RCNN/SPP/FAST RCNN/FASTER RCNN/YOLO/SSD算法簡介

RCNN:

RCNN(Regions with CNN features)是將CNN方法應用到目標檢測問題上的一個里程碑,由年輕有爲的RBG大神提出,藉助CNN良好的特徵提取和分類性能,通過RegionProposal方法實現目標檢測問題的轉化。

        算法可以分爲四步:

        1)候選區域選擇

        Region Proposal是一類傳統的區域提取方法,可以看作不同寬高的滑動窗口,通過窗口滑動獲得潛在的目標圖像,關於Proposal大家可以看下SelectiveSearch,一般Candidate選項爲2k個即可,這裏不再詳述;

        根據Proposal提取的目標圖像進行歸一化,作爲CNN的標準輸入。

        2)CNN特徵提取

        標準CNN過程,根據輸入進行卷積/池化等操作,得到固定維度的輸出;

        3)分類與邊界迴歸

        實際包含兩個子步驟,一是對上一步的輸出向量進行分類(需要根據特徵訓練分類器);二是通過邊界迴歸(bounding-box regression) 得到精確的目標區域,由於實際目標會產生多個子區域,旨在對完成分類的前景目標進行精確的定位與合併,避免多個檢出。

RCNN存在三個明顯的問題:

1)多個候選區域對應的圖像需要預先提取,佔用較大的磁盤空間;

2)針對傳統CNN需要固定尺寸的輸入圖像,crop/warp(歸一化)產生物體截斷或拉伸,會導致輸入CNN的信息丟失;

3)每一個ProposalRegion都需要進入CNN網絡計算,上千個Region存在大量的範圍重疊,重複的特徵提取帶來巨大的計算浪費。

•   SPP-Net

        智者善於提出疑問,既然CNN的特徵提取過程如此耗時(大量的卷積計算),爲什麼要對每一個候選區域獨立計算,而不是提取整體特徵,僅在分類之前做一次Region截取呢?智者提出疑問後會立即付諸實踐,於是SPP-Net誕生了。

SPP-Net在RCNN的基礎上做了實質性的改進:

1)取消了crop/warp圖像歸一化過程,解決圖像變形導致的信息丟失以及存儲問題;

2)採用空間金字塔池化(SpatialPyramid Pooling )替換了 全連接層之前的最後一個池化層(上圖top),翠平說這是一個新詞,我們先認識一下它。

        爲了適應不同分辨率的特徵圖,定義一種可伸縮的池化層,不管輸入分辨率是多大,都可以劃分成m*n個部分。這是SPP-net的第一個顯著特徵,它的輸入是conv5特徵圖 以及特徵圖候選框(原圖候選框 通過stride映射得到),輸出是固定尺寸(m*n)特徵;

        還有金字塔呢?通過多尺度增加所提取特徵的魯棒性,這並不關鍵,在後面的Fast-RCNN改進中該特徵已經被捨棄;

        最關鍵的是SPP的位置,它放在所有的卷積層之後,有效解決了卷積層的重複計算問題(測試速度提高了24~102倍),這是論文的核心貢獻。

儘管SPP-Net貢獻很大,仍然存在很多問題:

1)和RCNN一樣,訓練過程仍然是隔離的,提取候選框 | 計算CNN特徵| SVM分類 | Bounding Box迴歸獨立訓練,大量的中間結果需要轉存,無法整體訓練參數;

2)SPP-Net在無法同時Tuning在SPP-Layer兩邊的卷積層和全連接層,很大程度上限制了深度CNN的效果;

3)在整個過程中,Proposal Region仍然很耗時。

•   Fast-RCNN

        問題很多,解決思路同樣也非常巧妙,ok,再次感謝 RBG 大神的貢獻,直接引用論文原圖(描述十分詳盡)。

        Fast-RCNN主要貢獻在於對RCNN進行加速,快是我們一直追求的目標(來個山寨版的奧運口號- 更快、更準、更魯棒),問題在以下方面得到改進:

        1)賣點1 - 借鑑SPP思路,提出簡化版的ROI池化層(注意,沒用金字塔),同時加入了候選框映射功能,使得網絡能夠反向傳播,解決了SPP的整體網絡訓練問題;

        2)賣點2 - 多任務Loss層

    A)SoftmaxLoss代替了SVM,證明了softmax比SVM更好的效果;

    B)SmoothL1Loss取代Bouding box迴歸。

        將分類和邊框迴歸進行合併(又一個開創性的思路),通過多任務Loss層進一步整合深度網絡,統一了訓練過程,從而提高了算法準確度。

        3)全連接層通過SVD加速

            這個大家可以自己看,有一定的提升但不是革命性的。

        4)結合上面的改進,模型訓練時可對所有層進行更新,除了速度提升外(訓練速度是SPP的3倍,測試速度10倍),得到了更好的檢測效果(VOC07數據集mAP爲70,注:mAP,mean Average Precision)。

        接下來分別展開這裏面的兩大賣點:

        前面已經瞭解過可伸縮的池化層,那麼在訓練中參數如何通過ROI Pooling層傳導的?根據鏈式求導法則,對於yj = max(xi) 傳統的max pooling的映射公式:

        其中 爲判別函數,爲1時表示選中爲最大值,0表示被丟棄,誤差不需要回傳,即對應 權值不需要更新。如下圖所示,對於輸入 xi 的擴展公式表示爲:

      (i,r,j) 表示 xi 在第 r 個框的第  j 個節點是否被選中爲最大值(對應上圖 y0,8 和 y1,0),xi 參數在前向傳導時受後面梯度誤差之和的影響。

        多任務Loss層(全連接層)是第二個核心思路,如上圖所示,其中cls_score用於判斷分類,bbox_reg計算邊框迴歸,label爲訓練樣本標記。

        其中Lcls爲分類誤差:

        px 爲對應Softmax分類概率,pl 即爲label所對應概率(正確分類的概率),pl = 1時,計算結果Loss爲0, 越小,Loss值越大(0.01對應Loss爲2)。

       Lreg爲邊框迴歸誤差:

        即在正確分類的情況下,迴歸框與Label框之間的誤差(Smooth L1), 對應描述邊框的4個參數(上下左右or平移縮放),g對應單個參數的差異,|x|>1 時,變換爲線性以降低離羣噪聲:

         Ltotal爲加權目標函數(背景不考慮迴歸Loss):

 細心的小夥伴可能發現了,我們提到的SPP的第三個問題還沒有解決,依然是耗時的候選框提取過程(忽略這個過程,Fast-RCNN幾乎達到了實時),那麼有沒有簡化的方法呢?

        必須有,搞學術一定要有這種勇氣。

