天天看點

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

一篇非常好的文章,是轉載的喲,轉載連結見底部~

object detection我的了解,就是在給定的圖檔中精确找到物體所在位置,并标注出物體的類别。object detection要解決的問題就是物體在哪裡,是什麼這整個流程的問題。然而,這個問題可不是那麼容易解決的,物體的尺寸變化範圍很大,擺放物體的角度,姿态不定,而且可以出現在圖檔的任何地方,更何況物體還可以是多個類别。

object detection技術的演進:

RCNN->SppNET->Fast-RCNN->Faster-RCNN

從圖像識别的任務說起

這裡有一個圖像任務:

既要把圖中的物體識别出來,又要用方框框出它的位置。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

上面的任務用專業的說法就是:圖像識别+定位

圖像識别(classification):

輸入:圖檔

輸出:物體的類别

評估方法:準确率

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

定位(localization):

輸入:圖檔

輸出:方框在圖檔中的位置(x,y,w,h)

評估方法:檢測評價函數 intersection-over-union ( IOU ) 

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

卷積神經網絡CNN已經幫我們完成了圖像識别(判定是貓還是狗)的任務了,我們隻需要添加一些額外的功能來完成定位任務即可。

定位的問題的解決思路有哪些?

思路一:看做回歸問題

看做回歸問題,我們需要預測出(x,y,w,h)四個參數的值,進而得出方框的位置。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟1:

  • 先解決簡單問題, 搭一個識别圖像的神經網絡

  • 在AlexNet VGG GoogleLenet上fine-tuning一下

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟2:

  • 在上述神經網絡的尾部展開(也就說CNN前面保持不變,我們對CNN的結尾處作出改進:加了兩個頭:“分類頭”和“回歸頭”)

  • 成為classification + regression模式

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟3:

  • Regression那個部分用歐氏距離損失

  • 使用SGD訓練

步驟4:

  • 預測階段把2個頭部拼上

  • 完成不同的功能

這裡需要進行兩次fine-tuning

第一次在ALexNet上做,第二次将頭部改成regression head,前面不變,做一次fine-tuning

Regression的部分加在哪?

有兩種處理方法:

  • 加在最後一個卷積層後面(如VGG)

  • 加在最後一個全連接配接層後面(如R-CNN)

regression太難做了,應想方設法轉換為classification問題。

regression的訓練參數收斂的時間要長得多,是以上面的網絡采取了用classification的網絡來計算出網絡共同部分的連接配接權值。

思路二:取圖像視窗

  • 還是剛才的classification + regression思路

  • 咱們取不同的大小的“框”

  • 讓框出現在不同的位置,得出這個框的判定得分

  • 取得分最高的那個框

左上角的黑框:得分0.5

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

右上角的黑框:得分0.75

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

左下角的黑框:得分0.6

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

右下角的黑框:得分0.8

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

根據得分的高低,我們選擇了右下角的黑框作為目标位置的預測。

注:有的時候也會選擇得分最高的兩個框,然後取兩框的交集作為最終的位置預測。

疑惑:框要取多大?

取不同的框,依次從左上角掃到右下角。非常粗暴啊。

總結一下思路:

對一張圖檔,用各種大小的框(周遊整張圖檔)将圖檔截取出來,輸入到CNN,然後CNN會輸出這個框的得分(classification)以及這個框圖檔對應的x,y,h,w(regression)。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

這方法實在太耗時間了,做個優化。

原來網絡是這樣的:

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

優化成這樣:把全連接配接層改為卷積層,這樣可以提提速。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

物體檢測(Object Detection)

當圖像有很多物體怎麼辦的?難度可是一下暴增啊。

那任務就變成了:多物體識别+定位多個物體

那把這個任務看做分類問題?

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

看成分類問題有何不妥?

  • 你需要找很多位置, 給很多個不同大小的框

  • 你還需要對框内的圖像分類

  • 當然, 如果你的GPU很強大, 恩, 那加油做吧…

看做classification, 有沒有辦法優化下?我可不想試那麼多框那麼多位置啊!

有人想到一個好方法:

找出可能含有物體的框(也就是候選框,比如選1000個候選框),這些框之間是可以互相重疊互相包含的,這樣我們就可以避免暴力枚舉的所有框了。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

大牛們發明好多標明候選框的方法,比如EdgeBoxes和Selective Search。

以下是各種標明候選框的方法的性能對比。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

有一個很大的疑惑,提取候選框用到的算法“選擇性搜尋”到底怎麼選出這些候選框的呢?那個就得好好看看它的論文了,這裡就不介紹了。

R-CNN橫空出世

基于以上的思路,RCNN的出現了。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟一:訓練(或者下載下傳)一個分類模型(比如AlexNet)

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟二:對該模型做fine-tuning

  • 将分類數從1000改為20

  • 去掉最後一個全連接配接層

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟三:特征提取

  • 提取圖像的所有候選框(選擇性搜尋)

  • 對于每一個區域:修正區域大小以适合CNN的輸入,做一次前向運算,将第五個池化層的輸出(就是對候選框提取到的特征)存到硬碟

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟四:訓練一個SVM分類器(二分類)來判斷這個候選框裡物體的類别

每個類别對應一個SVM,判斷是不是屬于這個類别,是就是positive,反之nagative

比如下圖,就是狗分類的SVM

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

