最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

令我“細(xì)思極恐”的Faster-R-CNN

2020-12-29 17:25 作者:深藍(lán)學(xué)院  | 我要投稿

前言

CW(本文作者,簡(jiǎn)介見底部)每次回顧Faster R-CNN的相關(guān)知識(shí)(包括源碼),都會(huì)發(fā)現(xiàn)之前沒有注意到的一些細(xì)節(jié),從而有新的收獲,既驚恐又驚喜,可謂“細(xì)思極恐”!

Faster R-CNN可以算是深度學(xué)習(xí)目標(biāo)檢測(cè)領(lǐng)域的祖師爺了,至今許多算法都是在其基礎(chǔ)上進(jìn)行延伸和改進(jìn)的,它的出現(xiàn),可謂是開啟了目標(biāo)檢測(cè)的新篇章,其最為突出的貢獻(xiàn)之一是提出了 "anchor" 這個(gè)東東,并且使用 CNN 來生成region proposal(目標(biāo)候選區(qū)域),從而真正意義上完全使用CNN 來實(shí)現(xiàn)目標(biāo)檢測(cè)任務(wù)(以往的架構(gòu)會(huì)使用一些傳統(tǒng)視覺算法如Selective Search來生成目標(biāo)候選框,而 CNN僅用來提取特征或最后進(jìn)行分類和回歸)。

Faster R-CNN 由 R-CNN 和 Fast R-CNN發(fā)展而來,R-CNN是第一次將CNN應(yīng)用于目標(biāo)檢測(cè)任務(wù)的家伙,它使用selective search算法獲取目標(biāo)候選區(qū)域(region proposal),然后將每個(gè)候選區(qū)域縮放到同樣尺寸,接著將它們都輸入CNN提取特征后再用SVM進(jìn)行分類,最后再對(duì)分類結(jié)果進(jìn)行回歸,整個(gè)訓(xùn)練過程十分繁瑣,需要微調(diào)CNN+訓(xùn)練SVM+邊框回歸,無法實(shí)現(xiàn)端到端。

Fast R-CNN則受到 SPP-Net 的啟發(fā),將全圖(而非各個(gè)候選區(qū)域)輸入CNN進(jìn)行特征提取得到 feature map,然后用RoI Pooling將不同尺寸的候選區(qū)域(依然由selective search算法得到)映射到統(tǒng)一尺寸。另外,它用Softmax替代SVM用于分類任務(wù),除最后一層全連接層外,分類和回歸任務(wù)共享了網(wǎng)絡(luò)權(quán)重。

而Faster R-CNN相對(duì)于其前輩Fast R-CNN的最大改進(jìn)就是使用RPN來生成候選區(qū)域,摒棄了selective search算法,即完全使用CNN解決目標(biāo)檢測(cè)任務(wù),同時(shí)整個(gè)過程都能跑在GPU上,之前selective search僅在CPU上跑,是耗時(shí)的一大瓶頸。

本文從編碼實(shí)現(xiàn)的角度來解析 Faster R-CNN,先對(duì)網(wǎng)絡(luò)的前向(forward)過程進(jìn)行闡述,再回過頭來看訓(xùn)練的細(xì)節(jié),這樣便于更好地理解。

源碼是一位大佬寫的,基于Pytorch框架,是Faster R-CNN的精煉版,作為學(xué)習(xí)和參考來說相當(dāng)不錯(cuò),我自己也擼了一遍,這里也附上大佬源碼的鏈接:Faster R-CNN 精煉版。

Faster R-CNN Network

一. Overview

除去復(fù)雜的理論知識(shí)不談,從編程的角度來看,F(xiàn)aster R-CNN做的事情其實(shí)就是,“窮舉”一張圖片可能出現(xiàn)物體的位置,生成矩形框(計(jì)算位置和大?。?jì)算這些框中出現(xiàn)物體的概率,選擇概率高的,然后調(diào)整這些矩形框的位置與大小,并去除重疊度高的,最終得到一個(gè)個(gè)包含物體的矩形框。

如下為整體框架結(jié)構(gòu),結(jié)合上述過程來看,主要是三部分,Extrator進(jìn)行特征提取、RPN 生成候選框、RoIHead對(duì)候選框進(jìn)行分類并調(diào)整目標(biāo)預(yù)測(cè)框的位置與大小。


