免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
目標檢測合集 | 4 Faster R-CNN解析
Faster R-CNN,由Shaoqing Ren,Kaiming He,Ross Girshick等2015.06年提出,將候選框選擇、特征提取、分類、檢測框回歸都整合在了一個網(wǎng)絡(luò)中,通過對圖像生成候選區(qū)域,提取特征,判別特征類別并修正候選框位置。完全端到端,使得精度和速度大幅提升。Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,Ren源碼(官方Matlab),RBG源碼(pyCaffe)

核心思想:
  • Faster R-CNN = RPN + Fast R-CNN
  • RPN:是一個全卷積網(wǎng)絡(luò),它的輸入為特征圖,輸出為候選框ROI。完成了區(qū)域推薦,將Proposal的提取部分嵌入到內(nèi)部網(wǎng)絡(luò),候選區(qū)域生成網(wǎng)絡(luò)與檢測網(wǎng)絡(luò)共享卷積層參數(shù),因此計算開銷非常小。代替了selective search算法。
    • Anchor機制:為feature map中的每個特征點在對應(yīng)的原圖上手動選取9個不同大小和寬高比的anchor,通過滑動窗口將9個anchor卷積成一個特征向量,再輸出給前后景分類層和檢測框回歸層。
    • NMS:消除大量重疊的框。除此了NMS還有其他判斷方法去除冗余的候選框。
  • RPN損失函數(shù):分類的Softmax Loss,回歸的Smooth L1 loss。
  • Fast R-CNN:用RPN訊選出來的候選框做多類別分類,和進一步的檢測框回歸。
  • 整體訓(xùn)練方式:交替訓(xùn)練或端到端訓(xùn)練。訓(xùn)練的目的是調(diào)整 RPN 和檢測網(wǎng)絡(luò)中的權(quán)值,并對主干網(wǎng)絡(luò)的權(quán)值進行微調(diào)。
  • 端到端的檢測,與Fast R-CNN的組件相似,但組織形式框架更加完整的了。后序研究都是對框架中的各個組件的優(yōu)化了,如替換更好的主干網(wǎng)絡(luò)、ROI Pooling等。
  • VOC2007 78.8%,VOC2012 75.9%。VGG版200ms(K40 GPU,包含所有步驟)。
網(wǎng)絡(luò)結(jié)構(gòu):
一個整的網(wǎng)絡(luò)模型:整張圖片->共享卷積網(wǎng)絡(luò)層->RPN網(wǎng)絡(luò)層->Fast R-CNN分類和定位loss層。
  1. 主干網(wǎng)絡(luò):可用VGG和ZF,提取圖像的feature map,feature map被后續(xù)RPN層和全連接層共享。13con+13relu+4pooling,圖像下采樣了2^4=16倍
  2. RPN網(wǎng)絡(luò)(Region Proposal Network):用于生成候選區(qū)域(proposals)。該層通過一組固定的尺寸和比例得到一組錨點(anchors),通過softmax判斷錨點屬于前景或者背景,這就初步完成了目標檢測,再利用邊界框回歸修正前景anchor逼近真值框。3x3+背景前景分類+初步定位
  3. ROI Pooling層:該層收集輸入的feature map和候選區(qū)域,將候選區(qū)域映射到feature map中并劃分網(wǎng)格池化為統(tǒng)一大小的區(qū)域特征圖,將送入下面的全連接層判定目標類別。同fast rcnn一樣
  4. Fast R-CNN檢測網(wǎng)絡(luò):分類+位置精確定位。利用區(qū)域特征圖計算候選區(qū)域的類別,同時再次通過區(qū)域回歸獲得檢測框最終的精確位置。
