1. 程式人生 > >Faster R-CNN改進篇(一): ION ● HyperNet ● MS CNN

Faster R-CNN改進篇(一): ION ● HyperNet ● MS CNN

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/linolzhang/article/details/74159463

一. 源起於Faster

       深度學習於目標檢測的里程碑成果,來自於這篇論文:

       Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information Processing Systems. 2015.

       也可以參考:【論文翻譯

       雖然該文章前面已經講過,但只給出了很小的篇幅,並沒有作為獨立的一篇展開,這裡我們詳細展開並討論其 網路結構、應用領域 及 後續改進。

       前面文章參考:【目標檢測-RCNN系列

 

二. 網路結構

       Faster RCNN的網路結構圖如下:

        

       用的還是之前的圖,其實對於這張圖只需要記住一點:RPN網路,這是本文的核心貢獻,RPN通過深度網路實現了 Proposal 功能,相較於之前的 SS(Selective Search)方法 和 EdgeBoxes 方法有很大提升。

       RPN 我們來看原論文的圖:

        

       這張圖雖然經典,但描述的並不太清楚,有些人可能看不明白,有幾個關鍵點需要說明:

1)RPN 連線在 Conv5 之後

     參考網路結構圖,先理解 Conv5,Conv5是前面經過4次conv和pooling。

     對於原圖800*600的輸入,Feature尺寸 變為[800/16,600/16] = [50,37.5],

     Conv5的輸出維度為 256,Feature維度 為 256。

2)Anchor 生成與排序

     特徵圖採用滑窗方式遍歷,每個特徵畫素點 對應K個 Anchor(即不同的Scale和Size),上述input對應的Anchor Count為 50*38*k(9) = 17100。

     對應如此多的 Anchor,需要通過置信度剔除大多數Candidate,通常保留100-300個就足夠了。

     訓練過程中通過IOU進行正負樣本的選擇,測試過程中置信度較低的被丟棄。

3)RPN 輸出

     如上圖所示,輸出分為兩部分,2K Scores + 4K Reg,基於 256d 的 intermediate 層,通過兩個網路,同時進行 分類 + 迴歸,Scores提供了作為前景、背景目標的概率(2位),Reg提供了4個座標值,標識Box位置。

     參考如下Caffe結構圖,先通過3*3 的卷積核進行處理,然後1*1的卷積核進行降維,在 k=9 的情況下,每個畫素對應生成 2*k = 18個 Scores 引數 和 4*k = 36個 Reg引數。

     整體上 1*1 卷積生成的特徵是    分類W*H*18   &   迴歸W*H*36,其中 ReShape 是方便 Softmax 用的,可以忽略掉。

     Proposal層 根據 Softmax 輸出(丟棄背景),結合對應 Anchor和Stride進行對映,將Box對映到原圖,作為下一步 ROI Pooling 的輸入。

        

4)RPN 結合方式

     RPN 網路相對獨立於卷積層,原文中通過 ImageNet 資料集進行預訓練。

     微調時,分別固定 RPN引數 和 卷積網路引數,對另外的網路部分進行微調,也就是說,雖然 Faster實現了端到端的處理,但並未實現全域性的 Fine Turning。

 

5)ROI Pooling

     提取到的 Proposal 作為輸入送到 ROI Pooling 層,與 Conv5 特徵圖結合,即在特徵圖上標識出了 Proposal 的位置。

    > Smooth L1 Loss

        針對邊框迴歸,可以描述為一種對映,即通過 變換函式 f,將原 Box A=(Ax, Ay, Aw, Ah) 變換為:

               f(Ax, Ay, Aw, Ah) = (G'x, G'y, G'w, G'h) ,如下圖所示:

                

        t 表示與Ground Truth之間的差異係數(ln 是為了減少w,h的誤差比),公式描述為(其中紅色框內 σ 為一般形式,=1 時與 Fast 一致):

       

       ωin 和 ωout 作為開關控制當前項是否起作用。

 

