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