RPN網(wǎng)絡(luò)
  • 目的:是找到region proposal,是一種全連接網(wǎng)絡(luò),它的輸入為最后一個共享卷積層的feature map,輸出為一系列的候選框。
  • 優(yōu)點:RPN可以高效和準確的生成region proposal,與其后的檢測網(wǎng)絡(luò)共享卷積特征參數(shù),使得區(qū)域推薦幾乎是不花時間的;學(xué)到的RPN也改善了區(qū)域推薦的質(zhì)量,進而改善整個目標檢測的準確性。它代替了傳統(tǒng)的分割+分層的選擇性搜索的方法。
  • 網(wǎng)絡(luò)步驟:
    • 輸入最后一個共享卷積層的feature map(conv5_3)
    • 在feature map上滑動小網(wǎng)絡(luò)(3x3)時,每個滑動窗口位置(小網(wǎng)絡(luò),對應(yīng)feature map的每個點)都在原圖上對應(yīng)了以它的中心為中心的k個anchor box(也稱anchor)。這9個anchor box有3種尺度和3種長寬比,都是手工設(shè)計的初始檢測框,尚不準確,后面還有2次邊界框回歸器可以修正檢測框位置。圖3(左)以這個小網(wǎng)絡(luò)在某個位置的例子
      • 也就是feature map上的每一個特征點都可以在原始圖像中相對應(yīng)的點上生成指定尺寸的9個anchor box,則對于大小為W*H(典型值約2,400)的feature map,總共有W*H*k個anchor。
      • 一個特征點的9個anchor同時與真值框在原圖上比較,生成9個評分,評分好的就是預(yù)測出來的好推薦框,訓(xùn)練學(xué)習(xí)的就是學(xué)習(xí)靠近好的情況下的權(quán)重,以便可以針對某種對象直接給出大概的框。這9個anchor是使用縮放位置記住的,對應(yīng)到原圖比較,不需要每個anchor都看成一個區(qū)域feature map,只看一個中心點的特征。
      • 以3*3滑窗中心對應(yīng)原圖的位置作為中心點,在原圖生成9個不同尺度長寬比的anchor,然后每個anchor都會被分配到相應(yīng)的類標簽和正樣本的回歸標簽,用標簽就可以訓(xùn)練RPN網(wǎng)絡(luò)了。參考
    • 每個feature map的特征點經(jīng)過3*3的滑動窗,生成一個特征向量(全連接層,ZF是1*1*256-d,VGG是1*1*512-d)。這個卷積可當作普通權(quán)重。每個滑動窗口位置對應(yīng)有9個anchor,9個anchor對應(yīng)一個向量。
      • 3*3的滑窗怎么能有這么多的輸出?既有2*k分類值的分數(shù)還有4*k個回歸值?:3*3對應(yīng)的原圖感受野區(qū)域有228個像素(ZF是171像素),輸出有512個通道,512個3*3這些值足夠還原并表現(xiàn)出原圖該區(qū)域中的所有特征。由于RPN中小網(wǎng)絡(luò)的卷積核是3*3*512,就是全連接,全連接的權(quán)重有3*3*512*512個,只要其中某些權(quán)重值設(shè)置得當,那么就可以輸出原圖該區(qū)域的所有特征,包括各種檢測類的位置,分類分數(shù)等。
      • 注意,由于小網(wǎng)絡(luò)是滑動窗口的形式,所以全連接層被所有空間位置共享,該體系結(jié)構(gòu)很自然地使用n*n卷積層實現(xiàn),這類似滑動窗口的卷積實現(xiàn)。在feature map上滑動小網(wǎng)絡(luò),這個小網(wǎng)絡(luò)以子圖像作為輸入,每個子圖像代表了原始圖像中該點為中心的一個矩形區(qū)域(anchor box)。不管滑動多少次,多少anchor box,feature map都做了一次整的卷積,只需要在后面層找到相對應(yīng)的位置即可,共享了計算步驟。每個小網(wǎng)絡(luò)也就是每個特征點的感受野經(jīng)過主干網(wǎng)絡(luò)的映射(可根據(jù)池化縮放得到)。
      • 滑動窗的處理方式保證reg-layer和cls-layer關(guān)聯(lián)了conv5_3的全部特征空間。
    • 然后將這個特征向量輸出給兩個同級的全連接層:檢測框回歸層(reg)和檢測框前后景分類層(cls),就可以預(yù)測出類別和候選框位置了。每個特征點的特征向量都會生成一個1*1*2k和1*1*4k的向量,代表了一個特征點在原圖對應(yīng)的k個anchor,每個點的預(yù)測結(jié)果和這9個anchor box關(guān)聯(lián)起來了,這個點上的對象是哪個anchor。這里就生成的最終的region proposal(可能還會去掉超出邊界的、NMS等),它就可以輸入到檢測網(wǎng)絡(luò)中了。
      • 用二分類的Softmax層實現(xiàn)的cls層,每個點有2k個輸出,判斷anchor是foreground還是background,也就相當于初步提取了檢測目標候選區(qū)域box(一般認為目標在foreground anchors中)。也可以用Logistic回歸來生成k個得分。
      • reg層預(yù)測的前景anchor坐標,每個點有4k個輸出,要用來與真值坐標比較,看它如何變換微調(diào)才能更接近真值坐標框,要訓(xùn)練學(xué)習(xí)的就是這種變換關(guān)系。這就是邊界框回歸??梢哉J為這種變換是一種線性變換, 那么就可以用線性回歸來建模對窗口進行微調(diào),線性回歸就是給定輸入的特征向量X, 學(xué)習(xí)一組參數(shù)W, 使得經(jīng)過線性回歸后的值跟真實值Y非常接近,即Y=WX。(注意只有當前景anchors和真值框比較接近時,才能使用線性回歸模型,否則就是復(fù)雜的非線性問題了)參考
    • 訓(xùn)練時再用分別接兩個損失函數(shù),反向傳播更新。分類損失用的是交叉熵損失,而計算回歸損失用的是Smooth_l1_loss,在計算回歸損失的時候,只計算前景的損失。(訓(xùn)練學(xué)習(xí)的權(quán)重主要是第3步中n*n的滑動卷積核)
  • 前景背景分類+框位置的回歸:
    • 粗分類:判定提取出來的候選框?qū)儆诒尘斑€是前景,后序網(wǎng)絡(luò)還會判斷候選框所屬的具體類別
    • 粗定位:粗略回歸框的位置,后序網(wǎng)絡(luò)還會再一次對候選框精確回歸