三. 應用領域

       對於目標檢測的研究分為兩個方向,精度和效率,一方面以 Faster R-CNN為代表的RPN的方法在精度上不斷重新整理 mAP;另一方面,以SSD 和 YOLO v2 為代表的迴歸方法則是強調效率(或者說價效比),這兩個方向在領域內都有著很大的應用場景。

       Faster RCNN的代表特徵是Region Proposal,通過 RPN 將檢測分成兩步,提供 Proposal 和 Location+Class,Proposal 越準確,後面的複合Loss裡 Class所佔比例就越大,分類自然就更加準確。而回歸方法沒有 Proposal過程,通過 Location+Class直接回歸+分類,反向傳播誤差在Location上面大範圍迴歸,降低了分類佔比,因此分類準確度不好保證,特別是對於小目標,檢測精度比較差。

       檢測精度是演算法最核心的價值,即使是以效率為主的 迴歸方法 也會強調準確性,Faster 方法目前所實現的效率通常是 每秒3-5幀(GPU版本),這在非實時系統裡面實際上也是足夠使用的,比如在 農業上對於病蟲害的檢測,在醫療領域對於影象的後處理等等。

       實時系統的應用是更為廣闊的市場,這也是為什麼說目前有相當多的人持續投入研究,比如 ADAS、機器人、無人機等,這些領域對於 實時性、準確性、成本控制的要求 帶來了不斷重新整理紀錄的研究成果。

      

四. 後續改進

       關於 Faster RCNN 的改進比較多,我們將隨時關注,保持更新。

       可以參考資料集排名:【KITTI】 【PASCAL VOC 2012】【COCO】

       Faster R-CNN 的三個組成部分思路包括:

1)基礎特徵提取網路

      ResNet,IncRes V2,ResNeXt 都是顯著超越 VGG 的特徵網路,當然網路的改進帶來的是計算量的增加。

2)RPN

      通過更準確地  RPN 方法,減少 Proposal 個數,提高準確度。

3)改進分類迴歸層

      分類迴歸層的改進,包括 通過多層來提取特徵 和 判別。

 

 

@改進1:ION

       論文:Inside outside net: Detecting objects in context with skip pooling and recurrent neural networks   【點選下載

       提出了兩個方面的貢獻:

1)Inside Net

      所謂 Inside 是指在 ROI 區域之內,通過連線不同 Scale 下的 Feature Map,實現多尺度特徵融合。

      這裡採用的是 Skip-Pooling,從 conv3-4-5-context 分別提取特徵,後面會講到。

      多尺度特徵 能夠提升對小目標的檢測精度。

2)Outside Net

      所謂 Outside 是指 ROI 區域之外,也就是目標周圍的 上下文(Contextual)資訊。

      作者通過添加了兩個 RNN 層(修改後的 IRNN)實現上下文特徵提取。

      上下文資訊 對於目標遮擋有比較好的適應。

       來看結構圖:

        

  > 多尺度特徵

       本文不考慮 Region Proposal 的環節,只在 ROI 之後,從上圖可以看到,分別從 3、4、5 層提取特徵,然後再和 context得到的特徵做一個連線(concat),這樣做的依據是什麼呢?作者給出了實驗驗證結果:

        

       可以看到 Conv2 是用不到的,和我們理解的一致(尺度太大),而特徵提取是 通過 L2 Norm + Scale + 1x1 Conv 得到,因為不同 Feature 之間的尺度不一致,Norm 是必須的,通過 歸一化 和 Scale 進行特徵提取後,送到 FC全連線層進行 分類和迴歸,如上圖所示。

  > Contextual 上下文

       和前面的多尺度的思路一樣,上下文也不是一個新的概念,生成上下文資訊有很多種方法,來看下對比示意:

        

       文中用的是 多維的概念,上圖(d)(4-dir),如下圖所示:

        

       與傳統的雙向 RNN 不同,文中 通過上下左右四個方向,並且通過兩次 IRNN 來增加非線性,更加有效的結合全域性資訊,看實驗效果:

        

 