Faster R-CNN 框架

二. 特征提取

最初的Faster R-CNN使用了預(yù)訓(xùn)練的VGG16作為backbone進(jìn)行特征提取,實(shí)現(xiàn)方法是加載預(yù)訓(xùn)練模型,抽取并分離前面的卷積層和后面的全連接層,固定卷積層中部分層的權(quán)重,用作特征提取,而全連接層則給 RoIHead 用作分類和回歸。

Feature Extractor 實(shí)現(xiàn)

三. RPN(Region Proposal Network)

RPN 能夠獲得包含物體的區(qū)域,網(wǎng)絡(luò)的后續(xù)部分便可基于這些區(qū)域做進(jìn)一步的檢測(cè)。

1、使用anchor“窮舉”目標(biāo)物體所在區(qū)域

這里先介紹下anchor,這東東有點(diǎn)抽象,中文翻譯是“錨”,讓人容易覺得這是一個(gè)點(diǎn),實(shí)際它是可能包含目標(biāo)物體的矩形框。在目標(biāo)檢測(cè)任務(wù)中,通常會(huì)為每個(gè)像素點(diǎn)預(yù)設(shè)一個(gè)或多個(gè)面積大小和寬高比例不同的anchor,以此使得圖像上密集鋪滿了許許多多anchor,從而覆蓋到包含物體的所有位置區(qū)域。

backbone提取的特征圖(記作 fm)相對(duì)于網(wǎng)絡(luò)的輸入圖像尺寸縮小了16倍。因此,fm 中的1個(gè)像素點(diǎn)就相當(dāng)于輸入圖像的16個(gè)像素點(diǎn),或者說,fm中的1x1區(qū)域覆蓋了輸入圖像的16x16區(qū)域。這樣,fm中的每個(gè)像素點(diǎn)都對(duì)應(yīng)地覆蓋了輸入圖像的區(qū)域。

不難想象,如果一個(gè)像素點(diǎn)僅對(duì)應(yīng)一個(gè)anchor,難免會(huì)覆蓋不到或者覆蓋不全目標(biāo)物體。

因此,F(xiàn)aster R-CNN 對(duì)每個(gè)點(diǎn)對(duì)應(yīng)的anchor進(jìn)行了尺寸縮放和形變,前者對(duì)應(yīng)矩形面積,后者對(duì)應(yīng)矩形長(zhǎng)寬比例,每種尺寸對(duì)應(yīng)3種長(zhǎng)寬比,共設(shè)置3種尺寸,3種尺寸分別是128x128、256x256、512x512,3種長(zhǎng)寬比分別是 1:1、1:2、2:1,這樣一來,一個(gè)點(diǎn)就對(duì)應(yīng)9個(gè)anchor,其中每個(gè) anchor 的形狀和大小都不完全相同。

9個(gè)形狀和大小不同的anchor

具體的實(shí)現(xiàn)方法是,先計(jì)算fm中的一個(gè)點(diǎn)(通常是左上角)對(duì)應(yīng)的9個(gè)anchor的中心點(diǎn)坐標(biāo)和長(zhǎng)寬,其它點(diǎn)對(duì)應(yīng)的anchor則通過平移計(jì)算得出。

特征圖左上角的像素點(diǎn)對(duì)應(yīng)的9個(gè)anchor位置

不知道諸位客觀發(fā)現(xiàn)了沒,在上圖計(jì)算anchor_base坐標(biāo)時(shí),有可能出現(xiàn)負(fù)數(shù)!比如對(duì)于特征圖左上角的那個(gè)點(diǎn)(0,0),其作為anchor中心點(diǎn),由于下采樣了16倍,那么就對(duì)應(yīng)于輸入圖像16x16的區(qū)域,于是映射到輸入圖像上anchor中心點(diǎn)就是(8,8)。

考慮anchor尺寸倍數(shù)為8且長(zhǎng)寬比為1:1的情況,此時(shí)anchor面積為(16x8) x (16x8)=128x128,長(zhǎng)寬各為128,但中心點(diǎn)卻是(8,8),按此計(jì)算,左上角點(diǎn)坐標(biāo)就是 (8 - 128/2, 8-128/2) = (-56, -56)。莫方,在以下第3小節(jié)講解生成RoI的部分會(huì)涉及這部分的處理。

