object detection 就是在給定的圖片中精確找到物體所在位置,并標注出物體的類別。object detection 要解決的問題就是物體在哪里,是什么這整個流程的問題。然而,這個問題不是容易解決的,物體的尺寸變化范圍很大,擺放物體的角度,姿態不定,可以出現在圖片的任何地方,而且物體還可以是多個類別。
object detection技術的演進:RCNN->SppNET->Fast-RCNN->Faster-RCNN
傳統的目標檢測方法
傳統的目標檢測方法一般分為三個階段:首先在給定的圖像上選擇一些候選的區域,然后對這些區域提取特征,最后使用訓練的分類器進行分類。
1. 區域選擇
這一步是為了對目標進行定位。傳統方法是采用窮舉策略。由于目標可能在圖片上的任意位置,大小不定,因此使用滑動窗口的策略對整幅圖像進行遍歷,而且需要設置不同的長寬。這種策略雖然可以檢測到所有可能出現的位置,但是時間復雜度太高,產生的冗余窗口太多,嚴重影響后續特征的提取和分類速度的性能。
2. 特征提取
提取特征的好壞會直接影響到分類的準確性,但又由于目標的形態多樣性,提取一個魯棒的特征并不是一個簡單的事。這個階段常用的特征有SIFT(尺度不變特征變換 ,Scale-invariant feature transform)和HOG( 方向梯度直方圖特征,Histogram of Oriented Gradient)等。
3. 分類器
主要有SVM,Adaboost等
綜上所述,傳統目標檢測存在兩個主要問題:一個是基于滑動窗口的區域選擇策略沒有針對性,時間復雜度高,窗口冗余;二是手工設計的特征對于多樣性沒有很好的魯棒性。
Region proposal+CNN(RCNN)
文章鏈接:Region-based Convolution Networks for Accurate Object detection and Segmentation
針對滑動窗口問題,region proposal(候選區域)是預先找出圖中目標可能出現的位置,這可以保證在選取較少窗口(幾千個甚至幾百個)的情況下保持較高的召回率。并且獲取的候選窗口要比滑動窗口的質量更高(滑動窗口固定長寬比)。針對特征選取,卷積神經網絡(convolution neural network: CNN) 的特征比傳統手工特征效果更好。因此在2014年,RBG(Ross B. Girshick )使用 Region proposal+CNN(RCNN)代替傳統目標檢測使用的滑動窗口+手工設計特征,設計了RCNN框架,使得目標檢測取得巨大突破,并開啟了基于深度學習的目標檢測熱潮。
1 檢測流程
RCNN主要分為3個大部分,第一部分產生候選區域,第二部分對每個候選區域使用CNN提取長度固定的特征;第三個部分使用一系列的SVM進行分類。
下圖是RCNN的整體檢測流程:
- 首先輸入一張自然圖像;
- 使用Selective Search提取大約2000個候選區域(proposal);
- 對每個候選區域的圖像進行拉伸形變,使之成為固定大小的正方形圖像,并將該圖像輸入到CNN中提取特征;
- 使用線性的SVM對提取的特征進行分類。
下面我們來分布介紹這幾個步驟。
1.1 候選區域的產生
RCNN使用Selective Search算法提取圖像中的候選區域。
大牛們發明好多選定候選框的方法,比如EdgeBoxes和Selective Search。以下是各種選定候選框的方法的性能對比。
1.2 CNN特征提取
作者用 AlexNet 對得到的候選區域的圖像進行特征提取,最終生成的是一個4096維的特征向量。注意 AlexNet 輸入的是227x227大小的圖像,因此在輸入到 AlexNet 之前,作者把候選區域的圖像首先進行了一小部分的邊緣擴展(16像素),然后進行了拉伸操作,使得輸入的候選區域圖像滿足AlexNet的輸入要求(即227x227)。
作者在這里其實進行了一部分實驗,考慮怎樣使候選區域圖像滿足AlexNet的輸入要求,在文章的附錄A中進行了介紹,以下是附錄A中實驗的三種方法:最終作者選擇的是D中的直接拉伸的方法。
1.3 SVM特征分類
作者論文里并沒有介紹怎么進行SVM的特征分類,不過要注意的是作者為每個類都訓練了一個SVM分類器,在訓練/檢測的過程中使用這些分類器為每一類進行分類。
CNN表面是在分類,但真正目的其實只是提取特征,提取特征之后,每個候選框可以得到一個4096維的特征向量,使用得到的CNN特征再輸入線性SVM中訓練分類器。
SVM支持向量機其實是可以支持多分類的,即SVMs分類器。但是論文不是對21個類(別漏了background類)使用一個SVM,而是使用了One-Versu-All的方法,對每個類別都使用個SVM(這里只需要20個SVM)。方法很簡單,對于每個類別來說,一個Region如果不是該類別,那就是背景。由于負樣本很多,使用?hard negative mining?方法。每個SVM判斷候選框是否屬于這一類。對于2000個候選框,將屬于第i類的所有候選框進行分類,并按照得分進行降序排列,然后使用?MNS?去除重疊的候選框。
為什么不直接使用CNN的分類結果,而還要繼續訓練若干個SVM分類器呢?
作者也直接使用CNN分類結果進行了實驗,發現效果相比SVM有所降低,他發現使用CNN直接分類結果并不注重于精確定位(我覺得這個情況很合理,因為CNN識別能力非常強大,非常的魯棒,所以不是那么精確的定位也可以得到比較好的結果,所以不注重精確定位)第二個原因在于SVM 訓練時采用的 hard negative mining 選擇的樣本比 CNN 中隨機選擇的樣本要好,所以結果會更好。作者也提出,可能通過更改 fine-tuning 的一些細節可以提升效果(他們也是這么做的,Fast RCNN中他們改變了loss函數)。
因為CNN容易過擬合,想要期望樣本數目多一些,所以在判斷正樣本的時候條件比較松,IoU>0.5就認為是正樣本,而SVM本身是結構風險最小,以SVM為分類器時改變了正負樣本的判定條件:候選框完全包含 GoundTruth 的定位框才是正樣本,當IoU<0.3時是負樣本。
2 訓練與測試
2.1?訓練
- 預訓練 AlexNet 網絡。將訓練好的模型保存。
- fine-tuning 。這種方法也是當數據量不夠的時候,常用的一種訓練方式,即先用別的數據庫訓練網絡,然后再用自己的數據庫微調訓練(fine-tuning)。 首先會逐步讀入圖片,然后采用 seletive search 對讀入的圖片生成候選區域,再計算每個候選區域和 ground truth (代碼中的fine_turn_list)的IOU。當IOU大于閾值時,則認為是當前的候選區域屬于正確類。并且將其標定為相應的類別(label)。這樣每一個候選區域就會產生相應的label即(image, label),?(image, label)就是Fineturn訓練的訓練集。然后利用這些數據訓練 AlexNet 網絡,這時候參數的初始化即為步驟1中與訓練的結果,將訓練好的 fine-tuning 模型保存。
- SVM訓練。采用與2相同的方法生成 SVM?訓練集。首先會逐步讀入圖片,然后采用 seletive search 對讀入的圖片生成候選區域,這時候會生成候選區域候選框的坐標信息, 再計算每個候選區域和 ground truth (代碼中的fine_turn_list)的IOU。當IOU大于閾值時,則認為是當前的候選區域屬于正確類,并且將其標定為相應的類別(label), 并將這個label對應的候選區域圖(image)的候選框坐標信息與ground truth的位置信息作對比,保留相對位置(平移和縮放)信息保留下來(label_bbox),作為訓練數據。這樣整個訓練數據則為(image, label, label_bbox)對。但是在訓練 SVM 時不會用到label_bbox信息,SVM 還只是用來分類。而且需要對每種類型都單獨訓練一個分類器, 并保存訓練好的模型,備用。另外 SVM 分類器的輸入是 AlexNet 網絡 softmax 鏈接層之前的全連接層的輸出結果。
- 候選框回歸(Reg_box)。這個模型的訓練集就是3中方法生成的(image, label_bbox)對。模型會計算出候選框相對于 ground truth 的平移縮放結果。
2.2 測試
在測試階段,首先使用selective search提取測試圖像的2000個proposals,然后將所有proposal圖像拉伸到合適的大小并用CNN進行特征提取,得到固定長度的特征向量。最終對于每個類別,使用為該類別訓練的SVM分類器對得到的所有特征向量(對應每個proposal圖像)進行打分(代表的是這個proposal是該類的概率)。如果不是背景,用Reg_box生成平移縮放值, 然后對生成的候選區域進行調整。最后應用了一次NMS(非最大值抑制)
作者對測試階段的時間進行了分析,認為RCNN的優勢在于:(1)CNN中共享網絡參數(CNN本身特性);(2)CNN提取后的特征維度較低(相比之前的方法),計算更快。
作者在各階段的一些細節
ImageNet預訓練階段
作者首先在ImageNet上進行了CNN的預訓練,由于VOC 2012中訓練數據較少(相對而言),所以使用ImageNet預訓練然后再fine tune效果會更好。
Fine-tuning(微調)階段
在微調階段,作者把ImageNet上預訓練的網絡從1000個輸出改為21個輸出(VOC的20類+1類background),然后將所有與groundtruth的包圍框的IoU>= 0.5的proposal看作正類(20類之一),其他的全部看作背景類。在訓練時使用隨機梯度下降(SGD),學習率為0.001,在訓練的過程中隨機選取32個postive樣本和96個negative樣本,這樣選擇是因為在提取的proposal中background樣本要遠遠多于postive樣本。
SVM分類器訓練階段
在訓練SVMs的過程中,作者把IoU低于0.3的proposal設置為negative樣本,對于postive則是groundtruth的包圍盒圖像。作者對每個類別都訓練了一個線性的SVM分類器,由于訓練圖像過多,同時為了保證訓練的效果,所以作者在訓練的過程中采用了hard negative mining方法(hard negative mining訓練方法在我看來就是通過訓練挑出訓練集中那些總是被識別錯誤的負樣本作為訓練集)。
為什么fine-tuning時采用的IoU閾值和SVM訓練時采用的閾值不同呢?
首先作者承認,在實驗開始他們并沒有fine-tuning的過程,而最開始使用SVM訓練時閾值就是0.3,在訓練SVM時,正樣本為groundtruth,負樣本定義為與ground truth的IoU小于0.3的候選區域為負樣本,介于0.3與0.7之間的樣本忽略。
在后面的實驗中加入fine-tuing 以后,采用相同的閾值效果比使用現在的0.5閾值要差很多。作者的猜想是閾值的設置并不是很重要,而是微調時數據量的問題,在微調時采用0.5閾值的話會出現很多所謂的“抖動”的樣本,這些樣本于groundtruth的IoU在0.5到1之間,采用0.5的閾值以后正樣本增加了30倍,所以fine-tuning時訓練數據增多,效果會更好。?
而且 fine-tuning 時擔心過擬合的原因,要擴大正樣本的樣本量,所以定義比較寬松,但是SVM是最終用于分類的分類器,而且SVM原理就是最小的距離最大化,越難分的數據越有利于SVM的訓練,所以對樣本的定義比較嚴格。
Bounding-box回歸
作者在完成了前面提到的“生成候選區域——CNN提取特征——SVM進行分類”以后,為了進一步的提高定位效果,在文章的附錄C中介紹了Bounding-box Regression的處理。可以參考:深度學習之邊框回歸(Bounding Box Regression)。
小結:R-CNN在 PASCAL VOC2007上的檢測結果從 DPM HSC的34.3%直接提升到了66%(mAP)。如此大的提升使我們看到了region proposal+CNN的巨大優勢。 但是R-CNN框架也存在著很多問題:
- 訓練分為多個階段,步驟繁瑣: 微調網絡+訓練SVM+訓練邊框回歸器
- 訓練耗時,占用磁盤空間大:5000張圖像產生幾百G的特征文件
- 速度慢: 使用GPU, VGG16模型處理一張圖像需要47s。
針對速度慢的這個問題,SPP-NET給出了很好的解決方案。
SPP-NET (ECCV2014, TPAMI2015) (Spatial Pyramid Pooling)
它的特點有兩個:
1.結合空間金字塔方法實現CNNs的對尺度輸入。一般CNN后接全連接層或者分類器,他們都需要固定的輸入尺寸,因此不得不對輸入數據進行crop或者warp,這些預處理會造成數據的丟失或幾何的失真。SPP Net的第一個貢獻就是將金字塔思想加入到CNN,實現了數據的多尺度輸入。如下圖所示,在卷積層和全連接層之間加入了SPP layer。此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。
2.只對原圖提取一次卷積特征。在 R-CNN 中,每個候選框先 resize 到統一大小,然后分別作為CNN的輸入,這樣是很低效的。所以SPP Net根據這個缺點做了優化:只對原圖進行一次卷積得到整張圖的 feature map,然后找到每個候選框在 feature map 上的映射 patch,將此 patch 作為每個候選框的卷積特征輸入到 SPP layer 和之后的層。節省了大量的計算時間,比 R-CNN 有一百倍左右的提速。
小結:使用SPP-NET相比于R-CNN可以大大加快目標檢測的速度,但是依然存在著很多問題:
- 訓練分為多個階段,步驟繁瑣: 微調網絡+訓練SVM+訓練訓練邊框回歸器
- SPP-NET在微調網絡的時候固定了卷積層,只對全連接層進行微調,而對于一個新的任務,有必要對卷積層也進行微調。(分類的模型提取的特征更注重高層語義,而目標檢測任務除了語義信息還需要目標的位置信息)
針對這兩個問題,RBG又提出Fast R-CNN, 一個精簡而快速的目標檢測框架。
深度學習目標檢測:FAST RCNN?(ICCV2015)
SPP Net 真是個好方法,R-CNN 的進階版 Fast R-CNN 就是在 RCNN 的基礎上采納了 SPP Net方法,對RCNN作了改進,使得性能進一步提高。
FAST RCNN 提出了一個可以看做單層 spp-net 的網絡層,叫做?ROI Pooling,這個網絡層可以把不同大小的輸入映射到一個固定尺度的特征向量,而我們知道,conv、pooling、relu 等操作都不需要固定size的輸入,因此,在原始圖片上執行這些操作后,雖然輸入圖片size不同導致得到的feature map 尺寸也不同,不能直接接到一個全連接層進行分類,但是可以加入這個神奇的 ROI Pooling 層,對每個 region 都提取一個固定維度的特征表示,再通過正常的 softmax 進行類型識別。
FAST RCNN框架圖如下:
與R-CNN框架圖對比,可以發現主要有兩處不同:
- 一是最后一個卷積層后加了一個 ROI pooling layer,ROI pooling layer實際上是 SPP-NET 的一個精簡版。同時加入了候選框映射功能,使得網絡能夠反向傳播,解決了SPP的整體網絡訓練問題; ?
- 二是損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網絡中訓練。 R-CNN 訓練過程分為了三個階段,而 Fast R-CNN 直接使用 softmax 替代 SVM 分類,同時利用多任務損失函數把邊框回歸也加入到了網絡中,這樣整個的訓練過程是端到端的(除去 region proposal 提取階段)。Fast R-CNN在網絡微調的過程中,將部分卷積層也進行了微調,取得了更好的檢測效果。
- SmoothL1Loss取代Bouding box回歸。 ? ?
小結:Fast R-CNN融合了R-CNN和SPP-NET的精髓,并且引入多任務損失函數,使整個網絡的訓練和測試變得十分方便。
缺點:region proposal 的提取使用 selective search,目標檢測時間大多消耗在這上面(提取region proposal 2~3s,而提取特征分類只需0.32s),無法滿足實時應用,而且并沒有實現真正意義上的端到端訓練測試(region proposal 使用 selective search 先提取出來)。
深度學習目標檢測:FASTER RCNN?(NIPS2015)
網絡結構如下:
Fast R-CNN 存在的問題:存在瓶頸,Fast R-CNN 使用 selective search 找候選框,這個也非常耗時。那我們能不能找出一個更加高效的方法來求出這些候選框呢?當然可以,我們可以加入一個提取邊緣的神經網絡??Region Proposal Network(RPN)。也就是說找到候選框的工作也交給神經網絡來做了。
具體做法:
- 將RPN放在最后一個卷積層的后面
- RPN直接訓練得到候選區域
?
NIPS2015 版本的 Faster R-CNN 使用的檢測框架是 RPN網絡+Fast R-CNN網絡分離進行的目標檢測,整體流程跟Fast R-CNN一樣,只是region proposal現在是用RPN網絡提取的(代替原來的selective search)。RPN的核心思想是使用卷積神經網絡直接產生region proposal,使用的方法本質上就是滑動窗口。RPN的設計比較巧妙,只需在最后的卷積層上滑動一遍,因為anchor機制和邊框回歸可以得到多尺度多長寬比的 region proposal。 作者為了讓 RPN 網絡和 Fast R-CNN 網絡實現卷積層的權值共享,訓練 RPN 和 Fast R-CNN 的時候用了4階段的訓練方法:
- 使用在ImageNet上預訓練的模型初始化網絡參數,微調 RPN 網絡;
- 使用(1)中 RPN 網絡提取 region proposal 訓練 Fast R-CNN 網絡;
- 使用(2)的 Fast R-CNN 網絡重新初始化 RPN, 固定卷積層進行微調;
- 固定(2)中 Fast R-CNN 的卷積層,使用(3)中 RPN 提取的 region proposal 微調網絡。
權值共享后的RPN和Fast R-CNN用于目標檢測精度會提高一些。
小結:Faster R-CNN 將一直以來分離的 region proposal 和 CNN 分類融合到了一起,使用端到端的網絡進行目標檢測,無論在速度上還是精度上都得到了不錯的提高。然而 Faster R-CNN 還是達不到實時的目標檢測,預先獲取 region proposal,然后在對每個 proposal 分類計算量還是比較大。比較幸運的是YOLO這類目標檢測方法的出現讓實時性也變的成為可能。Faster R-CNN 可以達到每秒7幀,YOLO系列可以達到每秒40幀。
速度對比
Faster R-CNN的主要貢獻是設計了提取候選區域的網絡RPN,代替了費時的選擇性搜索,使得檢測速度大幅提高。
RCNN網絡的演進
因為Faster-RCNN,這種基于CNN的 real-time 的目標檢測方法看到了希望,在這個方向上有了進一步的研究思路。至此,我們來看一下RCNN網絡的演進,如下圖所示:
最后總結一下各大算法的步驟:
RCNN
1. 在圖像中確定約1000-2000個候選框 (使用選擇性搜索)
2. 每個候選框內圖像塊縮放至相同大小,并輸入到CNN內進行特征提取?
3. 對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
4. 對于屬于某一特征的候選框,用回歸器進一步調整其位置
Fast RCNN
1. 在圖像中確定約1000-2000個候選框 (使用選擇性搜索)
2. 對整張圖片輸進CNN,得到feature map
3. 找到每個候選框在feature map上的映射patch,將此patch作為每個候選框的卷積特征輸入到SPP layer和之后的層
4. 對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
5. 對于屬于某一特征的候選框,用回歸器進一步調整其位置
Faster RCNN
1. 對整張圖片輸進CNN,得到feature map
2. 卷積特征輸入到RPN,得到候選框的特征信息
3. 對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
4. 對于屬于某一特征的候選框,用回歸器進一步調整其位置
總的來說,從R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走來,基于深度學習目標檢測的流程變得越來越精簡,精度越來越高,速度也越來越快。可以說基于region proposal的R-CNN系列目標檢測方法是當前目標檢測技術領域最主要的一個分支。