•   Faster-RCNN

        對於提取候選框最常用的SelectiveSearch方法,提取一副圖像大概需要2s的時間,改進的EdgeBoxes算法將效率提高到了0.2s,但是這還不夠。

        候選框提取不一定要在原圖上做,特徵圖上同樣可以,低分辨率特徵圖意味着更少的計算量,基於這個假設,MSRA的任少卿等人提出RPN(RegionProposal Network),完美解決了這個問題,我們先來看一下網絡拓撲。

        通過添加額外的RPN分支網絡,將候選框提取合併到深度網絡中,這正是Faster-RCNN里程碑式的貢獻。

RPN網絡的特點在於通過滑動窗口的方式實現候選框的提取,每個滑動窗口位置生成9個候選窗口(不同尺度、不同寬高),提取對應9個候選窗口(anchor)的特徵,用於目標分類和邊框迴歸,與FastRCNN類似。

        目標分類只需要區分候選框內特徵爲前景或者背景。

        邊框迴歸確定更精確的目標位置,基本網絡結構如下圖所示:

        訓練過程中,涉及到的候選框選取,選取依據:

1)丟棄跨越邊界的anchor;

2)與樣本重疊區域大於0.7的anchor標記爲前景,重疊區域小於0.3的標定爲背景;

      對於每一個位置,通過兩個全連接層(目標分類+邊框迴歸)對每個候選框(anchor)進行判斷,並且結合概率值進行捨棄(僅保留約300個anchor),沒有顯式地提取任何候選窗口,完全使用網絡自身完成判斷和修正。

        從模型訓練的角度來看,通過使用共享特徵交替訓練的方式,達到接近實時的性能,交替訓練方式描述爲:

1)根據現有網絡初始化權值w,訓練RPN;

2)用RPN提取訓練集上的候選區域,用候選區域訓練FastRCNN,更新權值w;

3)重複1、2,直到收斂。

        因爲Faster-RCNN,這種基於CNN的real-time 的目標檢測方法看到了希望,在這個方向上有了進一步的研究思路。至此,我們來看一下RCNN網絡的演進,如下圖所示:

     Faster實現了端到端的檢測,並且幾乎達到了效果上的最優,速度方向的改進仍有餘地,於是YOLO誕生了。

•   YOLO

        YOLO來自於“YouOnly Look Once”,你只需要看一次,不需要類似RPN的候選框提取,直接進行整圖迴歸就可以了,簡單吧?

        算法描述爲:

1)將圖像劃分爲固定的網格(比如7*7),如果某個樣本Object中心落在對應網格,該網格負責這個Object位置的迴歸;

2)每個網格預測包含Object位置與置信度信息,這些信息編碼爲一個向量;

3)網絡輸出層即爲每個Grid的對應結果,由此實現端到端的訓練。

        YOLO算法的問題有以下幾點:

1)7*7的網格迴歸特徵丟失比較嚴重,缺乏多尺度迴歸依據;

2)Loss計算方式無法有效平衡(不管是加權或者均差),Loss收斂變差,導致模型不穩定。

Object(目標分類+迴歸)<=等價於=>背景(目標分類)

        導致Loss對目標分類+迴歸的影響,與背景影響一致,部分殘差無法有效回傳;

整體上YOLO方法定位不夠精確,貢獻在於提出給目標檢測一個新的思路,讓我們看到了目標檢測在實際應用中真正的可能性。

        這裏備註一下,直接回歸可以認爲最後一層即是對應7*7個網格的特徵結果,每一個網格的對應向量代表了要回歸的參數(比如pred、cls、xmin、ymin、xmax、ymax),參數的含義在於Loss函數的設計。

•   SSD

        由於YOLO本身採用的SingleShot基於最後一個卷積層實現,對目標定位有一定偏差,也容易造成小目標的漏檢。

        借鑑Faster-RCNN的Anchor機制,SSD(Single Shot MultiBox Detector)在一定程度上解決了這個問題,我們先來看下SSD的結構對比圖。

      基於多尺度特徵的Proposal,SSD達到了效率與效果的平衡,從運算速度上來看,能達到接近實時的表現,從效果上看,要比YOLO更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章