根據(jù)位移計(jì)算特征圖所有像素點(diǎn)對(duì)應(yīng)的anchor位置

2、在每個(gè)特征點(diǎn)上計(jì)算分類與回歸結(jié)果

這里的分類是二分類,僅僅區(qū)分前景和背景,具體做法是,先將 fm 進(jìn)行3x3卷積,進(jìn)一步提取特征,然后使用1x1卷積將通道數(shù)映射到18=9x2,對(duì)應(yīng)9個(gè)anchor的兩個(gè)類別,然后再將通道這個(gè)維度分割多一個(gè)維度,使得最后一維是2,代表前景和背景,最后使用softmax計(jì)算概率。

對(duì)候選區(qū)域分類

回歸的做法是使用1x1卷積將通道數(shù)映射到36=9x4,對(duì)應(yīng)9個(gè)anchor的位置與大小。注意,這里回歸的4個(gè)量分別是矩形框中心點(diǎn)與anchor中心點(diǎn)橫、縱坐標(biāo)的位移 以及 矩形框長(zhǎng)寬與 anchor 長(zhǎng)寬的比例。

對(duì)候選區(qū)域回歸

3、對(duì)分類與回歸結(jié)果進(jìn)行后處理,生成 RoI(Region of Interest)

這部分是One-Stage的最后階段,也稱作 Proposal Creator(Proposal Layer),會(huì)對(duì)RPN輸出的分類和回歸結(jié)果進(jìn)行后處理(如NMS等),得到網(wǎng)絡(luò)認(rèn)為包含物體的區(qū)域,稱為感興趣的候選區(qū)域——RoI。

至此,其實(shí)已經(jīng)完成了檢測(cè)任務(wù),因?yàn)橐呀?jīng)得到了包含物體的區(qū)域(bbox),只不過沒有對(duì)物體類別進(jìn)行細(xì)分,僅區(qū)分了前、背景。另外,由于anchor的位置和大小是人工預(yù)設(shè)的,且用于訓(xùn)練的樣本有限,因此此處得到的檢測(cè)結(jié)果可能并不夠精準(zhǔn)。

具體做法是,先將回歸得到的候選區(qū)域的寬、高限制在輸入圖像尺寸范圍內(nèi)以及剔除尺寸過小(小于16x16,因?yàn)樘卣鲌D中一個(gè)像素點(diǎn)就已經(jīng)代表了輸入圖像16x16的區(qū)域。

下圖中的scale是輸入網(wǎng)絡(luò)中的圖像與原圖之間的縮放系數(shù))的,然后將它們按前景概率排序,保留前面的一批(訓(xùn)練時(shí)是12000,預(yù)測(cè)時(shí)是6000),接著使用非極大值抑制進(jìn)一步剔除掉可能重復(fù)的,最后從剔除后的結(jié)果中保留剩下的一批(訓(xùn)練時(shí)是2000,預(yù)測(cè)時(shí)是300)。

生成RoI(i)
生成RoI(ii)

四. RolHead

RPN 生成的 RoI 僅僅區(qū)分了前景和背景,并沒有區(qū)分出物體的具體類別。因此,RoIHead 就是對(duì) RoI 進(jìn)一步分類,并且調(diào)整矩形框的位置和大小,使得預(yù)測(cè)結(jié)果更精細(xì)。

1. RoI Pooling

顧名思義,就是對(duì) RoI 進(jìn)行池化操作,具體做法是將每個(gè)RoI縮放到特征圖尺寸范圍內(nèi)對(duì)應(yīng)的區(qū)域,然后將RoI平均劃分為同樣數(shù)量的子區(qū)域(bin),對(duì)每個(gè)bin實(shí)施(最大/平均)池化操作,這樣就使得每個(gè)bin都映射為一個(gè)像素值,由于不同尺寸的RoI都劃分了同樣數(shù)量的bin,因此最終使得所有RoI都變?yōu)橥瑯哟笮?,這里是7x7(也就是對(duì)每個(gè)RoI都劃分了7x7個(gè)bin)。

RPN 生成的 RoI 尺寸是對(duì)應(yīng)于輸入圖像的,為了后面接全連接層生成預(yù)測(cè)結(jié)果,因此需要使用RoI Pooling將不同尺寸的各個(gè)RoI都映射至相同大小。

7x7大小的RoI經(jīng)過RoI Pooling變成2x2大小

