系列博客鏈接:
(一)目標檢測概述 https://www.cnblogs.com/kongweisi/p/10894415.html
(二)目標檢測算法之R-CNN https://www.cnblogs.com/kongweisi/p/10895055.html
(三)目標檢測算法之SPPNet https://www.cnblogs.com/kongweisi/p/10899771.html
(四)目標檢測算法之Fast R-CNN https://www.cnblogs.com/kongweisi/p/10900021.html
寫在最前面:https://zhuanlan.zhihu.com/p/31426458,這是某知乎大佬關於我今天所寫的超級棒的文章,放在最前面,完全可以不看我的文章去看這位大佬的。
當然,大佬的文章深度和精度都很足,因此文章篇幅比較長,想簡單一些了解(其實我的也不是特別簡單,很想簡單點。。囧~~)Faster R-CNN的,可以直接讀我的文章。
本文概述:
1、Faster R-CNN:區域生成網絡+Fast R-CNN
候選區域生成(Region Proposal Network),特征提取,分類,位置精修
2、RPN原理
2.1 anchors
2.2 候選區域的訓練
3、Faster R-CNN的訓練
4、效果對比
5、Faster R-CNN總結
引言:
在Fast R-CNN還存在着瓶頸問題:Selective Search(選擇性搜索)。要找出所有的候選框,這個也非常耗時。那我們有沒有一個更加高效的方法來求出這些候選框呢?
1、Faster R-CNN
在Faster R-CNN中加入一個提取邊緣的神經網絡,也就說找候選框的工作也交給神經網絡來做了。這樣,目標檢測的四個基本步驟(候選區域生成,特征提取,分類,位置精修)終於被統一到一個深度網絡框架之內。
Faster R-CNN可以簡單地看成是區域生成網絡+Fast R-CNN的模型,用區域生成網絡(Region Proposal Network,簡稱RPN)來代替Fast R-CNN中的選擇性搜索方法,結構如下:
圖1 Faster RCNN基本結構
- 1、首先向CNN網絡(VGG-16)輸入任意大小圖片
- 2、Faster RCNN使用一組基礎的conv+relu+pooling層提取feature map。該feature map被共享用於后續RPN層和RoI Pooling層。
- 3、Region Proposal Networks。RPN網絡用於生成region proposals,該層通過softmax判斷anchors屬於foreground或者background,再利用bounding box regression修正anchors獲得精確的region proposals,輸出其Top-N(默認為300)的區域給RoI pooling。
- 生成anchors -> softmax分類器提取fg anchors -> bbox reg回歸fg anchors -> Proposal Layer生成region proposals
- 4、第2步得到的高維特征圖和第3步輸出的區域,合並(可以理解成候選區映射到特征圖中,類似第(三)節SPPNet中1.1"映射")輸入RoI池化層(類), 該輸出到全連接層判定目標類別。
- 5、利用proposal feature maps計算每個region proposal的不同類別概率,同時bounding box regression獲得檢測框最終的精確位置
圖2 Faster RCNN基本結構
解釋:
圖2展示了python版本中的VGG16模型中的faster_rcnn_test.pt的網絡結構,可以清晰的看到該網絡對於一副任意大小PxQ的圖像,首先縮放至固定大小MxN,然后將MxN圖像送入網絡;
而Conv layers中包含了13個conv層+13個relu層+4個pooling層;RPN網絡首先經過3x3卷積,再分別生成foreground anchors與bounding box regression偏移量,然后計算出region proposals;
而Roi Pooling層則利用region proposals從feature maps中提取region proposal feature送入后續全連接和softmax網絡作classification(即分類region proposal到底是什么object)。
2、 RPN(Region Proposal Networks)原理
RPN網絡的主要作用是得出比較准確的候選區域。整個過程分為兩步
- 用n×n(默認3×3=9)的大小窗口去掃描特征圖,每個滑窗位置映射到一個低維的向量(默認256維),並為每個滑窗位置考慮k種(在論文設計中k=9)可能的參考窗口(論文中稱為anchors,錨框)
- 低維特征向量輸入兩個並行連接的1 x 1卷積層然后得出兩個部分:reg窗口回歸層(用於修正位置)和cls窗口分類層(是否為前景或背景概率)
圖3 RPN層基本結構
上圖3展示了RPN網絡的具體結構。可以看到RPN網絡實際分為2條線,上面一條通過softmax分類anchors獲得foreground和background(檢測目標是foreground),
下面一條用於計算對於anchors的bounding box regression偏移量,以獲得精確的proposal。而最后的Proposal層則負責綜合foreground anchors和bounding box regression偏移量獲取proposals,
同時剔除太小和超出邊界的proposals(有一些分類實在太爛的區域,我們直接丟掉,否則計算量會非常大)。其實整個網絡到了Proposal Layer這里,就完成了相當於目標定位(相當於完成了選擇性搜索(SS)生成候選區)的功能。
2.1 anchors
舉個例子:
- 3*3卷積核的中心點對應原圖上的位置,將該點作為anchor的中心點,在原圖中框出多尺度、多種長寬比的anchors, 三種尺度{ 128,256,512 }, 三種長寬比{1:1,1:2,2:1}
解釋:
所謂anchors,實際上就是一組的矩形。
[[ -84. -40. 99. 55.] [-176. -88. 191. 103.] [-360. -184. 375. 199.] [ -56. -56. 71. 71.] [-120. -120. 135. 135.] [-248. -248. 263. 263.] [ -36. -80. 51. 95.] [ -80. -168. 95. 183.] [-168. -344. 183. 359.]]
其中每行的4個值 表矩形左上和右下角點坐標。9個矩形共有3種形狀,長寬比為大約為
三種,如圖4。實際上通過anchors就引入了檢測中常用到的多尺度方法。
圖4 anchors示意圖
注:關於上面的anchors size,其實是根據檢測圖像設置的。在python demo中,會把任意大小的輸入圖像reshape成800x600(即圖2中的M=800,N=600)。再回頭來看anchors的大小,anchors中長寬1:2中最大為352x704,長寬2:1中最大736x384,基本是cover了800x600的各個尺度和形狀。
那么這9個anchors是做什么的呢?借用Faster RCNN論文中的原圖,如圖5,遍歷Conv layers計算獲得的feature maps,為每一個點(每一個像素的中心)都配備這9種anchors作為初始的檢測框。這樣做獲得檢測框很不准確,不用擔心,后面還有2次bounding box regression可以修正檢測框位置。
圖5
其實RPN最終就是在原圖尺度上,設置了密密麻麻的候選Anchor。然后用cnn去判斷哪些Anchor是里面有目標的foreground anchor,哪些是沒目標的backgroud。所以,僅僅是個二分類而已!
而anchor的個數也是我們關心的一個問題,如下圖經過CNN后得到的特征是51 x 39(通道數忽略),那么對於9種形狀的anchor,一共有51 x 39 x 9 = 17901個anchor從RPN層輸出,對於更高維度的圖像,輸出的特征會更大,帶來訓練參數過大的問題。
2.2 候選區域的訓練
- 訓練樣本anchor標記
- 1.每個ground-truth box有着最高的IoU的anchor標記為正樣本
- 2.剩下的anchor/anchors與任何ground-truth box的IoU大於0.7記為正樣本,IoU小於0.3,記為負樣本
- 3.剩下的樣本全部忽略
- 正負樣本比例為1:3
- 訓練損失
- RPN classification (anchor good / bad) ,二分類,是否有物體,是、否
- RPN regression (anchor -> proposal) ,回歸
- 注:這里使用的損失函數和Fast R-CNN內的損失函數原理類似,同時最小化兩種代價
候選區域的訓練是為了讓得出來的正確的候選區域, 並且候選區域經過了回歸微調。
在這基礎之上做Fast RCNN訓練是得到特征向量做分類預測和回歸預測。
3、Faster R-CNN的訓練
Faster R-CNN的訓練分為兩部分,即兩個網絡的訓練。前面已經說明了RPN的訓練損失,這里輸出結果部分的的損失(這兩個網絡的損失合並一起訓練):
-
Fast R-CNN classification (over classes) ,所有類別分類N+1
-
Fast R-CNN regression (bbox regression)
4、效果對比
5、Faster R-CNN總結
- 優點
- 提出RPN網絡
- 端到端網絡模型
- 缺點
- 訓練參數過大
- 對於真實訓練使用來說還是依然過於耗時
可以改進的需求:
- RPN(Region Proposal Networks) 改進 對於小目標選擇利用多尺度特征信息進行RPN
- 速度提升 如YOLO系列算法,刪去了RPN,直接對Region Proposal(候選區)進行分類回歸,極大的提升了網絡的速度