1. 程式人生 > >基於深度學習的目標檢測框架總結

基於深度學習的目標檢測框架總結

目前比較主流的基於深度學習的目標檢測框架主要分為兩類,一類是基於two-stage的方法,比如RCNN,Fast RCNN,Faster RCNN,將檢測任務分為迴歸(location)和分類任務。還有基於one-stage的目標檢測框架,例如YOLO/YOLOv2,SSD等,同時完成檢測和迴歸任務。two-stage任務準確率較高,但是速度比較慢。one-stage能夠達到實時性但是犧牲了精度。下面一次對這些進行一個系統的總結。

R-CNN,Fast R-CNN,Faster R-CNN關係表

R-CNN

RCNN的思想是利用SS演算法提取候選框,然後利用CNN提取特徵,最後利用SVM進行識別。

簡單來說,RCNN使用以下四步實現目標檢測:

  1. 在影象中確定約1000-2000個候選框
  2. 對於每個候選框內影象塊,使用深度網路提取特徵
  3. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
  4. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置

selective search演算法

使用了Selective Search1方法從一張影象生成約2000-3000個候選區域。基本思路如下:

  • 使用一種過分割手段,將影象分割成小區域
  • 檢視現有小區域,合併可能性最高的兩個區域。重複直到整張影象合併成一個區域位置
  • 輸出所有曾經存在過的區域,所謂候選區域

分割的部分採取了基於圖的分割演算法

,其實這一部分沒太看懂。。。

合併規則

優先合併以下四種區域:
1. 顏色(顏色直方圖)相近的
2. 紋理(梯度直方圖)相近的
3. 合併後總面積小的
4. 合併後,總面積在其BBOX中所佔比例大的

第三條,保證合併操作的尺度較為均勻,避免一個大區域陸續“吃掉”其他小區域。

例:設有區域a-b-c-d-e-f-g-h。
較好的合併方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 
不好的合併方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

第四條,保證合併後形狀規則。

左圖適合合併,右圖不適合合併

上述四條規則只涉及區域的顏色直方圖、紋理直方圖、面積和位置。合併後的區域特徵可以直接由子區域特徵計算而來,速度較快。

多樣化與後處理

為儘可能不遺漏候選區域,上述操作在多個顏色空間中同時進行(RGB,HSV,Lab等)。在一個顏色空間中,使用上述四條規則的不同組合進行合併。所有顏色空間與所有規則的全部結果,在去除重複後,都作為候選區域輸出。

RCNN解決的問題是利用selective search演算法代替滑動視窗演算法,提升了產生region proposal演算法速度的問題。

Fast RCNN

Fast R-CNN框架與R-CNN有兩處不同:

① 最後一個卷積層後加了一個ROI pooling layer;

② 損失函式使用了multi-task loss(多工損失)函式,將邊框迴歸直接加到CNN網路中訓練。分類Fast R-CNN直接用softmax替代R-CNN用的SVM進行分類。

Fast R-CNN是端到端(end-to-end)的。

ROI Pooling

ROIs Pooling顧名思義,是Pooling層的一種,而且是針對RoIs的Pooling,他的特點是輸入特徵圖尺寸不固定,但是輸出特徵圖尺寸固定;[2]

什麼是ROI呢?
ROI是Region of Interest的簡寫,指的是在“特徵圖上的框”;
1)在Fast RCNN中, RoI是指Selective Search完成後得到的“候選框”在特徵圖上的對映,如下圖所示;
2)在Faster RCNN中,候選框是經過RPN產生的,然後再把各個“候選框”對映到特徵圖上,得到RoIs。

ROI Pooling的輸入

輸入有兩部分組成:
1. 特徵圖:指的是圖1中所示的特徵圖,在Fast RCNN中,它位於RoI Pooling之前,在Faster RCNN中,它是與RPN共享那個特徵圖,通常我們常常稱之為“share_conv”;
2. rois:在Fast RCNN中,指的是Selective Search的輸出;在Faster RCNN中指的是RPN的輸出,一堆矩形候選框框,形狀為1x5x1x1(4個座標+索引index),其中值得注意的是:座標的參考系不是針對feature map這張圖的,而是針對原圖的(神經網路最開始的輸入)

ROI Pooling的輸出

輸出是batch個vector,其中batch的值等於RoI的個數,vector的大小為channel * w * h;RoI Pooling的過程就是將一個個大小不同的box矩形框,都對映成大小固定(w * h)的矩形框;

其實這裡有一點空間金字塔池化(SSP)的思想。即將所有大小不同的候選框resize()成大小一樣的候選框。 參考ROI Pooling層詳解

multi task

cls_score層用於分類,輸出K+1維陣列p,表示屬於K類和背景的概率。
bbox_prdict層用於調整候選區域位置,輸出4*K維陣列t,表示分別屬於K類時,應該平移縮放的引數。

loss_cls層評估分類代價。由真實分類u對應的概率決定:

Lcls=logpu

loss_bbox評估檢測框定位代價。比較真實分類對應的預測引數tu和真實平移縮放參數為v的差別:

Lloc=i=14g(tiuvi)

g為Smooth L1誤差,對outlier不敏感:

g(x)={0.5x2|x|<1|x|0.5otherwise

總代價為兩者加權和,如果分類為背景則不考慮定位代價:

L={Lcls+LlocuLlocu

迴歸

Faster R-CNN

Faster R-CNN的思想

Faster R-CNN可以簡單地看做“區域生成網路RPNs + Fast R-CNN”的系統,用區域生成網路代替FastR-CNN中的Selective Search方法。Faster R-CNN這篇論文著重解決了這個系統中的三個問題:
1. 如何設計區域生成網路;
2. 如何訓練區域生成網路;
3. 如何讓區域生成網路和Fast RCNN網路共享特徵提取網路。

在整個Faster R-CNN演算法中,有三種尺度:
1. 原圖尺度:原始輸入的大小。不受任何限制,不影響效能。
2. 歸一化尺度:輸入特徵提取網路的大小,在測試時設定,原始碼中opts.test_scale=600。anchor在這個尺度上設定。這個引數和anchor的相對大小決定了想要檢測的目標範圍。
3. 網路輸入尺度:輸入特徵檢測網路的大小,在訓練時設定,原始碼中為224*224。

Faster R-CNN框架

Faster-R-CNN演算法由兩大模組組成:
1. PRN候選框提取模組;
2. Fast R-CNN檢測模組。

其中,RPN是全卷積神經網路,用於提取候選框;Fast R-CNN基於RPN提取的proposal檢測並識別proposal中的目標。

RPN網路

背景

目前最先進的目標檢測網路需要先用區域建議演算法推測目標位置,像SPPnet和Fast R-CNN這些網路雖然已經減少了檢測網路執行的時間,但是計算區域建議依然耗時較大。所以,在這樣的瓶頸下,RBG和Kaiming He一幫人將Region Proposal也交給CNN來做,這才提出了RPN(Region Proposal Network)區域建議網路用來提取檢測區域,它能和整個檢測網路共享全圖的卷積特徵,使得區域建議幾乎不花時間。

RCNN解決的是,“為什麼不用CNN做classification呢?”
Fast R-CNN解決的是,“為什麼不一起輸出bounding box和label呢?”
Faster R-CNN解決的是,“為什麼還要用selective search呢?”

基本思想

RPN的核心思想是使用CNN卷積神經網路直接產生Region Proposal,使用的方法本質上就是滑動視窗(只需在最後的卷積層上滑動一遍),因為anchor機制和邊框迴歸可以得到多尺度多長寬比的Region Proposal。

anchors機制

anchor是rpn網路的核心。剛剛說到,需要確定每個滑窗中心對應感受野記憶體在目標與否。由於目標大小和長寬比例不一,需要多個尺度的窗。Anchor即給出一個基準窗大小,按照倍數和長寬比例得到不同大小的窗。例如論文中基準窗大小為16,給了(8、16、32)三種倍數和(0.5、1、2)三種比例,這樣能夠得到一共9種尺度的anchor

分類和迴歸

前面介紹瞭如何anchors機制,接著就要思考如何判斷是否存在物體以及是否需要訓練

利用anchor是從第二列這個位置開始進行處理,這個時候,原始圖片已經經過一系列卷積層和池化層以及relu,得到了這裡的 feature:51x39x256(256是層數)在這個特徵引數的基礎上,通過一個3x3的滑動視窗,在這個51x39的區域上進行滑動,stride=1,padding=2,這樣一來,滑動得到的就是51x39個3x3的視窗。對於每個3x3的視窗,作者就計算這個滑動視窗的中心點所對應的原始圖片的中心點。然後作者假定,這個3x3視窗,是從原始圖片上通過SPP池化得到的,而這個池化的區域的面積以及比例,就是一個個的anchor。換句話說,對於每個3x3視窗,作者假定它來自9種不同原始區域的池化,但是這些池化在原始圖片中的中心點,都完全一樣。這個中心點,就是剛才提到的,3x3視窗中心點所對應的原始圖片中的中心點。如此一來,在每個視窗位置,我們都可以根據9個不同長寬比例、不同面積的anchor,逆向推匯出它所對應的原始圖片中的一個區域,這個區域的尺寸以及座標,都是已知的。而這個區域,就是我們想要的 proposal。所以我們通過滑動視窗和anchor,成功得到了 51x39x9 個原始圖片的proposal。接下來,每個proposal我們只輸出6個引數:每個 proposal 和 ground truth 進行比較得到的前景概率和背景概率(2個引數)(對應圖上的 cls_score);由於每個 proposal 和 ground truth 位置及尺寸上的差異,從 proposal 通過平移放縮得到 ground truth 需要的4個平移放縮引數(對應圖上的 bbox_pred)。

RPN訓練

RPN網路訓練,那麼就涉及ground truth和loss function的問題。對於左支路,ground truth為anchor是否為目標,用0/1表示。那麼怎麼判定一個anchor內是否有目標呢?論文中採用了這樣的規則:
1. 假如某anchor與任一目標區域的IoU最大,則該anchor判定為有目標;
2. 假如某anchor與任一目標區域的IoU>0.7,則判定為有目標;
3. 假如某anchor與任一目標區域的IoU<0.3,則判定為背景。所謂IoU,就是預測box和真實box的覆蓋率,其值等於兩個box的交集除以兩個box的並集。其它的anchor不參與訓練。

YOLO

  • 直接對bounding box迴歸,並不是計算候選和gt之間的 Δ ,並且不構造 hard negatives
  • 速度快,將檢測過程變為一個迴歸問題,簡化了很多計算過程(Faster R-CNN也是迴歸)
  • 全域性觀,不像R-CNN那樣只利用region資訊,YOLO會利用整體資訊
  • 泛化能力強,尤其訓練和測試資料不一致的時候可以表現比較好的泛化性
  • 準去率略低,YOLO是準確率和速度之間的tradeoff

基本原理

  1. 將原圖劃分為 S×S 的網格
  2. 每一個網格會預測B個bounding box和confidence得分,五元組具體為
    (x,y,w,h,Pr(Object)IOUtruthpred) ,其中 Pr(Object) 表示當前位置是一個Object的概率,IOU是預測的box和groundtruth之間的重疊概率(比例?)。其中xy是中心座標。
  3. 每一個網格預測類別概率 Ci=Pr(Classi|Object) .
  4. 預測的時候,將類條件概率和置信度相乘: