RCNN到Faster R-CNN筆記

注:md文件,Typora書寫,md兼容程度github=CSDN>知乎,若有不兼容處麻煩移步其他平臺,github文檔供下載。

上傳在github:https://github.com/FermHan/Learning-Notes 發(fā)表在CSDN:https://blog.csdn.net/hancoder/article/ 發(fā)表在知乎專欄:https://zhuanlan.zhihu.com/c_1088438808227254272

學(xué)習(xí)總結(jié)前言與知識預(yù)熱object detection技術(shù)的演進:一. RCNN二. SPP - net:Spatial Pyramid Pooling三. Fast R-CNN四. Faster R-CNN = Fast R-CNN + RPN2:RPN

學(xué)習(xí)總結(jié)

本文依次講解了目標檢測的必讀論文:R-CNN,SPP,F(xiàn)ast R-CNN,Faster R-CNN。 網(wǎng)上有很多“一文讀懂...”,其實這類文章只是帶入門,知道某個名詞是干什么的,真正想要看懂這些文章還是需要先大概看一遍論文。而此文針對的是論文原文與百度結(jié)合的讀者。因為此文寫作時間有點跨度,零散地看到些論文中的重點理解就記錄下來,所以此文排版不是非常整齊,但內(nèi)容還是非常豐富的。

前言與知識預(yù)熱

  • 目標檢測由來:1966年,Marvin Minsky讓他的學(xué)生Gerald Jay Sussman花費一個暑假把相機連接到電腦上以使電腦能描述看到的東西。

  • 實例分割(instance Segmentation):標記實例和語義, 不僅要分割出這個類, 而且要分割出這個人是誰, 也就是具體的實例。即不僅要分類,而且同類間需要區(qū)別每個個體。semantic segmentation - 只標記語義, 也就是說只分割出這個類來

  • 定位框的表示:只需(x_0,y_0,width,height)四個參數(shù),即可表示一個框

  • 目標檢測競賽:

    • Pascal VOC:20 classes常用

    • COCO:200 classes,2018年COCO競賽中國團隊包攬全部六項任務(wù)的冠軍,其中曠視取得4項冠軍

    • ImageNet ILSVRC停辦

  • 目標檢測數(shù)據(jù)集:Caltech2005,Pascal VOC2005,,LabelMe2007,ImageNet2009,Caltech-USCD-birds-200 2010,F(xiàn)GVC-Aircraft2013

  • pre-train和fine-tune:pre-train指的是在ImageNet上對CNN模型進行預(yù)訓(xùn)練。預(yù)訓(xùn)練的數(shù)據(jù)和真實訓(xùn)練的數(shù)據(jù)集不必一樣。fine-tune指的是使用真正的數(shù)據(jù)集進行訓(xùn)練,調(diào)整。

  • 評價準則:召回率

    • 如圖所示,召回率指的是真實標簽中有多少被檢測出來了,想要的正例有多少被召回來了。

    • IOU(Intersection-over-Union)指的是真實檢測框與計算出來的檢測框之間的交并比

image
  • 從一張圖中提取候選框Region Proposal方法:EdgeBoxes和Selective Search(SS)。

    • 選擇性搜索SS于層次聚類算法,主要通過框與框之間的顏色,紋理,大小,吻合等相似度排序,合并相鄰的相似區(qū)域來減少候選框。即不斷合并相似的框,直到相似度達到一定程度或者框的數(shù)目減小到閾值(~2K個)。合并策略:S = a×S(color) + b× S(texture) + c×S(size) + d×S(fit);
  • 非極大值抑制

    • 抑制不是最大值的元素,把與指定框(分數(shù)高的)overlap大于一定閾值的其他框移除
  • 框的表示:因為框是矩形,所以我們只需知道左上角和右下角坐標即可知道框的位置。此外,也可以用左上角坐標和框的寬高、或者框的中心坐標和框的寬高來表示。

  • 邊界框回歸:調(diào)整邊界框是相對于anchor調(diào)整的,而不是直接回歸出預(yù)測框坐標,而是通過間接轉(zhuǎn)化得出的。

[圖片上傳失敗...(image-556ec6-1557035146027)]

通常我們算位置框loss時使用的是xywh四個值進行回歸。T字母代表Target,即預(yù)測的框,我們想要T接近于真實框。O代表Original,即原始anchor框。