這里提出 RoI Pooling 會(huì)產(chǎn)生的問題:

1.1 兩次量化損失

在將RoI映射至特征圖尺寸范圍的過程中,下采樣取整操作(比如200x200的區(qū)域經(jīng)16倍下采樣后映射為12 x 12)會(huì)產(chǎn)生一次量化損失;接著,假設(shè)最終需要生成的尺寸大小為nxn,則需將RoI劃分nxn個(gè)bin,在這個(gè)劃分過程中又會(huì)產(chǎn)生一次量化損失(比如對(duì)12x12大小的RoI劃分成7x7個(gè)bin,每個(gè)bin的平均尺寸是

,那么就會(huì)造成有些bin的大小是

,而另一些bin的大小則是

),于是后來就有人提出如RoI Align和Precise RoI Pooling等方法進(jìn)行改進(jìn),這里就不展開敘述了。

RoI Pooling的兩次量化損失

1.2 只有少數(shù)點(diǎn)的loss在反向傳播中貢獻(xiàn)了梯度

由于每個(gè)bin都由其中像素值最大的一點(diǎn)代表,因此在這部分的反向傳播中,每個(gè)bin只有一個(gè)點(diǎn)的loss貢獻(xiàn)了梯度,忽略了大部分點(diǎn)。

RoI Pooling的反向傳播

2. RoI 分類與回歸

將RoI Pooling后的結(jié)果展開(flatten)成 vector,輸入全連接層進(jìn)行分類和回歸,對(duì)應(yīng)輸出的神經(jīng)元個(gè)數(shù)分別為物體類別數(shù)(記為n_classes)以及每個(gè)類別物體對(duì)應(yīng)的bbox(n_classes x 4)。

注意,這里回歸的結(jié)果是預(yù)測(cè)框中心點(diǎn)相對(duì)于正樣本RoIs(在后文訓(xùn)練部分會(huì)講解如何篩選正樣本)中心點(diǎn)坐標(biāo)的位移以及兩者長(zhǎng)寬的比例,并且是歸一化(減去均值除以標(biāo)準(zhǔn)差)后的結(jié)果。

RoI分類與回歸

五. 后處理生成預(yù)測(cè)結(jié)果

RoIHead的輸出還不是預(yù)測(cè)結(jié)果的最終形態(tài),為了產(chǎn)生最終的預(yù)測(cè)結(jié)果,還需要做一些后處理。

具體做法是,將網(wǎng)絡(luò)輸出縮放至原圖尺寸,注意是原圖,不是輸入網(wǎng)絡(luò)的圖像,在原圖與輸入圖像之間是有縮放操作的。

接著對(duì)回歸的結(jié)果去歸一化(乘標(biāo)準(zhǔn)差加均值),結(jié)合RoIs的位置和大小計(jì)算出bbox的位置(左上角坐標(biāo)和右下角坐標(biāo)),并且裁剪到原圖尺寸范圍內(nèi)。

然后,選擇置信度大于閥值的矩形框,最后再使用非極大值抑制(NMS)剔除重疊度高的bbox得到最終的結(jié)果。

生成預(yù)測(cè)結(jié)果(i)

注意,這里在進(jìn)行置信度篩選以及NMS時(shí)是分別對(duì)每個(gè)物體單獨(dú)類別實(shí)施的,不包括背景類(下圖range()從1開始)。

那么就可能會(huì)發(fā)生這樣的情況:一個(gè)RoI對(duì)應(yīng)不同類別的預(yù)測(cè)結(jié)果都被保留下來(要知道RoIHead的輸出是每個(gè)RoI在不同類別上的分類和回歸結(jié)果),這里可以說是Faster R-CNN優(yōu)于YOLOv1的地方,因?yàn)閅OLOv1的一個(gè)格子僅能預(yù)測(cè)一個(gè)物體,但同時(shí)Faster R-CNN單獨(dú)在各個(gè)類別進(jìn)行NMS勢(shì)必會(huì)影響推斷速度,所以說從這方面看這里也是弱于YOLOv1的地方。

速度與質(zhì)量,魚與熊掌皆不可得~

生成預(yù)測(cè)結(jié)果(ii)

六. 訓(xùn)練