Anchor

  • Anchor(錨)機制:對feature map上的每一個特征點都會在原圖上生成k個不同指定尺度的anchor,它們中心點相同,這樣在整個feature map上一共有w*h*k個anchor框。anchor(anchor box)實際就是4個坐標值,代表框的左上角坐標和右下角坐標。
  • 優(yōu)點:平移不變性、多尺度
  • 一般要將不完全在圖像內(nèi)部(初始化的anchor的4個坐標點超出圖像邊界)的anchor都過濾掉,一般剩下了原來1/3左右的anchor。如果不將這部分anchor過濾,則會使訓(xùn)練過程難以收斂。
  • 手工選取每個Anchor的尺度:
    • 每個中心點都會有3*3=9個尺度的anchor,因w*h大小的feature map上每一個點都是anchor,所以總候選框有9*w*h個。
    • 選擇三個面積尺寸:128*128, 256*256, 512*512
    • 在每個尺寸下分別取三種不同的長寬比:1:1, 1:2, 2:1
    • anchors size其實是根據(jù)檢測圖像設(shè)置的,在python demo中,會把任意大小的輸入圖像reshape成800x600(即圖2中的M=800,N=600),再遍歷Conv layers的feature maps,為每一個點都配備9種anchors作為初始的檢測框。
  • yolo也引入的類似的anchor,吳恩達說是為了在一個yolo網(wǎng)格中檢測多個對象,各個對象的anchor box形狀是不一樣的,根據(jù)anchor box和對象真實形狀的IOU來判定此框?qū)儆谀膫€類.
  • 相比較,MultiBox方法用k-means在每個中心點生成了800個anchor,但不具有平移不變性,而且它的卷積輸出層和特征提取層的參數(shù)比本文方法要多很多,這樣本文方法在PASCAL VOC這種小數(shù)據(jù)集上出現(xiàn)過擬合的風(fēng)險較小。
    • 本文的最后卷積輸出層參數(shù)是512 × (4 + 2) × 9(用VGG),而MultiBox的是1536 × (4 + 1) × 800(用GoogleNet)
    • 本文的特征提取層(就是n*n那些卷積核+卷積輸出層)的參數(shù)為
MultiBox的特征提取層的參數(shù)為
Proposal的最后生成
預(yù)測時Proposal的生成就是將圖像輸入到RPN網(wǎng)絡(luò)中進行一次前向(forward)計算,處理流程如下:
  1. 計算特征圖conv5-3映射到輸入圖像的所有anchors,并通過RPN網(wǎng)絡(luò)前向計算得到anchors的score輸出和bbox回歸參數(shù)。已經(jīng)做完了RPN
  2. 由anchors坐標和bbox回歸參數(shù)計算得到預(yù)測框proposal的坐標
  3. 處理proposal坐標超出圖像邊界的情況(使得坐標最小值為0,最大值為寬或高)
  4. 濾除掉尺寸(寬高)小于給定閾值的proposal
  5. 對剩下的proposal按照目標得分從大到小排序,提取前pre_nms_topN(e.g. 6000)個proposal
  6. 對提取的proposal進行非極大值抑制,再根據(jù)nms后的foreground score,篩選前post_nms_topN(e.g. 300)個proposal作為最后的輸出