這里我們先不講3個框,而是只看預(yù)測框和anchor框。預(yù)測框與anchor框的距離可以通過如下表示:

  • ?.

  • 為什么是上式表示,而不是歐氏距離呢?原因是這么表示的框縮放圖片后t是不變的

    [圖片上傳失敗...(image-3b7bd9-1557035146019)]

目標檢測分為單階段和二階段檢測,此文我們說的是單階段檢測

兩階段

object detection技術(shù)的演進:

  • RCNN(Selective Search + CNN + SVM)

  • ->SPP-net:Spatial Pyramid Pooling(空間金字塔池化)(ROI Pooling)

  • ->Fast R-CNN(Selective Search + CNN + ROI)

  • ->Faster R-CNN(RPN + VGG + ROI)

  • ->Mask R-CNN(resnet +FPN)

image

一. RCNN

2014年,作者RBG

R-CNN解決的是,“為什么不用CNN做classification呢?”

[圖片上傳失敗...(image-97580f-1557035146027)]

image

R-CNN步驟:

一:用SS提取候選區(qū)域 二:用CNN提取區(qū)域特征 三:對區(qū)域進行SVM分類+邊框校準

R-CNN詳解:

一:用SS提取候選區(qū)域

image

哪一層的特征好用?

二:用CNN提取區(qū)域特征

  1. 將不同大小的候選區(qū)域(原圖)縮放到相同大小

  2. 將所有區(qū)域送入AlexNet提取特征:5個卷積層,2個全連接層

  3. 以最后一個全連接網(wǎng)絡(luò)的輸出作為區(qū)域的特征表示:

    image
  • 有監(jiān)督預(yù)訓(xùn)練pretraining

    • 圖像分類任務(wù):使用ImageNet,1000類,僅有圖像標簽,沒有物體邊框標準

    • 數(shù)據(jù)量120張圖像,多。此時得到的是分類的網(wǎng)絡(luò),而不是檢測網(wǎng)絡(luò)

    • image
  • 針對目標任務(wù)進行微調(diào) Fine-tuning

    • 目標檢測任務(wù):Pascal VOC,20類,有物體邊框標注

    • 數(shù)據(jù)量:僅有數(shù)千或上萬張圖像,少。

    • 已經(jīng)經(jīng)過了大量CNN的預(yù)訓(xùn)練,只需要少量圖片就可以在檢測上做的比較好

    • [圖片上傳失敗...(image-fcf002-1557035146015)]

三:對區(qū)域進行分類+邊框校準

  • 線性SVM分類器(不使用之前的softmax了)

    • 針對每個類別分類訓(xùn)練,每個類別對應(yīng)一個SVM分類器

    • [圖片上傳失敗...(image-7b9555-1557035146015)]

    • 兩類分類:one-vs-all

    • 對于摩托車SVM,摩托車是正類,其余是父類。對于自行車SVM,自行車是正類,其余是父類。

    • image
  • softmax分類

    • 和整個CNN一起端到端訓(xùn)練

    • 所有類別一起訓(xùn)練

    • 多類分類

  • 邊框校準(包含更少的背景)

    image

    線性回歸模型(x,y,w,h)

?

?

?

?

image

非極大值抑制算法:得分從大到小排序,最大的分別于后面的IoU比較,與擁有最大值的圖片重合度大于0.5的,則丟掉小的。這樣丟掉了一部分圖片。然后拿出來最大值的圖片,第二大的再和其余更小的去比較。

非極大值抑制后可能圖片數(shù)大大減少了,然后再進行邊框回歸。

image

缺點:

  • 需要變形特征到固定大小,crop/warp會丟失了長寬比信息,影響檢測精度

  • 低效的流水線,SS耗時,每個候選區(qū)域輸入到卷積也耗時

  • 訓(xùn)練時間很長(48小時)=FineTune(18)+特征提?。?3)+SVM/Bbox訓(xùn)練(3)

  • 測試階段很慢:VGG一張圖片47s

  • image
  • 所謂端到端是指在一個神經(jīng)網(wǎng)絡(luò)里整體去實現(xiàn)

[圖片上傳失敗...(image-e63402-1557035146026)]

image

pool5底層的特征,萬金油,但是準確率不高

image
候選區(qū)域目標(RP) 特征提取 分類
RCNN selective search CNN SVM
傳統(tǒng)的算法 objectness,constrainedparametric min-cuts,sliding window,edge boxes,.... HOG , SIFT,LBP, BoW,DPM,... SVM

二. SPP - net:Spatial Pyramid Pooling

作者何凱明