通過以上部分,相信朋友們已經(jīng)清楚了Faster R-CNN是如何進(jìn)行預(yù)測(cè)的了,但是,我們還沒有開始將它是如何訓(xùn)練的,只有進(jìn)行了有效的訓(xùn)練,模型才能產(chǎn)生可靠的預(yù)測(cè)結(jié)果,重頭戲來咯!

訓(xùn)練的部分主要包含三個(gè):Backbone、RPN 以及 RoIHead。Backbone 通常會(huì)采用在ImageNet上預(yù)訓(xùn)練的權(quán)重然后進(jìn)行微調(diào),因此這里主要解析RPN和RoIHead的訓(xùn)練過程,最初的實(shí)現(xiàn)將這兩部分開訓(xùn)練,后來的大多數(shù)實(shí)現(xiàn)已使用聯(lián)合訓(xùn)練的方式。

1. 篩選anchor樣本,指導(dǎo)RPN訓(xùn)練

由于anchor數(shù)量太多,因此需要篩選部分anchor樣本用于指導(dǎo)RPN訓(xùn)練。anchor總樣本是Backbone輸出特征圖上每點(diǎn)對(duì)應(yīng)的9個(gè)anchor,從中進(jìn)行篩選目標(biāo)樣本,具體做法是:

1). 將坐標(biāo)值不在輸入圖像尺寸范圍內(nèi)的anchor的標(biāo)簽記為-1;

2). 將與ground truth(gt)的IoU小于0.3的anchor作為負(fù)樣本,標(biāo)簽記為0;

3). 將與每個(gè)gt的IoU最大的anchor作為正樣本,標(biāo)簽記為1;

4). 將與gt的IoU不小于0.7的anchor作為正樣本,標(biāo)簽記為1;

5). 限制正樣本與負(fù)樣本總數(shù)為256個(gè),正負(fù)樣本比為1:1,若其中某一類樣本超過128個(gè),則隨機(jī)從中選擇多出的樣本將其標(biāo)簽記為-1;?

6). 僅將標(biāo)簽為0和1的樣本用于訓(xùn)練,忽略標(biāo)簽為-1的anchor

生成目標(biāo)anchor用于指導(dǎo)訓(xùn)練
對(duì)anchor樣本進(jìn)行篩選得到目標(biāo)anchor

正樣本和負(fù)樣本用作計(jì)算分類損失,而回歸的損失僅對(duì)正樣本計(jì)算。注意,這里回歸的目標(biāo)是gt相對(duì)于正樣本anchor中心點(diǎn)坐標(biāo)的位移以及兩者長(zhǎng)寬的比例,正因如此,前面部分談到過RPN回歸的結(jié)果是候選區(qū)域相對(duì)于anchor中心點(diǎn)坐標(biāo)的位移以及兩者長(zhǎng)寬的比例。

這種方式是將預(yù)測(cè)結(jié)果和gt都與anchor做比較,訓(xùn)練目標(biāo)是讓預(yù)測(cè)結(jié)果與anchor的差別和gt與anchor的差別一致。

Anchor Target Creator

最后總結(jié)下,RPN會(huì)在特征圖每點(diǎn)都輸出9x2個(gè)分類結(jié)果和9x4個(gè)回歸結(jié)果,分別與每點(diǎn)的9個(gè)anchor的分類標(biāo)簽和回歸標(biāo)簽對(duì)應(yīng)(RPN是二分類,僅區(qū)分前、背景),但并不是會(huì)對(duì)每個(gè)點(diǎn)都計(jì)算損失,最多僅有256個(gè)點(diǎn)會(huì)參與損失計(jì)算。

因?yàn)橥ㄟ^上述可知,僅有256個(gè)anchor樣本供訓(xùn)練使用,而其中還可能有多個(gè)anchor對(duì)應(yīng)到一個(gè)特征像素點(diǎn)上。注意下,這部分的訓(xùn)練是與ProposalCreator并行的分支,并不是拿ProposalCreator的輸出進(jìn)行訓(xùn)練!

另外,這里有個(gè)問題引發(fā)了我的思考:在前文講RPN部分的第1節(jié)中,我們提到計(jì)算anchor坐標(biāo)時(shí)可能出現(xiàn)負(fù)數(shù),那么在篩選訓(xùn)練樣本時(shí)它們就勢(shì)必會(huì)被剔除掉。

