Faster RCNN详解
摘自:【個(gè)人整理】faster-RCNN的背景、結(jié)構(gòu)以及大致實(shí)現(xiàn)架構(gòu)
這篇是我看過講faster-RCNN最清楚的,很多地方茅塞頓開,特轉(zhuǎn)。
一、 faster-RCNN的背景
Faster R-CNN 發(fā)表于 NIPS 2015,其后出現(xiàn)了很多改進(jìn)版本,后面會(huì)進(jìn)行介紹.
R-CNN - Rich feature hierarchies for accurate object detection and semantic segmentation 是 Faster R-CNN 的啟發(fā)版本. R-CNN 是采用 Selective Search 算法來提取(propose)可能的 RoIs(regions of interest) 區(qū)域,然后對(duì)每個(gè)提取區(qū)域采用標(biāo)準(zhǔn) CNN 進(jìn)行分類.
出現(xiàn)于 2015 年早期的 Fast R-CNN 是 R-CNN 的改進(jìn),其采用興趣區(qū)域池化(Region of Interest Pooling,RoI Pooling) 來共享計(jì)算量較大的部分,提高模型的效率.
Faster R-CNN 隨后被提出,其是第一個(gè)完全可微分的模型. Faster R-CNN 是 R-CNN 論文的第三個(gè)版本.R-CNN、Fast R-CNN 和 Faster R-CNN 作者都有 Ross Girshick.
二、faster-RCNN的網(wǎng)絡(luò)結(jié)構(gòu)
Faster R-CNN 的結(jié)構(gòu)是復(fù)雜的,因?yàn)槠溆袔讉€(gè)移動(dòng)部件. 這里先對(duì)整體框架宏觀介紹,然后再對(duì)每個(gè)部分的細(xì)節(jié)分析.
問題描述:
針對(duì)一張圖片,需要獲得的輸出有:
邊界框(bounding boxes) 列表,即一幅圖像有多少個(gè)候選框(region proposal),比如有2000個(gè);
每個(gè)邊界框的類別標(biāo)簽,比如候選框里面是貓?狗?等等;
每個(gè)邊界框和類別標(biāo)簽的概率。
2.1 faster-RCNN的基本結(jié)構(gòu)
除此之外,下面的幾幅圖也能夠較好的描述發(fā)圖爾-RCNN的一般結(jié)構(gòu):
2.2 faster-RCNN的大致實(shí)現(xiàn)過程
整個(gè)網(wǎng)絡(luò)的大致過程如下:
(1)首先,輸入圖片表示為 Height × Width × Depth 的張量(多維數(shù)組)形式,經(jīng)過預(yù)訓(xùn)練 CNN 模型的處理,得到卷積特征圖(conv feature map)。即將 CNN 作為特征提取器,送入下一個(gè)部分。這種技術(shù)在遷移學(xué)習(xí)(Transfer Learning)中比較普遍,尤其是,采用在大規(guī)模數(shù)據(jù)集訓(xùn)練的網(wǎng)絡(luò)權(quán)重,來對(duì)小規(guī)模數(shù)據(jù)集訓(xùn)練分類器. 后面會(huì)詳細(xì)介紹.
(2)然后,RPN(Region Propose Network) 對(duì)提取的卷積特征圖進(jìn)行處理. RPN 用于尋找可能包含 objects 的預(yù)定義數(shù)量的區(qū)域(regions,邊界框)。這是整個(gè)文章最核心的改進(jìn),也是本文會(huì)著重介紹的點(diǎn)。
基于深度學(xué)習(xí)的目標(biāo)檢測中,可能最難的問題就是生成長度不定(variable-length)的邊界框列表. 在構(gòu)建深度神經(jīng)網(wǎng)絡(luò)時(shí),最后的網(wǎng)絡(luò)輸出一般是固定尺寸的張量輸出(采用RNN的除外). 例如,在圖片分類中,網(wǎng)絡(luò)輸出是 (N, ) 的張量,N 是類別標(biāo)簽數(shù),張量的每個(gè)位置的標(biāo)量值表示圖片是類別 labeli{ label_i }labeli 的概率值.
在 RPN 中,通過采用 anchors 來解決邊界框列表長度不定的問題,即,在原始圖像中統(tǒng)一放置固定大小的參考邊界框. 不同于直接檢測 objects 的位置,這里將問題轉(zhuǎn)化為兩部分:
對(duì)每一個(gè) anchor 而言,
anchor 是否包含相關(guān)的 object?
如何調(diào)整 anchor 以更好的擬合相關(guān)的 object?
這里可能不容易理解,后面會(huì)深入介紹anchor以及RPN相關(guān)的實(shí)現(xiàn)原理。
上圖展示了RPN網(wǎng)絡(luò)的具體結(jié)構(gòu)。可以看到RPN網(wǎng)絡(luò)實(shí)際分為2條線,上面一條通過softmax分類anchors獲得positive和negative分類,下面一條用于計(jì)算對(duì)于anchors的bounding box regression偏移量,以獲得精確的proposal。而最后的Proposal層則負(fù)責(zé)綜合positive anchors和對(duì)應(yīng)bounding box regression偏移量獲取proposals,同時(shí)剔除太小和超出邊界的proposals。其實(shí)整個(gè)網(wǎng)絡(luò)到了Proposal Layer這里,就完成了相當(dāng)于目標(biāo)定位的功能。
(3)當(dāng)獲得了可能的相關(guān)objects 和其在原始圖像中的對(duì)應(yīng)位置之后,問題就更加直接了. 采用 CNN 提取的特征和包含相關(guān) objects 的邊界框,采用 RoI Pooling 處理,并提取相關(guān) object 的特征,得到一個(gè)新的向量.
最后,基于 R-CNN 模塊,得到:
對(duì)邊界框內(nèi)的內(nèi)容進(jìn)行分類,(或丟棄邊界框,采用 background 作為一個(gè) label.)
調(diào)整邊界框坐標(biāo),以更好的使用 object.
上面的過程沒有涉及到一些重要的細(xì)節(jié)信息. 但包括了 Faster R-CNN 的大致實(shí)現(xiàn)過程。
2.3 faster-RCNN的基本組成
faster-RCNN其實(shí)就是由幾個(gè)基本的網(wǎng)絡(luò)架構(gòu)組成的。
Faster R-CNN的整體流程如下圖所示。
從上面的圖形中可以看出,F(xiàn)aster R-CNN主要分為四部分(圖中四個(gè)綠色框)
(1)Dataset數(shù)據(jù)。提供符合要求的數(shù)據(jù)格式(目前常用數(shù)據(jù)集是VOC和COCO);
(2)Extractor卷積神經(jīng)網(wǎng)絡(luò)。 利用CNN提取圖片特征features(原始論文用的是ZF和VGG16,后來人們又用ResNet101);
(3)RPN(Region Proposal Network)。 負(fù)責(zé)提供候選區(qū)域rois(每張圖給出大概2000個(gè)候選框);
(4)RoIHead。 負(fù)責(zé)對(duì)由RPN產(chǎn)生的ROI進(jìn)行分類和微調(diào)。對(duì)RPN找出的ROI,判斷它是否包含目標(biāo),并修正框的位置和座標(biāo)。
Faster R-CNN整體的流程可以分為三步:
(1)提特征。 圖片(img)經(jīng)過預(yù)訓(xùn)練的網(wǎng)絡(luò)(Extractor),提取到了圖片的特征(feature)
(2)Region Proposal。 利用提取的特征(feature),經(jīng)過RPN網(wǎng)絡(luò),找出一定數(shù)量的rois(region of interests)
(3)分類與回歸。將rois和圖像特征features,輸入到RoIHead,對(duì)這些rois進(jìn)行分類,判斷都屬于什么類別,同時(shí)對(duì)這些rois的位置進(jìn)行微調(diào)。
就是第二步是關(guān)鍵所在,第一步和第三部同fast-RCNN一樣。
三、區(qū)域推薦網(wǎng)絡(luò)RPN詳解
3.1 邊框的位置到底用什么表示?
目標(biāo)檢測之所以難,是因?yàn)槊恳粋€(gè)物體的區(qū)域大小是不一樣的,每一個(gè)區(qū)域框有著不同的大小size(也稱之為scale)和不同的長寬比(aspect ratios)
現(xiàn)在假設(shè),已經(jīng)知道圖片中有兩個(gè) objects,首先想到的是,訓(xùn)練一個(gè)網(wǎng)絡(luò),輸出 8 個(gè)值:兩對(duì)元組 (xmin,ymin,xmax,ymax)、(xmin,ymin,xmax,ymax)分別定義了每個(gè) object 的邊界框.。這種方法存在一些基本問題. 例如,
(1)當(dāng)圖片的尺寸和長寬比不一致時(shí),良好訓(xùn)練模型來預(yù)測,會(huì)非常復(fù)雜;(這里不是很理解,望有大神告知!)
(2)另一個(gè)問題是無效預(yù)測:預(yù)測 xmin和xmax 時(shí),需要保證 xmin<xmax;
事實(shí)上,有一種更加簡單的方法來預(yù)測 objects 的邊界框,即,學(xué)習(xí)相對(duì)于參考boxes 的偏移量. 假設(shè)參考 box的位置由以下確定:(xcenter,ycenter,width,height),則需要預(yù)測量為:( Δxcenter,Δycenter,Δwidth,Δheight),它們的取值一般都是很小的值,以調(diào)整參考 box 更好的擬合所需要的。
3.2 RPN網(wǎng)絡(luò)的基本結(jié)構(gòu)
首先看到這幅圖的時(shí)候我是一臉懵逼,看了半天又是一知半解,后面我會(huì)結(jié)合這幅圖詳細(xì)來說,這里暫且先放一副結(jié)構(gòu)圖。我們發(fā)現(xiàn),其實(shí)整個(gè)RPN的網(wǎng)絡(luò)很淺很簡單,但是為什么要這樣設(shè)計(jì)呢?這樣設(shè)計(jì)能達(dá)到什么樣的效果呢?
a.conv fetaure map到 intermediate layer的卷積過程:(摘自:https://blog.csdn.net/gbz3300255/article/details/105493407/)
在特征圖上用sliding window 3*3的窗口滑動(dòng)。這個(gè)窗口提出來的圖 conv feature map大小是3*3*256,上面那個(gè)圖只顯示了1通道的,在它下面還有255層。那么對(duì)于特征圖上某個(gè)點(diǎn)來說,就要用256個(gè)大小為3*3*256的卷積核對(duì)這個(gè)窗口進(jìn)行卷積,卷積過程顯然是對(duì)應(yīng)通道(256channel)卷積,獲得1*256維的向量,然后累加獲得1*1向量,卷積核有256個(gè),這樣的向量就有256個(gè)最終結(jié)果就是1*256(這個(gè)256是卷積核個(gè)數(shù))。結(jié)果對(duì)應(yīng)于下圖intermediate layer。整張?zhí)卣鲌D卷積結(jié)果如下圖
(卷積函數(shù) 輸入通道數(shù)決定卷積核的通道數(shù),卷積核的個(gè)數(shù)決定輸出通道數(shù))
b.intermediate layer的256維向量后面對(duì)應(yīng)兩條分支:
cls layer分支是目標(biāo)和背景的二分類(classification),因?yàn)閗等于9,所以通過1×1×256×18的卷積核得到 2*9 = 18個(gè)分?jǐn)?shù),分別是目標(biāo)和背景的評(píng)分。這次卷積總的流程如下圖。最右側(cè)的18層中,每兩層代表了某個(gè)anchor的特征圖上所有點(diǎn)的前景背景概率值。
reg layer分支。如果候選框是目標(biāo)區(qū)域,就去判斷該目標(biāo)區(qū)域的候選框位置在哪,這個(gè)時(shí)候另一條分支就過1×1×256×36的卷積得到4*9個(gè)值,每個(gè)框包含4個(gè)值(x,y,w,h),就是9個(gè)候選區(qū)域?qū)?yīng)的框應(yīng)該偏移的具體位置Δxcenter,Δycenter,Δwidth,Δheight。如果候選框不是目標(biāo)區(qū)域,就直接將該候選框去除掉,不再進(jìn)行后續(xù)位置信息的判斷操作。這里預(yù)測的值都是通過模型不斷訓(xùn)練得到的。顯然最右側(cè)的18層中,每4層代表了某個(gè)anchor的特征圖上所有點(diǎn)的偏移量的值。
最終結(jié)果:候選框。
3.3 RPN的核心概念——anchor
anchor,中文意思是錨點(diǎn)的意思,那到底什么是anchor?有很多不同的解釋,其實(shí)不能說那種解釋完全標(biāo)準(zhǔn),主要是站在不同的角度進(jìn)行解釋的,都有道理,本文會(huì)將各種解釋綜合起來,盡量說得易懂一點(diǎn)。
3.3.1 知識(shí)回顧
要理解什么是anchor,就要知道我們?yōu)槭裁锤愠鲆粋€(gè)RPN這種東西,回顧一下前面三種目標(biāo)檢測架構(gòu)RCNN、SPPNet、fast-RCNN,
(1)RCNN是在原始圖像中使用select search方法選擇大約2000個(gè)候選框,然后對(duì)每個(gè)候選框進(jìn)行卷積運(yùn)算;
(2)SPPNet和fast-RCNN是先讓整個(gè)圖片經(jīng)過CNN,然后在得到的特征圖上使用select search選擇2000個(gè)左右的候選框,其實(shí)我們真正需要的還是在原始圖像上的候選區(qū)域,那為什么在卷積之后的特征圖上也可以這么做呢?這是因?yàn)榫矸e之后的特征圖和原始圖像之間存在的映射關(guān)系,在特征圖上的候選區(qū)可以映射到原始圖像上。
總而言之:我們要使用RPN的目的也就是要產(chǎn)生(原始圖像上的)候選框。而且這里有一個(gè)重要的信息,就是卷積之后的feature map和原始圖像之間是有一個(gè)映射關(guān)系的,如果我能夠在feature map上面找到響應(yīng)候選框,也就代表了在原始圖像上找到了候選框。
3.3.2 RPN的輸入與輸出
輸入:RPN是接在feature map之后的,因此它的輸入是feature map;
輸出:我希望得到的是候選區(qū)域,因此輸出的是候選區(qū)域,這樣說沒錯(cuò),但是在網(wǎng)絡(luò)中其實(shí)流動(dòng)的都是數(shù)據(jù)啊,這一個(gè)框框嗯么表示呢?當(dāng)然也是通過數(shù)據(jù)的形式來表示了,還有一點(diǎn)就是這個(gè)框框里面有目標(biāo)還是沒有目標(biāo),這也是通過數(shù)據(jù)來表示的。
3.3.3 到底什么是anchor?
有很多文獻(xiàn)中這樣說道:Anchor是大小和尺寸固定的候選框,個(gè)人感覺這種說法是很不準(zhǔn)確的,只是一個(gè)表象而已。在回答什么 是anchor之前,我們先看一下RPN網(wǎng)絡(luò)的一個(gè)第一步運(yùn)算,RPN的第一步運(yùn)算實(shí)際上就是一個(gè)3*3*256的卷積運(yùn)算,我們稱3*3為一個(gè)滑動(dòng)窗口(sliding window)。假設(shè)RPN的輸入是13*13*256的特征圖,然后使用3*3*256(一個(gè)卷積核的size,本例應(yīng)該是有256個(gè)卷積核)的卷積核進(jìn)行卷積運(yùn)算,最后依然會(huì)得到一個(gè)a*a*256的特征圖,這里的a與卷積的步幅有關(guān)。
在原始論文中,我們選定了3種不同scale、3種不同長寬比(aspect ratios)的矩形框作為“基本候選框(這是我起的名字)”,
三種scale/size是{128,256,512}
三種比例{1:1 , 1:2 , 2:1}
故而一共是3x3=9種,有很多文獻(xiàn)說這就是9個(gè)anchors,之所以我覺得不準(zhǔn)確是因?yàn)橄旅娴膬蓚€(gè)方面
(1)anchor顧名思義為錨點(diǎn),這這是一個(gè)矩形框,與錨點(diǎn)本身的含義是不符合的;
(2)很明顯,這9個(gè)基本候選框的長寬遠(yuǎn)遠(yuǎn)大于特征圖的長寬,所以這9個(gè)指的應(yīng)該是原始圖像,結(jié)合論文中要對(duì)原始圖像進(jìn)行縮放到600*1000左右的大小,更加確定了這一點(diǎn),有的人說錨點(diǎn)是特征圖上的某一個(gè)點(diǎn)或者是候選框,既然這9個(gè)根本就不是特征圖上的候選框,那自然不存在錨點(diǎn)之說了。
3.3.4 anchor錨點(diǎn)的本質(zhì)
錨點(diǎn)的真實(shí)含義:應(yīng)該是特征圖的某一個(gè)像素與對(duì)應(yīng)在原始圖像的某一個(gè)像素,即它本質(zhì)上指的是特征圖上當(dāng)前滑窗的中心在原像素空間的映射點(diǎn)稱為anchor,即anchor是在原始圖像上的
然后以這個(gè)錨點(diǎn)為中心,配上規(guī)定的9個(gè)基本候選框,這就正確了,所以在原始圖像上的圖像大致如下:
其中每一個(gè)黑色的點(diǎn)是anchor錨點(diǎn),以及畫出的以這些錨點(diǎn)為中心的9個(gè)基本候選框。
3.3.5 為什么這樣子設(shè)計(jì)可行?
依然以上面的例子進(jìn)行說明,假定輸出特征圖為13*13*256,然后在該特征圖上進(jìn)行3*3*256的卷積,默認(rèn)進(jìn)行了邊界填充
那么每一個(gè)特征圖上一共有13*13=169個(gè)像素點(diǎn),由于采用了邊界填充,所以在進(jìn)行3*3卷積的時(shí)候,每一個(gè)像素點(diǎn)都可以做一次3*3卷積核的中心點(diǎn),那么整個(gè)卷積下來相當(dāng)于是有169個(gè)卷積中心,這169個(gè)卷積中心在原始圖像上會(huì)有169個(gè)對(duì)應(yīng)的錨點(diǎn),然后每個(gè)錨點(diǎn)會(huì)有9個(gè)默認(rèn)大小的基本候選框,這樣相當(dāng)于原始圖像中一共有169*9=1521個(gè)候選框,這1521個(gè)候選框有9種不同的尺度,中心又到處都分布,所以足以覆蓋了整個(gè)原始圖像上所有的區(qū)域,甚至還有大量的重復(fù)區(qū)域。
這個(gè)映射過程如下所示(自己畫的,不好請(qǐng)包涵):
補(bǔ)充:
關(guān)于特征圖和原始圖像的映射關(guān)系,這里有一點(diǎn)需要補(bǔ)充,假定原始的圖像長寬分別是W*H,特征圖的長寬是w*h,則有如下關(guān)系:
w=W/r;h=W/r;這里的r稱之為下采樣率,即各個(gè)卷積層和池化層步幅的乘積,在VGG中,r=19.
其實(shí)我們需要的并不是這個(gè)候選框本身,我們需要的數(shù)據(jù)是每一個(gè)候選框的位置信息(x,y,w,h)和目標(biāo)信息(有,沒有),我們可以這樣理解,每一個(gè)候選框都包含這6個(gè)信息,也可以說成是是6個(gè)特征,特征圖上的每一個(gè)像素都對(duì)應(yīng)于原始圖像上的一個(gè)“錨點(diǎn)anchor”,而每一個(gè)anchor又包含了9個(gè)尺寸比例各不相同的標(biāo)準(zhǔn)候選框,每一個(gè)候選框又包含著這6個(gè)基本信息,所以現(xiàn)在相當(dāng)于是對(duì)每一個(gè)特征像素進(jìn)行學(xué)習(xí),也就間接的學(xué)習(xí)到了原始圖像上大量的錨點(diǎn)以及大量的候選框的信息,這樣理解不就更好了嗎(個(gè)人理解,有錯(cuò)誤請(qǐng)大佬糾正!)
另外一篇博客的解釋:對(duì)于feature map中的每個(gè)3×3的窗口,作者就以這個(gè)滑動(dòng)窗口的中心點(diǎn)對(duì)應(yīng)原始圖片的中心點(diǎn)。然后作者假定,這個(gè)3×3的窗口,是從原始圖片通過SPP池化得到,而這個(gè)池化的面積及比例,就是一個(gè)個(gè)anchors。換句話說,對(duì)于每個(gè)3x3窗口,作者假定它來自9種不同原始區(qū)域的池化,但是這些池化在原始圖片中的中心點(diǎn),都完全一樣。這個(gè)中心點(diǎn),就是剛剛提到的,3x3窗口中心點(diǎn)所對(duì)應(yīng)的原始圖片中的中心點(diǎn)。如此一來,在每個(gè)窗口位置,我們都可以根據(jù)不同的長寬比例,不同的面積的anchors,逆向推導(dǎo)出它所對(duì)應(yīng)的原始圖片的一個(gè)區(qū)域,這個(gè)區(qū)域的尺寸以及坐標(biāo),都是已知。而這個(gè)區(qū)域,就是我們想要的proposal。接下來,每個(gè)proposal我們只輸出6個(gè)參數(shù),每個(gè)proposal和ground truth進(jìn)行比較得到的前景概率和背景概率(2個(gè)參數(shù))對(duì)應(yīng)圖片上的cls_score,由于每個(gè)proposal和groundtruth的位置及尺寸上的差異從proposal通過平移縮放得到ground truth需要的4個(gè)平移縮放參數(shù)(對(duì)應(yīng)圖片上bbox_pred)。
還有一篇博客的解釋:首先我們要知道anchor的本質(zhì)是什么,本質(zhì)是SPP(spatial pyramid pooling)思想的你想。而SPP本身是做什么的呢?就是將不同尺寸的輸入resize成為相同尺寸的輸出。所以SPP的逆向就是,將相同尺寸的輸出,倒推得到不同尺寸的輸入。原始圖片經(jīng)過一系列卷積層和池化層以及relu,得到feature map:51*39*256.在這個(gè)特征基礎(chǔ)上,通過一個(gè)3*3的滑動(dòng)窗口,在這個(gè)51*39的區(qū)域上進(jìn)行滑動(dòng),stride=1, padding=1,這樣一來,滑動(dòng)得到的就是51*39個(gè)3*3的窗口。對(duì)于每個(gè)3*3的窗口,作者就計(jì)算這個(gè)滑動(dòng)窗口的中心點(diǎn)所對(duì)應(yīng)的原始圖片的中心點(diǎn)。然后作者假定,這個(gè)3*3窗口,是從原始圖片上通過SPP池化得到的,而這個(gè)池化的區(qū)域的面積以及長寬比例,就是一個(gè)個(gè)的anchor。換句話說,對(duì)于每個(gè)3x3窗口,作者假定它來自9種不同原始區(qū)域的池化,但是這些池化在原始圖片中的中心點(diǎn),都完全一樣。這個(gè)中心點(diǎn),就是剛才提到的,3x3窗口中心點(diǎn)所對(duì)應(yīng)的原始圖片中的中心點(diǎn)。如此一來,在每個(gè)窗口位置,我們都可以根據(jù)9個(gè)不同長寬比例、不同面積的anchor,逆向推導(dǎo)出它所對(duì)應(yīng)的原始圖片中的一個(gè)區(qū)域,這個(gè)區(qū)域的尺寸以及坐標(biāo),都是已知的。而這個(gè)區(qū)域,就是我們想要的 proposal。所以我們通過滑動(dòng)窗口和anchor,成功得到了 51x39x9 個(gè)原始圖片的proposal。接下來,每個(gè)proposal我們只輸出6個(gè)參數(shù):每個(gè) proposal 和 ground truth 進(jìn)行比較得到的前景概率和背景概率(2個(gè)參數(shù))(對(duì)應(yīng)圖上的 cls_score);由于每個(gè) proposal 和 ground truth 位置及尺寸上的差異,從 proposal 通過平移放縮得到 ground truth 需要的4個(gè)平移放縮參數(shù)(對(duì)應(yīng)圖上的 bbox_pred)。
總結(jié)歸納:當(dāng)前滑窗的中心在原像素空間的映射點(diǎn)稱為anchor,以此anchor為中心,生成k(paper中default k=9, 3 scales and 3 aspect ratios)個(gè)proposals。雖然 anchors 是基于卷積特征圖定義的,但最終的 anchos 是相對(duì)于原始圖片的.RPN的本質(zhì)是 “ 基于滑窗的無類別obejct檢測器 ” 。
3.4 生成anchor的作用和目的
要知道,訓(xùn)練RPN網(wǎng)絡(luò)是有監(jiān)督訓(xùn)練,需要有數(shù)據(jù)、還要有相應(yīng)的類標(biāo)簽,輸入小網(wǎng)絡(luò)的是512個(gè)通道的3*3滑窗,類標(biāo)簽沒有給定,沒有類標(biāo)簽就無法計(jì)算Loss損失函數(shù),無法訓(xùn)練網(wǎng)絡(luò)。以3*3滑窗中心對(duì)應(yīng)原圖的位置作為中心點(diǎn),在原圖生成9個(gè)不同尺度長寬比的anchor,然后每個(gè)anchor都會(huì)被分配到相應(yīng)的類標(biāo)簽,有正樣本(1)、負(fù)樣本(0),也有不參與訓(xùn)練的框(not used),對(duì)正樣本計(jì)算,就是回歸的類標(biāo)簽,負(fù)樣本不計(jì)算回歸loss。0,1是二分類的標(biāo)簽。所以在原圖生成anchor的目的之一是得到類標(biāo)簽。這里只得到了分類的標(biāo)簽(0,1),還有正樣本的回歸標(biāo)簽需要確定,該正樣本的回歸標(biāo)簽是其對(duì)應(yīng)的ground truth計(jì)算出來的。負(fù)樣本不計(jì)算回歸損失沒有回歸標(biāo)簽。
3.5 RPN的訓(xùn)練過程
上面只討論了RPN的第一步運(yùn)算——實(shí)際上就是卷積運(yùn)算,接下來考慮后面的運(yùn)算步驟,如下:
上面的用黑色圈出來的部分是第一步運(yùn)算,用紅色圈圈圈出來的是第二步運(yùn)算,我們將第二步運(yùn)算單獨(dú)拿出來看,如下圖所示:
注意:這里圖片的和上面的稍微有所區(qū)別,但是沒關(guān)系,只要能理解清楚意思就好。
RPN 是全卷積(full conv) 網(wǎng)絡(luò),其采用基礎(chǔ)網(wǎng)絡(luò)輸出的卷積特征圖作為輸入. 首先,采用 512 channel,3×3 kernel 的卷積層(上面的例子采用的是256個(gè)channel,但是不影響理解,backbone是ZF網(wǎng)絡(luò)是256,VGG16的話是512個(gè)channel),然后是兩個(gè)并行的 1×1 kernel 的卷積層,該卷積層的 channels 數(shù)量取決每個(gè)點(diǎn)(每個(gè)anchor)所對(duì)應(yīng)的的 標(biāo)準(zhǔn)候選框K 的數(shù)量,在這兩個(gè)并行的1x1卷積中,左側(cè)的是進(jìn)行分類的,這里的分類只是分有和無兩類,即候選框中有目標(biāo)還是沒有目標(biāo),至于目標(biāo)到底是什么先不管,由于每一個(gè)anchor對(duì)應(yīng)k個(gè)候選框,每一個(gè)候選框有兩個(gè)取值(即有和無,用概率大小表示)所以每一個(gè)anchor對(duì)應(yīng)的輸出應(yīng)該為一個(gè)2K維度的向量,故而左側(cè)的分類卷積使用2K個(gè)channel;
同樣的道理,右側(cè)是獲取邊框位置信息的卷積網(wǎng)絡(luò),由于每一個(gè)anchor對(duì)應(yīng)k個(gè)候選框,每一個(gè)候選框有4個(gè)位置取值(x,y,w,h)所以每一個(gè)anchor對(duì)應(yīng)的輸出應(yīng)該為一個(gè)4K維度的向量,故而右側(cè)的卷積使用4K個(gè)channel;這里的理解是很重要的。
那究竟RPN網(wǎng)絡(luò)是如何進(jìn)行訓(xùn)練的呢?
RPN訓(xùn)練中對(duì)于正樣本文章中給出兩種定義。第一,與ground truth box有最大的IoU的anchors作為正樣本;第二,與ground truth box的IoU大于0.7的作為正樣本。文中采取的是第一種方式。文中定義的負(fù)樣本為與ground truth box的IoU小于0.3的樣本。
訓(xùn)練RPN的loss函數(shù)定義如下:
其中,i表示mini-batch中第i個(gè)anchor,pi表示第i個(gè)anchor是前景的概率,當(dāng)?shù)趇個(gè)anchor是前景時(shí)pi為1反之為0,ti表示預(yù)測的bounding box的坐標(biāo),ti?為ground truth的坐標(biāo)。
看過Fast R-CNN文章詳細(xì)解讀文章的會(huì)發(fā)現(xiàn),這部分的loss函數(shù)和Fast R-CNN一樣,除了正負(fù)樣本的定義不一樣,其他表示時(shí)一樣的。一個(gè)是交叉熵?fù)p失,一個(gè)是smooth_L1損失函數(shù)。
3.6 RPN是如何產(chǎn)生ROI的?
RPN在自身訓(xùn)練的同時(shí),還會(huì)提供RoIs(region of interests)給Fast RCNN(RoIHead)作為訓(xùn)練樣本。RPN生成RoIs的過程(ProposalCreator)如下:
(1)對(duì)于每張圖片,利用它的feature map, 計(jì)算 (H/16)× (W/16)×9(大概20000)個(gè)anchor屬于前景的概率,以及對(duì)應(yīng)的位置參數(shù)。(這里的W、H表示原始圖像的寬和高,前面已經(jīng)有說過了)
(2)選取概率較大的12000個(gè)anchor,利用回歸的位置參數(shù),修正這12000個(gè)anchor的位置,得到RoIs,利用非極大值((Non-maximum suppression, NMS)抑制,選出概率最大的2000個(gè)RoIs
注意:在inference的時(shí)候,為了提高處理速度,12000和2000分別變?yōu)?000和300.
注意:這部分的操作不需要進(jìn)行反向傳播,因此可以利用numpy/tensor實(shí)現(xiàn)。
RPN的輸出:RoIs(形如2000×4或者300×4的tensor)
3.7 RPN網(wǎng)絡(luò)與Fast R-CNN網(wǎng)絡(luò)的權(quán)值共享
RPN最終目的是得到候選區(qū)域,但在目標(biāo)檢測的最終目的是為了得到最終的物體的位置和相應(yīng)的概率,這部分功能由Fast R-CNN做的。因?yàn)镽PN和Fast R-CNN都會(huì)要求利用CNN網(wǎng)絡(luò)提取特征,所以文章的做法是使RPN和Fast R-CNN共享同一個(gè)CNN部分。
Faster R-CNN的訓(xùn)練方法主要分為兩個(gè),目的都是使得RPN和Fast R-CNN共享CNN部分,如下圖所示 :
一個(gè)是迭代的,先訓(xùn)練RPN,然后使用得到的候選區(qū)域訓(xùn)練Fast R-CNN,之后再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次訓(xùn)練RPN(這里不更新CNN,僅更新RPN特有的層),最后再次訓(xùn)練Fast R-CNN(這里不更新CNN,僅更新Fast R-CNN特有的層)。
還有一個(gè)更為簡單的方法,就是end-to-end的訓(xùn)練方法,將RPN和Fast R-CNN結(jié)合起來一起訓(xùn)練,tf版本的代碼有這種方式的實(shí)現(xiàn)。
四、RoIHead與Fast R-CNN的進(jìn)一步訓(xùn)練
RPN只是給出了2000個(gè)候選框,RoI Head在給出的2000候選框之上繼續(xù)進(jìn)行分類和位置參數(shù)的回歸。其實(shí)所謂的ROIHead就是對(duì)生成的候選框進(jìn)行處理,這個(gè)地方與前面的fast-RCNN是一樣的。
4.1 ROIHead的網(wǎng)絡(luò)結(jié)構(gòu)
由于RoIs給出的2000個(gè)候選框,分別對(duì)應(yīng)feature map不同大小的區(qū)域。首先利用ProposalTargetCreator 挑選出128個(gè)sample_rois, 然后使用了RoIPooling 將這些不同尺寸的區(qū)域全部pooling到同一個(gè)尺度(7×7)上。下圖就是一個(gè)例子,對(duì)于feature map上兩個(gè)不同尺度的RoI,經(jīng)過RoIPooling之后,最后得到了3×3的feature map.
RoIPooling,其實(shí)這里的ROIPooling跟fast-RCNN里面的是一樣的。
RoI Pooling 是一種特殊的Pooling操作,給定一張圖片的Feature map (512×H/16×W/16) ,和128個(gè)候選區(qū)域的座標(biāo)(128×4),RoI Pooling將這些區(qū)域統(tǒng)一下采樣到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一個(gè)batch-size=128,通道數(shù)為512,7×7的feature map。
為什么要pooling成7×7的尺度?是為了能夠共享權(quán)重。在之前講過,除了用到VGG前幾層的卷積之外,最后的全連接層也可以繼續(xù)利用。當(dāng)所有的RoIs都被pooling成(512×7×7)的feature map后,將它reshape 成一個(gè)一維的向量,就可以利用VGG16預(yù)訓(xùn)練的權(quán)重,初始化前兩層全連接。最后再接兩個(gè)全連接層,分別是:
FC 21 用來分類,預(yù)測RoIs屬于哪個(gè)類別(20個(gè)類+背景)
FC 84 用來回歸位置(21個(gè)類,每個(gè)類都有4個(gè)位置參數(shù))
4.2 訓(xùn)練
前面講過,RPN會(huì)產(chǎn)生大約2000個(gè)RoIs,這2000個(gè)RoIs不是都拿去訓(xùn)練,而是利用ProposalTargetCreator 選擇128個(gè)RoIs用以訓(xùn)練。選擇的規(guī)則如下:
(1)RoIs和gt_bboxes 的IoU大于0.5的,選擇一些(比如32個(gè))
(2)選擇 RoIs和gt_bboxes的IoU小于等于0(或者0.1)的選擇一些(比如 128-32=96個(gè))作為負(fù)樣本
(3)為了便于訓(xùn)練,對(duì)選擇出的128個(gè)RoIs,還對(duì)他們的gt_roi_loc 進(jìn)行標(biāo)準(zhǔn)化處理(減去均值除以標(biāo)準(zhǔn)差)
(4)對(duì)于分類問題,直接利用交叉熵?fù)p失. 而對(duì)于位置的回歸損失,一樣采用Smooth_L1Loss, 只不過只對(duì)正樣本計(jì)算損失.而且是只對(duì)正樣本中的這個(gè)類別4個(gè)參數(shù)計(jì)算損失。
舉例來說:
一個(gè)RoI在經(jīng)過FC 84后會(huì)輸出一個(gè)84維的loc 向量. 如果這個(gè)RoI是負(fù)樣本,則這84維向量不參與計(jì)算 L1_Loss。如果這個(gè)RoI是正樣本,屬于label K,那么它的第 K×4, K×4+1 ,K×4+2, K×4+3 這4個(gè)數(shù)參與計(jì)算損失,其余的不參與計(jì)算損失。
4.3 生成預(yù)測結(jié)果
測試的時(shí)候?qū)λ械腞oIs(大概300個(gè)左右) 計(jì)算概率,并利用位置參數(shù)調(diào)整預(yù)測候選框的位置。然后再用一遍極大值抑制(之前在RPN的ProposalCreator用過)。
注意:
在RPN的時(shí)候,已經(jīng)對(duì)anchor做了一遍NMS,在RCNN測試的時(shí)候,還要再做一遍
在RPN的時(shí)候,已經(jīng)對(duì)anchor的位置做了回歸調(diào)整,在RCNN階段還要對(duì)RoI再做一遍
在RPN階段分類是二分類,而Fast RCNN階段是21分類
4.4 模型架構(gòu)圖
最后整體的模型架構(gòu)圖如下:
需要注意的是: 藍(lán)色箭頭的線代表著計(jì)算圖,梯度反向傳播會(huì)經(jīng)過。而紅色部分的線不需要進(jìn)行反向傳播(論文了中提到了ProposalCreator生成RoIs的過程也能進(jìn)行反向傳播,但需要專門的算法)。
五、faster-RCNN里面的幾個(gè)重要概念(四個(gè)損失三個(gè)creator)
5.1 四類損失
雖然原始論文中用的4-Step Alternating Training 即四步交替迭代訓(xùn)練。然而現(xiàn)在github上開源的實(shí)現(xiàn)大多是采用近似聯(lián)合訓(xùn)練(Approximate joint training),端到端,一步到位,速度更快。
在訓(xùn)練Faster RCNN的時(shí)候有四個(gè)損失:
(1)RPN 分類損失:anchor是否為前景(二分類)
(2)RPN位置回歸損失:anchor位置微調(diào)
(3)RoI 分類損失:RoI所屬類別(21分類,多了一個(gè)類作為背景)
(4)RoI位置回歸損失:繼續(xù)對(duì)RoI位置微調(diào)
四個(gè)損失相加作為最后的損失,反向傳播,更新參數(shù)。
5.2 三個(gè)creator
(1)AnchorTargetCreator : 負(fù)責(zé)在訓(xùn)練RPN的時(shí)候,從上萬個(gè)anchor中選擇一些(比如256)進(jìn)行訓(xùn)練,以使得正負(fù)樣本比例大概是1:1. 同時(shí)給出訓(xùn)練的位置參數(shù)目標(biāo)。 即返回gt_rpn_loc和gt_rpn_label。
(2)ProposalTargetCreator: 負(fù)責(zé)在訓(xùn)練RoIHead/Fast R-CNN的時(shí)候,從RoIs選擇一部分(比如128個(gè))用以訓(xùn)練。同時(shí)給定訓(xùn)練目標(biāo), 返回(sample_RoI, gt_RoI_loc, gt_RoI_label)
(3)ProposalCreator: 在RPN中,從上萬個(gè)anchor中,選擇一定數(shù)目(2000或者300),調(diào)整大小和位置,生成RoIs,用以Fast R-CNN訓(xùn)練或者測試。
其中AnchorTargetCreator和ProposalTargetCreator是為了生成訓(xùn)練的目標(biāo),只在訓(xùn)練階段用到,ProposalCreator是RPN為Fast R-CNN生成RoIs,在訓(xùn)練和測試階段都會(huì)用到。三個(gè)共同點(diǎn)在于他們都不需要考慮反向傳播(因此不同框架間可以共享numpy實(shí)現(xiàn))
其它比較好的博客:
https://blog.csdn.net/Lin_xiaoyi/article/details/78214874
https://blog.csdn.net/qq_37392244/article/details/88837784
總結(jié)
以上是生活随笔為你收集整理的Faster RCNN详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate.hbm2ddl.au
- 下一篇: 查看浏览器内核以及版本信息