R-CNN的低效原因是因為全連接層的輸入長度需要固定(而卷積層的輸入大小任意),SPP的貢獻是1:將不同大小的特征圖歸一化到相同大小。此外:2“SPP還對整張圖計算卷積特征,去除了各個區(qū)域的重復(fù)計算。在整張圖片上只進行一躺卷積,然后SPP-net從feature map上抽取特征。

SPP-net與R-CNN的對比

image
image

區(qū)別:RCNN輸入原圖像的proposal VS SPP輸入特征的proposal

[圖片上傳失敗...(image-ae333b-1557035146026)]

SPP:3個level和21個Bin:1×1,2×2,4×4。在bin內(nèi)使用maxpooling。如圖所示,把特征圖分別16,4,1等分,從每個等分塊中取一個像素,從而構(gòu)成相同長度的向量。也可以只進行16等分,從而得到長度16的向量。(為了可以把卷積層與全連接層連接)

image

窗口大小 ?,步長 ?

解決的是,因為全連接層的輸入需要固定尺寸,既然卷積層可以適應(yīng)任何尺寸,那么只需要在卷積層的最后加入某種結(jié)構(gòu),使得后面全連接層得到的輸入為固定程度就可以了。所以將金字塔思想加入CNN,提取固定長度的特征向量,實現(xiàn)了數(shù)據(jù)的多尺度輸入。Spatial Pyramid Pooling添加在卷積后,全連接前。SPP還有一個優(yōu)化點是:如果對ss提供的2000多個候選區(qū)域都逐一進行卷積處理,很耗時。解決思路是先將整張圖卷積得到特征圖,然后再將ss算法提供的2000多個候選區(qū)域的位置記錄下來,通過比例映射到整張圖的feature map上提取出候選區(qū)域的特征圖B(映射關(guān)系與補償有關(guān)),然后將B送入到金字塔池化層中,進行權(quán)重計算。

image

SPP-net的缺點:步驟還是很繁瑣

  • R-CNN和SPP-net的訓(xùn)練都包含多個單獨的步驟

    • 1)多網(wǎng)絡(luò)進行微調(diào)

      • R-CNN對整個CNN進行微調(diào)

      • SPP-net只對SPP之后的(全連接)層進行微調(diào)

    • 2)訓(xùn)練SVM,

    • 3)訓(xùn)練邊框回歸模型

  • 檢測速度慢,尤其是R-CNN

    • RCNN+VGG16:檢測一張圖需要47s

    • 和RCNN一樣,訓(xùn)練過程仍然是隔離的,多階段。提取候選框 | 計算CNN特征| SVM分類 | Bounding Box回歸獨立訓(xùn)練,大量的中間結(jié)果需要轉(zhuǎn)存,無法整體訓(xùn)練參數(shù); 2 )SPP-Net在無法同時Tuning在SPP-Layer兩邊的卷積層和全連接層,很大程度上限制了深度CNN的效果; 3)在整個過程中,Proposal Region仍然很耗時。

  • 新問題:SPP之前的所有卷積層參數(shù)不能finetune

三. Fast R-CNN

image

之前方法缺點:

[圖片上傳失敗...(image-687e93-1557035146026)]

解決的是,“為什么不一起輸出bounding box和label呢?”。把SVM和邊框回歸去掉,由CNN直接得到類別和邊框。

框架

[圖片上傳失敗...(image-21ad0e-1557035146026)]

image
  1. 輸入一張圖和一堆bounding boxes(由SS產(chǎn)生)

  2. 產(chǎn)生卷積特征圖

  3. 對于每一個box,通過ROI Pooling層得到一個定長特征向量

  4. 輸入:(1)K+1類別概率 ,(2)回歸框位置

貢獻:

