版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/kwame211/article/details/88016151
一、目標檢測常見算法
object detection,就是在給定的圖片中精確找到物體所在位置,并標注出物體的類別。所以,object detection要解決的問題就是物體在哪里以及是什么的整個流程問題。
然而,這個問題可不是那么容易解決的,物體的尺寸變化范圍很大,擺放物體的角度,姿態不定,而且可以出現在圖片的任何地方,更何況物體還可以是多個類別。
目前學術和工業界出現的目標檢測算法分成3類:
1. 傳統的目標檢測算法:Cascade + HOG/DPM + Haar/SVM以及上述方法的諸多改進、優化;
2. 候選區域/框 + 深度學習分類:通過提取候選區域,并對相應區域進行以深度學習方法為主的分類的方案,如:
R-CNN(Selective?Search + CNN + SVM)
SPP-net(ROI Pooling)
Fast R-CNN(Selective?Search + CNN + ROI)
Faster R-CNN(RPN + CNN + ROI)
R-FCN
等系列方法;
3. 基于深度學習的回歸方法:YOLO/SSD/DenseBox 等方法;以及最近出現的結合RNN算法的RRC detection;結合DPM的Deformable CNN等
?
傳統目標檢測流程:
1)區域選擇(窮舉策略:采用滑動窗口,且設置不同的大小,不同的長寬比對圖像進行遍歷,時間復雜度高)
2)特征提取(SIFT、HOG等;形態多樣性、光照變化多樣性、背景多樣性使得特征魯棒性差)
3)分類器分類(主要有SVM、Adaboost等)
二、傳統的目標檢測算法
2.1 從圖像識別的任務說起
這里有一個圖像任務:既要把圖中的物體識別出來,又要用方框框出它的位置。
?
這個任務本質上就是這兩個問題:一:圖像識別,二:定位。
圖像識別(classification):
輸入:圖片
輸出:物體的類別
評估方法:準確率
?
定位(localization):
輸入:圖片
輸出:方框在圖片中的位置(x,y,w,h)
評估方法:檢測評價函數intersection-over-union(關于什么是IOU,請參看本深度學習分類下第55題:https://www.julyedu.com/question/big/kp_id/26/ques_id/2138)
?
卷積神經網絡CNN已經幫我們完成了圖像識別(判定是貓還是狗)的任務了,我們只需要添加一些額外的功能來完成定位任務即可。
定位的問題的解決思路有哪些?
思路一:看做回歸問題
看做回歸問題,我們需要預測出(x,y,w,h)四個參數的值,從而得出方框的位置。
?
步驟1:
*先解決簡單問題, 搭一個識別圖像的神經網絡
*在AlexNet VGG GoogleLenet上fine-tuning一下(關于什么是微調fine-tuning,請參看本深度學習分類下第54題:https://www.julyedu.com/question/big/kp_id/26/ques_id/2137)
?
步驟2:
*在上述神經網絡的尾部展開(也就說CNN前面保持不變,我們對CNN的結尾處作出改進:加了兩個頭:“分類頭”和“回歸頭”)
*成為classification + regression模式
?
步驟3:
*Regression那個部分用歐氏距離損失
*使用SGD訓練
步驟4:
*預測階段把2個頭部拼上
*完成不同的功能
這里需要進行兩次fine-tuning
第一次在ALexNet上做,第二次將頭部改成regression head,前面不變,做一次fine-tuning
Regression的部分加在哪?
有兩種處理方法:
?加在最后一個卷積層后面(如VGG)
?加在最后一個全連接層后面(如R-CNN)
regression太難做了,應想方設法轉換為classification問題。
regression的訓練參數收斂的時間要長得多,所以上面的網絡采取了用classification的網絡來計算出網絡共同部分的連接權值。
思路二:取圖像窗口
?還是剛才的classification + regression思路
?咱們取不同的大小的“框”
?讓框出現在不同的位置,得出這個框的判定得分
?取得分最高的那個框
左上角的黑框:得分0.5
?
右上角的黑框:得分0.75
?
左下角的黑框:得分0.6
?
右下角的黑框:得分0.8
?
根據得分的高低,我們選擇了右下角的黑框作為目標位置的預測。
注:有的時候也會選擇得分最高的兩個框,然后取兩框的交集作為最終的位置預測。
疑惑:框要取多大?
取不同的框,依次從左上角掃到右下角。非常粗暴啊。
總結一下思路:
對一張圖片,用各種大小的框(遍歷整張圖片)將圖片截取出來,輸入到CNN,然后CNN會輸出這個框的得分(classification)以及這個框圖片對應的x,y,h,w(regression)。
這方法實在太耗時間了,做個優化。
原來網絡是這樣的:
?
優化成這樣:把全連接層改為卷積層,這樣可以提提速。
?
2.2 物體檢測(Object Detection)
當圖像有很多物體怎么辦的?難度可是一下暴增啊。
那任務就變成了:多物體識別+定位多個物體
那把這個任務看做分類問題?
?
看成分類問題有何不妥?
?你需要找很多位置, 給很多個不同大小的框
?你還需要對框內的圖像分類
?當然, 如果你的GPU很強大, 恩, 那加油做吧…
所以,傳統目標檢測的主要問題是:
1)基于滑動窗口的區域選擇策略沒有針對性,時間復雜度高,窗口冗余
2)手工設計的特征對于多樣性的變化沒有很好的魯棒性
看做classification, 有沒有辦法優化下?我可不想試那么多框那么多位置啊!
三、候選區域/窗 + 深度學習分類
3.1 R-CNN橫空出世
有人想到一個好方法:預先找出圖中目標可能出現的位置,即候選區域(Region Proposal)。利用圖像中的紋理、邊緣、顏色等信息,可以保證在選取較少窗口(幾千甚至幾百)的情況下保持較高的召回率(Recall)。
所以,問題就轉變成找出可能含有物體的區域/框(也就是候選區域/框,比如選2000個候選框),這些框之間是可以互相重疊互相包含的,這樣我們就可以避免暴力枚舉所有框了。
大牛們發明好多選定候選框Region Proposal的方法,比如Selective Search和EdgeBoxes。那提取候選框用到的算法“選擇性搜索”到底怎么選出這些候選框的呢?具體可以看一下PAMI2015的“What makes for effective detection proposals?”
以下是各種選定候選框的方法的性能對比。
?
有了候選區域,剩下的工作實際就是對候選區域進行圖像分類的工作(特征提取+分類)。
對于圖像分類,不得不提的是2012年ImageNet大規模視覺識別挑戰賽(ILSVRC)上,機器學習泰斗Geoffrey Hinton教授帶領學生Krizhevsky使用卷積神經網絡將ILSVRC分類任務的Top-5 error降低到了15.3%,而使用傳統方法的第二名top-5 error高達 26.2%。此后,卷積神經網絡CNN占據了圖像分類任務的絕對統治地位。
2014年,RBG(Ross B. Girshick)使用Region Proposal + CNN代替傳統目標檢測使用的滑動窗口+手工設計特征,設計了R-CNN框架,使得目標檢測取得巨大突破,并開啟了基于深度學習目標檢測的熱潮。
?
R-CNN的簡要步驟如下
(1) 輸入測試圖像
(2) 利用選擇性搜索Selective Search算法在圖像中從下到上提取2000個左右的可能包含物體的候選區域Region Proposal
(3) 因為取出的區域大小各自不同,所以需要將每個Region Proposal縮放(warp)成統一的227x227的大小并輸入到CNN,將CNN的fc7層的輸出作為特征
(4) 將每個Region Proposal提取到的CNN特征輸入到SVM進行分類
具體步驟則如下
步驟一:訓練(或者下載)一個分類模型(比如AlexNet)
步驟二:對該模型做fine-tuning
?將分類數從1000改為21,比如20個物體類別 + 1個背景
?去掉最后一個全連接層
步驟三:特征提取
?提取圖像的所有候選框(選擇性搜索Selective Search)
?對于每一個區域:修正區域大小以適合CNN的輸入,做一次前向運算,將第五個池化層的輸出(就是對候選框提取到的特征)存到硬盤
步驟四:訓練一個SVM分類器(二分類)來判斷這個候選框里物體的類別
每個類別對應一個SVM,判斷是不是屬于這個類別,是就是positive,反之nagative。
比如下圖,就是狗分類的SVM
?
步驟五:使用回歸器精細修正候選框位置:對于每一個類,訓練一個線性回歸模型去判定這個框是否框得完美。
?
細心的同學可能看出來了問題,R-CNN雖然不再像傳統方法那樣窮舉,但R-CNN流程的第一步中對原始圖片通過Selective Search提取的候選框region proposal多達2000個左右,而這2000個候選框每個框都需要進行CNN提特征+SVM分類,計算量很大,導致R-CNN檢測速度很慢,一張圖都需要47s。
?
有沒有方法提速呢?答案是有的,這2000個region proposal不都是圖像的一部分嗎,那么我們完全可以對圖像提一次卷積層特征,然后只需要將region proposal在原圖的位置映射到卷積層特征圖上,這樣對于一張圖像我們只需要提一次卷積層特征,然后將每個region proposal的卷積層特征輸入到全連接層做后續操作。
但現在的問題是每個region proposal的尺度不一樣,而全連接層輸入必須是固定的長度,所以直接這樣輸入全連接層肯定是不行的。SPP Net恰好可以解決這個問題。
3.2 SPP Net
SPP:Spatial Pyramid Pooling(空間金字塔池化)
SPP-Net是出自2015年發表在IEEE上的論文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。
眾所周知,CNN一般都含有卷積部分和全連接部分,其中,卷積層不需要固定尺寸的圖像,而全連接層是需要固定大小的輸入。
?
所以當全連接層面對各種尺寸的輸入數據時,就需要對輸入數據進行crop(crop就是從一個大圖扣出網絡輸入大小的patch,比如227×227),或warp(把一個邊界框bounding box的內容resize成227×227)等一系列操作以統一圖片的尺寸大小,比如224*224(ImageNet)、32*32(LenNet)、96*96等。
所以才如你在上文中看到的,在R-CNN中,“因為取出的區域大小各自不同,所以需要將每個Region Proposal縮放(warp)成統一的227x227的大小并輸入到CNN”。
但warp/crop這種預處理,導致的問題要么被拉伸變形、要么物體不全,限制了識別精確度。沒太明白?說句人話就是,一張16:9比例的圖片你硬是要Resize成1:1的圖片,你說圖片失真不?
SPP Net的作者Kaiming He等人逆向思考,既然由于全連接FC層的存在,普通的CNN需要通過固定輸入圖片的大小來使得全連接層的輸入固定。那借鑒卷積層可以適應任何尺寸,為何不能在卷積層的最后加入某種結構,使得后面全連接層得到的輸入變成固定的呢?
這個“化腐朽為神奇”的結構就是spatial pyramid pooling layer。
下圖便是R-CNN和SPP Net檢測流程的比較:
它的特點有兩個:
1.結合空間金字塔方法實現CNNs的多尺度輸入。
SPP Net的第一個貢獻就是在最后一個卷積層后,接入了金字塔池化層,保證傳到下一層全連接層的輸入固定。
換句話說,在普通的CNN機構中,輸入圖像的尺寸往往是固定的(比如224*224像素),輸出則是一個固定維數的向量。SPP Net在普通的CNN結構中加入了ROI池化層(ROI Pooling),使得網絡的輸入圖像可以是任意尺寸的,輸出則不變,同樣是一個固定維數的向量。
簡言之,CNN原本只能固定輸入、固定輸出,CNN加上SSP之后,便能任意輸入、固定輸出。神奇吧?
ROI池化層一般跟在卷積層后面,此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出則是固定維數的向量,然后給到全連接FC層。
?
2.只對原圖提取一次卷積特征
在R-CNN中,每個候選框先resize到統一大小,然后分別作為CNN的輸入,這樣是很低效的。
而SPP Net根據這個缺點做了優化:只對原圖進行一次卷積計算,便得到整張圖的卷積特征feature map,然后找到每個候選框在feature map上的映射patch,將此patch作為每個候選框的卷積特征輸入到SPP layer和之后的層,完成特征提取工作。
如此這般,R-CNN要對每個區域計算卷積,而SPPNet只需要計算一次卷積,從而節省了大量的計算時間,比R-CNN有一百倍左右的提速。
?
3.3 Fast R-CNN
SPP Net真是個好方法,R-CNN的進階版Fast R-CNN就是在R-CNN的基礎上采納了SPP Net方法,對R-CNN作了改進,使得性能進一步提高。
R-CNN與Fast R-CNN的區別有哪些呢?
先說R-CNN的缺點:即使使用了Selective Search等預處理步驟來提取潛在的邊界框bounding box作為輸入,但是R-CNN仍會有嚴重的速度瓶頸,原因也很明顯,就是計算機對所有region進行特征提取時會有重復計算,Fast-RCNN正是為了解決這個問題誕生的。
?
與R-CNN框架圖對比,可以發現主要有兩處不同:一是最后一個卷積層后加了一個ROI pooling layer,二是損失函數使用了多任務損失函數(multi-task loss),將邊框回歸Bounding Box Regression直接加入到CNN網絡中訓練(關于什么是邊框回歸,請參看本深度學習分類下第56題:https://www.julyedu.com/question/big/kp_id/26/ques_id/2139)。
(1) ROI pooling layer實際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特征圖。對于VGG16網絡conv5_3有512個特征圖,這樣所有region proposal對應了一個7*7*512維度的特征向量作為全連接層的輸入。
換言之,這個網絡層可以把不同大小的輸入映射到一個固定尺度的特征向量,而我們知道,conv、pooling、relu等操作都不需要固定size的輸入,因此,在原始圖片上執行這些操作后,雖然輸入圖片size不同導致得到的feature map尺寸也不同,不能直接接到一個全連接層進行分類,但是可以加入這個神奇的ROI Pooling層,對每個region都提取一個固定維度的特征表示,再通過正常的softmax進行類型識別。
(2) R-CNN訓練過程分為了三個階段,而Fast R-CNN直接使用softmax替代SVM分類,同時利用多任務損失函數邊框回歸也加入到了網絡中,這樣整個的訓練過程是端到端的(除去region proposal提取階段)。
也就是說,之前R-CNN的處理流程是先提proposal,然后CNN提取特征,之后用SVM分類器,最后再做box regression,而在Fast R-CNN中,作者巧妙的把box regression放進了神經網絡內部,與region分類和并成為了一個multi-task模型,實際實驗也證明,這兩個任務能夠共享卷積特征,并相互促進。
?
所以,Fast-RCNN很重要的一個貢獻是成功的讓人們看到了Region Proposal + CNN這一框架實時檢測的希望,原來多類檢測真的可以在保證準確率的同時提升處理速度,也為后來的Faster R-CNN做下了鋪墊。
畫一畫重點:
R-CNN有一些相當大的缺點(把這些缺點都改掉了,就成了Fast R-CNN)。
大缺點:由于每一個候選框都要獨自經過CNN,這使得花費的時間非常多。
解決:共享卷積層,現在不是每一個候選框都當做輸入進入CNN了,而是輸入一張完整的圖片,在第五個卷積層再得到每個候選框的特征
原來的方法:許多候選框(比如兩千個)-->CNN-->得到每個候選框的特征-->分類+回歸
現在的方法:一張完整圖片-->CNN-->得到每張候選框的特征-->分類+回歸
所以容易看見,Fast R-CNN相對于R-CNN的提速原因就在于:不過不像R-CNN把每個候選區域給深度網絡提特征,而是整張圖提一次特征,再把候選框映射到conv5上,而SPP只需要計算一次特征,剩下的只需要在conv5層上操作就可以了。
在性能上提升也是相當明顯的:
?
3.4 Faster R-CNN
Fast R-CNN存在的問題:存在瓶頸:選擇性搜索,找出所有的候選框,這個也非常耗時。那我們能不能找出一個更加高效的方法來求出這些候選框呢?
解決:加入一個提取邊緣的神經網絡,也就說找到候選框的工作也交給神經網絡來做了。
所以,rgbd在Fast R-CNN中引入Region Proposal Network(RPN)替代Selective Search,同時引入anchor box應對目標形狀的變化問題(anchor就是位置和大小固定的box,可以理解成事先設置好的固定的proposal)。
具體做法:
?將RPN放在最后一個卷積層的后面
?RPN直接訓練得到候選區域
?
RPN簡介:
?在feature map上滑動窗口
?建一個神經網絡用于物體分類+框位置的回歸
?滑動窗口的位置提供了物體的大體位置信息
?框的回歸提供了框更精確的位置
?
一種網絡,四個損失函數;
?RPN calssification(anchor good.bad)
?RPN regression(anchor->propoasal)
?Fast R-CNN classification(over classes)
?Fast R-CNN regression(proposal ->box)
?
速度對比
?
Faster R-CNN的主要貢獻就是設計了提取候選區域的網絡RPN,代替了費時的選擇性搜索Selective Search,使得檢測速度大幅提高。
最后總結一下各大算法的步驟:
RCNN
1.在圖像中確定約1000-2000個候選框 (使用選擇性搜索Selective Search)
2.每個候選框內圖像塊縮放至相同大小,并輸入到CNN內進行特征提取
3.對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
4.對于屬于某一類別的候選框,用回歸器進一步調整其位置
Fast R-CNN
1.在圖像中確定約1000-2000個候選框 (使用選擇性搜索)
2.對整張圖片輸進CNN,得到feature map
3.找到每個候選框在feature map上的映射patch,將此patch作為每個候選框的卷積特征輸入到SPP layer和之后的層
4.對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
5.對于屬于某一類別的候選框,用回歸器進一步調整其位置
Faster R-CNN
1.對整張圖片輸進CNN,得到feature map
2.卷積特征輸入到RPN,得到候選框的特征信息
3.對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
4.對于屬于某一類別的候選框,用回歸器進一步調整其位置
簡言之,即如本文開頭所列
R-CNN(Selective Search + CNN + SVM)
SPP-net(ROI Pooling)
Fast R-CNN(Selective Search + CNN + ROI)
Faster R-CNN(RPN + CNN + ROI)
總的來說,從R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走來,基于深度學習目標檢測的流程變得越來越精簡,精度越來越高,速度也越來越快。可以說基于region proposal的R-CNN系列目標檢測方法是當前目標檢測技術領域最主要的一個分支。
四、基于深度學習的回歸方法
4.1 YOLO (CVPR2016, oral)
(You Only Look Once: Unified, Real-Time Object Detection)
Faster R-CNN的方法目前是主流的目標檢測方法,但是速度上并不能滿足實時的要求。YOLO一類的方法慢慢顯現出其重要性,這類方法使用了回歸的思想,利用整張圖作為網絡的輸入,直接在圖像的多個位置上回歸出這個位置的目標邊框,以及目標所屬的類別。
我們直接看上面YOLO的目標檢測的流程圖:
?
(1) 給個一個輸入圖像,首先將圖像劃分成7*7的網格
(2) 對于每個網格,我們都預測2個邊框(包括每個邊框是目標的置信度以及每個邊框區域在多個類別上的概率)
(3) 根據上一步可以預測出7*7*2個目標窗口,然后根據閾值去除可能性比較低的目標窗口,最后NMS去除冗余窗口即可(關于什么是非極大值抑制NMS,請參看本深度學習分類下第58題:https://www.julyedu.com/question/big/kp_id/26/ques_id/2141)。
可以看到整個過程非常簡單,不再需要中間的region proposal找目標,直接回歸便完成了位置和類別的判定。
?
小結:YOLO將目標檢測任務轉換成一個回歸問題,大大加快了檢測的速度,使得YOLO可以每秒處理45張圖像。而且由于每個網絡預測目標窗口時使用的是全圖信息,使得false positive比例大幅降低(充分的上下文信息)。
但是YOLO也存在問題:沒有了Region Proposal機制,只使用7*7的網格回歸會使得目標不能非常精準的定位,這也導致了YOLO的檢測精度并不是很高。
4.2 SSD
(SSD: Single Shot?multibox?Detector)
上面分析了YOLO存在的問題,使用整圖特征在7*7的粗糙網格內回歸對目標的定位并不是很精準。那是不是可以結合region proposal的思想實現精準一些的定位?SSD結合YOLO的回歸思想以及Faster R-CNN的anchor機制做到了這點。
?
上圖是SSD的一個框架圖,首先SSD獲取目標位置和類別的方法跟YOLO一樣,都是使用回歸,但是YOLO預測某個位置使用的是全圖的特征,SSD預測某個位置使用的是這個位置周圍的特征(感覺更合理一些)。
那么如何建立某個位置和其特征的對應關系呢?可能你已經想到了,使用Faster R-CNN的anchor機制。如SSD的框架圖所示,假如某一層特征圖(圖b)大小是8*8,那么就使用3*3的滑窗提取每個位置的特征,然后這個特征回歸得到目標的坐標信息和類別信息(圖c)。
不同于Faster R-CNN,這個anchor是在多個feature map上,這樣可以利用多層的特征并且自然的達到多尺度(不同層的feature map 3*3滑窗感受野不同)。
小結:SSD結合了YOLO中的回歸思想和Faster R-CNN中的anchor機制,使用全圖各個位置的多尺度區域特征進行回歸,既保持了YOLO速度快的特性,也保證了窗口預測的跟Faster R-CNN一樣比較精準。SSD在VOC2007上mAP可以達到72.1%,速度在GPU上達到58幀每秒。
---------------------
作者:少林達摩祖師
來源:CSDN
原文:https://blog.csdn.net/special00/article/details/90237513
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件