• 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)。
接下來分別展開這裡面的兩大賣點:
其中 為判別函式,為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)。

即在正確分類的情況下,迴歸框與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方法定位不夠精確,貢獻在於提出給目標檢測一個新的思路,讓我們看到了目標檢測在實際應用中真正的可能性。
• SSD
由於YOLO本身採用的SingleShot基於最後一個卷積層實現,對目標定位有一定偏差,也容易造成小目標的漏檢。
借鑑Faster-RCNN的Anchor機制,SSD(Single Shot MultiBox Detector)在一定程度上解決了這個問題,我們先來看下SSD的結構對比圖。

基於多尺度特徵的Proposal,SSD達到了效率與效果的平衡,從運算速度上來看,能達到接近實時的表現,從效果上看,要比YOLO更好。
写评论
很抱歉,必須登入網站才能發佈留言。