image
  • 提出了ROI Pooling,可以看做是單層SPP-net(single-level SPP)

    [圖片上傳失敗...(image-e1a276-1557035146018)]

    簡單地說就是把一張圖差不多等分成很多份,從每一份中取一個像素,拼湊起來就得到相同長度的向量。窗口大小 ?,步長 ?

    image

    RoI pooling的梯度回傳。RoI有重疊,會有一些像素重疊。非重疊的區(qū)域是maxpooling類似的梯度回傳,如果是重疊的:多個區(qū)域的偏導(dǎo)之和。假設(shè)有2個區(qū)域r0和r1。r0經(jīng)過roi pooling后假設(shè)是2×2的。pooling之后是2×2的輸出。重合了1個像素。對于r0來說是貢獻到了右下角,r1貢獻到了左上角。梯度回傳的時候還有更深的層回傳梯度。知道了2×2的梯度往回傳的時候,算大圖的梯度的時候,是兩個小圖梯度的相加。

  • 引入多任務(wù)學(xué)習(xí),將多個步驟整合到一個模型中。

    image
    • SVM+Regressor -> Multitask Loss(SoftMax + Regressor)

    • ?,背景的時候,u是0

    • 其中分類損失?

  • 邊框回歸:Loc
    image

    即對于x,y,w,h,邊框回歸的損失都是smoothL1損失,t是預(yù)測的,v是真實的。u指示的是,背景的邊框回歸忽略掉不計算。?。smoothL1損失相較于L2損失的好處是當(dāng)絕對值對于1值,梯度為1,梯度不會過大,而絕對值小于1時,梯度為x,而且在x=1處是連續(xù)可導(dǎo)的。

  • 全連接層加速:Truncated SVD

    W≈U

    將一個大的全連接層分解層兩個小的全連接層

    時間復(fù)雜度:O(uv)→O(t(u+v))

  • 多任務(wù)學(xué)習(xí)的優(yōu)勢

  • 拋棄SVM vs 使用Softmax

    • 為什么不使用SVM了:訓(xùn)練使用難樣本挖掘以使網(wǎng)絡(luò)獲得高判別力,從而精準定位目標
  • 結(jié)果比R-CNN好一些,不需要磁盤存儲

缺點:

  • Fast R-CNN讓然需要專門的候選窗口生成模塊

  • 候選框提取方法仍是SS:CPU,2s/圖,速度慢

  • 其他方法:EdgeBox,GPU,0.2S/圖

image
image
image

Fast R-CNN的RegionProposal是在feature map之后做的,這樣可以不用對所有的區(qū)域進行單獨的CNN Forward步驟。

[圖片上傳失敗...(image-a28b3b-1557035146025)]

  • 分類損失:交叉熵損失

  • 回歸損失:預(yù)測值和真實值差異小于1的話,讓損失小一些。如果差異比較大,讓損失大一些

四. Faster R-CNN = Fast R-CNN + RPN

  • 首先,這個鏈接里講得很不錯,https://zhuanlan.zhihu.com/p/31426458,建議直接轉(zhuǎn)去看這個鏈接,本文會有參考。先放幾張圖簡單看看Faster 1:R-CNN的框架
    image

有張比較重要的圖太長,放文中不太合適,我放文尾了,也可以點這個鏈接(對理解很重要)

image
image

下面這張圖的目的是為了顯示訓(xùn)練是分階段的,即像之前的方法一樣,先產(chǎn)生建議框,然后拿建議框去分類,只不過這里建議框的生成方式換成了RPN網(wǎng)絡(luò)。

image
  • 之前的Fast R-CNN存在的問題:存在瓶頸:選擇性搜索,找出所有的候選框,這個也非常耗時。 解決方法:加入一個提取邊緣的神經(jīng)網(wǎng)絡(luò),也就說找到候選框的工作也交給神經(jīng)網(wǎng)絡(luò)來做了,即Region Proposal Network(RPN)。

  • Faster R-CNN解決的是,“為什么還要用selective search呢?”----將選擇性搜索候選框的方法換成Region Proposal Network(RPN)。

2:RPN

  • RPN的最終結(jié)果是用CNN來生成候選窗口,通過得分排序等方式挑出量少質(zhì)優(yōu)的框(~300)

  • 讓生成候選窗口的CNN和分類的CNN共享卷積層

    其實RPN最終就是在原圖尺度上,設(shè)置了密密麻麻的候選Anchor。然后用cnn去判斷哪些Anchor是里面有目標的foreground anchor,哪些是沒目標的backgroud。所以,僅僅是個二分類而已!

  • 具體做法:

    image

2.1名詞介紹:anchors: The k proposals are parameterized relative to k reference boxes,which we call anchors

首先可以看下感受野的內(nèi)容https://zhuanlan.zhihu.com/p/44106492,“目標檢測task中設(shè)置anchor要嚴格對應(yīng)感受野,anchor太大或偏離感受野都會嚴重影響檢測性能”

比如原始輸入圖像的大小是256x256,特征提取網(wǎng)絡(luò)中含有4個pool層,然后最終獲得的特征圖的大小為 256/16 x 256/16,即獲得一個16x16的特征圖,該圖中的最小單位即是錨點,由于特征圖和原始圖像之間存在比例關(guān)系,在特征圖上面密集的點對應(yīng)到原始圖像上面是有16個像素的間隔。