如果我們將計(jì)算時(shí)anchor的坐標(biāo)clip到輸入圖像尺寸范圍內(nèi),那么就有可能引入更多有效的訓(xùn)練樣本,甚至是優(yōu)質(zhì)樣本,提高召回率是肯定的,精確率的話是不是也有可能提高?

2. 篩選RoI樣本,指導(dǎo)檢測(cè)器訓(xùn)練

Proposal Target Creator

這部分是從Proposal Creator (RPN中的Proposal Layer)產(chǎn)生的RoIs中篩選出128個(gè)目標(biāo)樣本,其中正負(fù)樣本比為1:3,用于指導(dǎo)檢測(cè)器(RoIHead)的訓(xùn)練。

?具體方法是,計(jì)算每個(gè)RoI與每個(gè)gt的IoU,若某個(gè)RoI與所有g(shù)t計(jì)算所得的最大IoU不小于0.5,則為正樣本,并記錄下與此對(duì)應(yīng)的gt,打上相應(yīng)的類別標(biāo)簽,同時(shí)限制正樣本數(shù)量不超過32個(gè)。

相對(duì)地,若某個(gè)RoI與所有g(shù)t的最大IoU小于0.5,則標(biāo)記為負(fù)樣本,類別標(biāo)簽為0,同時(shí)限制負(fù)樣本數(shù)量不超過96個(gè),正負(fù)樣本的類別標(biāo)簽用作指導(dǎo)分類訓(xùn)練。最后,計(jì)算gt相對(duì)于RoI樣本的中心點(diǎn)坐標(biāo)位移和兩者長(zhǎng)寬比,并且歸一化(減均值除標(biāo)準(zhǔn)差),用于指導(dǎo)回歸訓(xùn)練。

篩選目標(biāo)RoI
生成分類與回歸的目標(biāo)

在實(shí)際的代碼實(shí)現(xiàn)中,將GT也一并加入了RoIs樣本中:

將GT加入RoIs樣本中

仔細(xì)想想,感覺挺有道理,因?yàn)镽oIs來源于RPN的輸出,而RPN的結(jié)果并不一定可靠,特別是在訓(xùn)練初期,幾乎就是隨機(jī)輸出,可能連一個(gè)正樣本都沒有,加入GT一方面彌補(bǔ)了正樣本數(shù)量的不足,另一方面還提供了更優(yōu)質(zhì)的正樣本,怎么說它也是GT啊,還有比它更正的么????

另外,雖然RoIs眾多,但僅有128個(gè)樣本進(jìn)行了訓(xùn)練,訓(xùn)練時(shí)僅將這128個(gè)訓(xùn)練樣本(Proposal Target Creator的輸出)輸入到RoIHead,而測(cè)試時(shí)則是將RPN(Proposal Creator)的輸出直接輸入到RoIHead。

最后注意下,RPN的回歸目標(biāo)是沒有歸一化的,而RoIHead的有。

3. Loss函數(shù)的設(shè)計(jì)

這里使用了兩種loss函數(shù),CrossEntropy Loss(交叉熵?fù)p失) 用于分類,Smooth L1 Loss 用于回歸,注意在RPN和RoIHead中,回歸損失均只針對(duì)正樣本計(jì)算。

這里,Smooth L1 Loss 的實(shí)現(xiàn)有個(gè)技巧,通過給正負(fù)樣本設(shè)置不同的損失權(quán)重,其中負(fù)樣本權(quán)重為0,正樣本權(quán)重為1,這樣就可以忽略負(fù)樣本的回歸損失。

Smooth L1 Loss with anchor
Smooth L1 Loss

通過上圖可看到,在計(jì)算回歸損失的均值時(shí),分母將負(fù)樣本(標(biāo)簽為0)數(shù)量也算上了,為何呢?明明只計(jì)算了正樣本的回歸損失啊.. 現(xiàn)在,“明明”就來告訴你!?

可以拿RPN中l(wèi)oss的計(jì)算舉例,其實(shí),loss的原公式是這樣的:

loss

其中,

表示mini-batch中采集的樣本數(shù)量(RPN中默認(rèn)為256個(gè)),

表示anchor位置的數(shù)量,即feature map中特征點(diǎn)的數(shù)量(約2400個(gè)),λ是平衡參數(shù),相當(dāng)于加權(quán)(大于一時(shí)給回歸loss加權(quán),小于1時(shí)給分類加權(quán)),論文中默認(rèn)為10。這么一來,

