<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【深度學(xué)習(xí)】詳解Faster-R-CNN

          共 9556字,需瀏覽 20分鐘

           ·

          2021-03-02 11:09

          作者簡介

          CW,廣東深圳人,畢業(yè)于中山大學(xué)(SYSU)數(shù)據(jù)科學(xué)與計算機(jī)學(xué)院,畢業(yè)后就業(yè)于騰訊計算機(jī)系統(tǒng)有限公司技術(shù)工程與事業(yè)群(TEG)從事Devops工作,期間在AI LAB實習(xí)過,實操過道路交通元素與醫(yī)療病例圖像分割、視頻實時人臉檢測與表情識別、OCR等項目。

          目前也有在一些自媒體平臺上參與外包項目的研發(fā)工作,項目專注于CV領(lǐng)域(傳統(tǒng)圖像處理與深度學(xué)習(xí)方向均有)。

          前言

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

          Faster R-CNN可以算是深度學(xué)習(xí)目標(biāo)檢測領(lǐng)域的祖師爺了,至今許多算法都是在其基礎(chǔ)上進(jìn)行延伸和改進(jìn)的,它的出現(xiàn),可謂是開啟了目標(biāo)檢測的新篇章,其最為突出的貢獻(xiàn)之一是提出了 "anchor" 這個東東,并且使用 CNN 來生成region proposal(目標(biāo)候選區(qū)域),從而真正意義上完全使用CNN 來實現(xiàn)目標(biāo)檢測任務(wù)(以往的架構(gòu)會使用一些傳統(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)檢測任務(wù)的家伙,它使用selective search算法獲取目標(biāo)候選區(qū)域(region proposal),然后將每個候選區(qū)域縮放到同樣尺寸,接著將它們都輸入CNN提取特征后再用SVM進(jìn)行分類,最后再對分類結(jié)果進(jìn)行回歸,整個訓(xùn)練過程十分繁瑣,需要微調(diào)CNN+訓(xùn)練SVM+邊框回歸,無法實現(xiàn)端到端。
          Fast R-CNN則受到 SPP-Net 的啟發(fā),將全圖(而非各個候選區(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相對于其前輩Fast R-CNN的最大改進(jìn)就是使用RPN來生成候選區(qū)域,摒棄了selective search算法,即完全使用CNN解決目標(biāo)檢測任務(wù),同時整個過程都能跑在GPU上,之前selective search僅在CPU上跑,是耗時的一大瓶頸。
          本文從編碼實現(xiàn)的角度來解析 Faster R-CNN,先對網(wǎng)絡(luò)的前向(forward)過程進(jìn)行闡述,再回過頭來看訓(xùn)練的細(xì)節(jié),這樣便于更好地理解。
          源碼是一位大佬寫的,基于Pytorch框架,是Faster R-CNN的精煉版,作為學(xué)習(xí)和參考來說相當(dāng)不錯,我自己也擼了一遍,這里也附上大佬源碼的鏈接:Faster R-CNN 精煉版。
          Faster R-CNN Network
          一. Overview
          除去復(fù)雜的理論知識不談,從編程的角度來看,F(xiàn)aster R-CNN做的事情其實就是,“窮舉”一張圖片可能出現(xiàn)物體的位置,生成矩形框(計算位置和大?。嬎氵@些框中出現(xiàn)物體的概率,選擇概率高的,然后調(diào)整這些矩形框的位置與大小,并去除重疊度高的,最終得到一個個包含物體的矩形框。

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

          Faster R-CNN 框架

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

          Feature Extractor 實現(xiàn)

          三. RPN(Region Proposal Network)

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

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

          這里先介紹下anchor,這東東有點抽象,中文翻譯是“錨”,讓人容易覺得這是一個點,實際它是可能包含目標(biāo)物體的矩形框。在目標(biāo)檢測任務(wù)中,通常會為每個像素點預(yù)設(shè)一個或多個面積大小和寬高比例不同的anchor,以此使得圖像上密集鋪滿了許許多多anchor,從而覆蓋到包含物體的所有位置區(qū)域。
          backbone提取的特征圖(記作 fm)相對于網(wǎng)絡(luò)的輸入圖像尺寸縮小了16倍。因此,fm 中的1個像素點就相當(dāng)于輸入圖像的16個像素點,或者說,fm中的1x1區(qū)域覆蓋了輸入圖像的16x16區(qū)域。這樣,fm中的每個像素點都對應(yīng)地覆蓋了輸入圖像的區(qū)域。
          不難想象,如果一個像素點僅對應(yīng)一個anchor,難免會覆蓋不到或者覆蓋不全目標(biāo)物體。因此,F(xiàn)aster R-CNN 對每個點對應(yīng)的anchor進(jìn)行了尺寸縮放和形變,前者對應(yīng)矩形面積,后者對應(yīng)矩形長寬比例,每種尺寸對應(yīng)3種長寬比,共設(shè)置3種尺寸,3種尺寸分別是128x128、256x256、512x512,3種長寬比分別是 1:1、1:2、2:1,這樣一來,一個點就對應(yīng)9個anchor,其中每個 anchor 的形狀和大小都不完全相同。

          9個形狀和大小不同的anchor

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

          特征圖左上角的像素點對應(yīng)的9個anchor位置

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

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

          根據(jù)位移計算特征圖所有像素點對應(yīng)的anchor位置
          2.  在每個特征點上計算分類與回歸結(jié)果
          這里的分類是二分類,僅僅區(qū)分前景和背景,具體做法是,先將 fm 進(jìn)行3x3卷積,進(jìn)一步提取特征,然后使用1x1卷積將通道數(shù)映射到18=9x2,對應(yīng)9個anchor的兩個類別,然后再將通道這個維度分割多一個維度,使得最后一維是2,代表前景和背景,最后使用softmax計算概率。
          對候選區(qū)域分類

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

          對候選區(qū)域回歸
          3.對分類與回歸結(jié)果進(jìn)行后處理,生成 RoI(Region of Interest)

          這部分是One-Stage的最后階段,也稱作 Proposal Creator(Proposal Layer),會對RPN輸出的分類和回歸結(jié)果進(jìn)行后處理(如NMS等),得到網(wǎng)絡(luò)認(rèn)為包含物體的區(qū)域,稱為感興趣的候選區(qū)域——RoI。
          至此,其實已經(jīng)完成了檢測任務(wù),因為已經(jīng)得到了包含物體的區(qū)域(bbox),只不過沒有對物體類別進(jìn)行細(xì)分,僅區(qū)分了前、背景。另外,由于anchor的位置和大小是人工預(yù)設(shè)的,且用于訓(xùn)練的樣本有限,因此此處得到的檢測結(jié)果可能并不夠精準(zhǔn)。
          具體做法是,先將回歸得到的候選區(qū)域的寬、高限制在輸入圖像尺寸范圍內(nèi)以及剔除尺寸過小(小于16x16,因為特征圖中一個像素點就已經(jīng)代表了輸入圖像16x16的區(qū)域。
          下圖中的scale是輸入網(wǎng)絡(luò)中的圖像與原圖之間的縮放系數(shù))的,然后將它們按前景概率排序,保留前面的一批(訓(xùn)練時是12000,預(yù)測時是6000),接著使用非極大值抑制進(jìn)一步剔除掉可能重復(fù)的,最后從剔除后的結(jié)果中保留剩下的一批(訓(xùn)練時是2000,預(yù)測時是300)。
          生成RoI(i)

          生成RoI(ii)

          四. RolHead

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

          1. RoI Pooling

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

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

          7x7大小的RoI經(jīng)過RoI Pooling變成2x2大小
          這里提出 RoI Pooling 會產(chǎn)生的問題:
          1.1 兩次量化損失
          在將RoI映射至特征圖尺寸范圍的過程中,下采樣取整操作(比如200x200的區(qū)域經(jīng)16倍下采樣后映射為12 x 12)會產(chǎn)生一次量化損失;接著,假設(shè)最終需要生成的尺寸大小為nxn,則需將RoI劃分nxn個bin,在這個劃分過程中又會產(chǎn)生一次量化損失(比如對12x12大小的RoI劃分成7x7個bin,每個bin的平均尺寸是,那么就會造成有些bin的大小是,而另一些bin的大小則是),于是后來就有人提出如RoI Align和Precise RoI Pooling等方法進(jìn)行改進(jìn),這里就不展開敘述了。
          RoI Pooling的兩次量化損失
          1.2 只有少數(shù)點的loss在反向傳播中貢獻(xiàn)了梯度

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

          RoI Pooling的反向傳播
          2. RoI 分類與回歸
          將RoI Pooling后的結(jié)果展開(flatten)成 vector,輸入全連接層進(jìn)行分類和回歸,對應(yīng)輸出的神經(jīng)元個數(shù)分別為物體類別數(shù)(記為n_classes)以及每個類別物體對應(yīng)的bbox(n_classes x 4)。
          注意,這里回歸的結(jié)果是預(yù)測框中心點相對于正樣本RoIs(在后文訓(xùn)練部分會講解如何篩選正樣本)中心點坐標(biāo)的位移以及兩者長寬的比例,并且是歸一化(減去均值除以標(biāo)準(zhǔn)差)后的結(jié)果。

          RoI分類與回歸

          五. 后處理生成預(yù)測結(jié)果
          RoIHead的輸出還不是預(yù)測結(jié)果的最終形態(tài),為了產(chǎn)生最終的預(yù)測結(jié)果,還需要做一些后處理。
          具體做法是,將網(wǎng)絡(luò)輸出縮放至原圖尺寸,注意是原圖,不是輸入網(wǎng)絡(luò)的圖像,在原圖與輸入圖像之間是有縮放操作的。
          接著對回歸的結(jié)果去歸一化(乘標(biāo)準(zhǔn)差加均值),結(jié)合RoIs的位置和大小計算出bbox的位置(左上角坐標(biāo)和右下角坐標(biāo)),并且裁剪到原圖尺寸范圍內(nèi)。
          然后,選擇置信度大于閥值的矩形框,最后再使用非極大值抑制(NMS)剔除重疊度高的bbox得到最終的結(jié)果。
          生成預(yù)測結(jié)果(i)
          注意,這里在進(jìn)行置信度篩選以及NMS時是分別對每個物體單獨類別實施的,不包括背景類(下圖range()從1開始)。
          那么就可能會發(fā)生這樣的情況:一個RoI對應(yīng)不同類別的預(yù)測結(jié)果都被保留下來(要知道RoIHead的輸出是每個RoI在不同類別上的分類和回歸結(jié)果),這里可以說是Faster R-CNN優(yōu)于YOLOv1的地方,因為YOLOv1的一個格子僅能預(yù)測一個物體,但同時Faster R-CNN單獨在各個類別進(jìn)行NMS勢必會影響推斷速度,所以說從這方面看這里也是弱于YOLOv1的地方。

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

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

          六. 訓(xùn)練

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

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

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

          由于anchor數(shù)量太多,因此需要篩選部分anchor樣本用于指導(dǎo)RPN訓(xùn)練。anchor總樣本是Backbone輸出特征圖上每點對應(yīng)的9個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). 將與每個gt的IoU最大的anchor作為正樣本,標(biāo)簽記為1;
          4). 將與gt的IoU不小于0.7的anchor作為正樣本,標(biāo)簽記為1;
          5). 限制正樣本與負(fù)樣本總數(shù)為256個,正負(fù)樣本比為1:1,若其中某一類樣本超過128個,則隨機(jī)從中選擇多出的樣本將其標(biāo)簽記為-1;
            6). 僅將標(biāo)簽為0和1的樣本用于訓(xùn)練,忽略標(biāo)簽為-1的anchor
          生成目標(biāo)anchor用于指導(dǎo)訓(xùn)練
          對anchor樣本進(jìn)行篩選得到目標(biāo)anchor
          正樣本和負(fù)樣本用作計算分類損失,而回歸的損失僅對正樣本計算。注意,這里回歸的目標(biāo)是gt相對于正樣本anchor中心點坐標(biāo)的位移以及兩者長寬的比例,正因如此,前面部分談到過RPN回歸的結(jié)果是候選區(qū)域相對于anchor中心點坐標(biāo)的位移以及兩者長寬的比例。
          這種方式是將預(yù)測結(jié)果和gt都與anchor做比較,訓(xùn)練目標(biāo)是讓預(yù)測結(jié)果與anchor的差別和gt與anchor的差別一致。
          Anchor Target Creator
          最后總結(jié)下,RPN會在特征圖每點都輸出9x2個分類結(jié)果和9x4個回歸結(jié)果,分別與每點的9個anchor的分類標(biāo)簽和回歸標(biāo)簽對應(yīng)(RPN是二分類,僅區(qū)分前、背景),但并不是會對每個點都計算損失,最多僅有256個點會參與損失計算。
          因為通過上述可知,僅有256個anchor樣本供訓(xùn)練使用,而其中還可能有多個anchor對應(yīng)到一個特征像素點上。注意下,這部分的訓(xùn)練是與ProposalCreator并行的分支,并不是拿ProposalCreator的輸出進(jìn)行訓(xùn)練!
          另外,這里有個問題引發(fā)了我的思考:在前文講RPN部分的第1節(jié)中,我們提到計算anchor坐標(biāo)時可能出現(xiàn)負(fù)數(shù),那么在篩選訓(xùn)練樣本時它們就勢必會被剔除掉。
          如果我們將計算時anchor的坐標(biāo)clip到輸入圖像尺寸范圍內(nèi),那么就有可能引入更多有效的訓(xùn)練樣本,甚至是優(yōu)質(zhì)樣本,提高召回率是肯定的,精確率的話是不是也有可能提高?

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

          Proposal Target Creator
          這部分是從Proposal Creator (RPN中的Proposal Layer)產(chǎn)生的RoIs中篩選出128個目標(biāo)樣本,其中正負(fù)樣本比為1:3,用于指導(dǎo)檢測器(RoIHead)的訓(xùn)練。
          具體方法是,計算每個RoI與每個gt的IoU,若某個RoI與所有g(shù)t計算所得的最大IoU不小于0.5,則為正樣本,并記錄下與此對應(yīng)的gt,打上相應(yīng)的類別標(biāo)簽,同時限制正樣本數(shù)量不超過32個。
          相對地,若某個RoI與所有g(shù)t的最大IoU小于0.5,則標(biāo)記為負(fù)樣本,類別標(biāo)簽為0,同時限制負(fù)樣本數(shù)量不超過96個,正負(fù)樣本的類別標(biāo)簽用作指導(dǎo)分類訓(xùn)練。最后,計算gt相對于RoI樣本的中心點坐標(biāo)位移和兩者長寬比,并且歸一化(減均值除標(biāo)準(zhǔn)差),用于指導(dǎo)回歸訓(xùn)練。
          篩選目標(biāo)RoI
          生成分類與回歸的目標(biāo)
          在實際的代碼實現(xiàn)中,將GT也一并加入了RoIs樣本中:
          將GT加入RoIs樣本中
          仔細(xì)想想,感覺挺有道理,因為RoIs來源于RPN的輸出,而RPN的結(jié)果并不一定可靠,特別是在訓(xùn)練初期,幾乎就是隨機(jī)輸出,可能連一個正樣本都沒有,加入GT一方面彌補(bǔ)了正樣本數(shù)量的不足,另一方面還提供了更優(yōu)質(zhì)的正樣本,怎么說它也是GT啊,還有比它更正的么???
          另外,雖然RoIs眾多,但僅有128個樣本進(jìn)行了訓(xùn)練,訓(xùn)練時僅將這128個訓(xùn)練樣本(Proposal Target Creator的輸出)輸入到RoIHead,而測試時則是將RPN(Proposal Creator)的輸出直接輸入到RoIHead。
          最后注意下,RPN的回歸目標(biāo)是沒有歸一化的,而RoIHead的有。

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

          這里使用了兩種loss函數(shù),CrossEntropy Loss(交叉熵?fù)p失) 用于分類,Smooth L1 Loss 用于回歸,注意在RPN和RoIHead中,回歸損失均只針對正樣本計算。
          這里,Smooth L1 Loss 的實現(xiàn)有個技巧,通過給正負(fù)樣本設(shè)置不同的損失權(quán)重,其中負(fù)樣本權(quán)重為0,正樣本權(quán)重為1,這樣就可以忽略負(fù)樣本的回歸損失。
          Smooth L1 Loss with anchor
          Smooth L1 Loss
          通過上圖可看到,在計算回歸損失的均值時,分母將負(fù)樣本(標(biāo)簽為0)數(shù)量也算上了,為何呢?明明只計算了正樣本的回歸損失啊.. 現(xiàn)在,“明明”就來告訴你!
          可以拿RPN中l(wèi)oss的計算舉例,其實,loss的原公式是這樣的:
          loss
          其中,表示mini-batch中采集的樣本數(shù)量(RPN中默認(rèn)為256個),表示anchor位置的數(shù)量,即feature map中特征點的數(shù)量(約2400個),λ是平衡參數(shù),相當(dāng)于加權(quán)(大于一時給回歸loss加權(quán),小于1時給分類加權(quán)),論文中默認(rèn)為10。
          這么一來,,于是就用代替了。

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

          七. KeyPoints

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

          它們都是矩形框,通常以(左上角坐標(biāo)、右下角坐標(biāo))或者(中心點坐標(biāo)、長、寬)表示。不同的是,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的實現(xiàn)中,anchor和RoI的尺寸對應(yīng)的是網(wǎng)絡(luò)的輸入圖像,而原圖像和輸入圖像之間做了尺寸縮放,如以下代碼部分可看到一個'scale'變量,在預(yù)測的時候注意需要把結(jié)果根據(jù)縮放系數(shù)轉(zhuǎn)換對應(yīng)到原圖上。
          輸入圖像與原圖之間進(jìn)行了縮放
          2. 回歸結(jié)果為何不是bbox的坐標(biāo)?
          本文一直強(qiáng)調(diào),無論是在RPN還是RoIHead中,回歸結(jié)果都不是bounding box的坐標(biāo),而是相對(正樣本anchor、RoI)中心點坐標(biāo)的位移和長寬比。為方便敘述,這里把兩者分別稱之為offset和scale。
          直觀地看,直接回歸bounding box的坐標(biāo)更方便,免去了傳參(RPN中需要傳入anchor,RoIHead中需要傳入RoI)與坐標(biāo)計算。
          但是,如果回歸的是坐標(biāo),那么在計算損失時,大尺寸bbox的坐標(biāo)誤差占的比重可能就會比小尺寸bbox之間的坐標(biāo)誤差大得多,從而使得模型更偏向于學(xué)習(xí)大bbox,從而導(dǎo)致小目標(biāo)的檢測效果不佳。
          Regress
          那么如何計算offset和scale呢?拿上圖RPN的例子來說,對于預(yù)測框(藍(lán)色框),offset等于其中心點與anchor(紅色框)中心點坐標(biāo)差除以anchor邊長,scale等于兩者的長寬比,并且使用log函數(shù),log函數(shù)的作用也是一定程度上抑制了大bbox之間的誤差占比蓋過小bbox(拉近了大、小bbox之間的誤差水平),gt(綠色框)的計算方法類似。
          在訓(xùn)練過程中,如果我們希望預(yù)測框接近于gt,那么它們與anchor之間的offset和scale都應(yīng)該盡可能接近,于是將gt與anchor的offset與scale作為回歸的目標(biāo)。
          轉(zhuǎn)換成坐標(biāo)的時候,基于上述公式逆向計算即可。
          RPN預(yù)測框的計算

          3.3 個 Creator 分別做了什么?

          Anchor Target Creator:對特征圖上每點對應(yīng)的anchor樣本進(jìn)行篩選(尺寸、IoU、樣本數(shù)量),為 RPN提供256個訓(xùn)練樣本,正負(fù)樣本比為1:1,此處是二分類;
          Proposal Creator:對RPN產(chǎn)生的RoI進(jìn)行篩選(尺寸、置信度、數(shù)量、NMS),產(chǎn)生大約2000個RoIs;
          Proposal Target Creator:從Proposal Creator產(chǎn)生的RoIs中篩選(數(shù)量和IoU)128個目標(biāo)樣本以指導(dǎo)檢測頭部(RoIHead)訓(xùn)練,正負(fù)樣本比為1:3,此處是多分類。
          Anchor Target Creator 和 Proposal Target Creator 僅在訓(xùn)練過程中使用,而 Proposal Creator 在訓(xùn)練和測試過程中都會用到,但它們都不涉及反向傳播,因此這部分在不同深度學(xué)習(xí)框架上可以方便地通過numpy遷移實現(xiàn)。

          4.4 個損失的作用是什么?

          ? RPN分類損失:區(qū)分anchor是前景還是背景,從而讓模型能夠?qū)W會區(qū)分前景和背景;
          RPN回歸損失:調(diào)整anchor的位置和形狀,使其更接近于gt;
          RoI分類損失:區(qū)分RoI屬于哪個物體類別(這里是21類,包括背景);
          RoI回歸損失:調(diào)整RoI的位置和形狀,使其更接近于gt、預(yù)測結(jié)果更精細(xì)。
          由上述可知,其實在RPN輸出的時候,就已經(jīng)完成了“檢測”任務(wù),即能夠把目標(biāo)物體框出來,只不過沒有對這些物體類別進(jìn)行細(xì)分而已,并且框出來的位置可能不夠精準(zhǔn)。而RoIHead可看作是對RPN結(jié)果的調(diào)優(yōu)。
          結(jié)語
          從整體框架上來看,F(xiàn)aster R-CNN主要包含F(xiàn)eature Extractor(特征提?。?、RPN(產(chǎn)生候選區(qū)域)、RoIHead(檢測器)三部分,理論看似簡單,但是代碼實現(xiàn)起來真不容易。
          自己在學(xué)習(xí)Faster R-CNN的時候,看了不少資料,也做了相關(guān)筆記,但覺得沒有真正學(xué)懂,有些點總是記不牢,不能夠在腦海里很好地復(fù)現(xiàn)。于是就決定擼一遍源碼,這樣之后總算是踏實下來了。
          作為深度學(xué)習(xí)目標(biāo)檢測領(lǐng)域中具有重大意義的算法,手?jǐn)]一遍源碼還是很有必要的,如果只是知道它的原理,那么并不真正代表會了,一個知識點你聽懂了和你能夠把它復(fù)現(xiàn)甚至改進(jìn)是完全兩碼事,實踐才是檢驗成果的硬道理!

          往期精彩回顧





          本站qq群704220115,加入微信群請掃碼:

          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  激情五月婷婷五月 | 欧美性爱久久平台 | 中国a一片一级一片 | 国产黄片免费播放 | 一起色综合 |