image
  1. 2錨點與原圖的對應(yīng)

    可能你還是不太清楚anchor是什么。假設(shè)我們此時看的是特征圖上正中心的一個點,那么以這個點為中心進行3×3卷積,對應(yīng)的感受野仍是以原始輸入圖像為中心的,而大小變?yōu)椋?的區(qū)域。特征圖上3×3卷積可以看做是3×3大小的框,而因為感受野的存在,對應(yīng)到原圖上是在這48個像素內(nèi)畫的一組框,這個數(shù)量可能有些龐大,但原始圖像上這個區(qū)域最多有2,3個物體,所有我們只要設(shè)置3種大小,3種長寬比的框就可以了,至于跟真實框的匹配程度,我們只需要通過這9個框慢慢回歸到真實框就可以了??傊?,conv5_3特征圖上的3×3卷積是對應(yīng)9個anchors預(yù)設(shè)框的。

    具體這9個anchor的寬高是多少呢?在程序中直接運行作者demo中的generate_anchors.py可以得到9個輸出,這9個輸出對于每個3×3是通用的,但這個anchors其實是超參。

    <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="PYTHON" cid="n342" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background: inherit; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 30px; border: 1px solid; width: inherit;">[[ -84. -40. 99. 55.]
    [-176. -88. 191. 103.]
    [-360. -184. 375. 199.]
    [ -56. -56. 71. 71.]
    [-120. -120. 135. 135.]
    [-248. -248. 263. 263.]
    [ -36. -80. 51. 95.]
    [ -80. -168. 95. 183.]
    [-168. -344. 183. 359.]]

    anchor得出每個anchor的 4個數(shù)對應(yīng)的是左上角和右下角的坐標,第1+第3=第2+第4=15,我們可知這個是左上角坐標為(7,7)那個點的anchors,anchors中長寬1:2中最大為352x704,長寬2:1中最大736x384,基本是cover了800x600的各個尺度和形狀。</pre>

    這里卷積的細節(jié)是在conv5_3特征圖上用3×3的窗口滑動(stride=1,padding 0填充,即輸入輸出大小不變,改變的是通道數(shù)),每個3×3窗口可能對應(yīng)原圖多種(k=9種)形狀(3種大小,三種形狀)。相當(dāng)于conv5_3上的每一個3×3圖對應(yīng)原圖的某一位置的框。我們讓3×3卷積后得到的下一層特征圖rpn/output通道數(shù)與上一個特征圖conv5_3通道數(shù)相等,這樣下一層特征圖rpn/output的每一個點對應(yīng)上conv5_3上的一個3×3的anchor,而conv5_3上的3×3anchor對應(yīng)于原圖的一塊區(qū)域。

    此時我們得到的rpn/output特征圖相當(dāng)于每個點都對應(yīng)于原圖某個位置的框。那我們針對rpn/output特征圖上每個點進行處理或者算loss就相當(dāng)于對原圖上的框做處理或者調(diào)整。所以我們的思路是用1×1的卷積核在rpn/output特征圖上做滑動,這樣滑動得到的特征圖還是每個點對應(yīng)于原圖上某個位置的框。這步實際操作的時候是用兩組1×1的卷積兩路并行(1×1卷積特征圖寬高不變),一路用于計算邊框位置,一路用于計算框出物體的分類,只不過RPN這里我們不進行分類,僅僅區(qū)分是前/背景就可以了。這兩路的具體形式后面再講。

    假設(shè)每個點對應(yīng)k個anchors(9個),則邊界支路reg層輸出通道數(shù)是4×k,分類支路cls層輸出通道數(shù)是2×k(評估是/否物體的概率)。然后把這兩個支路整合一下?,這樣我們就利用RPN得到了一些含object的框。

    • 在train階段,會輸出約2000個proposal,但只會抽取其中256個proposal(128positive anchor + 128 negative anchors)來訓(xùn)練RPN的cls+reg結(jié)構(gòu);到了reference階段,則直接輸出最高score的300個proposal。inference時由于沒有了監(jiān)督信息,所有RPN并不知道這些proposal是否為前景,整個過程只是慣性地推送一波無tag的proposal給后面的Fast R-CNN。

    • 滑動窗口的位置提供了在原圖像上定位的參考信息,邊界框回歸根據(jù)滑動窗口的參考信息提供了更精準的定位信息。回歸器為每個錨點框計算偏移,分類器評測每個錨點框(回歸后的)是物體的可能性

    • 3×3的中心與原圖anchor的中心對應(yīng)

    • RPN/output上每個點對應(yīng)什么樣的框? 針對每一個點,然后根據(jù)不同的尺度(128、256、512pixel)和不同的長寬比(1:1、0.5:1、1:0.5)產(chǎn)生9個BoundingBox,如下圖所示,對于16x16的特征圖,最終產(chǎn)生16x16x9個候選的ROI,最后原圖上的框圖下圖所示。(可以理解為錨點在conv5_3 [其實是RPN/output] 上,框在原圖上)

    • 接下來整張圖解釋了從特征圖上一個3×3卷積的anchors對應(yīng)到原圖上的情況,而最后一個圖解釋了當(dāng)所有anchor畫出來后框是密密麻麻的。
      image

