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層。 主干網(wǎng)絡(luò):可用VGG和ZF,提取圖像的feature map,feature map被后續(xù)RPN層和全連接層共享。13con+13relu+4pooling,圖像下采樣了2^4=16倍 RPN網(wǎng)絡(luò)(Region Proposal Network):用于生成候選區(qū)域(proposals)。該層通過一組固定的尺寸和比例得到一組錨點(anchors),通過softmax判斷錨點屬于前景或者背景,這就初步完成了目標檢測,再利用邊界框回歸修正前景anchor逼近真值框。3x3+背景前景分類+初步定位 ROI Pooling層:該層收集輸入的feature map和候選區(qū)域,將候選區(qū)域映射到feature map中并劃分網(wǎng)格池化為統(tǒng)一大小的區(qū)域特征圖,將送入下面的全連接層判定目標類別。同fast rcnn一樣 Fast R-CNN檢測網(wǎng)絡(luò):分類+位置精確定位。利用區(qū)域特征圖計算候選區(qū)域的類別,同時再次通過區(qū)域回歸獲得檢測框最終的精確位置。 目的:是找到region proposal,是一種全連接網(wǎng)絡(luò),它的輸入為最后一個共享卷積層的feature map,輸出為一系列的候選框。 優(yōu)點:RPN可以高效和準確的生成region proposal,與其后的檢測網(wǎng)絡(luò)共享卷積特征參數(shù),使得區(qū)域推薦幾乎是不花時間的;學(xué)到的RPN也改善了區(qū)域推薦的質(zhì)量,進而改善整個目標檢測的準確性。它代替了傳統(tǒng)的分割+分層的選擇性搜索的方法。 輸入最后一個共享卷積層的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個坐標值,代表框的左上角坐標和右下角坐標。 一般要將不完全在圖像內(nèi)部(初始化的anchor的4個坐標點超出圖像邊界)的anchor都過濾掉,一般剩下了原來1/3左右的anchor。如果不將這部分anchor過濾,則會使訓(xùn)練過程難以收斂。 每個中心點都會有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ù)為 Proposal的最后生成 預(yù)測時Proposal的生成就是將圖像輸入到RPN網(wǎng)絡(luò)中進行一次前向(forward)計算,處理流程如下: 計算特征圖conv5-3映射到輸入圖像的所有anchors,并通過RPN網(wǎng)絡(luò)前向計算得到anchors的score輸出和bbox回歸參數(shù)。已經(jīng)做完了RPN 由anchors坐標和bbox回歸參數(shù)計算得到預(yù)測框proposal的坐標 處理proposal坐標超出圖像邊界的情況(使得坐標最小值為0,最大值為寬或高) 對剩下的proposal按照目標得分從大到小排序,提取前pre_nms_topN(e.g. 6000)個proposal 對提取的proposal進行非極大值抑制,再根據(jù)nms后的foreground score,篩選前post_nms_topN(e.g. 300)個proposal作為最后的輸出 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。 參數(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),理解起來都一樣。 用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%。 即使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'
}
}
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/3x3 : 3*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_scor e: 預(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)圖 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
}
}
論文實現(xiàn)結(jié)果
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
https://zhuanlan.zhihu.com/ObjectDet