摘自:【個人整理】faster-RCNN的背景、結構以及大致實現架構
這篇是我看過講faster-RCNN最清楚的,很多地方茅塞頓開,特轉。
一、 faster-RCNN的背景
Faster R-CNN 發表於 NIPS 2015,其后出現了很多改進版本,后面會進行介紹.
R-CNN - Rich feature hierarchies for accurate object detection and semantic segmentation 是 Faster R-CNN 的啟發版本. R-CNN 是采用 Selective Search 算法來提取(propose)可能的 RoIs(regions of interest) 區域,然后對每個提取區域采用標准 CNN 進行分類.
出現於 2015 年早期的 Fast R-CNN 是 R-CNN 的改進,其采用興趣區域池化(Region of Interest Pooling,RoI Pooling) 來共享計算量較大的部分,提高模型的效率.
Faster R-CNN 隨后被提出,其是第一個完全可微分的模型. Faster R-CNN 是 R-CNN 論文的第三個版本.R-CNN、Fast R-CNN 和 Faster R-CNN 作者都有 Ross Girshick.
二、faster-RCNN的網絡結構
Faster R-CNN 的結構是復雜的,因為其有幾個移動部件. 這里先對整體框架宏觀介紹,然后再對每個部分的細節分析.
問題描述:
針對一張圖片,需要獲得的輸出有:
- 邊界框(bounding boxes) 列表,即一幅圖像有多少個候選框(region proposal),比如有2000個;
- 每個邊界框的類別標簽,比如候選框里面是貓?狗?等等;
- 每個邊界框和類別標簽的概率。
2.1 faster-RCNN的基本結構
除此之外,下面的幾幅圖也能夠較好的描述發圖爾-RCNN的一般結構:
2.2 faster-RCNN的大致實現過程
整個網絡的大致過程如下:
(1)首先,輸入圖片表示為 Height × Width × Depth 的張量(多維數組)形式,經過預訓練 CNN 模型的處理,得到卷積特征圖(conv feature map)。即將 CNN 作為特征提取器,送入下一個部分。這種技術在遷移學習(Transfer Learning)中比較普遍,尤其是,采用在大規模數據集訓練的網絡權重,來對小規模數據集訓練分類器. 后面會詳細介紹.
(2)然后,RPN(Region Propose Network) 對提取的卷積特征圖進行處理. RPN 用於尋找可能包含 objects 的預定義數量的區域(regions,邊界框)。這是整個文章最核心的改進,也是本文會着重介紹的點。
基於深度學習的目標檢測中,可能最難的問題就是生成長度不定(variable-length)的邊界框列表. 在構建深度神經網絡時,最后的網絡輸出一般是固定尺寸的張量輸出(采用RNN的除外). 例如,在圖片分類中,網絡輸出是 (N, ) 的張量,N 是類別標簽數,張量的每個位置的標量值表示圖片是類別 labeli{ label_i }labeli 的概率值.
在 RPN 中,通過采用 anchors 來解決邊界框列表長度不定的問題,即,在原始圖像中統一放置固定大小的參考邊界框. 不同於直接檢測 objects 的位置,這里將問題轉化為兩部分:
對每一個 anchor 而言,
- anchor 是否包含相關的 object?
- 如何調整 anchor 以更好的擬合相關的 object?
這里可能不容易理解,后面會深入介紹anchor以及RPN相關的實現原理。
上圖展示了RPN網絡的具體結構。可以看到RPN網絡實際分為2條線,上面一條通過softmax分類anchors獲得positive和negative分類,下面一條用於計算對於anchors的bounding box regression偏移量,以獲得精確的proposal。而最后的Proposal層則負責綜合positive anchors和對應bounding box regression偏移量獲取proposals,同時剔除太小和超出邊界的proposals。其實整個網絡到了Proposal Layer這里,就完成了相當於目標定位的功能。
(3)當獲得了可能的相關objects 和其在原始圖像中的對應位置之后,問題就更加直接了. 采用 CNN 提取的特征和包含相關 objects 的邊界框,采用 RoI Pooling 處理,並提取相關 object 的特征,得到一個新的向量.
最后,基於 R-CNN 模塊,得到:
- 對邊界框內的內容進行分類,(或丟棄邊界框,采用 background 作為一個 label.)
- 調整邊界框坐標,以更好的使用 object.
上面的過程沒有涉及到一些重要的細節信息. 但包括了 Faster R-CNN 的大致實現過程。
2.3 faster-RCNN的基本組成
faster-RCNN其實就是由幾個基本的網絡架構組成的。
Faster R-CNN的整體流程如下圖所示。
從上面的圖形中可以看出,Faster R-CNN主要分為四部分(圖中四個綠色框)
(1)Dataset數據。提供符合要求的數據格式(目前常用數據集是VOC和COCO);
(2)Extractor卷積神經網絡。 利用CNN提取圖片特征features(原始論文用的是ZF和VGG16,后來人們又用ResNet101);
(3)RPN(Region Proposal Network)。 負責提供候選區域rois(每張圖給出大概2000個候選框);
(4)RoIHead。 負責對由RPN產生的ROI進行分類和微調。對RPN找出的ROI,判斷它是否包含目標,並修正框的位置和座標。
Faster R-CNN整體的流程可以分為三步:
(1)提特征。 圖片(img)經過預訓練的網絡(Extractor),提取到了圖片的特征(feature)
(2)Region Proposal。 利用提取的特征(feature),經過RPN網絡,找出一定數量的rois(region of interests)
(3)分類與回歸。將rois和圖像特征features,輸入到RoIHead,對這些rois進行分類,判斷都屬於什么類別,同時對這些rois的位置進行微調。
就是第二步是關鍵所在,第一步和第三部同fast-RCNN一樣。
三、區域推薦網絡RPN詳解
3.1 邊框的位置到底用什么表示?
目標檢測之所以難,是因為每一個物體的區域大小是不一樣的,每一個區域框有着不同的大小size(也稱之為scale)和不同的長寬比(aspect ratios)
現在假設,已經知道圖片中有兩個 objects,首先想到的是,訓練一個網絡,輸出 8 個值:兩對元組 (xmin,ymin,xmax,ymax)、(xmin,ymin,xmax,ymax)分別定義了每個 object 的邊界框.。這種方法存在一些基本問題. 例如,
(1)當圖片的尺寸和長寬比不一致時,良好訓練模型來預測,會非常復雜;(這里不是很理解,望有大神告知!)
(2)另一個問題是無效預測:預測 xmin和xmax 時,需要保證 xmin<xmax;
事實上,有一種更加簡單的方法來預測 objects 的邊界框,即,學習相對於參考boxes 的偏移量. 假設參考 box的位置由以下確定:(xcenter,ycenter,width,height),則需要預測量為:( Δxcenter,Δycenter,Δwidth,Δheight),它們的取值一般都是很小的值,以調整參考 box 更好的擬合所需要的。
3.2 RPN網絡的基本結構
首先看到這幅圖的時候我是一臉懵逼,看了半天又是一知半解,后面我會結合這幅圖詳細來說,這里暫且先放一副結構圖。我們發現,其實整個RPN的網絡很淺很簡單,但是為什么要這樣設計呢?這樣設計能達到什么樣的效果呢?
a.conv fetaure map到 intermediate layer的卷積過程:(摘自:https://blog.csdn.net/gbz3300255/article/details/105493407/)
在特征圖上用sliding window 3*3的窗口滑動。這個窗口提出來的圖 conv feature map大小是3*3*256,上面那個圖只顯示了1通道的,在它下面還有255層。那么對於特征圖上某個點來說,就要用256個大小為3*3*256的卷積核對這個窗口進行卷積,卷積過程顯然是對應通道(256channel)卷積,獲得1*256維的向量,然后累加獲得1*1向量,卷積核有256個,這樣的向量就有256個最終結果就是1*256(這個256是卷積核個數)。結果對應於下圖intermediate layer。整張特征圖卷積結果如下圖
(卷積函數 輸入通道數決定卷積核的通道數,卷積核的個數決定輸出通道數)

b.intermediate layer的256維向量后面對應兩條分支:
cls layer分支是目標和背景的二分類(classification),因為k等於9,所以通過1×1×256×18的卷積核得到 2*9 = 18個分數,分別是目標和背景的評分。這次卷積總的流程如下圖。最右側的18層中,每兩層代表了某個anchor的特征圖上所有點的前景背景概率值。

reg layer分支。如果候選框是目標區域,就去判斷該目標區域的候選框位置在哪,這個時候另一條分支就過1×1×256×36的卷積得到4*9個值,每個框包含4個值(x,y,w,h),就是9個候選區域對應的框應該偏移的具體位置Δxcenter,Δycenter,Δwidth,Δheight。如果候選框不是目標區域,就直接將該候選框去除掉,不再進行后續位置信息的判斷操作。這里預測的值都是通過模型不斷訓練得到的。顯然最右側的18層中,每4層代表了某個anchor的特征圖上所有點的偏移量的值。

最終結果:候選框。
3.3 RPN的核心概念——anchor
anchor,中文意思是錨點的意思,那到底什么是anchor?有很多不同的解釋,其實不能說那種解釋完全標准,主要是站在不同的角度進行解釋的,都有道理,本文會將各種解釋綜合起來,盡量說得易懂一點。
3.3.1 知識回顧
要理解什么是anchor,就要知道我們為什么搞出一個RPN這種東西,回顧一下前面三種目標檢測架構RCNN、SPPNet、fast-RCNN,
(1)RCNN是在原始圖像中使用select search方法選擇大約2000個候選框,然后對每個候選框進行卷積運算;
(2)SPPNet和fast-RCNN是先讓整個圖片經過CNN,然后在得到的特征圖上使用select search選擇2000個左右的候選框,其實我們真正需要的還是在原始圖像上的候選區域,那為什么在卷積之后的特征圖上也可以這么做呢?這是因為卷積之后的特征圖和原始圖像之間存在的映射關系,在特征圖上的候選區可以映射到原始圖像上。
總而言之:我們要使用RPN的目的也就是要產生(原始圖像上的)候選框。而且這里有一個重要的信息,就是卷積之后的feature map和原始圖像之間是有一個映射關系的,如果我能夠在feature map上面找到響應候選框,也就代表了在原始圖像上找到了候選框。
3.3.2 RPN的輸入與輸出
輸入:RPN是接在feature map之后的,因此它的輸入是feature map;
輸出:我希望得到的是候選區域,因此輸出的是候選區域,這樣說沒錯,但是在網絡中其實流動的都是數據啊,這一個框框嗯么表示呢?當然也是通過數據的形式來表示了,還有一點就是這個框框里面有目標還是沒有目標,這也是通過數據來表示的。
3.3.3 到底什么是anchor?
有很多文獻中這樣說道:Anchor是大小和尺寸固定的候選框,個人感覺這種說法是很不准確的,只是一個表象而已。在回答什么 是anchor之前,我們先看一下RPN網絡的一個第一步運算,RPN的第一步運算實際上就是一個3*3*256的卷積運算,我們稱3*3為一個滑動窗口(sliding window)。假設RPN的輸入是13*13*256的特征圖,然后使用3*3*256(一個卷積核的size,本例應該是有256個卷積核)的卷積核進行卷積運算,最后依然會得到一個a*a*256的特征圖,這里的a與卷積的步幅有關。
在原始論文中,我們選定了3種不同scale、3種不同長寬比(aspect ratios)的矩形框作為“基本候選框(這是我起的名字)”,
三種scale/size是{128,256,512}
三種比例{1:1 , 1:2 , 2:1}
故而一共是3x3=9種,有很多文獻說這就是9個anchors,之所以我覺得不准確是因為下面的兩個方面
(1)anchor顧名思義為錨點,這這是一個矩形框,與錨點本身的含義是不符合的;
(2)很明顯,這9個基本候選框的長寬遠遠大於特征圖的長寬,所以這9個指的應該是原始圖像,結合論文中要對原始圖像進行縮放到600*1000左右的大小,更加確定了這一點,有的人說錨點是特征圖上的某一個點或者是候選框,既然這9個根本就不是特征圖上的候選框,那自然不存在錨點之說了。
3.3.4 anchor錨點的本質
錨點的真實含義:應該是特征圖的某一個像素與對應在原始圖像的某一個像素,即它本質上指的是特征圖上當前滑窗的中心在原像素空間的映射點稱為anchor,即anchor是在原始圖像上的
然后以這個錨點為中心,配上規定的9個基本候選框,這就正確了,所以在原始圖像上的圖像大致如下:
其中每一個黑色的點是anchor錨點,以及畫出的以這些錨點為中心的9個基本候選框。
3.3.5 為什么這樣子設計可行?
依然以上面的例子進行說明,假定輸出特征圖為13*13*256,然后在該特征圖上進行3*3*256的卷積,默認進行了邊界填充
那么每一個特征圖上一共有13*13=169個像素點,由於采用了邊界填充,所以在進行3*3卷積的時候,每一個像素點都可以做一次3*3卷積核的中心點,那么整個卷積下來相當於是有169個卷積中心,這169個卷積中心在原始圖像上會有169個對應的錨點,然后每個錨點會有9個默認大小的基本候選框,這樣相當於原始圖像中一共有169*9=1521個候選框,這1521個候選框有9種不同的尺度,中心又到處都分布,所以足以覆蓋了整個原始圖像上所有的區域,甚至還有大量的重復區域。
這個映射過程如下所示(自己畫的,不好請包涵):
補充:
關於特征圖和原始圖像的映射關系,這里有一點需要補充,假定原始的圖像長寬分別是W*H,特征圖的長寬是w*h,則有如下關系:
w=W/r;h=W/r;這里的r稱之為下采樣率,即各個卷積層和池化層步幅的乘積,在VGG中,r=19.
其實我們需要的並不是這個候選框本身,我們需要的數據是每一個候選框的位置信息(x,y,w,h)和目標信息(有,沒有),我們可以這樣理解,每一個候選框都包含這6個信息,也可以說成是是6個特征,特征圖上的每一個像素都對應於原始圖像上的一個“錨點anchor”,而每一個anchor又包含了9個尺寸比例各不相同的標准候選框,每一個候選框又包含着這6個基本信息,所以現在相當於是對每一個特征像素進行學習,也就間接的學習到了原始圖像上大量的錨點以及大量的候選框的信息,這樣理解不就更好了嗎(個人理解,有錯誤請大佬糾正!)
另外一篇博客的解釋:對於feature map中的每個3×3的窗口,作者就以這個滑動窗口的中心點對應原始圖片的中心點。然后作者假定,這個3×3的窗口,是從原始圖片通過SPP池化得到,而這個池化的面積及比例,就是一個個anchors。換句話說,對於每個3x3窗口,作者假定它來自9種不同原始區域的池化,但是這些池化在原始圖片中的中心點,都完全一樣。這個中心點,就是剛剛提到的,3x3窗口中心點所對應的原始圖片中的中心點。如此一來,在每個窗口位置,我們都可以根據不同的長寬比例,不同的面積的anchors,逆向推導出它所對應的原始圖片的一個區域,這個區域的尺寸以及坐標,都是已知。而這個區域,就是我們想要的proposal。接下來,每個proposal我們只輸出6個參數,每個proposal和ground truth進行比較得到的前景概率和背景概率(2個參數)對應圖片上的cls_score,由於每個proposal和groundtruth的位置及尺寸上的差異從proposal通過平移縮放得到ground truth需要的4個平移縮放參數(對應圖片上bbox_pred)。
還有一篇博客的解釋:首先我們要知道anchor的本質是什么,本質是SPP(spatial pyramid pooling)思想的你想。而SPP本身是做什么的呢?就是將不同尺寸的輸入resize成為相同尺寸的輸出。所以SPP的逆向就是,將相同尺寸的輸出,倒推得到不同尺寸的輸入。原始圖片經過一系列卷積層和池化層以及relu,得到feature map:51*39*256.在這個特征基礎上,通過一個3*3的滑動窗口,在這個51*39的區域上進行滑動,stride=1, padding=1,這樣一來,滑動得到的就是51*39個3*3的窗口。對於每個3*3的窗口,作者就計算這個滑動窗口的中心點所對應的原始圖片的中心點。然后作者假定,這個3*3窗口,是從原始圖片上通過SPP池化得到的,而這個池化的區域的面積以及長寬比例,就是一個個的anchor。換句話說,對於每個3x3窗口,作者假定它來自9種不同原始區域的池化,但是這些池化在原始圖片中的中心點,都完全一樣。這個中心點,就是剛才提到的,3x3窗口中心點所對應的原始圖片中的中心點。如此一來,在每個窗口位置,我們都可以根據9個不同長寬比例、不同面積的anchor,逆向推導出它所對應的原始圖片中的一個區域,這個區域的尺寸以及坐標,都是已知的。而這個區域,就是我們想要的 proposal。所以我們通過滑動窗口和anchor,成功得到了 51x39x9 個原始圖片的proposal。接下來,每個proposal我們只輸出6個參數:每個 proposal 和 ground truth 進行比較得到的前景概率和背景概率(2個參數)(對應圖上的 cls_score);由於每個 proposal 和 ground truth 位置及尺寸上的差異,從 proposal 通過平移放縮得到 ground truth 需要的4個平移放縮參數(對應圖上的 bbox_pred)。
總結歸納:當前滑窗的中心在原像素空間的映射點稱為anchor,以此anchor為中心,生成k(paper中default k=9, 3 scales and 3 aspect ratios)個proposals。雖然 anchors 是基於卷積特征圖定義的,但最終的 anchos 是相對於原始圖片的. RPN的本質是 “ 基於滑窗的無類別obejct檢測器 ” 。
3.4 生成anchor的作用和目的
要知道,訓練RPN網絡是有監督訓練,需要有數據、還要有相應的類標簽,輸入小網絡的是512個通道的3*3滑窗,類標簽沒有給定,沒有類標簽就無法計算Loss損失函數,無法訓練網絡。以3*3滑窗中心對應原圖的位置作為中心點,在原圖生成9個不同尺度長寬比的anchor,然后每個anchor都會被分配到相應的類標簽,有正樣本(1)、負樣本(0),也有不參與訓練的框(not used),對正樣本計算,就是回歸的類標簽,負樣本不計算回歸loss。0,1是二分類的標簽。所以在原圖生成anchor的目的之一是得到類標簽。這里只得到了分類的標簽(0,1),還有正樣本的回歸標簽需要確定,該正樣本的回歸標簽是其對應的ground truth計算出來的。負樣本不計算回歸損失沒有回歸標簽。
3.5 RPN的訓練過程
上面只討論了RPN的第一步運算——實際上就是卷積運算,接下來考慮后面的運算步驟,如下:
上面的用黑色圈出來的部分是第一步運算,用紅色圈圈圈出來的是第二步運算,我們將第二步運算單獨拿出來看,如下圖所示:

注意:這里圖片的和上面的稍微有所區別,但是沒關系,只要能理解清楚意思就好。
RPN 是全卷積(full conv) 網絡,其采用基礎網絡輸出的卷積特征圖作為輸入. 首先,采用 512 channel,3×3 kernel 的卷積層(上面的例子采用的是256個channel,但是不影響理解,backbone是ZF網絡是256,VGG16的話是512個channel),然后是兩個並行的 1×1 kernel 的卷積層,該卷積層的 channels 數量取決每個點(每個anchor)所對應的的 標准候選框K 的數量,在這兩個並行的1x1卷積中,左側的是進行分類的,這里的分類只是分有和無兩類,即候選框中有目標還是沒有目標,至於目標到底是什么先不管,由於每一個anchor對應k個候選框,每一個候選框有兩個取值(即有和無,用概率大小表示)所以每一個anchor對應的輸出應該為一個2K維度的向量,故而左側的分類卷積使用2K個channel;
同樣的道理,右側是獲取邊框位置信息的卷積網絡,由於每一個anchor對應k個候選框,每一個候選框有4個位置取值(x,y,w,h)所以每一個anchor對應的輸出應該為一個4K維度的向量,故而右側的卷積使用4K個channel;這里的理解是很重要的。
那究竟RPN網絡是如何進行訓練的呢?
RPN訓練中對於正樣本文章中給出兩種定義。第一,與ground truth box有最大的IoU的anchors作為正樣本;第二,與ground truth box的IoU大於0.7的作為正樣本。文中采取的是第一種方式。文中定義的負樣本為與ground truth box的IoU小於0.3的樣本。
訓練RPN的loss函數定義如下:
其中,i表示mini-batch中第i個anchor,pi表示第i個anchor是前景的概率,當第i個anchor是前景時pi為1反之為0,ti表示預測的bounding box的坐標,ti∗為ground truth的坐標。
看過Fast R-CNN文章詳細解讀文章的會發現,這部分的loss函數和Fast R-CNN一樣,除了正負樣本的定義不一樣,其他表示時一樣的。一個是交叉熵損失,一個是smooth_L1損失函數。
3.6 RPN是如何產生ROI的?
RPN在自身訓練的同時,還會提供RoIs(region of interests)給Fast RCNN(RoIHead)作為訓練樣本。RPN生成RoIs的過程(ProposalCreator)如下:
(1)對於每張圖片,利用它的feature map, 計算 (H/16)× (W/16)×9(大概20000)個anchor屬於前景的概率,以及對應的位置參數。(這里的W、H表示原始圖像的寬和高,前面已經有說過了)
(2)選取概率較大的12000個anchor,利用回歸的位置參數,修正這12000個anchor的位置,得到RoIs,利用非極大值((Non-maximum suppression, NMS)抑制,選出概率最大的2000個RoIs
注意:在inference的時候,為了提高處理速度,12000和2000分別變為6000和300.
注意:這部分的操作不需要進行反向傳播,因此可以利用numpy/tensor實現。
RPN的輸出:RoIs(形如2000×4或者300×4的tensor)
3.7 RPN網絡與Fast R-CNN網絡的權值共享
RPN最終目的是得到候選區域,但在目標檢測的最終目的是為了得到最終的物體的位置和相應的概率,這部分功能由Fast R-CNN做的。因為RPN和Fast R-CNN都會要求利用CNN網絡提取特征,所以文章的做法是使RPN和Fast R-CNN共享同一個CNN部分。
Faster R-CNN的訓練方法主要分為兩個,目的都是使得RPN和Fast R-CNN共享CNN部分,如下圖所示 :
還有一個更為簡單的方法,就是end-to-end的訓練方法,將RPN和Fast R-CNN結合起來一起訓練,tf版本的代碼有這種方式的實現。
四、RoIHead與Fast R-CNN的進一步訓練
RPN只是給出了2000個候選框,RoI Head在給出的2000候選框之上繼續進行分類和位置參數的回歸。其實所謂的ROIHead就是對生成的候選框進行處理,這個地方與前面的fast-RCNN是一樣的。
4.1 ROIHead的網絡結構
由於RoIs給出的2000個候選框,分別對應feature map不同大小的區域。首先利用ProposalTargetCreator 挑選出128個sample_rois, 然后使用了RoIPooling 將這些不同尺寸的區域全部pooling到同一個尺度(7×7)上。下圖就是一個例子,對於feature map上兩個不同尺度的RoI,經過RoIPooling之后,最后得到了3×3的feature map.
RoIPooling,其實這里的ROIPooling跟fast-RCNN里面的是一樣的。
RoI Pooling 是一種特殊的Pooling操作,給定一張圖片的Feature map (512×H/16×W/16) ,和128個候選區域的座標(128×4),RoI Pooling將這些區域統一下采樣到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一個batch-size=128,通道數為512,7×7的feature map。
為什么要pooling成7×7的尺度?是為了能夠共享權重。在之前講過,除了用到VGG前幾層的卷積之外,最后的全連接層也可以繼續利用。當所有的RoIs都被pooling成(512×7×7)的feature map后,將它reshape 成一個一維的向量,就可以利用VGG16預訓練的權重,初始化前兩層全連接。最后再接兩個全連接層,分別是:
FC 21 用來分類,預測RoIs屬於哪個類別(20個類+背景)
FC 84 用來回歸位置(21個類,每個類都有4個位置參數)
4.2 訓練
前面講過,RPN會產生大約2000個RoIs,這2000個RoIs不是都拿去訓練,而是利用ProposalTargetCreator 選擇128個RoIs用以訓練。選擇的規則如下:
(1)RoIs和gt_bboxes 的IoU大於0.5的,選擇一些(比如32個)
(2)選擇 RoIs和gt_bboxes的IoU小於等於0(或者0.1)的選擇一些(比如 128-32=96個)作為負樣本
(3)為了便於訓練,對選擇出的128個RoIs,還對他們的gt_roi_loc 進行標准化處理(減去均值除以標准差)
(4)對於分類問題,直接利用交叉熵損失. 而對於位置的回歸損失,一樣采用Smooth_L1Loss, 只不過只對正樣本計算損失.而且是只對正樣本中的這個類別4個參數計算損失。
舉例來說:
一個RoI在經過FC 84后會輸出一個84維的loc 向量. 如果這個RoI是負樣本,則這84維向量不參與計算 L1_Loss。如果這個RoI是正樣本,屬於label K,那么它的第 K×4, K×4+1 ,K×4+2, K×4+3 這4個數參與計算損失,其余的不參與計算損失。
4.3 生成預測結果
測試的時候對所有的RoIs(大概300個左右) 計算概率,並利用位置參數調整預測候選框的位置。然后再用一遍極大值抑制(之前在RPN的ProposalCreator用過)。
注意:
在RPN的時候,已經對anchor做了一遍NMS,在RCNN測試的時候,還要再做一遍
在RPN的時候,已經對anchor的位置做了回歸調整,在RCNN階段還要對RoI再做一遍
在RPN階段分類是二分類,而Fast RCNN階段是21分類
4.4 模型架構圖
最后整體的模型架構圖如下:
需要注意的是: 藍色箭頭的線代表着計算圖,梯度反向傳播會經過。而紅色部分的線不需要進行反向傳播(論文了中提到了ProposalCreator生成RoIs的過程也能進行反向傳播,但需要專門的算法)。
五、faster-RCNN里面的幾個重要概念(四個損失三個creator)
5.1 四類損失
雖然原始論文中用的4-Step Alternating Training 即四步交替迭代訓練。然而現在github上開源的實現大多是采用近似聯合訓練(Approximate joint training),端到端,一步到位,速度更快。
在訓練Faster RCNN的時候有四個損失:
(1)RPN 分類損失:anchor是否為前景(二分類)
(2)RPN位置回歸損失:anchor位置微調
(3)RoI 分類損失:RoI所屬類別(21分類,多了一個類作為背景)
(4)RoI位置回歸損失:繼續對RoI位置微調
四個損失相加作為最后的損失,反向傳播,更新參數。
5.2 三個creator
(1)AnchorTargetCreator : 負責在訓練RPN的時候,從上萬個anchor中選擇一些(比如256)進行訓練,以使得正負樣本比例大概是1:1. 同時給出訓練的位置參數目標。 即返回gt_rpn_loc和gt_rpn_label。
(2)ProposalTargetCreator: 負責在訓練RoIHead/Fast R-CNN的時候,從RoIs選擇一部分(比如128個)用以訓練。同時給定訓練目標, 返回(sample_RoI, gt_RoI_loc, gt_RoI_label)
(3)ProposalCreator: 在RPN中,從上萬個anchor中,選擇一定數目(2000或者300),調整大小和位置,生成RoIs,用以Fast R-CNN訓練或者測試。
其中AnchorTargetCreator和ProposalTargetCreator是為了生成訓練的目標,只在訓練階段用到,ProposalCreator是RPN為Fast R-CNN生成RoIs,在訓練和測試階段都會用到。三個共同點在於他們都不需要考慮反向傳播(因此不同框架間可以共享numpy實現)
其它比較好的博客:
https://blog.csdn.net/Lin_xiaoyi/article/details/78214874
https://blog.csdn.net/qq_37392244/article/details/88837784