@改進2:多尺度之 HyperNet

       論文:Hypernet: Towards accurate region proposal generation and joint object detection   【點選下載

       基於 Region Proposal 的方法,通過多尺度的特徵提取來提高對小目標的檢測能力,來看網路框圖:

    

       分為 三個主要特徵 來介紹(對應上面網路拓撲圖的 三個紅色框):

1)Hyper Feature Extraction (特徵提取)

      多尺度特徵提取是本文的核心點,作者的方法稍微有所不同,他是以中間的 Feature 尺度為參考,前面的層通過 Max Pooling 到對應大小,後面的層則是通過 反捲積(Deconv)進行放大。

      多尺度 Feature ConCat 的時候,作者使用了 LRN進行歸一化(類似於 ION 的 L2 Norm)。

      拋開具體方法不表,對小目標檢測來講,這種多尺度的特徵提取已經算是標配,下圖證明採用 1、3、5 的效果要更優(層間隔大,關聯性小)。

      

2)Region Proposal Generation(建議框生成)

      作者設計了一個輕量級的 ConvNet,與 RPN 的區別不大(為寫論文強創新^_^)。

       一個 ROI Pooling層,一個 Conv 層,還有一個 FC 層。每個 Position 通過 ROI Pooling 得到一個 13*13 的 bin,通過 Conv(3*3*4)層得到一個 13*13*4 的 Cube,再通過 FC 層得到一個 256d 的向量。

      後面的 Score+ BBox_Reg 與 Faster並無區別,用於目標得分 和 Location OffSet。

      考慮到建議框的 Overlap,作者用了 Greedy NMS 去重,文中將 IOU參考設為 0.7,每個 Image 保留 1k 個 Region,並選擇其中 Top-200 做 Detetcion。

      通過對比,要優於基於 Edge Box 重排序的 Deep Box,從多尺度上考慮比 Deep Proposal 效果更好。

3)Object Detection(目標檢測)

      與 Fast RCNN基本一致,在原來的檢測網路基礎上做了兩點改進:

       a)在 FC 層之前添加了一個 卷積層(3*3*63),對特徵有效降維;

       b)將 DropOut 從 0.5 降到 0.25;

      另外,與 Proposal一樣採用了 NMS 進行 Box抑制,但由於之前已經做了,這一步的意義不大。

 

 

  > 訓練過程

       採用了 聯合訓練(joint training)的方法,首先對 Proposal 和 Detection 分別訓練,固定一個訓練另一個,然後 joint 訓練,即共享前面的卷積層訓練一遍,具體可以參考原文給出的訓練流程(這裡不再贅述)。

  > 效率改進

       演算法整體上和 Faster 執行效率相當,因為加入了多尺度的過程,理論上要比 Faster要慢,作者提出了提高效率的改進方法,將 Conv 層放在 ROI Pooling 層之前,如下圖所示:

        

 

  > 實驗效果對比

       通過對比可以看到 mAP 比 Faster 提高了 1%,主要是多尺度的功勞,其他可以忽略,這一點需要正視。

        

 

@改進3:多尺度之 MSCNN

       論文:A Unified Multi-scale Deep Convolutional Neural Network for Fast Object Detection    【點選下載

       Caffe程式碼:【Github

       論文首先給出了不同的多尺度方法(參考下圖講解):

        

a)原圖縮放,多個Scale的原圖對應不同Scale的Feature;

      該方法計算多次Scale,每個Scale提取一次Feature,計算量巨大。

b)一幅輸入影象對應多個分類器;

      不需要重複提取特徵圖,但對分類器要求很高,一般很難得到理想的結果。

c)原圖縮放,少量Scale原圖->少量特徵圖->多個Model模板;

      相當於對 a)和 b)的 Trade-Off。

d)原圖縮放,少量Scale原圖->少量特徵圖->特徵圖插值->1個Model;