2.3RPN的兩個并行支路

首先看之前給過的圖的RPN部分

image

這兩個支路中的上面支路用來分類前背景,下面支路用來回歸框的位置(xyw寬h高定義了一個框)。

  • 邊框回歸支路是靠下的支路。36=4×9。4代表(x,y,w,h)。
image

如圖,G代表真實框,A代表anchor給出的框,我們的目的是讓A更接近G。所以想讓A變換后變成G',這樣A更接近G。xy代表的是框的中心,而x,y移動的距離是與w,h有關(guān)的,w,h越大,我們就讓xy移動得多一些,反之則移動得小一些。為后文方便,我們在此文中定義A是初步預(yù)測框(原始anchors),G'是調(diào)整后的預(yù)測框(foreground anchors),G是真實框GT。

2.4 RPN的Loss Function

RPN的Loss由邊框位置loss和分類loss組成

因為此時我們分類僅僅區(qū)分前景背景,需要定義一個正標簽是什么

兩種anchors被標記為正類label=1,p×=1:(1)與真實box有最高的IoU重合度(也許不到0.7),(2)與任意any真實box的IoU重疊度大于0.7。 與所有真實box的IoU重疊度小于0.3的anchor被標記為負類label=0,p×=0。剩下不是正類也不是負類的anchor對訓(xùn)練沒有影響label=-1。

這樣一個真實box可能被賦給多個anchor正標簽。通常第二種情況用來分辨正類已經(jīng)足夠了,但是仍然采用第一種的原因是如果全部框的IoU重合度都不大于0.7,那么我們就沒框了,序號(1)是為了至少有個框。

通過IoU會把anchor分為正、負、不參與訓(xùn)練的標簽,此外,全部anchors拿去訓(xùn)練太多了,訓(xùn)練程序會在合適的anchors中隨機選取128個postive anchors+128個negative anchors進行訓(xùn)練

[圖片上傳失敗...(image-dafa01-1557035146024)]

其中t×代表預(yù)測框A與真實框G的距離(平移量),t代表預(yù)測框A與調(diào)整后的預(yù)測框G'的距離。算Loss時算的是算出的平移量與實際平移量之間的誤差?。此外觀察一下框回歸函數(shù)我們會發(fā)現(xiàn)只有正標簽前景才會計算回歸loss,因為loss里乘了p×。

由于在實際過程中,[圖片上傳失敗...(image-a92e0b-1557035146024)] 和[圖片上傳失敗...(image-a8cd11-1557035146024)] 差距過大,用參數(shù)λ平衡二者(如[圖片上傳失敗...(image-f0aee4-1557035146024)] ,[圖片上傳失敗...(image-cfa6bc-1557035146024)] 時設(shè)置 [圖片上傳失敗...(image-e98ba5-1557035146024)]

),使總的網(wǎng)絡(luò)Loss計算過程中能夠均勻考慮2種Loss。

R代表的是smooth L1函數(shù),這個函數(shù)我們在fast R-CNN里說過了。
image

至于loss更多的細節(jié)還需要去論文或者代碼里去讀,我們在此簡單地認為xywh需要作變換即可。

<mark style="box-sizing: border-box; background: rgb(211, 212, 14); color: rgb(0, 0, 0);">監(jiān)督信號是Anchor與GT的差距 [圖片上傳失敗...(image-9c51f1-1557035146014)] ,即訓(xùn)練目標是:輸入 Φ的情況下使網(wǎng)絡(luò)輸出與監(jiān)督信號盡可能接近。</mark>