,于是就用

代替

了。

所以,在計(jì)算回歸損失的時(shí)候,系數(shù)的分母就使用正負(fù)樣本的總數(shù)了。

七. KeyPoints

1. Anchor 與 RoI 傻傻分不清楚?

它們都是矩形框,通常以(左上角坐標(biāo)、右下角坐標(biāo))或者(中心點(diǎn)坐標(biāo)、長(zhǎng)、寬)表示。不同的是,anchor是預(yù)設(shè)的可能覆蓋目標(biāo)物體的區(qū)域,而RoI是網(wǎng)絡(luò)產(chǎn)生的更為可靠的目標(biāo)候選區(qū)域。

可以這么看,anchor 是“死”的,是人為設(shè)置的(當(dāng)然,后來的一些算法框架能夠通過聚類得出anchor,如YOLO),通過窮舉它來盡可能覆蓋目標(biāo)物體。因此需要網(wǎng)絡(luò)通過訓(xùn)練來進(jìn)一步篩選和調(diào)整,產(chǎn)生RoI。在RoIHead部分,可認(rèn)為RoIs充當(dāng)了anchor的作用。

另外,在Faster R-CNN的實(shí)現(xiàn)中,anchor和RoI的尺寸對(duì)應(yīng)的是網(wǎng)絡(luò)的輸入圖像,而原圖像和輸入圖像之間做了尺寸縮放,如以下代碼部分可看到一個(gè)'scale'變量,在預(yù)測(cè)的時(shí)候注意需要把結(jié)果根據(jù)縮放系數(shù)轉(zhuǎn)換對(duì)應(yīng)到原圖上。

輸入圖像與原圖之間進(jìn)行了縮放

2. 回歸結(jié)果為何不是bbox的坐標(biāo)?

本文一直強(qiáng)調(diào),無論是在RPN還是RoIHead中,回歸結(jié)果都不是bounding box的坐標(biāo),而是相對(duì)(正樣本anchor、RoI)中心點(diǎn)坐標(biāo)的位移和長(zhǎng)寬比。為方便敘述,這里把兩者分別稱之為offset和scale。

直觀地看,直接回歸bounding box的坐標(biāo)更方便,免去了傳參(RPN中需要傳入anchor,RoIHead中需要傳入RoI)與坐標(biāo)計(jì)算。

但是,如果回歸的是坐標(biāo),那么在計(jì)算損失時(shí),大尺寸bbox的坐標(biāo)誤差占的比重可能就會(huì)比小尺寸bbox之間的坐標(biāo)誤差大得多,從而使得模型更偏向于學(xué)習(xí)大bbox,從而導(dǎo)致小目標(biāo)的檢測(cè)效果不佳。

Regress

那么如何計(jì)算offset和scale呢?拿上圖RPN的例子來說,對(duì)于預(yù)測(cè)框(藍(lán)色框),offset等于其中心點(diǎn)與anchor(紅色框)中心點(diǎn)坐標(biāo)差除以anchor邊長(zhǎng),scale等于兩者的長(zhǎng)寬比,并且使用log函數(shù),log函數(shù)的作用也是一定程度上抑制了大bbox之間的誤差占比蓋過小bbox(拉近了大、小bbox之間的誤差水平),gt(綠色框)的計(jì)算方法類似。?

在訓(xùn)練過程中,如果我們希望預(yù)測(cè)框接近于gt,那么它們與anchor之間的offset和scale都應(yīng)該盡可能接近,于是將gt與anchor的offset與scale作為回歸的目標(biāo)。

轉(zhuǎn)換成坐標(biāo)的時(shí)候,基于上述公式逆向計(jì)算即可。

RPN預(yù)測(cè)框的計(jì)算

3.3 個(gè) Creator 分別做了什么?

Anchor Target Creator:對(duì)特征圖上每點(diǎn)對(duì)應(yīng)的anchor樣本進(jìn)行篩選(尺寸、IoU、樣本數(shù)量),為 RPN提供256個(gè)訓(xùn)練樣本,正負(fù)樣本比為1:1,此處是二分類;

Proposal Creator:對(duì)RPN產(chǎn)生的RoI進(jìn)行篩選(尺寸、置信度、數(shù)量、NMS),產(chǎn)生大約2000個(gè)RoIs;

