目標檢測-RCNN系列

•   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 RCNN的網路結構(基於VGG16):

        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更好。

        對於目標檢測網路的探索仍在一個快速的過程中,有些基於Faster-RCNN的變種準確度已經刷到了87%以上,而在速度的改進上,YOLO2也似乎會給我們帶來一定的驚喜,“未來已來”,我們拭目以待!