RPN的損失函數(shù)
  • Anchor正/負樣本:為了訓(xùn)練RPN,我們給每個anchor分配一個二值的標簽(是不是目標)。再給這兩類anchor分配正樣本:(i)與檢測框真值IoU最高的anchor,(ii)與任意檢測框真值有大于0.7的IoU交疊的anchor。注意到一個檢測框真值可能分配正標簽給多個anchor。
    • 通常第二個條件足以確定正樣本。但是我們?nèi)匀徊扇〉谝粋€條件,因為在極少數(shù)情況下,第二個條件可能沒有發(fā)現(xiàn)正樣本。我們分配負樣本給與所有檢測框真值的IoU比率都低于0.3的anchor。
  • 有了這些定義,我們遵循Fast R-CNN中的多任務(wù)損失,最小化目標函數(shù)。損失函數(shù)定義為:

參數(shù):i 是一個mini-batch中anchor的索引,pi 是預(yù)測anchor_i為對象的概率,pi*是檢測框真值標簽,如果anchor為正標簽它就是1;ti 是一個向量,表示預(yù)測框的4個坐標,ti* 是正標簽anchor對應(yīng)的檢測框真值的坐標向量。分類損失L_cls是兩個類別的log對數(shù)損失。回歸損失L_reg是

,R是魯棒的損失函數(shù)(Smooth L1 loss)。pi*xL_reg這一項意味著只有正標簽anchor( )才有回歸損失。cls層和reg層的輸出分別由{pi}和{ti}組成。這兩項由N_cls和N_reg歸一化,并由一個平衡參數(shù) λ 加權(quán)。cls項的歸一化值為mini-batch的大?。碞_cls=256),reg項的歸一化值為anchor位置的數(shù)量(約為2,400),默認情況下 λ=10。
  • 回歸中采用如下4個參數(shù):
參數(shù):x,y,w,h 指的是包圍盒中心的坐標、寬、高。變量x,x_a,x*分別指預(yù)測的檢測框、anchor box、檢測框真值,其他也類似??梢岳斫鉃閺那熬癮nchor box到附近檢測框真值的邊界框回歸?;貧w網(wǎng)絡(luò)分支的輸出就是每個Anchor的偏移量和變換尺度,顯然即可用來修正Anchor位置了。偏移是全局性的,但RPN是一次預(yù)測一個區(qū)域,不影響。
我們用了一種與之前基于RoI方法的不同方法實現(xiàn)了檢測框回歸算法。在SPP和Fast RCNN中,檢測框回歸是通過從任意大小的ROI區(qū)域中池化特征實現(xiàn)的,回歸權(quán)重被所有大小區(qū)域共享。而本文方法中,用于回歸的特征在特征映射中具有相同的空間尺寸(3x3)。為了適應(yīng)不同的尺寸,我們學(xué)習(xí)了一組k個檢測框回歸量,每一個回歸量對應(yīng)于一個尺度和長寬比,這k個回歸量之間不共享權(quán)重。由于anchor的設(shè)計,即使特征的大小/比例是固定的,仍然可以預(yù)測各種大小的檢測框。

選擇候選框并輸入網(wǎng)絡(luò)的方法比較
  • R-CNN(選擇性搜索):用圖像分割的方法找到可能存在對象的色塊,然后根據(jù)相似度不斷合并相鄰區(qū)域構(gòu)成更多不同尺度的新候選框,最后選擇出2000個候選框;
    • 將這2000個候選框做crop/warp后分別輸入到各自的卷積網(wǎng)絡(luò),逐一對每個候選區(qū)域分類,會有大量卷積層重復(fù)計算。這和普通的滑動窗口檢測差不多,也是要把切分后的框輸入到網(wǎng)絡(luò)。
  • Fast R-CNN(選擇性搜索+滑動窗口的卷積實現(xiàn)):先用R-CNN的選擇性搜索找出2000個候選框;而輸入網(wǎng)絡(luò)時,是將整幅圖片輸入到卷積網(wǎng)絡(luò),對于2000個候選框是怎么對應(yīng)到各自的輸出的,用的就是滑動窗口的卷積實現(xiàn)的思想,每一個框都會對應(yīng)卷積層輸出的一部分(這部分就像是映射),而在最后的全連接層中每個候選框都會生成一個1x1的高維向量。這里并沒有真正的滑動窗口,只是把2000個候選框當做滑動出來的窗口理解了。
    • 滑動窗口的卷積實現(xiàn)只對整幅圖做了一次卷積網(wǎng)絡(luò),共享了很多卷積計算;而如果沒有預(yù)先的選擇性搜索,直接在原圖上逐步滑動,在沒有對象的區(qū)域會浪費時間。
    • 如下圖是滑動窗口的卷積實現(xiàn),假設(shè)輸入給卷積網(wǎng)絡(luò)的圖片大小是14×14×3,測試圖片是16×16×3,相當于在測試圖片上做了4次14x14大小的滑動,全連接層就成了2x2的了,而不是1x1,代表著4個滑動窗的各類得分。共享了很多計算是因為各卷積層的滑動窗使用了相同的卷積核?;瑒哟霸诰W(wǎng)絡(luò)里面的就算是個標記,不管有多少滑動窗,整幅圖像只經(jīng)過一次卷積網(wǎng)絡(luò),一次得到所有預(yù)測值,最后在輸出層找到各個滑動窗相對應(yīng)的那個神經(jīng)單元即可。
  • Faster R-CNN(RPN:anchor):對主干網(wǎng)絡(luò)的最后一層feture map上的每一個特征點,都在相對應(yīng)的原圖上生成了9個anchor,然后每個特征點都有2k+4k的預(yù)測向量,代表了每個特征點涵蓋的9個anchor與真值框的對比情況,或者直接預(yù)測值,這個向量就可以做分類和回歸損失的訓(xùn)練了。也是將整幅圖片輸入到主干卷積網(wǎng)絡(luò)。
