原文出處: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系列目標檢測方法是當前目標最主要的一個分支。