Proposal Target Creator:從Proposal Creator產(chǎn)生的RoIs中篩選(數(shù)量和IoU)128個(gè)目標(biāo)樣本以指導(dǎo)檢測(cè)頭部(RoIHead)訓(xùn)練,正負(fù)樣本比為1:3,此處是多分類。

Anchor Target Creator 和 Proposal Target Creator 僅在訓(xùn)練過程中使用,而 Proposal Creator 在訓(xùn)練和測(cè)試過程中都會(huì)用到,但它們都不涉及反向傳播,因此這部分在不同深度學(xué)習(xí)框架上可以方便地通過numpy遷移實(shí)現(xiàn)。

4.4 個(gè)損失的作用是什么?

? RPN分類損失:區(qū)分anchor是前景還是背景,從而讓模型能夠?qū)W會(huì)區(qū)分前景和背景;

? RPN回歸損失:調(diào)整anchor的位置和形狀,使其更接近于gt;

? RoI分類損失:區(qū)分RoI屬于哪個(gè)物體類別(這里是21類,包括背景);

? RoI回歸損失:調(diào)整RoI的位置和形狀,使其更接近于gt、預(yù)測(cè)結(jié)果更精細(xì)。由上述可知,其

實(shí)在RPN輸出的時(shí)候,就已經(jīng)完成了“檢測(cè)”任務(wù),即能夠把目標(biāo)物體框出來,只不過沒有對(duì)這些物體類別進(jìn)行細(xì)分而已,并且框出來的位置可能不夠精準(zhǔn)。而RoIHead可看作是對(duì)RPN結(jié)果的調(diào)優(yōu)。

結(jié)語

從整體框架上來看,F(xiàn)aster R-CNN主要包含F(xiàn)eature Extractor(特征提?。?、RPN(產(chǎn)生候選區(qū)域)、RoIHead(檢測(cè)器)三部分,理論看似簡(jiǎn)單,但是代碼實(shí)現(xiàn)起來真不容易。

自己在學(xué)習(xí)Faster R-CNN的時(shí)候,看了不少資料,也做了相關(guān)筆記,但覺得沒有真正學(xué)懂,有些點(diǎn)總是記不牢,不能夠在腦海里很好地復(fù)現(xiàn)。于是就決定擼一遍源碼,這樣之后總算是踏實(shí)下來了。

作為深度學(xué)習(xí)目標(biāo)檢測(cè)領(lǐng)域中具有重大意義的算法,手?jǐn)]一遍源碼還是很有必要的,如果只是知道它的原理,那么并不真正代表會(huì)了,一個(gè)知識(shí)點(diǎn)你聽懂了和你能夠把它復(fù)現(xiàn)甚至改進(jìn)是完全兩碼事,實(shí)踐才是檢驗(yàn)成果的硬道理!

作者簡(jiǎn)介:CW,廣東深圳人,畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計(jì)算機(jī)學(xué)院,畢業(yè)后就業(yè)于騰訊計(jì)算機(jī)系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實(shí)習(xí)過,實(shí)操過道路交通元素與醫(yī)療病例圖像分割、視頻實(shí)時(shí)人臉檢測(cè)與表情識(shí)別、OCR等項(xiàng)目。目前也有在一些自媒體平臺(tái)上參與外包項(xiàng)目的研發(fā)工作,項(xiàng)目專注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學(xué)習(xí)方向均有)。

大家看完后有什么想說的、想討論、不清晰的,盡管在評(píng)論區(qū)互相交流或告訴我們,我們也會(huì)第一時(shí)間給大家答復(fù)喲~

令我“細(xì)思極恐”的Faster-R-CNN的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
娄底市| 县级市| 青岛市| 湖州市| 林芝县| 芒康县| 德昌县| 增城市| 永清县| 轮台县| 镇原县| 盐边县| 济宁市| 芦山县| 永新县| 灯塔市| 沙湾县| 阳江市| 桂林市| 改则县| 青岛市| 梅州市| 罗源县| 斗六市| 洪湖市| 红安县| 莒南县| 开远市| 肥东县| 玉门市| 彭泽县| 新营市| 巴彦县| 隆子县| 铁岭县| 阆中市| 油尖旺区| 宜丰县| 比如县| 攀枝花市| 甘孜|