4-2 三種訓(xùn)練方法
如何實現(xiàn)RPN前面的卷積層和檢測網(wǎng)絡(luò)的卷積層參數(shù)的共享?對于提取proposals的RPN,以及分類回歸的Fast R-CNN,如何將這兩個網(wǎng)絡(luò)嵌入到同一個網(wǎng)絡(luò)結(jié)構(gòu)中,訓(xùn)練一個共享卷積層參數(shù)的多任務(wù)網(wǎng)絡(luò)模型。源碼中有實現(xiàn)交替訓(xùn)練(Alternating training)和端到端訓(xùn)練(end-to-end)兩種方式,兩種方法訓(xùn)練出來的網(wǎng)絡(luò)準確度基本沒有多大的區(qū)別,但是使用 end2end 訓(xùn)練可以節(jié)省很多時間和顯存。兩種方法的網(wǎng)絡(luò)結(jié)構(gòu)圖其實是一樣的,只是交替訓(xùn)練拆分3個單獨的子結(jié)構(gòu),理解起來都一樣。

交替訓(xùn)練
  • 用ImageNet的預(yù)訓(xùn)練模型M0訓(xùn)練RPN網(wǎng)絡(luò),得到模型M1,生成Proposal P1
  • 使用上一步RPN生成的區(qū)域建議Proposal,訓(xùn)練Fast R-CNN網(wǎng)絡(luò),同樣用ImageNet模型初始化,訓(xùn)練得到模型M2。在這兩個網(wǎng)絡(luò)還沒有共享卷積層。
  • 使用模型M2參數(shù)初始化RPN訓(xùn)練,但固定共享卷積層僅微調(diào)RPN特有的層,固定卷積層參數(shù)。即把RPN、Fast R-CNN共享的那些卷積層的學(xué)習(xí)率設(shè)置為0,只微調(diào)更新RPN網(wǎng)絡(luò)獨有的層,訓(xùn)練得到模型M3,生成Proposal P2。此時兩個網(wǎng)絡(luò)已經(jīng)共享了所有公共的卷積層。
  • 訓(xùn)練Fast R-CNN網(wǎng)絡(luò),用RPN網(wǎng)絡(luò)模型M3初始化,保持共享卷積層參數(shù)和RPN參數(shù)不變,只微調(diào)Fast R-CNN特有的層,得到最終模型M4。
由訓(xùn)練流程可知,第4步訓(xùn)練RPN網(wǎng)絡(luò)和第6步訓(xùn)練Fast R-CNN網(wǎng)絡(luò)實現(xiàn)了卷積層參數(shù)共享。總體上看,訓(xùn)練過程只循環(huán)了2次,但每一步訓(xùn)練(M1,M2,M3,M4)都迭代了多次(e.g. 80k,60k)。
端到端訓(xùn)練(近似聯(lián)合訓(xùn)練)
end2end的訓(xùn)練一氣呵成,對于前向傳播,rpn可以作為預(yù)設(shè)的網(wǎng)絡(luò)提供proposal;而在后向傳播中rpn與fast rcnn分別傳導(dǎo),而匯聚到shared layer。RPN和Fast R-CNN網(wǎng)絡(luò)在訓(xùn)練期間被合并到一個網(wǎng)絡(luò)中,訓(xùn)練它:
  • 在每個SGD迭代中,前向傳遞產(chǎn)生推薦區(qū)域,在訓(xùn)練時被視為固定的,訓(xùn)練Fast R-CNN檢測器前要預(yù)先計算proposal。
  • 反向傳播像往常一樣發(fā)生,其中對于共享層,反向傳播信號為來自RPN的損失和Fast R-CNN的損失的組合。這個解決方案很容易實現(xiàn)。但是這個解決方案忽略了衍生的w.r.t.推薦框的坐標也是網(wǎng)絡(luò)響應(yīng),所以是近似。在我們的實驗中,我們發(fā)現(xiàn)這個解決方案產(chǎn)生了相近的結(jié)果,與交替訓(xùn)練相比,訓(xùn)練時間減少了約25-50%。
  • SGD訓(xùn)練與像往常一樣
  • 即使proposal的分布發(fā)生了變化,這也能奏效
