【深度学习】基于深度学习的目标检测研究进展
原文出處:http://chuansong.me/n/353443351445
開始本文內容之前,我們先來看一下上邊左側的這張圖,從圖中你看到了什么物體?他們在什么位置?這還不簡單,圖中有一個貓和一個人,具體的位置就是上圖右側圖像兩個邊框(bounding-box)所在的位置。其實剛剛的這個過程就是目標檢測,目標檢測就是“給定一張圖像或者視頻幀,找出其中所有目標的位置,并給出每個目標的具體類別”。????
目標檢測對于人來說是再簡單不過的任務,但是對于計算機來說,它看到的是一些值為0~255的數組,因而很難直接得到圖像中有人或者貓這種高層語義概念,也不清楚目標出現在圖像中哪個區域。圖像中的目標可能出現在任何位置,目標的形態可能存在各種各樣的變化,圖像的背景千差萬別……,這些因素導致目標檢測并不是一個容易解決的任務。????
得益于深度學習——主要是卷積神經網絡(convolution neural network: CNN)和候選區域(region proposal)算法,從2014年開始,目標檢測取得了巨大的突破。
本文主要對基于深度學習的目標檢測算法進行剖析和總結,文章分為四個部分:第一部分大體介紹下傳統目標檢測的流程,第二部分介紹以R-CNN為代表的結合region proposal和CNN分類的目標檢測框架(R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN); 第三部分介紹以YOLO為代表的將目標檢測轉換為回歸問題的目標檢測框架(YOLO, SSD); 第四部分介紹一些可以提高目標檢測性能的技巧和方法。
一. 傳統目標檢測方法
???
?如上圖所示,傳統目標檢測的方法一般分為三個階段:首先在給定的圖像上選擇一些候選的區域,然后對這些區域提取特征,最后使用訓練的分類器進行分類。下面我們對這三個階段分別進行介紹。????
(1) 區域選擇????這一步是為了對目標的位置進行定位。由于目標可能出現在圖像的任何位置,而且目標的大小、長寬比例也不確定,所以最初采用滑動窗口的策略對整幅圖像進行遍歷,而且需要設置不同的尺度,不同的長寬比。這種窮舉的策略雖然包含了目標所有可能出現的位置,但是缺點也是顯而易見的:時間復雜度太高,產生冗余窗口太多,這也嚴重影響后續特征提取和分類的速度和性能。(實際上由于受到時間復雜度的問題,滑動窗口的長寬比一般都是固定的設置幾個,所以對于長寬比浮動較大的多類別目標檢測,即便是滑動窗口遍歷也不能得到很好的區域) 。
(2)?特征提取????由于目標的形態多樣性,光照變化多樣性,背景多樣性等因素使得設計一個魯棒的特征并不是那么容易。然而提取特征的好壞直接影響到分類的準確性。(這個階段常用的特征有SIFT、HOG等)。????
(3) 分類器????主要有SVM, Adaboost等。????
總結:傳統目標檢測存在的兩個主要問題:一個是基于滑動窗口的區域選擇策略沒有針對性,時間復雜度高,窗口冗余;二是手工設計的特征對于多樣性的變化并沒有很好的魯棒性。
二. 基于Region Proposal的深度學習目標檢測算法????
對于傳統目標檢測任務存在的兩個主要問題,我們該如何解決呢? ? ?
對于滑動窗口存在的問題,region proposal提供了很好的解決方案。region proposal(候選區域)是預先找出圖中目標可能出現的位置。但由于region proposal利用了圖像中的紋理、邊緣、顏色等信息,可以保證在選取較少窗口(幾千個甚至幾百個)的情況下保持較高的召回率。這大大降低了后續操作的時間復雜度,并且獲取的候選窗口要比滑動窗口的質量更高(滑動窗口固定長寬比)。比較常用的region proposal算法有selective Search和edge Boxes,如果想具體了解region proposal可以看一下PAMI2015的“What makes for effective detection proposals?” ? ?
有了候選區域,剩下的工作實際就是對候選區域進行圖像分類的工作(特征提取+分類)。
對于圖像分類,不得不提的是2012年ImageNet大規模視覺識別挑戰賽(ILSVRC)上,機器學習泰斗Geoffrey Hinton教授帶領學生Krizhevsky使用卷積神經網絡將ILSVRC分類任務的Top-5 error降低到了15.3%,而使用傳統方法的第二名top-5 error高達 26.2%。此后,卷積神經網絡占據了圖像分類任務的絕對統治地位,微軟最新的ResNet和谷歌的Inception V4模型的top-5 error降到了4%以內多,這已經超越人在這個特定任務上的能力。所以目標檢測得到候選區域后使用CNN對其進行圖像分類是一個不錯的選擇。 ? ?
2014年,RBG(Ross B. Girshick)大神使用region proposal+CNN代替傳統目標檢測使用的滑動窗口+手工設計特征,設計了R-CNN框架,使得目標檢測取得巨大突破,并開啟了基于深度學習目標檢測的熱潮。
1.R-CNN (CVPR2014, TPAMI2015)? ??(Region-based Convolution Networks for Accurate Object detection and Segmentation)
????
上面的框架圖清晰的給出了R-CNN的目標檢測流程:????
(1)?輸入測試圖像?? ?
(2)??利用selective search算法在圖像中提取2000個左右的region proposal。? ??
(3)?將每個region proposal縮放(warp)成227x227的大小并輸入到CNN,將CNN的fc7層的輸出作為特征。? ??
(4)?將每個region proposal提取到的CNN特征輸入到SVM進行分類。????
針對上面的框架給出幾點解釋:? ??
*?上面的框架圖是測試的流程圖,要進行測試我們首先要訓練好提取特征的CNN模型,以及用于分類的SVM:使用在ImageNet上預訓練的模型(AlexNet/VGG16)進行微調得到用于特征提取的CNN模型,然后利用CNN模型對訓練集提特征訓練SVM。???
*?對每個region proposal縮放到同一尺度是因為CNN全連接層輸入需要保證維度固定。????
*?上圖少畫了一個過程——對于SVM分好類的region proposal做邊框回歸(bounding-box regression),邊框回歸是對region proposal進行糾正的線性回歸算法,為了讓region proposal提取到的窗口跟目標真實窗口更吻合。因為region proposal提取到的窗口不可能跟人手工標記那么準,如果region proposal跟目標位置偏移較大,即便是分類正確了,但是由于IoU(region proposal與Ground Truth的窗口的交集比并集的比值)低于0.5,那么相當于目標還是沒有檢測到。????
小結:R-CNN在PASCAL VOC2007上的檢測結果從DPM HSC的34.3%直接提升到了66%(mAP)。如此大的提升使我們看到了region proposal+CNN的巨大優勢。????
但是R-CNN框架也存在著很多問題:????
(1)?訓練分為多個階段,步驟繁瑣: 微調網絡+訓練SVM+訓練邊框回歸器????
(2)?訓練耗時,占用磁盤空間大:5000張圖像產生幾百G的特征文件????
(3)?速度慢: 使用GPU, VGG16模型處理一張圖像需要47s。????
針對速度慢的這個問題,SPP-NET給出了很好的解決方案。
2. SPP-NET (ECCV2014, TPAMI2015)(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition) ? ?
先看一下R-CNN為什么檢測速度這么慢,一張圖都需要47s!仔細看下R-CNN框架發現,對圖像提完region proposal(2000個左右)之后將每個proposal當成一張圖像進行后續處理(CNN提特征+SVM分類),實際上對一張圖像進行了2000次提特征和分類的過程!????
有沒有方法提速呢?好像是有的,這2000個region proposal不都是圖像的一部分嗎,那么我們完全可以對圖像提一次卷積層特征,然后只需要將region proposal在原圖的位置映射到卷積層特征圖上,這樣對于一張圖像我們只需要提一次卷積層特征,然后將每個region proposal的卷積層特征輸入到全連接層做后續操作。(對于CNN來說,大部分運算都耗在卷積操作上,這樣做可以節省大量時間)。現在的問題是每個region proposal的尺度不一樣,直接這樣輸入全連接層肯定是不行的,因為全連接層輸入必須是固定的長度。
SPP-NET恰好可以解決這個問題:
????
上圖對應的就是SPP-NET的網絡結構圖,任意給一張圖像輸入到CNN,經過卷積操作我們可以得到卷積特征(比如VGG16最后的卷積層為conv5_3,共產生512張特征圖)。圖中的window是就是原圖一個region proposal對應到特征圖的區域,只需要將這些不同大小window的特征映射到同樣的維度,將其作為全連接的輸入,就能保證只對圖像提取一次卷積層特征。SPP-NET使用了空間金字塔采樣(spatial pyramid pooling):將每個window劃分為4*4, 2*2, 1*1的塊,然后每個塊使用max-pooling下采樣,這樣對于每個window經過SPP層之后都得到了一個長度為(4*4+2*2+1)*512維度的特征向量,將這個作為全連接層的輸入進行后續操作。????
小結:使用SPP-NET相比于R-CNN可以大大加快目標檢測的速度,但是依然存在著很多問題:????
(1)?訓練分為多個階段,步驟繁瑣: 微調網絡+訓練SVM+訓練訓練邊框回歸器???
(2)?SPP-NET在微調網絡的時候固定了卷積層,只對全連接層進行微調,而對于一個新的任務,有必要對卷積層也進行微調。(分類的模型提取的特征更注重高層語義,而目標檢測任務除了語義信息還需要目標的位置信息)????針對這兩個問題,RBG又提出Fast R-CNN, 一個精簡而快速的目標檢測框架。
3.Fast R-CNN(ICCV2015)?有了前邊R-CNN和SPP-NET的介紹,我們直接看Fast R-CNN的框架圖:
????
與R-CNN框架圖對比,可以發現主要有兩處不同:一是最后一個卷積層后加了一個ROI pooling layer,二是損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網絡中訓練。? ?
(1)?ROI pooling layer實際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特征圖。對于VGG16網絡conv5_3有512個特征圖,這樣所有region proposal對應了一個7*7*512維度的特征向量作為全連接層的輸入。???
?(2)?R-CNN訓練過程分為了三個階段,而Fast R-CNN直接使用softmax替代SVM分類,同時利用多任務損失函數邊框回歸也加入到了網絡中,這樣整個的訓練過程是端到端的(除去region proposal提取階段)。???
(3)?Fast R-CNN在網絡微調的過程中,將部分卷積層也進行了微調,取得了更好的檢測效果。????
小結:Fast R-CNN融合了R-CNN和SPP-NET的精髓,并且引入多任務損失函數,使整個網絡的訓練和測試變得十分方便。在Pascal VOC2007訓練集上訓練,在VOC2007測試的結果為66.9%(mAP),如果使用VOC2007+2012訓練集訓練,在VOC2007上測試結果為70%(數據集的擴充能大幅提高目標檢測性能)。使用VGG16每張圖像總共需要3s左右。????
缺點:region proposal的提取使用selective search,目標檢測時間大多消耗在這上面(提region proposal 2~3s,而提特征分類只需0.32s),無法滿足實時應用,而且并沒有實現真正意義上的端到端訓練測試(region proposal使用selective search先提取處來)。那么有沒有可能直接使用CNN直接產生region proposal并對其分類?Faster R-CNN框架就是符合這樣需要的目標檢測框架。
3. Faster R-CNN(NIPS2015)(Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks)????
在region proposal + CNN分類的這種目標檢測框架中,region proposal質量好壞直接影響到目標檢測任務的精度。如果找到一種方法只提取幾百個或者更少的高質量的預選窗口,而且召回率很高,這不但能加快目標檢測速度,還能提高目標檢測的性能(假陽例少)。RPN(Region Proposal Networks)網絡應運而生。????
RPN的核心思想是使用卷積神經網絡直接產生region proposal,使用的方法本質上就是滑動窗口。RPN的設計比較巧妙,RPN只需在最后的卷積層上滑動一遍,因為anchor機制和邊框回歸可以得到多尺度多長寬比的region proposal。
???
?我們直接看上邊的RPN網絡結構圖(使用了ZF模型),給定輸入圖像(假設分辨率為600*1000),經過卷積操作得到最后一層的卷積特征圖(大小約為40*60)。在這個特征圖上使用3*3的卷積核(滑動窗口)與特征圖進行卷積,最后一層卷積層共有256個feature map,那么這個3*3的區域卷積后可以獲得一個256維的特征向量,后邊接cls layer和reg layer分別用于分類和邊框回歸(跟Fast R-CNN類似,只不過這里的類別只有目標和背景兩個類別)。3*3滑窗對應的每個特征區域同時預測輸入圖像3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)的region proposal,這種映射的機制稱為anchor。所以對于這個40*60的feature map,總共有約20000(40*60*9)個anchor,也就是預測20000個region proposal。????
這樣設計的好處是什么呢?雖然現在也是用的滑動窗口策略,但是:滑動窗口操作是在卷積層特征圖上進行的,維度較原始圖像降低了16*16倍(中間經過了4次2*2的pooling操作);多尺度采用了9種anchor,對應了三種尺度和三種長寬比,加上后邊接了邊框回歸,所以即便是這9種anchor外的窗口也能得到一個跟目標比較接近的region proposal。????
NIPS2015版本的Faster R-CNN使用的檢測框架是RPN網絡+Fast R-CNN網絡分離進行的目標檢測,整體流程跟Fast R-CNN一樣,只是region proposal現在是用RPN網絡提取的(代替原來的selective search)。
同時作者為了讓RPN的網絡和Fast R-CNN網絡實現卷積層的權值共享,訓練RPN和Fast R-CNN的時候用了4階段的訓練方法:????
(1)?使用在ImageNet上預訓練的模型初始化網絡參數,微調RPN網絡;????
(2)?使用(1)中RPN網絡提取region proposal訓練Fast R-CNN網絡;???
(3)?使用(2)的Fast R-CNN網絡重新初始化RPN, 固定卷積層進行微調;????
(4)?固定(2)中Fast R-CNN的卷積層,使用(3)中RPN提取的region proposal微調網絡。????
權值共享后的RPN和Fast R-CNN用于目標檢測精度會提高一些。????
使用訓練好的RPN網絡,給定測試圖像,可以直接得到邊緣回歸后的region proposal,根據region proposal的類別得分對RPN網絡進行排序,并選取前300個窗口作為Fast R-CNN的輸入進行目標檢測,使用VOC07+12訓練集訓練,VOC2007測試集測試mAP達到73.2%(selective search + Fast R-CNN是70%), 目標檢測的速度可以達到每秒5幀(selective search+Fast R-CNN是2~3s一張)。????
需要注意的是,最新的版本已經將RPN網絡和Fast R-CNN網絡結合到了一起——將RPN獲取到的proposal直接連到ROI pooling層,這才是一個真正意義上的使用一個CNN網絡實現端到端目標檢測的框架。????
小結:Faster R-CNN將一直以來分離的region proposal和CNN分類融合到了一起,使用端到端的網絡進行目標檢測,無論在速度上還是精度上都得到了不錯的提高。然而Faster R-CNN還是達不到實時的目標檢測,預先獲取region proposal,然后在對每個proposal分類計算量還是比較大。比較幸運的是YOLO這類目標檢測方法的出現讓實時性也變的成為可能。????
總的來說,從R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走來,基于深度學習目標檢測的流程變得越來越精簡,精度越來越高,速度也越來越快。可以說基于region proposal的R-CNN系列目標檢測方法是當前目標最主要的一個分支。
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幀每秒。???? 總結:YOLO的提出給目標檢測一個新的思路,SSD的性能則讓我們看到了目標檢測在實際應用中真正的可能性。
四. 提高目標檢測方法 ???? R-CNN系列目標檢測框架和YOLO目標檢測框架給了我們進行目標檢測的兩個基本框架。除此之外,研究人員基于這些框架從其他方面入手提出了一系列提高目標檢測性能的方法。???? (1) 難分樣本挖掘(hard negative mining)???? R-CNN在訓練SVM分類器時使用了難分樣本挖掘的思想,但Fast R-CNN和Faster R-CNN由于使用端到端的訓練策略并沒有使用難分樣本挖掘(只是設置了正負樣本的比例并隨機抽取)。CVPR2016的Training Region-based Object Detectors with Online Hard Example Mining(oral)將難分樣本挖掘(hard example mining)機制嵌入到SGD算法中,使得Fast R-CNN在訓練的過程中根據region proposal的損失自動選取合適的region proposal作為正負例訓練。實驗結果表明使用OHEM(Online Hard Example Mining)機制可以使得Fast R-CNN算法在VOC2007和VOC2012上mAP提高 4%左右。???? (2) 多層特征融合???? Fast R-CNN和Faster R-CNN都是利用了最后卷積層的特征進行目標檢測,而由于高層的卷積層特征已經損失了很多細節信息(pooling操作),所以在定位時不是很精準。HyperNet等一些方法則利用了CNN的多層特征融合進行目標檢測,這不僅利用了高層特征的語義信息,還考慮了低層特征的細節紋理信息,使得目標檢測定位更精準。???? (3)?使用上下文信息????在提取region proposal特征進行目標檢測時,結合region proposal上下文信息,檢測效果往往會更好一些。(Object detection via a multi-region & semantic segmentation-aware CNN model以及Inside-Outside Net等論文中都使用了上下文信息)
2017.08.02
總結
以上是生活随笔為你收集整理的【深度学习】基于深度学习的目标检测研究进展的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【caffe】使用自己的图像数据训练le
- 下一篇: 【caffe】使用draw_net绘制n