Faster-rcnn详解
論文題目:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
論文鏈接:論文鏈接
論文代碼:Matlab版本點擊此處,Python版本點擊此處
?
作為一個目標檢測領域的baseline算法,Faster-rcnn值得你去仔細理解里面的細節,如果你能深入的了解這些,我相信你會受益匪淺。
那么,我們還是按照總分總的順序給大家剖析它吧。(看圖吧)
????????????????????????????????????????????????????????????????? ?圖1 Faster-rcnn架構圖(理解版)
圖2 Faster-rcnn架構圖(精簡版)
圖3 Faster-rcnn架構圖(細節版)
一、目標檢測的總體框架
圖4 目標檢測框架圖
觀察圖4,你可以發現目標檢測的框架中包含4個關鍵模塊,包括region proposal(生成ROI)、feature extraction(特征提取網絡)、classification(ROI分類)、regression(ROI回歸)。而faster-rcnn利用一個神經網絡將這4個模塊結合起來,訓練了一個端到端的網絡。通過觀察圖1、圖2、圖3,我們可以得到如下的結論:Faster-rcnn主要包括4個關鍵模塊,特征提取網絡、生成ROI、ROI分類、ROI回歸。
1.?特征提取網絡:它用來從大量的圖片中提取出一些不同目標的重要特征,通常由conv+relu+pool層構成,常用一些預訓練好的網絡(VGG、Inception、Resnet等),獲得的結果叫做特征圖;
2.?生成ROI:在獲得的特征圖的每一個點上做多個候選ROI(這里是9),然后利用分類器將這些ROI區分為背景和前景,同時利用回歸器對這些ROI的位置進行初步的調整;
3.?ROI分類:在RPN階段,用來區分前景(于真實目標重疊并且其重疊區域大于0.5)和背景(不與任何目標重疊或者其重疊區域小于0.1);在Fast-rcnn階段,用于區分不同種類的目標(貓、狗、人等);
4.?ROI回歸:在RPN階段,進行初步調整;在Fast-rcnn階段進行精確調整;
總之,其整體流程如下所示:
?
- 首先對輸入的圖片進行裁剪操作,并將裁剪后的圖片送入預訓練好的分類網絡中獲取該圖像對應的特征圖;
- 然后在特征圖上的每一個錨點上取9個候選的ROI(3個不同尺度,3個不同長寬比),并根據相應的比例將其映射到原始圖像中(因為特征提取網絡一般有conv和pool組成,但是只有pool會改變特征圖的大小,因此最終的特征圖大小和pool的個數相關);
- 接著將這些候選的ROI輸入到RPN網絡中,RPN網絡對這些ROI進行分類(即確定這些ROI是前景還是背景)同時對其進行初步回歸(即計算這些前景ROI與真實目標之間的BB的偏差值,包括Δx、Δy、Δw、Δh),然后做NMS(非極大值抑制,即根據分類的得分對這些ROI進行排序,然后選擇其中的前N個ROI);
- 接著對這些不同大小的ROI進行ROI Pooling操作(即將其映射為特定大小的feature_map,文中是7x7),輸出固定大小的feature_map;
- 最后將其輸入簡單的檢測網絡中,然后利用1x1的卷積進行分類(區分不同的類別,N+1類,多余的一類是背景,用于刪除不準確的ROI),同時進行BB回歸(精確的調整預測的ROI和GT的ROI之間的偏差值),從而輸出一個BB集合。?
?
二、Faster-rcnn中的核心問題
?
1. 提出了“RPN”網絡,在提高精度的同時提高了速度;
2. RPN網絡和Fast-rcnn網絡的特征共享與訓練;
3. 使用了ROI Pooling技術 ;
4. 使用了NMS技術;
?
三、細節詳解
1. 錨點
即特征圖上的最小單位點,比如原始圖像的大小是256x256,特征提取網絡中含有4個pool層,然后最終獲得的特征圖的大小為 256/16 x 256/16,即獲得一個16x16的特征圖,該圖中的最小單位即是錨點,由于特征圖和原始圖像之間存在比例關系,在特征圖上面密集的點對應到原始圖像上面是有16個像素的間隔,如下圖所示:
圖5 原始圖像中對應的錨點
2. 候選的ROI
針對每一個錨點,然后根據不同的尺度(128、256、512pixel)和不同的長寬比(1:1、0.5:1、1:0.5)產生9個BB,如下圖所示,對于16x16的特征圖,最終產生16x16x9個候選的ROI。
圖6?左側:錨點、中心:特征圖空間單一錨點在原圖中的表達,右側:所有錨點在原圖中的表達
?
3. RPN網絡 -- 用來對特征圖上面產生的多個ROI進行區分和初步定位
圖7 RPN映射過程
RPN(如圖3所示) 是用完全卷積的方式高效實現的,用基礎網絡返回的卷積特征圖作為輸入。首先,我們使用一個有 512個通道和 3x3 卷積核大小的卷積層,然后我們有兩個使用 1x1 卷積核的并行卷積層,其通道數量取決于每個點的錨點數量。
對于分類層,我們對每個錨點輸出兩個預測值:它是背景(不是目標)的分數,和它是前景(實際的目標)的分數。
對于回歸或邊框調整層,我們輸出四個預測值:Δx、Δy、Δw、Δh我們將會把這些值用到錨點中來得到最終的建議。
4.? ROI Pooling?
ROI Pooling的作用是通過最大池化操作將特征圖上面的ROI固定為特定大小的特征圖(7x7),以便進行后續的分類和包圍框回歸操作。
存在的問題
由于預選ROI的位置通常是有模型回歸得到的,一般來說是浮點數,而赤化后的特征圖要求尺度固定,因此ROI Pooling這個操作存在兩次數據量化的過程。1)將候選框邊界量化為整數點坐標值;2)將量化后的邊界區域平均分割成kxk個單元,對每個單元的邊界進行量化。事實上,經過上面的兩次量化操作,此時的ROI已經和最開始的ROI之間存在一定的偏差,這個偏差會影響檢測的精確度。
圖8 ROI Pooling解釋
下面我們用直觀的例子具體分析一下區域不匹配問題,如圖所示,這是一個Faster-rcnn檢測框架。輸入一張800x800的圖片,圖片中有一個665x665的BB中框這一只狗。圖片經過特征提取網絡之后,整個圖片的特征圖變為800/32 * 800/32,即25x25,但是665/32=20.87,帶有小數,ROI Pooling直接將它量化為20。在這里引入了一次偏差。由于最終的特征映射的大小為7x7,即需要將20x20的區域映射成7x7,矩形區域的邊長為2.86,又一次將其量化為2。這里再次引入了一次量化誤差。經過這兩次的量化,候選ROI已經出現了嚴重的偏差(如圖中綠色部分所示)。更重要的是,在特征圖上差0.1個像素,對應到原圖上就是3.2個像素。
5. ROI Pooling后的檢測網絡
圖9 檢測網絡
如上圖所示,在獲得7x7x512的特征映射之后,通過Flatten操作將其展開為一維向量,然后經過兩個全連接層對其進行分類和回歸。一個有 N+1 個單元的全連接層,其中 N 是類的總數,另外一個是背景類。一個有 4N 個單元的全連接層。我們希望有一個回歸預測,因此對 N 個類別中的每一個可能的類別,我們都需要 Δx、Δy、Δw、Δh。
6. NMS(非極大值抑制)
由于錨點經常重疊,因此建議最終也會在同一個目標上重疊。為了解決重復建議的問題,我們使用一個簡單的算法,稱為非極大抑制(NMS)。NMS 獲取按照分數排序的建議列表并對已排序的列表進行迭代,丟棄那些 IoU 值大于某個預定義閾值的建議,并提出一個具有更高分數的建議。總之,抑制的過程是一個迭代-遍歷-消除的過程。如下圖所示:
?
- 將所有候選框的得分進行排序,選中最高分及其所對應的BB;
圖10
?
- 遍歷其余的框,如果它和當前最高得分框的重疊面積大于一定的閾值,我們將其刪除。
圖11
?
- 從沒有處理的框中繼續選擇一個得分最高的,重復上述過程。
圖12
6. 損失函數計算
對于每個錨點,首先在后面接上一個二分類softmax,有2個score 輸出用來表示這是一個前景還是一個背景的概率 (),然后再接上一個bounding box的regressor 輸出代表這個錨點的4個坐標位置(),因此RPN的總體Loss函數可以定義為 :
其中Lcls表示分類loss,這里使用兩類別(前景還是背景)的log loss;Lreg表示回歸loss,這里使用的是Smooth-L1;
i表示第i個錨點,當錨點是正beiji樣本時??=1 ,是負樣本則為0 。??表示 一個與正樣本錨點相關的ground true box坐標 (每個正樣本錨點 只可能對應一個ground true box: 一個正樣本錨點 與某個grand true BB對應,那么該錨點與ground true box 的IOU要么是所有anchor中最大,要么大于0.7) 。
x,y,w,h分別表示box的中心坐標、寬和高;?分別表示 predicted box, anchor box, and ground truth box ,如下圖所示;?表示predict box相對于anchor box的偏移量;?表示ground true box相對于anchor box的偏移量,學習的目標就是讓前者接近后者的值。
圖13?predicted box, anchor box, and ground truth box
?
7. 正負樣本的劃分
?
- 對每個標定的ground true box區域,與其重疊比例最大的anchor記為 正樣本 (保證每個ground true 至少對應一個正樣本anchor);
- 對1)剩余的anchor,如果其與某個標定區域重疊比例大于0.7,記為正樣本(每個ground true box可能會對應多個正樣本anchor。但每個正樣本anchor 只可能對應一個grand true box);如果其與任意一個標定的重疊比例都小于0.3,記為負樣本。
- 對上面兩步剩余的anchor,棄去不用;
- 跨越圖像邊界的anchor棄去不用。
8. Faster-rcnn訓練策略
圖14 Faster-rcnn訓練策略
?
- 用ImageNet模型初始化,獨立訓練一個RPN網絡;
- 仍然用ImageNet模型初始化,但是使用上一步RPN網絡產生的proposal作為輸入,訓練一個Fast-RCNN網絡,至此,兩個網絡每一層的參數完全不共享;
- 使用第二步的Fast-RCNN網絡參數初始化一個新的RPN網絡,但是把RPN、Fast-RCNN共享的那些卷積層的learning rate設置為0,也就是不更新,僅僅更新RPN特有的那些網絡層,重新訓練,此時,兩個網絡已經共享了所有公共的卷積層;
- 仍然固定共享的那些網絡層,把Fast-RCNN特有的網絡層也加入進來,形成一個unified network,繼續訓練,fine tune Fast-RCNN特有的網絡層,此時,該網絡已經實現我們設想的目標,即網絡內部預測proposal并實現檢測的功能。
即進行交替訓練,迭代2次的原因是作者發現多次的迭代并沒有顯著的改善性能。?
?
四、總結
Faster-rcnn是一個目標檢測的baseline方法,值得你去仔細的研究,很建議你去實踐一下,這樣你可以更加清楚的了解到它的細節信息。
最后,給大家介紹一個很好用的網絡可視化工具,專門用來可視化.prototxt文件,你可以將.prototxt文件中的內容復制到該鏈接點擊打開鏈接,然后按下Shift+Enter,就可以看到漂亮的網絡結構啦。如下所示:
圖14 caffe可視化工具
?
參考文獻:
[1] Faster R-CNN: Down the rabbit hole of modern object detection,鏈接地址
[2] CNN目標檢測(一):Faster RCNN詳解,鏈接地址
[3] Faster R-CNN,鏈接地址
[4] 詳解 ROI Align 的基本原理和實現細節,鏈接地址
[5] NMS——非極大值抑制,鏈接地址
?
注意事項:
[1] 該博客是本人原創博客,如果您對該博客感興趣,想要轉載該博客,請與我聯系(qq郵箱:1575262785@qq.com),我會在第一時間回復大家,謝謝大家。
[2] 由于個人能力有限,該博客可能存在很多的問題,希望大家能夠提出改進意見。
[3] 如果您在閱讀本博客時遇到不理解的地方,希望可以聯系我,我會及時的回復您,和您交流想法和意見,謝謝。
[4] 本人業余時間承接各種本科畢設設計和各種小項目,包括圖像處理(數據挖掘、機器學習、深度學習等)、matlab仿真、python算法及仿真等,有需要的請加QQ:1575262785詳聊!!!
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Faster-rcnn详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux16.04安装Matlab20
- 下一篇: 影音先锋怎么看片?xfplay播放器怎么