非近似聯(lián)合訓(xùn)練
如上所述,由RPN預(yù)測的檢測框也是輸入的函數(shù)。Fast R-CNN中的RoI pooling接受卷積特征以及預(yù)測的檢測框作為輸入,因此理論上有效的反向傳播求解器也應(yīng)該包含梯度w.r.t.框坐標。而這些梯度在上述近似聯(lián)合訓(xùn)練中被忽略。在非近似聯(lián)合培訓(xùn)解決方案中,我們需要一個可區(qū)分w.r.t.框坐標的RoI池化層。這是一個非常重要的問題,解決方案可以參考[15]中開發(fā)的“RoI warping”層給出,這超出了本文的范圍。
但是端到端訓(xùn)練沒有考慮RoI pooling層對于predicted bounding box的導(dǎo)數(shù)。對于faster rcnn來說,RoI pooling層顯然依賴于圖像本身和roi區(qū)域,而roi是通過rpn產(chǎn)生的,rpn不定,所以roi的生成依賴于圖像,不可導(dǎo)。由于最大池化的作用,所以沒有辦法對roi的四個位置求導(dǎo)。對于fast rcnn來講,roi是固定的,可導(dǎo)。所以我們忽略掉對于roi的導(dǎo)數(shù),運行SGD的“surrogate”梯度。這還能工作,是因為RPN網(wǎng)絡(luò)接受直接監(jiān)督,錯誤傳播RoI pooling可能會有所幫助,但并不是嚴格必需的。當然了如果改變max pooling的方式,比如如下所說采取雙線性插值,這樣輸出既有roi的坐標也有圖像像素值,則可以關(guān)于roi求導(dǎo)。