e)RCNN方法,Proposal直接給到CNN;

      和 a)全圖計算不同,只針對Patch計算。

f)RPN方法,特徵圖是通過CNN卷積層得到;

      和 b)類似,不過採用的是同尺度的不同模板,容易導致尺度不一致問題。

g)上套路,提出我們自己的方法,多尺度特徵圖;

      每個尺度特徵圖對應一個 輸出模板,每個尺度cover一個目標尺寸範圍。

  > 拓撲圖

       套路先拋到一邊,原理很簡單,結合拓撲圖(基於VGG的網路)來看:

        

       上面是提供 多尺度 Proposal 的子圖,黑色 Cube 是網路輸出,其中 h*w 表示 filter尺寸,c是分類類別,b是Box座標。

       通過在不同的 Conv Layer 進行輸出(conv4-3,conv5-3,conv6),對應不同尺度的 det 檢測器,得到4個Branch Output。

           PS:作者提到,conv4-3 Branch比價靠近Bottom,梯度影響會比後面的 Branch要大,因此多加入了一個緩衝層。

  > Loss函式

       再來看 Loss 函式,對於 訓練樣本 Si =(Xi,Yi),其中 Xi 表示輸入影象,Yi={yi,bi}表示 類別標籤+Box位置,M代表不同的Branch,訓練樣本S按照尺度劃分到不同的Brach,每個Branch權值不同,用a來表示。

       來看下面的公式:

        

          

         

       後面兩個公式為最上面公式 子項的展開,公式2 中l(X,Y|W) 對應 分類Loss 和 Loc Loss的加權求和,公式3 Loc Loss 同樣採用 Smooth L1 Loss,與Faster方法大致上沒什麼區別,此處不再展開。

  > Sampling

       樣本的選擇對於訓練結果非常重要,本文采用多尺度訓練,樣本先劃分到對應 Layer m,在對應Layer上 根據 IOU 劃分為正負樣本,S = {S+,S-},公式:

       

       對應每個Ground Truth (S gt),計算與每個 Anchor Box 的 IOU,結果 o*>0.5 表示正樣本,o*<0.2 歸類為負樣本,其餘丟棄。為了保證正負樣本的比例,作者提出三種方法 對負樣本進行篩選:1)隨機取樣;  2)按Score排序,保留 Top n個強負樣本(Hard Negative);  3)一般隨機取樣,另一半Score排序;

       同樣由於每個 Scale單獨訓練,可能會出現某個特定的 Scale 正樣本不足,無法滿足比例條件,即 S-/S+ >> λ,作者採用如下方法處理:

        

       通過一個加權的 Cross Entropy 來進行比例調節,思路比較好理解。

  > Training

       作者 Argue 了多尺度訓練的必要性,強調針對 KITTI 這種 Scale 差異比較大的資料集,有比較大的意義。引入了一個 Two-Stage 的訓練過程,通過不同的引數來達到好的訓練效果(具體引數和迭代次數可以參考原文章)。

  > 檢測網路

       與 RPN 網路對應的是檢測網路,檢測網路與上面的 RPN網路共享一個 主幹網路(trunk CNN layers),如下圖所示:

        

       這上面有兩點要說明:

1)通過在 conv4-3 後面新增一個 反捲積(Deconvolution),增加特徵圖的解析度,提高了對小目標的檢測精度;

2)加入 Object 的上下文(context)描述,對應上圖的 藍色 Cube,是對應Object(綠色cube)尺寸的1.5倍大小;

       特徵圖 通過全連線層後,輸出為一個分類(class probability)加一個位置(bounding box)。

  > 結果評估

       不同尺度上對目標 Recall 的影響:

        

       Input size 對 Proposal Recall 的影響:

        

       比較 state-of-the-art 的 Detection 結果(看來是不錯):

        

--------------------- 本文來自 linolzhang 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/linolzhang/article/details/74159463?utm_source=copy