目标检测——Faster R-CNN论文阅读
論文閱讀——Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks
文章目錄
- 論文閱讀——Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks
- 一、前言
- 二、目標檢測背景
- 三、VGG-16結構
- 四、Faster R-CNN算法步驟
- 五、細節部分解讀
- RPN網絡
- RPN實現方式
- anchor
- VGG如何提取特征
- ROI pooling
- NMS
- 六、Loss Function
- 七、實驗結果分析
- 八、總結
一、前言
論文地址:https://arxiv.org/abs/1506.01497
開源代碼:https://github.com/endernewton/tf-faster-rcnn
筆者最近在學習目標檢測相關方向,第一篇看的就是Faster RCNN算法,但是已經看完了許久,所以經常會忘記,學長一問起來就又不懂了,說明掌握的不夠,所以在此又重新看了一遍論文,著重研究了下細節,所以在此記錄,寫的不好,希望大家多多指正。(畢竟我是小白,所以語言可能會偏通俗,盡量讓新手也能看懂)
二、目標檢測背景
目標檢測是很多計算機視覺任務的基礎。目前主流的目標檢測算法主要是基于深度學習模型,可以分為兩大塊:(1)one-stage檢測算法。這種算法直接產生物體的類別概率和坐標位置,不需要產生候選區域。比如說YOLO和SSD(2)two-stage檢測算法。這是將檢測問題劃分為兩個階段,首先是產生候選區域,然后對候選區域分類。典型算法就是R-CNN系列,而今天要介紹的就是基于region proposal的目標檢測——Faster R-CNN。
三、VGG-16結構
VGG-16是Faster R-CNN使用的主干網絡,在論文中可能經常會將主干網絡稱為backbone network。主干網絡的作用就是用來提取圖片特征的,這個不是一成不變的,可以替換,比如現在都在流行使用殘差網絡ResNet,再比如CornerNet算法中使用的backbone是Hourglass Network,所以具體情況具體分析。
網絡結構圖如圖2-1,VGG-16網絡中的16代表的含義是含有參數的有16個層,分別是13個卷積層+3個全連接層。如圖2-1,其中,13層的卷積層就是在不斷地提取特征,池化層就是使圖片的尺寸不斷在變小,例如,輸入圖片尺寸為224×224,由于pad=1,所以經過3×3的卷積核之后,圖片尺寸不變,所以圖片只有在池化層尺寸才會變小。而我們的Faster R-CNN,VGG16用的是 convolution layer
feature,一個卷積層的feature map。
當然,用這種網絡式的圖應該能夠更清楚(圖來自于網絡):
四、Faster R-CNN算法步驟
這部分是理解Faster R-CNN,先總體描述下算法的整個過程,以便后期我們做細節分析的時候,知道那個細節是在整個算法的哪個過程中。
由圖1可知,將整張圖片輸進CNN,得到feature map,卷積特征輸入到RPN,得到候選框的特征信息,對候選框中提取出的特征,使用分類器判別是否屬于一個特定類別,對于屬于某一特征的候選框,用回歸器進一步調整其位置。
Faster R-CNN可以看成是RPN和Fast R-CNN模型的組合體,即Faster R-CNN = RPN + Fast R-CNN。接下來,我們將一步步分析上圖3,搞清楚每個步驟的輸入輸出。
1.如圖3-1,首先通過預訓練模型訓練得到 conv layers
2.如圖3-2,這個conv layers實際上就是VGG-16,能夠接收整張圖片并提取特征圖feature maps,這個feature maps是在conv5_3獲得最后的特征(怎么一步步獲得特征的下面有具體分析)。
3.如圖3-4,這個feature maps被共享用于后續的RPN層和RoI池化層
4.如圖3-5,先看去往RPN層的:RPN網絡用于生成region proposals.該層通過softmax判斷anchors屬于前景(foreground)還是背景(background),再利用邊框回歸修正anchors,獲得精確的proposals
5.如圖3-6,接著是去往RoI pooling的:Roi Pooling層收集輸入的feature maps 和 proposals,綜合這些信息提取proposal feature map,進入到后面可利用全連接操作來進行目標識別和定位
最后的classifier會將Roi Pooling層形成固定大小的feature map進行全連接操作,利用Softmax進行具體類別的分類,同時,利用L1 Loss完成bounding box regression回歸操作獲得物體的精確位置.
五、細節部分解讀
-
RPN網絡
之前的R-CNN和Fast R-CNN都是采用可選擇性搜索(SS)來產生候選框的,但是這種方法特別耗時,因此,Faster R-CNN最大的亮點就是拋棄以往的SS,采用RPN來生成候選框。下圖是RPN網絡的結構圖。
先對上圖做個注解:
-
Conv feature map:VGG-16網絡最后一個卷積層輸出的feature map
-
Sliding windows:滑動窗口,實際就是3*3的卷積核,滑窗只是選取所有可能的區域,并沒有什么額外的作用
-
K anchor boxes:在每個sliding window的點上的初始化的參考區域(論文中k=9),其實就是9個矩形框
-
Intermediate layer:中間層
-
256-d:中間層的維度(論文中有說用ZF網絡就是256維,VGG的話就512維)
-
Cls layer:分類層,預測proposal的anchor對應的proposal的(x,y,w,h)
-
2k scores:2k 個分數(18個)
-
Reg layer:回歸層,判斷該proposal是前景還是背景
-
4k coordinates:4k 坐標(36個)
-
-
RPN實現方式
RPN 的輸入是卷積特征圖,輸出是圖片生成的 proposals.如下圖,RPN通過一個滑動窗口,連接在最后一個卷積層(conv5-3的卷積)的feature map上,生成一個長度為256(對應于ZF網絡)維的全連接特征。
接著如下圖,這個全連接特征分別送入兩個全連接層,一個是分類層,用于分類預測,另外一個是回歸層,用于回歸。對于每個華東窗口位置一般設置k(論文中k=9)個不同大小或比例的anchors,這意味著每個滑窗覆蓋的位置就會預測9個候選區域。
對于分類層,每個 anchor 輸出兩個預測值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score;對于回歸層,輸出4k(4×9=36)個坐標值,表示各個候選區域的位置即(x,y,w,h)
也就是說,在這里,我們是通過在這些特征圖上應用滑動窗口加anchor機制進行目標區域判定和分類的,這里的滑窗加anchor機制,功能其實就類似于 fast rcnn 的selective search 生成proposals 的作用,而我們是通過RPN來生成proposals。RPN就是一個卷積層+relu+左右兩個層(cls layer和reg layer)的小型網絡。
-
anchor
論文中的原話:The k proposals are parameterized relative to k reference boxes, which we call anchors。字面上可以理解為錨點,位于之前提到的
3×3的滑窗的中心處。anchor實際上就是矩形,如下圖所示,9個anchor的中心點重合。對于一個滑窗,我們可以同時預測多個proposal,就是因為有多個anchor。這9個anchor是作者設置的,論文中scale ==[128,256,512],長寬比[1;1,1:2,2:1],所以有9種。自己可以根據目標的特點做出不同的設計。對于一幅W×H的feature map,共有W×H×k個錨點。
-
VGG如何提取特征
如下圖,這是VGG網絡的流程圖
每個卷積層利用前面網絡信息來生成抽象描述. 第一層一般學習邊緣edges信息,第二層學習邊緣edges中的圖案patterns,以學習更復雜的形狀等信息. 最終,可以得到卷積特征圖,其空間維度(分辨率)比原圖小了很多,但更深. 特征圖的 width 和 height 由于卷積層間的池化層而降低,而 depth 由于卷積層學習的 filters 數量而增加.
-
ROI pooling
ROI就是region of interest,指的是感興趣區域,如果是原圖,roi就是目標,如果是featuremap,roi就是特征圖像目標的特征了,roi在這里就是經過RPN網絡得到的,總之就是一個框。pooling就是池化。所以ROI Pooling就是Pooling的一種,只是是針對于Rois的pooling操作而已。RPN 處理后,可以得到一堆沒有 class score 的 object proposals.待處理問題為:如何利用這些proposals分類.Roi pooling層的過程就是為了將不同輸入尺寸的feature map(ROI)摳出來,然后resize到統一的大小。
ROI pooling層的輸入:
- 特征圖feature maps(這個特征圖就是cnn卷積出來后的用于共享的那個特征圖)
- roi信息(就是RPN網絡的輸出, 一個表示所有ROI的N×5的矩陣,其中N表示ROI的數目。第一列表示圖像index,其余四列表示其余的左上角和右下角坐標,坐標信息是對應原圖中的絕對坐標。)
ROI pooling層的過程:
首先將RPN中得到的原圖中的roi信息映射到feature上(按原圖與featuremap的比例縮小roi坐標就行了),然后經過最大池化,池化到固定大小w×h。但這個pooling不是一般的Pooling,而是將區域等分,然后取每一小塊的最大值,最后才能得到固定尺寸的roi。
也就是:
- 根據輸入的image,將Roi映射到feature map對應的位置;
- 將映射后的區域劃分為相同大小的sections(sections數量和輸出的維度相同);
- 對每個section進行max pooling操作;
ROI pooling層的輸出:
結果是,由一組大小各異的矩形,我們快速獲取到具有固定大小的相應特征圖。值得注意的是,RoI pooling 輸出的維度實際上并不取決于輸入特征圖的大小,也不取決于區域提案的大小。這完全取決于我們將區域分成幾部分。也就是,batch個roi矩陣,每一個roi矩陣為:通道數xWxH,也就是從selective search得到batch個roi,然后映射為固定大小。
-
NMS
NMS(Non Maximum Suppression,非極大值抑制)用于后期的物體冗余邊界框去除,因為目標檢測最終一個目標只需要一個框,所以要把多余的框干掉,留下最準確的那個。
NMS的輸入:
檢測到的Boxes(同一個物體可能被檢測到很多Boxes,每個box均有分類score)
NMS的輸出:
最優的Box.
過程舉例:
假設圖片中的某個目標檢測到 4 個 Boxes,每個 Box 分別對應一個類別 Score,根據 Score 從小到大排列依次為,(B1, S1), (B2, S2), (B3, S3), (B4, S4). S4 > S3 > S2 > S1. ***以上B代表的是框,S代表的是框的分數***Step 1. 根據Score 大小,挑Score最大的那個先,從 Box B4 框開始; Step 2. 分別計算 B1, B2, B3 與 B4 的重疊程度 IoU,判斷是否大于預設定的閾值;如果大于設定閾值,則舍棄該 Box;同時標記保留的 Box. 假設 B3 與 B4 的閾值超過設定閾值,則舍棄 B3,標記 B4 為要保留的 Box; Step 3. 從剩余的 Boxes 中 B1, B2 中選取 Score 最大的 B2, 然后計算 B2 與 剩余的 B1 的重疊程度 IoU;如果大于設定閾值,同樣丟棄該 Box;同時標記保留的 Box. 重復以上過程,直到找到全部的保留 Boxes. -
全連接層
經過roi pooling層之后,batch_size=300, proposal feature map的大小是7×7,512-d,對特征圖進行全連接,參照下圖,最后同樣利用Softmax Loss和L1 Loss完成分類和定位。
通過全連接層與softmax計算每個region proposal具體屬于哪個類別(如人,馬,車等),輸出cls_prob概率向量;同時再次利用bounding box regression獲得每個region proposal的位置偏移量bbox_pred,用于回歸獲得更加精確的目標檢測框
即從PoI Pooling獲取到7x7大小的proposal feature maps后,通過全連接主要做了:
通過全連接和softmax對region proposals進行具體類別的分類;
再次對region proposals進行bounding box regression,獲取更高精度的rectangle box。
六、Loss Function
為了訓練RPN,作者給每個anchor分配了二類別標簽(是目標或者不是目標),還給兩種anchor設定了一個正標簽(兩種anchor分別是:①具有與實際邊界框的重疊最高交并比(IoU)的anchor,②具有與實際邊界框的重疊超過0.7 IoU的anchor),一個GT包圍盒可以對應多個anchor,這樣一個GT包圍盒就可以有多個正標簽。負標簽則是與所有GT包圍盒的IoU都小于0.3的anchor。剩下的既不是正樣本也不是負樣本,不用于最終訓練.
我們對一個圖像的損失函數如公式1 :共有兩大部分組成:分類損失(classification loss,就是分類分的準不準,比如這個目標是dog,你是否分類成pig或者cat了) 和回歸損失(regression loss,就是框畫的精不精確,比如這個目標是dog,這個框有沒有剛好框住dog,還是說只框住了一半) ,這兩大塊是按一定比重組成的(通過λ調節).
先大概解釋下公式中的變量:i是一個mini-batch中anchor的索引,Pi是anchor i是目標的預測概率。如果anchor為正,GT標簽Pi* 就是1,如果anchor為負,Pi* 就是0。ti是一個向量,表示預測的包圍盒的4個參數化坐標,ti* 是與正anchor對應的GT包圍盒的坐標向量。ti* 是與正anchor對應的GT包圍盒的坐標向量。λ是平衡參數,值為10,Ncls值為256,Nreg最大為2400,代表anchor的數量。
-
分類損失
分類損失Lcls是兩個類別(目標或者非目標)的對數損失:
對于每一個anchor計算對數損失,然后累加求和求和除以總的anchor數量Ncls。
-
回歸損失
是一個向量,表示該anchor預測的偏移量,是與ti維度相同的向量,表示anchor相對于gt實際的偏移量。具體如下:
x,y,w,h指的是包圍盒中心的(x, y)坐標、寬、高。變量x,xa,x*分別指預測的包圍盒、anchor的包圍盒、GT的包圍盒(對y,w,h也是一樣)的x坐標。可以理解為從anchor包圍盒到附近的GT包圍盒的包圍盒回歸。
R是smoothL1 函數,就是這樣。
七、實驗結果分析
此次的Faster R-CNN是在pascal_voc數據集上訓練及測試的
1.檢測器使用的是Fast R-CNN和ZF。
由圖5-1可知,SS在Fast R-CNN框架下的mAP為58.7%,EB的mAP為58.6%。RPN與Fast R-CNN的mAP為59.9%。
2.檢測器使用的是Fast R-CNN和VGG16。
由圖5-2可知,使用RPN+VGG,非共享特征的結果是68.5%,高于SS的。這是因為RPN+VGG生成的提議比SS更準確。對于特性共享的RPN+VGG,mAP是69.9%,比SS要高很多。如果在PASCAL VOC 2007和2012的訓練評估數據集上進一步訓練RPN和檢測網絡,該mAP是73.2%,也就是說能達到更高。
3.檢測器使用的是Fast R-CNN和VGG16。
如圖5-3,是我自己訓練測試的結果與論文的mAP對比:
八、總結
Faster R-CNN創新點:
-
設計 RPN,利用CNN卷積操作后的特征圖生成region proposals,代替了Selective Search的方法,速度上提升明顯;
-
訓練 RPN 與檢測網絡Fast R-CNN共享卷積層,大幅提高網絡的檢測速度。
-
FasterR-CNN將一直以來分離的region proposal和CNN分類融合到了一起,使用端到端的網絡進行目標檢測,無論在速度上還是精度上都得到了不錯的提高。
RPN的核心思想是使用CNN卷積神經網絡直接產生Region Proposal,使用的方法本質上就是滑動窗口。RPN的作用:
-
輸出proposal的位置(坐標)和score
-
將不同scale和ratio的proposal映射為低維的feature vector
-
輸出是否是前景的classification和進行位置的regression
總結
以上是生活随笔為你收集整理的目标检测——Faster R-CNN论文阅读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python脚本——图片重命名、图片合成
- 下一篇: 深度学习——数据预处理篇