4-3 Caffe訓(xùn)練結(jié)構(gòu)解讀
這里分析了端到端的train.prototxt源碼結(jié)構(gòu),還用到了交替訓(xùn)練的3個子結(jié)構(gòu)圖輔助理解,都一樣。
端到端的整體訓(xùn)練網(wǎng)絡(luò)結(jié)構(gòu)圖:
1、input-data - 輸入原圖數(shù)據(jù)
輸入圖像數(shù)據(jù)、類別和邊界框真值、圖像的寬高和縮放比例。
name: 'VGG_ILSVRC_16_layers'layer {  name: 'input-data'  type: 'Python'  top: 'data' # 單張圖像數(shù)據(jù)im_blob=[1,3,H,W]  top: 'im_info' # 圖像的寬高和縮放比例  top: 'gt_boxes' # 一幅圖像中所有g(shù)round truth的坐標和類別[x1,y1,x2,y2,cls]  python_param {    module: 'roi_data_layer.layer'    layer: 'RoIDataLayer'    param_str: ''num_classes': 21'  }}

2、主干網(wǎng)絡(luò)
conv5_3:輸出512維的feature map,尺度是(w/16,h/16)。layer { name: 'conv5_3' type: 'Convolution' bottom: 'conv5_2' top: 'conv5_3' param { lr_mult: 1 } param { lr_mult: 2 } convolution_param { num_output: 512 pad: 1 kernel_size: 3 }}
3、RPN網(wǎng)絡(luò)
Faster R-CNN采用了一種基于'滑動窗口'的技術(shù)生成一組密集的候選區(qū)域,然后使用神經(jīng)網(wǎng)絡(luò)驅(qū)動的RPN根據(jù)包含前景對象區(qū)域的概率對區(qū)域進行排序。而R-CNN使用選擇性搜索方法生成區(qū)域。
下面這種是交替訓(xùn)練的結(jié)構(gòu)圖,其實就是端到端結(jié)構(gòu)圖的拆分,一樣理解,另外這個圖把每個層的所有輸出都顯出來了,紅框中省略的主干網(wǎng)的Conv。
  • rpn_conv/3x33*3卷積,依舊輸出512維的feature map,尺度是(w/16,h/16)。
    • 輸出的rpn/output已經(jīng)是在每個特征點取了9個anchor后的。在它之前已經(jīng)做了滑動窗口,每一個特征點都生成有9個anchor,每個點的anchor的預(yù)測值還會在 rpn_loss中與所對應(yīng)的真值計算損失,以便做訓(xùn)練。
layer { name: 'rpn_conv/3x3' type: 'Convolution' bottom: 'conv5_3' top: 'rpn/output' param { lr_mult: 1.0 } param { lr_mult: 2.0 } convolution_param { num_output: 512 kernel_size: 3 pad: 1 stride: 1 weight_filler { type: 'gaussian' std: 0.01 } bias_filler { type: 'constant' value: 0 } }}
  • rpn_cls_score:預(yù)測類別概率,用18個1*1*512卷積核做卷積,輸出與上一層同尺度(w/16,h/16)的18維feature map,就是說尺度(w/16,h/16)上每一個特征點有一個18維向量,18維向量的參數(shù)存著9個anchor屬于前景和背景的2個概率值。用了18個卷積核是因為每個卷積核在一個特征點都要學(xué)習(xí)一種anchor的前景(或背景)。
layer { name: 'rpn_cls_score' type: 'Convolution' bottom: 'rpn/output' top: 'rpn_cls_score' param { lr_mult: 1.0 } param { lr_mult: 2.0 } convolution_param { num_output: 18 # 2(bg/fg) * 9(anchors) kernel_size: 1 pad: 0 stride: 1 weight_filler { type: 'gaussian' std: 0.01 } bias_filler { type: 'constant' value: 0 } }}
  • rpn_bbox_pred:預(yù)測邊界框,輸出36維的feature map,因為有9個anchor,每個有4個邊界框參數(shù)。
layer { name: 'rpn_bbox_pred' type: 'Convolution' bottom: 'rpn/output' top: 'rpn_bbox_pred' param { lr_mult: 1.0 } param { lr_mult: 2.0 } convolution_param { num_output: 36 # 4 * 9(anchors) kernel_size: 1 pad: 0 stride: 1 weight_filler { type: 'gaussian' std: 0.01 } bias_filler { type: 'constant' value: 0 } }}
  • rpn-data:input-data(RoIDataLayer)的下一層是rpn-data(AnchorTargetLayer),rpn-data計算所有anchors與ground truth的重疊比例IoU,從中篩選出一定數(shù)量(256)的正負樣本組成一個minibatch,用于RPN網(wǎng)絡(luò)的訓(xùn)練。目標是產(chǎn)生一組好的Anchor及相應(yīng)的前景/背景標記和目標回歸系數(shù),以訓(xùn)練RPN。
layer { name: 'rpn-data' type: 'Python' bottom: 'rpn_cls_score' bottom: 'gt_boxes' bottom: 'im_info' bottom: 'data' top: 'rpn_labels' # 每個anchor對應(yīng)的類別(1——fg,0——bg,-1——ignored),shape=[1,1,A*height,width] top: 'rpn_bbox_targets' # anchor與ground truth的回歸參數(shù)[dx,dy,dw,dh],shape=[1,A*4,height,width] top: 'rpn_bbox_inside_weights' # 回歸損失函數(shù)中的樣本權(quán)值,正樣本為1,負樣本為0,相當于損失函數(shù)中的p*,shape=[1,A*4,height,width] top: 'rpn_bbox_outside_weights' # 分類損失函數(shù)和回歸損失函數(shù)的平衡權(quán)重,相當于λ,shape=[1,A*4,height,width] python_param { module: 'rpn.anchor_target_layer' layer: 'AnchorTargetLayer' param_str: ''feat_stride': 16' }}
  • rpn_loss_cls:分類損失,輸入rpn_cls_scors_reshape和rpn_labels
layer { name: 'rpn_loss_cls' type: 'SoftmaxWithLoss' bottom: 'rpn_cls_score_reshape' # rpn_cls_score的變形 bottom: 'rpn_labels' propagate_down: 1 propagate_down: 0 top: 'rpn_cls_loss' loss_weight: 1 loss_param { ignore_label: -1 normalize: true }}
  • rpn_loss_bbox:回歸損失,輸入rpn_bbox_pred、rpn_bbox_targets、pn_bbox_inside_weigths、rpn_bbox_outside_weights。
layer { name: 'rpn_loss_bbox' type: 'SmoothL1Loss' bottom: 'rpn_bbox_pred' bottom: 'rpn_bbox_targets' bottom: 'rpn_bbox_inside_weights' bottom: 'rpn_bbox_outside_weights' top: 'rpn_loss_bbox' loss_weight: 1 smooth_l1_loss_param { sigma: 3.0 }}

4、生成Proposal
交替訓(xùn)練的結(jié)構(gòu)圖
  • proposal:生成推薦區(qū)域rpn_rois。在他之前先將分類預(yù)測 rpn_cls_score 做rpn_cls_prob和rpn_cls_prob_reshape變形,在生成proposal。利用了錨點成為前景區(qū)域的概率,通過應(yīng)用非最大抑制減少了錨點的數(shù)量。
layer { name: 'proposal' type: 'Python' bottom: 'rpn_cls_prob_reshape' # 預(yù)測分類得分 bottom: 'rpn_bbox_pred' # 預(yù)測邊界框 bottom: 'im_info' # 圖像的寬高和縮放比例 top: 'rpn_rois'# top: 'rpn_scores' python_param { module: 'rpn.proposal_layer' layer: 'ProposalLayer' param_str: ''feat_stride': 16' }}
  • roi-data,比較RPN的ROI與原圖片的真值,選擇符合重疊條件的ROIs和類特定的目標回歸系數(shù),用于檢測網(wǎng)絡(luò)。
layer { name: 'roi-data' type: 'Python' bottom: 'rpn_rois' bottom: 'gt_boxes' # 一幅圖像中所有g(shù)round truth的坐標和類別[x1,y1,x2,y2,cls] top: 'rois' # proposals的坐標[batch_inds,x1,y1,x2,y2] top: 'label' # proposals對應(yīng)的類別(0~20) top: 'bbox_targets' # proposal回歸參數(shù)的標定值,shape = [128, 4(N+1)] top: 'box_inside_targets'# 回歸損失函數(shù)中的樣本權(quán)值,正樣本為1,負樣本為0,相當于損失函數(shù)中的p* top: 'rpn_box_outside_targets':分類損失函數(shù)和回歸損失函數(shù)的平衡權(quán)重,相當于λ python_param { module: 'rpn.proposal_target_layer' layer: 'ProposalTargetLayer' param_str: ''num_classes': 21' }}

5、訓(xùn)練Fast R-CNN
這個data就是上面的roi-data。交替訓(xùn)練的結(jié)構(gòu)圖
  • roi_pool5:池化采樣conv5_3的feature map中對應(yīng)的proposal區(qū)域。這是將proposal坐標映射到conv5_3特征圖中,取出proposal對應(yīng)的特征圖區(qū)域,再池化為固定大小,輸入到后面的卷積網(wǎng)絡(luò)中。

layer { name: 'roi_pool5' type: 'ROIPooling' bottom: 'conv5_3' bottom: 'rois' top: 'pool5' roi_pooling_param { pooled_w: 7 pooled_h: 7 spatial_scale: 0.0625 # 1/16 }}
  • cls_score:預(yù)測分類

  • bbox_pred:預(yù)測邊界框

  • loss_cls:分類損失

  • loss_bbox:邊界框回歸損失,損失函數(shù)的計算與RPN網(wǎng)絡(luò)類似。

論文實現(xiàn)結(jié)果

  • VGG版推理速度200ms(K40 GPU)。

  • VOC 2007是78.8%,VOC 2012是75.9%。檢測器是Fast R-CNN+VGG16,RPN用于Fast R-CNN訓(xùn)練時的提案框是2k,RPN*表示非共享特征版本。

Caffe可視化(端到端結(jié)構(gòu))
(1)訓(xùn)練模型
https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt

(2)預(yù)測模型
https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt

參考:

1、http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/#Bibliography

2、http://117.128.6.9/cache/mp7.watson.ibm.com/ICCV2015/slides/iccv15_tutorial_training_rbg.pdf?ich_args2=467-17141622042137_aa6ea5b70baf01e1489b859bfe7e43b6_10001002_9c896124d7c4f2d69e3f518939a83798_9c5eb08ff263a9f04ff63f19ed98b21b

3、https://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf

4、https://zhuanlan.zhihu.com/p/32404424

5、https://zhuanlan.zhihu.com/p/31426458

6、https://senitco.github.io/2017/09/02/faster-rcnn/

7、https://blog.csdn.net/xiamentingtao/article/details/78536224

TF版源碼: 

https://github.com/smallcorgi/Faster-RCNN_TF



作者 | 知乎:Mengcius
https://zhuanlan.zhihu.com/ObjectDet

版權(quán)聲明

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Faster R-CNN tensorflows實現(xiàn)
一位算法工程師從30+場秋招面試中總結(jié)出的超強面經(jīng)——目標檢測篇(含答案)
令我“細思極恐”的Faster-R-CNN
十三、目標檢測、圖像分割
技術(shù)揭秘:海康威視PASCAL VOC2012目標檢測權(quán)威評測奪冠之道
(RegionProposal Network)RPN網(wǎng)絡(luò)結(jié)構(gòu)及詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服