【CV】通俗易懂的目标检测 | RCNN, SPPNet, Fast, Faster
全文5500個字,22幅圖,學習時長預計20分鐘
目錄
0?概述
1?RCNN
1.1 候選區Region Proposal
1.2 特征提取
1.3 SVM分類
1.4 線性回歸
2 SPP Net
3 Fast RCNN
4 Faster RCNN
5 總結
0 概述
本文主要講一下深度網絡時代,目標檢測系列的RCNN這個分支,這個分支就是常說的two-step,候選框 + 深度學習分類的模式:RCNN->SPP->Fast RCNN->Faster RCNN
另外一個分支是yolo v1-v4,這個分支是one-step的端到端的方式。不過這里主要是介紹RCNN那個體系的。
把下圖中的yolo忽略,剩下的四個就是RCNN體系的一個非常好的總結。
1 RCNN
RCNN既然是two-step,那么就從這里切入理解:
第一步,生成候選區
第二步,判斷每個候選區的類別 2.1 用CNN提取特征 2.2 用SVM分類 2.3 用線性回歸矯正候選框的位置
1.1 候選區Region Proposal
一個圖片中有多個待檢測的目標,我們怎么找到這個目標的位置呢?Region Proposal就是給出目標可能在的候選框中。如下圖,Region Proposal給出了大大小小的可能候選框:
怎么給出可能的候選框呢?比較籠統的說法是:利用圖像中的紋理、邊緣、顏色等信息,先產生較小的相同紋理、相同顏色的候選框,然后小的候選框慢慢合并成大的紋理相似的候選框。
【selective search 選擇性搜索】這個選擇性搜索就是給出候選框的算法的名字。用Selective Search方法可以對一張圖片生成大約1000~3000個候選框,具體的算法邏輯如下:
使用一種過分割手段,將圖像分割成過小的區域;
查看現有小區域,合并可能性最高的兩個區域,重復直到整張圖像合并成一個區域位置;;
輸出所有曾經存在過的區域,也就是從小合并到大的所有出現過的大大小小的候選框,即所謂候選區域。
【合并遵守的原則】
顏色(顏色直方圖)相近的;
紋理(梯度直方圖)相近的;
合并后總面積小的;
1.2 特征提取
之前選出來的大大小小的候選框,其實就是大大小小的圖片。這里把圖片都縮放成統一的227*227的大小,然后把統一大小的圖片輸入到CNN中,進行特征提取。這里的特征網絡是一個比較簡單的網絡(當年resnet啊googlenet啊都沒提出來,BN層也沒提出來,所以結構如下)
從上圖中的pool5之后的輸出的特征圖取出來,所以SVM的輸入特征。(這里需要提到的是,pool5在某些博客中被說成了第五個池化層,感覺不是很恰當,應該是第三個池化層,只是接在了第5個卷積層后面。)
1.3 SVM分類
眾所周知,SVM只能分類二分類任務(這個不清楚的給我回去看之前的SVM推導去)。
想要SVM處理多分類任務,那么就有多種集成方式。我記得上課老師說的有兩種(我只記得兩種了):
one vs one:就是假設5個類別,那么兩兩類別之間訓練一個SVM,總共訓練10個SVM,然后把一個圖片放入這個10個SVN,然后對于結果進行投票;
one vs all:這個5分類任務,就訓練5個SVM,然后每個SVM訓練的正負樣本就是:是這個類別的和不是這個類別的。淦!語言說的不清楚。
舉個例子:a,b,c三個類別。one vs one就是:a|b,a|c,b|c。one vs all就是a|bc,b|ac,c|ab。(值得注意的是,在目標檢測中,會多一個類別,叫做背景)
回到RCNN,這里的SVM用的就是one vs all的方式。下圖可以比較好的理解什么是one vs all:
1.4 線性回歸
現在我們知道一個候選框的類別了(通過SVM),但是我們經過一開始的拉伸,雖然讓所有圖片都變成了227的大小,但是也會造成圖像的扭曲。如下圖:
所以這時候,訓練一個線性回歸模型,來做一個邊框回歸,精細的調整候選框(x,y,w,h)四個參數。這里每一個類別就會訓練一個線性回歸模型,根據SVM的結果,選擇相應類別的線性回歸模型進行候選框的矯正。
整個RCNN的過程可以用下面這張圖來概括一下:
整體四個步驟,精度達到了當時水平的巔峰,但是每一張圖片都會有2000左右的候選框,再加上SVM和線性回歸的推理,一張圖片的推理時間需要47s。慢的雅痞。之后的三個模型,都是不斷改進了RCNN的各種問題,做出了各種杰出的提升。
2 SPP Net
SPP:Spatial Pyramid Pooling空間金字塔池化
SPP-Net是出自2015年發表在IEEE上的論文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。
眾所周知,CNN一般都含有卷積部分和全連接部分,其中,卷積層不需要固定尺寸的圖像,而全連接層是需要固定大小的輸入(SVM的輸入也是需要固定大小的輸入)。
所以當全連接層面對帶下不同的輸入數據的時候,就需要對數據做拉伸warp或者剪裁crop,就像是RCNN中把候選框拉伸到227尺寸大小。
【crop與warp】
兩者的效果看下面的圖就懂了吧。
現在的問題是,warp還是crop都會讓圖像變形、物體不全,這樣勢必會對識別的精確度產生影響。
【如何避免使用warp和crop】SPP net使用了SPP空間金字塔池化層,來實現了這個功能。先看和RCNN的模型結構對比:
RCNN中先通過warp講大小不同的候選框變成227統一大小輸入到conv layers;SPP中直接對大小不同的候選框做conv layers,所以我們得到了大小不同的特征圖。然后將大小不同的特征圖輸入到SPP空間金字塔池化層中,輸出變成大小相同的特征圖
【SPP層如何實現尺寸輸入不同輸出相同的呢?】ROI pooling是空間金字塔池化層的更底層的結構。準確的說,是ROI池化層實現的輸入尺寸不同,輸出相同的功能。。
ROI Pooling=Region of Interest Pooling感興趣區域池化層
ROI池化層一般跟在卷積層后面,此時網絡的輸入可以是任意尺度的,ROI pooling的filter會根據輸入調整大小。一個簡單的例子,10*10的特征圖輸入到ROI pooling,我們設置要一個5*5的輸出,所以ROI pooling的filter大小自動計算出是2*2的。假如輸入時20*20的特征圖,計算出來的filter就是4*4大小的,輸出結果還是5*5。
而SPP之所以稱之為金字塔(希望各位了解圖像金字塔的概念,不了解也沒事哈),是因為它用了好幾個ROI pooling,每一個ROI輸出的特征圖大小不同,有1*1的、2*2的、4*4的,然后把不同尺寸的特征圖的特征拉平,變成21個特征變量,就可以輸入到FC層或者SVM了。
下圖正式重現了上面我說的情況,三個不同的ROI總共產生了21個特征進行分類。(其中的256是通道數,嚴格來說是21*256個特征進行分類)
【SPPnet比RCNN好在哪里?】
通過使用SPP結構(ROI池化層),避免了warp和crop的使用,避免了圖像失真;
RCNN的處理順序是:先把候選框的圖扣出來,再放到卷積層進行訓練得到特征圖;SPPNet是先把原圖通過卷積層得到特征圖,然后把候選框的大小映射到特征圖上再摳出來。哪個速度快不用我多說了吧。就好比,我通知個消息,我一個一個好友的轉發,與我把好友拉到一個群里,我在群里發一樣(這是個不太恰當的例子可能)。總之,這樣RCNN需要卷積2000個候選框,而SPPNet只需要卷積一次,速度提升了100倍。
(最后需要提的一點是,我并不清楚SPPNet最后的分類是用FC層還是依然使用RCNN的SVM分類,不知道SPPNet是否使用了線性回歸的方法做邊框回歸。因為我只是把SPPNet看成提出了ROI pooling的一個方法,是RCNN進化史中的一個插曲。不過在意的朋友可以自行查找,然后方便的話告訴我哈哈哈,我懶得搞了。到這里已經碼字3小時了)
3 Fast RCNN
SPP Net真是個好方法,R-CNN的進階版Fast R-CNN就是在R-CNN的基礎上采納了SPP Net方法,對R-CNN作了改進,使得性能進一步提高。
【R-CNN vs Fast R-CNN】
依舊使用selective search的方法來選取候選框bounding box。
**不再使用SVM+線性回歸的方法,而是全部通過神經網絡來實現分類和邊框回歸的任務。**Fast-RCNN很重要的一個貢獻是成功的讓人們看到了Region Proposal + CNN這一框架的可行性,不再使用Region Proposal + CNN + SVM + LR的框架了。
現在梳理一些Fast RCNN推理的流程。
現在有一個原圖,先通過selective search得到候選框;
將原圖放到CNN中進行特征處理,得到特征圖,然后將候選框映射到特征圖上,得到大小不同的特征圖的候選框。
把特征圖候選框放到ROI pooling層中(只有一個,不是SPP的3個ROI結構了),輸出7*7的特征圖,這時候有512個通道,所以在ROI輸出之后,把7*7*512個特征放到FC層中。
FC層后接入了兩個不同的FC層(分支結構),分別輸出兩個不同的結果。第一個結果加上softmax變成候選框的類別概率,第二個結果就是候選框的4個參數的邊框回歸的值。
整個流程可以看下面的圖:
現在,目標檢測一張圖片,只需要0.32秒鐘,之前的RCNN可是47秒。
【Fast RCNN的貢獻】再說一下Fast RCNN的改進,其實主要改進都是SPP Net的,用了ROI和先卷積再扣除候選框的方法(SPPNet的兩個優點都用了),此外,還是用FC層直接代替了SVM和LR,這個Fast RCNN的最大貢獻。
4 Faster RCNN
之前Fast RCNN最消耗時間的地方,在于使用selective search來找候選框
為了更快,使用神經網絡來代替selective search,所以現在,Faster RCNN整體就是一個神經網絡來搞,一個端對端的模型。(輸入圖片,輸出候選框,一個模型完成所有任務所以是端對端)。
【區域候選網絡RPN】Faster RCNN最大的貢獻在一引入了Region Proposal Network(RPN)網絡來代替selective search。
RPN網絡直接放在最后一個卷積層的后面,通過一個滑動窗口,在feature map上滑動。每一個滑動窗口會給出一個置信度,置信度低的可以理解為這個窗口是沒有目標的,置信度高的再考慮不同類別的概率。
【Archor box先驗框】 這里還會有一個archor box的概念,因為滑動窗口一般是正方形的,但是實際的目標檢測可能是長方形。也許比較近似正方形的長方形可以通過邊框回歸矯正,但是其他的長方形物體就非常難辦了。這里事先設置了幾種不同形狀大小的候選框,除了正方形之外,還有長方形,小正方形等,這樣雖然成倍的增加了計算量,但是可以提高準確度。而且這樣增加候選框的計算量消耗依然是小于selective search的。
下圖來理解之前講解的概念:圖中有四種不同的archor box,意味著滑動到某一個位置的時候,以那個點為中心,產生四個不同大小的候選框,然后預測得到 是否是目標物體二分類結果 和 邊框回歸四分類結果。下圖會清晰的理解這個過程:
總的來說,RPN做的事情是:? 在feature map上滑動窗口 ? 建一個神經網絡用于物體分類+框位置的回歸 ? 滑動窗口的位置提供了物體的大體位置信息 ? 框的回歸提供了框更精確的位置
整個網絡有四個損失函數:
RPN的二分類損失函數
RPN的邊框回歸損失函數
FAST RCNN的多分類損失函數
Fast RCNN的邊框回歸損失函數
然后看看速度比Fast RCNN更快了。Faster R-CNN的主要貢獻就是設計了提取候選區域的網絡RPN,代替了費時的選擇性搜索Selective Search,使得檢測速度大幅提高。
5 總結
這里有個圖來總結:
項目 | R-CNN | Fast R-CNN | Faster R-CNN |
提取候選框 | Selective Search | Selective Search | RPN網絡 |
提取特征 | 卷積神經網絡(CNN) | 卷積神經網絡+ROI池化 | |
特征分類 | SVM | ||
R-CNN(Selective Search + CNN + SVM)
SPP-net(ROI Pooling)
Fast R-CNN(Selective Search + CNN + ROI)
Faster R-CNN(RPN + CNN + ROI)
總結
以上是生活随笔為你收集整理的【CV】通俗易懂的目标检测 | RCNN, SPPNet, Fast, Faster的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面向工业界】京东NLP落地应用实战
- 下一篇: 【NLP】Transformer模型深度