image

2.5 Loss訓(xùn)練的結(jié)果

源碼中,會生成60×40×9(~21k)個anchor box,IoU后約有2k個anchor喂入loss,然后累加上訓(xùn)練好的△x, △y, △w, △h,從而得到了相較于之前更加準確的預(yù)測框region proposal,進一步對預(yù)測框進行越界剔除和使用NMS非最大值抑制,剔除掉重疊的框,得到越300個框

anchor產(chǎn)生的平均建議框尺寸如下圖所示

image

這樣RPN檢測框的部分就結(jié)束了,后面的步驟是識別的部分了。

3:RPN后的識別

因為RPN之后的網(wǎng)絡(luò)有全連接層,所以需要進行RoI操作。

  • proposal是對應(yīng)M×N尺度的,所以首先使用spatial_scale參數(shù)將其映射回(M/16)×(N/16)大小的feature map尺度

  • 再將每個proposal對應(yīng)的feature map區(qū)域水平分為 pooled_w×pooled_h的網(wǎng)格;

  • 對網(wǎng)格的每一份都進行max pooling處理。

這樣處理后,即使大小不同的proposal輸出結(jié)果都是 pooled_w×pooled_h 固定大小,實現(xiàn)了固定長度輸出。接下來進行分類

跟RPN部分同理,此時利用bounding box regression獲得每個proposal的位置偏移量bbox_pred,用于回歸更加精確的目標檢測框。

image

如果你直接翻到這里,可能不懂RoI Pooling,RoIpooling是為了連接后面的FC層,細節(jié)可看fast R-CNN的部分(可能需要從SPP部分才能深刻理解),這部分也可以百度,還算簡單。pooling這里在maskR-CNN中被改進為AlignPooling

然后我們利用后面的網(wǎng)絡(luò)進行真正的分類,此時我們不是僅僅區(qū)分前背景了,還要區(qū)分阿貓阿狗。

但我們此時可能有疑問,那此不是有兩個地方有Loss?RPN的Loss和最后識別的Loss。怎么反向回歸?文章利用的是交替訓(xùn)練的方法。

4:模型學(xué)習(xí):交替式4步法訓(xùn)練

  • 4.1 基于預(yù)訓(xùn)練模型只訓(xùn)練RPN

  • 4.2 基于預(yù)訓(xùn)練模型,以及上一步得到的RPN,訓(xùn)練Fast R-CNN

    具體而言,RPN輸出一個region proposal,通過region proposal映射到原圖像,將映射后截取的圖像通過幾次conv-pool,然后再通過roi-pooling和fc再輸出兩條支路,一條是目標分類softmax,另一條是bbox回歸。此時,兩個網(wǎng)絡(luò)并沒有共享參數(shù),只是分開訓(xùn)練;

  • 4.3 固定共享的卷積層,再次訓(xùn)練RPN

  • 4.4 固定共享的卷積層,基于上一步得到的RPN,只訓(xùn)練Fast R-CNN獨有部分的參數(shù)

    image

Detail:

RPN與檢測網(wǎng)絡(luò)共享卷積部分,節(jié)省計算。但沒能實現(xiàn)實時檢測

分類網(wǎng)絡(luò)的梯度不向RPN回傳

只有在train時,cls+reg才能得到強監(jiān)督信息(來源于ground truth)。即ground truth會告訴cls+reg結(jié)構(gòu),哪些才是真的前景,從而引導(dǎo)cls+reg結(jié)構(gòu)學(xué)得正確區(qū)分前后景的能力;在reference階段,就要靠cls+reg自力更生了。

RPN的運用使得region proposal的額外開銷就只有一個兩層網(wǎng)絡(luò)。

在train階段,會輸出約2000個proposal。到了reference階段,則直接輸出最高score的300個proposal。inference時由于沒有了監(jiān)督信息,所有RPN并不知道這些proposal是否為前景,整個過程只是慣性地推送一波無tag的proposal給后面的Fast R-CNN。

image

5:Faster R-CNN總結(jié):

  • Fater R-CNN效果
    image
  • RoI pooling存在的問題:(mask RCNN解決) 由于預(yù)選ROI的位置通常是有模型回歸得到的,一般來說是浮點數(shù),而赤化后的特征圖要求尺度固定,因此ROI Pooling這個操作存在兩次數(shù)據(jù)量化的過程。1)將候選框邊界量化為整數(shù)點坐標值;2)將量化后的邊界區(qū)域平均分割成kxk個單元,對每個單元的邊界進行量化。事實上,經(jīng)過上面的兩次量化操作,此時的ROI已經(jīng)和最開始的ROI之間存在一定的偏差,這個偏差會影響檢測的精確度。