步驟五:使用回歸器精細修正候選框位置:對于每一個類,訓練一個線性回歸模型去判定這個框是否框得完美。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

RCNN的進化中SPP Net的思想對其貢獻很大,這裡也簡單介紹一下SPP Net。

SPP Net

SPP:Spatial Pyramid Pooling(空間金字塔池化)

它的特點有兩個:

1.結合空間金字塔方法實作CNNs的對尺度輸入。

一般CNN後接全連接配接層或者分類器,他們都需要固定的輸入尺寸,是以不得不對輸入資料進行crop或者warp,這些預處理會造成資料的丢失或幾何的失真。SPP Net的第一個貢獻就是将金字塔思想加入到CNN,實作了資料的多尺度輸入。

如下圖所示,在卷積層和全連接配接層之間加入了SPP layer。此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

 

2.隻對原圖提取一次卷積特征

在R-CNN中,每個候選框先resize到統一大小,然後分别作為CNN的輸入,這樣是很低效的。

是以SPP Net根據這個缺點做了優化:隻對原圖進行一次卷積得到整張圖的feature map,然後找到每個候選框zaifeature map上的映射patch,将此patch作為每個候選框的卷積特征輸入到SPP layer和之後的層。節省了大量的計算時間,比R-CNN有一百倍左右的提速。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

Fast R-CNN

SPP Net真是個好方法,R-CNN的進階版Fast R-CNN就是在RCNN的基礎上采納了SPP Net方法,對RCNN作了改進,使得性能進一步提高。

R-CNN與Fast RCNN的差別有哪些呢?

先說RCNN的缺點:即使使用了selective search等預處理步驟來提取潛在的bounding box作為輸入,但是RCNN仍會有嚴重的速度瓶頸,原因也很明顯,就是計算機對所有region進行特征提取時會有重複計算,Fast-RCNN正是為了解決這個問題誕生的。

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

大牛提出了一個可以看做單層sppnet的網絡層,叫做ROI Pooling,這個網絡層可以把不同大小的輸入映射到一個固定尺度的特征向量,而我們知道,conv、pooling、relu等操作都不需要固定size的輸入,是以,在原始圖檔上執行這些操作後,雖然輸入圖檔size不同導緻得到的feature map尺寸也不同,不能直接接到一個全連接配接層進行分類,但是可以加入這個神奇的ROI Pooling層,對每個region都提取一個固定次元的特征表示,再通過正常的softmax進行類型識别。另外,之前RCNN的處理流程是先提proposal,然後CNN提取特征,之後用SVM分類器,最後再做bbox regression,而在Fast-RCNN中,作者巧妙的把bbox regression放進了神經網絡内部,與region分類和并成為了一個multi-task模型,實際實驗也證明,這兩個任務能夠共享卷積特征,并互相促進。Fast-RCNN很重要的一個貢獻是成功的讓人們看到了Region Proposal+CNN這一架構實時檢測的希望,原來多類檢測真的可以在保證準确率的同時提升處理速度,也為後來的Faster-RCNN做下了鋪墊。

畫一畫重點:

R-CNN有一些相當大的缺點(把這些缺點都改掉了,就成了Fast R-CNN)。

大缺點:由于每一個候選框都要獨自經過CNN,這使得花費的時間非常多。

解決:共享卷積層,現在不是每一個候選框都當做輸入進入CNN了,而是輸入一張完整的圖檔,在第五個卷積層再得到每個候選框的特征

原來的方法:許多候選框(比如兩千個)-->CNN-->得到每個候選框的特征-->分類+回歸

現在的方法:一張完整圖檔-->CNN-->得到每張候選框的特征-->分類+回歸

是以容易看見,Fast RCNN相對于RCNN的提速原因就在于:不過不像RCNN把每個候選區域給深度網絡提特征,而是整張圖提一次特征,再把候選框映射到conv5上,而SPP隻需要計算一次特征,剩下的隻需要在conv5層上操作就可以了。

在性能上提升也是相當明顯的:

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

Faster R-CNN

Fast R-CNN存在的問題:存在瓶頸:選擇性搜尋,找出所有的候選框,這個也非常耗時。那我們能不能找出一個更加高效的方法來求出這些候選框呢?

解決:加入一個提取邊緣的神經網絡,也就說找到候選框的工作也交給神經網絡來做了。

做這樣的任務的神經網絡叫做Region Proposal Network(RPN)。

具體做法:

  • 将RPN放在最後一個卷積層的後面

  • RPN直接訓練得到候選區域

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

RPN簡介:

  • 在feature map上滑動視窗

  • 建一個神經網絡用于物體分類+框位置的回歸

  • 滑動視窗的位置提供了物體的大體位置資訊

  • 框的回歸提供了框更精确的位置

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

一種網絡,四個損失函數;

  • RPN calssification(anchor good.bad)

  • RPN regression(anchor->propoasal)

  • Fast R-CNN classification(over classes)

  • Fast R-CNN regression(proposal ->box)

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

速度對比

基于深度學習的目标檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNNYIPIAN

Faster R-CNN的主要貢獻是設計了提取候選區域的網絡RPN,代替了費時的選擇性搜尋,使得檢測速度大幅提高。

最後總結一下各大算法的步驟:

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系列目标檢測方法是目前目标檢測技術領域最主要的一個分支。

本文轉載自https://www.cnblogs.com/skyfsm/p/6806246.html

繼續閱讀