image
image
image

下面的圖是RPN的部分

image
  • Anchor Generation Layer: This layer <mark style="box-sizing: border-box; background: rgb(211, 212, 14); color: rgb(0, 0, 0);">generates a fixed number of “anchors”</mark> (bounding boxes) by first generating 9 anchors of different scales and aspect ratios and then replicating these anchors by translating them across uniformly spaced grid points spanning the input image.

  • Proposal Layer: Transform the anchors according to the bounding box regression coefficients to generate transformed anchors. <mark style="box-sizing: border-box; background: rgb(211, 212, 14); color: rgb(0, 0, 0);">Then prune the number of anchors by applying non-maximum suppression</mark> (see Appendix) using the probability of an anchor being a foreground region

  • Anchor Target Layer: The goal of the anchor target layer is to produce a set of “good” anchors and the corresponding foreground/background labels and target regression coefficients to train the Region Proposal Network. <mark style="box-sizing: border-box; background: rgb(211, 212, 14); color: rgb(0, 0, 0);">The output of this layer is only used to train the RPN network and is not used by the classification layer.</mark> <mark style="box-sizing: border-box; background: rgb(211, 212, 14); color: rgb(0, 0, 0);">Given a set of anchors (produced by the anchor generation layer, the anchor target layer identifies promising foreground and background anchors.</mark> Promising foreground anchors are those whose overlap with some ground truth box is higher than a threshold. Background boxes are those whose overlap with any ground truth box is lower than a threshold. The anchor target layer also outputs a set of bounding box regressors i.e., a measure of how far each anchor target is from the closest bounding box. These regressors only make sense for the foreground boxes as there is no notion of “closest bounding box” for a background box.

  • RPN Loss:

    The RPN loss function is the metric that is minimized during optimization to train the RPN network. The loss function is a combination of:

    • The proportion of bounding boxes produced by RPN that are correctly classified as foreground/background

    • Some distance measure between the predicted and target regression coefficients.

  • Proposal Target Layer: The goal of the proposal target layer is to prune the list of anchors produced by the proposal layer and produce class specific bounding box regression targets that can be used to train the classification layer to produce good class labels and regression targets

  • ROI Pooling Layer: Implements a spatial transformation network that samples the input feature map given the bounding box coordinates of the region proposals produced by the proposal target layer. These coordinates will generally not lie on integer boundaries, thus interpolation based sampling is required.

  • Classification Layer: The classification layer takes the output feature maps produced by the ROI Pooling Layer and passes them through a series of convolutional layers. The output is fed through two fully connected layers. The first layer produces the class probability distribution for each region proposal and the second layer produces a set of class specific bounding box regressors.

  • Classification Loss:

    Similar to RPN loss, classification loss is the metric that is minimized during optimization to train the classification network. During back propagation, the error gradients flow to the RPN network as well, so training the classification layer modifies the weights of the RPN network as well. We’ll have more to say about this point later. The classification loss is a combination of:

    • The proportion of bounding boxes produced by RPN that are correctly classified (as the correct object class)

    • Some distance measure between the predicted and target regression coefficients.

后續(xù)FPN等歡迎去本人博客查看:https://blog.csdn.net/hancoder/

參考:

B站視頻:python tensorflow圖像處理

https://zhuanlan.zhihu.com/p/31427164 #解讀非常好,點進去看專欄

www.zhuanzhi.ai #專知-深度學(xué)習(xí):算法到實踐

https://cloud.tencent.com/developer/article/1015122

https://blog.csdn.net/wakojosin/article/details/79363224 #RPN

https://blog.csdn.net/mllearnertj/article/details/53709766 #RPN

https://blog.csdn.net/WZZ18191171661/article/details/79439212

https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/ZF/faster_rcnn_end2end/train.prototxt #RPN

http://www.cnblogs.com/zf-blog/p/7286405.html #rpn代碼理解

https://www.learnopencv.com/selective-search-for-object-detection-cpp-python/

https://blog.csdn.net/v1_vivian/article/details/73275259

https://blog.csdn.net/xiamentingtao/article/details/78598027

https://github.com/deepsense-ai/roi-pooling

http://blog.leanote.com/post/afanti.deng@gmail.com/b5f4f526490b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容