廢話不多說,上車吧,少年
paper鏈接:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
&創新點
設計Region Proposal Networks【RPN】,利用CNN卷積操作后的特征圖生成region proposals,代替了Selective Search、EdgeBoxes等方法,速度上提升明顯;
訓練Region Proposal Networks與檢測網絡【Fast R-CNN】共享卷積層,大幅提高網絡的檢測速度。
&問題是什么
繼Fast R-CNN后,在CPU上實現的區域建議算法Selective Search【2s/image】、EdgeBoxes【0.2s/image】等成了物體檢測速度提升上的最大瓶頸。
&如何解決問題
。測試過程
Faster R-CNN統一的網絡結構如下圖所示,可以簡單看作RPN網絡+Fast R-CNN網絡。
注意:上圖Fast R-CNN中含特有卷積層,博主認為不是所有卷積層都參與共享。
首先向CNN網絡【ZF或VGG-16】輸入任意大小圖片;
經過CNN網絡前向傳播至最后共享的卷積層,一方面得到供RPN網絡輸入的特征圖,另一方面繼續前向傳播至特有卷積層,產生更高維特征圖;
供RPN網絡輸入的特征圖經過RPN網絡得到區域建議和區域得分,並對區域得分采用非極大值抑制【閾值為0.7】,輸出其Top-N【文中為300】得分的區域建議給RoI池化層;
第2步得到的高維特征圖和第3步輸出的區域建議同時輸入RoI池化層,提取對應區域建議的特征;
第4步得到的區域建議特征通過全連接層后,輸出該區域的分類得分以及回歸后的bounding-box。
。解釋分析
RPN網絡結構是什么?實現什么功能?具體如何實現?
單個RPN網絡結構如下圖:
注意:上圖中卷積層/全連接層表示卷積層或者全連接層,作者在論文中表示這兩層實際上是全連接層,但是網絡在所有滑窗位置共享全連接層,可以很自然地用n×n卷積核【論文中設計為3×3】跟隨兩個並行的1×1卷積核實現,文中這么解釋的,博主並不是很懂,尷尬。功能:實現attention機制,如圖所示,RPN在CNN卷積層后增加滑動窗口操作以及兩個卷積層完成區域建議功能,第一個卷積層將特征圖每個滑窗位置編碼成一個特征向量,第二個卷積層對應每個滑窗位置輸出k個區域得分和k個回歸后的區域建議,並對得分區域進行非極大值抑制后輸出得分Top-N【文中為300】區域,告訴檢測網絡應該注意哪些區域,本質上實現了Selective Search、EdgeBoxes等方法的功能。
具體實現:
①首先套用ImageNet上常用的圖像分類網絡,本文中試驗了兩種網絡:ZF或VGG-16,利用這兩種網絡的部分卷積層產生原始圖像的特征圖;② 對於①中特征圖,用n×n【論文中設計為3×3,n=3看起來很小,但是要考慮到這是非常高層的feature map,其size本身也沒有多大,因此9個矩形中,每個矩形窗框都是可以感知到很大范圍的】的滑動窗口在特征圖上滑動掃描【代替了從原始圖滑窗獲取特征】,每個滑窗位置通過卷積層1映射到一個低維的特征向量【ZF網絡:256維;VGG-16網絡:512維,低維是相對於特征圖大小W×H,typically~60×40=2400】后采用ReLU,並為每個滑窗位置考慮k種【論文中k=9】可能的參考窗口【論文中稱為anchors,見下解釋】,這就意味着每個滑窗位置會同時預測最多9個區域建議【超出邊界的不考慮】,對於一個W×H的特征圖,就會產生W×H×k個區域建議;
③步驟②中的低維特征向量輸入兩個並行連接的卷積層2:reg窗口回歸層【位置精修】和cls窗口分類層,分別用於回歸區域建議產生bounding-box【超出圖像邊界的裁剪到圖像邊緣位置】和對區域建議是否為前景或背景打分,這里由於每個滑窗位置產生k個區域建議,所以reg層有4k個輸出來編碼【平移縮放參數】k個區域建議的坐標,cls層有2k個得分估計k個區域建議為前景或者背景的概率
Anchors是什么?有什么用?
Anchors是一組大小固定的參考窗口:三種尺度{128^2,256^2,512^2}×三種長寬比{1:1,1:2,2:1},如下圖所示,表示RPN網絡中對特征圖滑窗時每個滑窗位置所對應的原圖區域中9種可能的大小,相當於模板,對任意圖像任意滑窗位置都是這9中模板。繼而根據圖像大小計算滑窗中心點對應原圖區域的中心點,通過中心點和size就可以得到滑窗位置和原圖位置的映射關系,由此原圖位置並根據與Ground Truth重復率貼上正負標簽,讓RPN學習該Anchors是否有物體即可。
作者在文中表示采用Anchors這種方法具有平移不變性,就是說在圖像中平移了物體,窗口建議也會跟着平移。同時這種方式也減少了整個模型的size,輸出層512×(4+2)×9=2.8×10^4個參數【512是前一層特征維度,(4+2)×9是9個Anchors的前景背景得分和平移縮放參數】,而MultiBox有1536×(4+1)×800=6.1×10^6個參數,而較小的參數可以在小數據集上減少過擬合風險。當然,在RPN網絡中我們只需要找到大致的地方,無論是位置還是尺寸,后面的工作都可以完成,這樣的話采用小網絡進行簡單的學習【估計和猜差不多,反正有50%概率】,還不如用深度網絡【還可以實現卷積共享】,固定尺度變化,固定長寬比變化,固定采樣方式來大致判斷是否是物體以及所對應的位置並降低任務復雜度。
Anchors為什么考慮以上三種尺度和長寬比?
文中對Anchors的尺度以及長寬比選取進行了實驗,如下圖所示:
實驗實在VGG-16模型下,采用PASCAL VOC 2007訓練集和PASCAL VOC 2007測試集得到。相比於只采用單一尺度和長寬比,單尺度多長寬比和多尺度單長寬比都能提升mAP,表明多size的anchors可以提高mAP,作者在這里選取了最高mAP的3種尺度和3種長寬比。如何處理多尺度多長寬比問題?即如何使24×24和1080×720的車輛同時在一個訓練好的網絡中都能正確識別?
文中展示了兩種解決多尺度多長寬比問題:一種是使用圖像金字塔,對伸縮到不同size的輸入圖像進行特征提取,雖然有效但是費時;
另一種是使用濾波器金字塔或者滑動窗口金字塔,對輸入圖像采用不同size的濾波器分別進行卷積操作,這兩種方式都需要枚舉圖像或者濾波器size;
作者提出了一種叫Anchors金字塔的方法來解決多尺度多長寬比的問題,在RPN網絡中對特征圖滑窗時,對滑窗位置中心進行多尺度多長寬比的采樣,並對多尺度多長寬比的anchor boxes區域進行回歸和分類,利用Anchors金字塔就僅僅依賴於單一尺度的圖像和特征圖和單一大小的卷積核,就可以解決多尺度多長寬比問題,這種對推薦區域采樣的模型不管是速度還是准確率都能取得很好的性能。同傳統滑窗方法提取區域建議方法相比,RPN網絡有什么優勢?
傳統方法是訓練一個能檢測物體的網絡,然后對整張圖片進行滑窗判斷,由於無法判斷區域建議的尺度和長寬比,所以需要多次縮放,這樣找出一張圖片有物體的區域就會很慢;
雖然RPN網絡也是用滑動窗口策略,但是滑動窗口實在卷積層特征圖上進行的,維度較原始圖像降低了很多倍【中間進行了多次max pooling 操作】,RPN采取了9種不同尺度不同長寬比的anchors,同時最后進行了bounding-box回歸,即使是這9種anchors外的區域也能得到一個跟目標比較接近的區域建議。
。訓練過程
RPN網絡預訓練
樣本 來源 正樣本 ILSVRC20XX 負樣本 ILSVRC20XX
樣本中只有類別標簽;
文中一帶而過RPN網絡被ImageNet網絡【ZF或VGG-16】進行了有監督預訓練,利用其訓練好的網絡參數初始化;
用標准差0.01均值為0的高斯分布對新增的層隨機初始化。Fast R-CNN網絡預訓練
樣本 來源 正樣本 ILSVRC20XX 負樣本 ILSVRC20XX
樣本中只有類別標簽;
文中一帶而過Fast R-CNN網絡被ImageNet網絡【ZF或VGG-16】進行了有監督預訓練,利用其訓練好的網絡參數初始化。RPN網絡微調訓練
RPN網絡樣本 來源 正樣本 與Ground Truth相交IoU最大的anchors【以防后一種方式下沒有正樣本】+與Ground Truth相交IoU>0.7的anchors 負樣本 與Ground Truth相交IoU<0.3的anchors
PASCAL VOC 數據集中既有物體類別標簽,也有物體位置標簽;
正樣本僅表示前景,負樣本僅表示背景;
回歸操作僅針對正樣本進行;
訓練時棄用所有超出圖像邊界的anchors,否則在訓練過程中會產生較大難以處理的修正誤差項,導致訓練過程無法收斂;
對去掉超出邊界后的anchors集采用非極大值抑制,最終一張圖有2000個anchors用於訓練【詳細見下】;
對於ZF網絡微調所有層,對VGG-16網絡僅微調conv3_1及conv3_1以上的層,以便節省內存。SGD mini-batch采樣方式:同Fast R-CNN網絡,采取”image-centric”方式采樣,即采用層次采樣,先對圖像取樣,再對anchors取樣,同一圖像的anchors共享計算和內存。每個mini-batch包含從一張圖中隨機提取的256個anchors,正負樣本比例為1:1【當然可以對一張圖所有anchors進行優化,但由於負樣本過多最終模型會對正樣本預測准確率很低】來計算一個mini-batch的損失函數,如果一張圖中不夠128個正樣本,拿負樣本補湊齊。
訓練超參數選擇:在PASCAL VOC數據集上前60k次迭代學習率為0.001,后20k次迭代學習率為0.0001;動量設置為0.9,權重衰減設置為0.0005。
一張圖片多任務目標函數【分類損失+回歸損失】具體如下:
解釋說明:其中,i表示一個mini-batch中某個anchor的下標, 表示anchor i預測為物體的概率;當anchor為正樣本時, ,當anchor為負樣本時 ,由此可以看出回歸損失項僅在anchor為正樣本情況下才被激活;
表示正樣本anchor到預測區域的4個平移縮放參數【以anchor為基准的變換】; 表示正樣本anchor到Ground Truth的4個平移縮放參數【以anchor為基准的變換】;
分類損失函數 是一個二值【是物體或者不是物體】分類器, ;
歸回損失函數 【兩種變換之差越小越好】,R函數定義如下:
參數用來權衡分類損失 和回歸損失 ,默認值 【文中實驗表明 從1變化到100對mAP影響不超過1%】;
和 分別用來標准化分類損失項 和回歸損失項 ,默認用mini-batch size=256設置 ,用anchor位置數目~2400初始化 ,文中也說明標准化操作並不是必須的,可以簡化省略。
Fast R-CNN網絡微調訓練
Fast R-CNN網絡樣本 來源 正樣本 Ground Truth +與Ground Truth相交IoU>閾值的區域建議 負樣本 與Ground Truth相交IoU<閾值的區域建議
PASCAL VOC 數據集中既有物體類別標簽,也有物體位置標簽;
正樣本表示每類物品的Ground Truth以及與Ground Truth重疊度超過某一閾值的區域建議,負樣本表示同Ground Truth重疊度小於某一閾值的區域建議;
回歸操作僅針對正樣本進行。RPN網絡、Fast R-CNN網絡聯合訓練
訓練網絡結構示意圖如下所示:
如上圖所示,RPN網絡、Fast R-CNN網絡聯合訓練是為了讓兩個網絡共享卷積層,降低計算量。
文中通過4步訓練算法,交替優化學習至共享特征:
① 進行上面RPN網絡預訓練,和以區域建議為目的的RPN網絡end-to-end微調訓練;
② 進行上面Fast R-CNN網絡預訓練,用第①步中得到的區域建議進行以檢測為目的的Fast R-CNN網絡end-to-end微調訓練【此時無共享卷積層】;
③ 使用第②步中微調后的Fast R-CNN網絡重新初始化RPN網絡,固定共享卷積層【即設置學習率為0,不更新】,僅微調RPN網絡獨有的層【此時共享卷積層】;
④ 固定第③步中共享卷積層,利用第③步中得到的區域建議,僅微調Fast R-CNN獨有的層,至此形成統一網絡如上圖所示。
。解釋分析
RPN網絡中bounding-box回歸怎么理解?同Fast R-CNN中的bounding-box回歸相比有什么區別?
對於bounding-box回歸,采用以下公式:其中,x,y,w,h表示窗口中心坐標和窗口的寬度和高度,變量 , 和 分別表示預測窗口、anchor窗口和Ground Truth的坐標【y,w,h同理】,因此這可以被認為是一個從anchor窗口到附近Ground Truth的bounding-box 回歸;
RPN網絡中bounding-box回歸的實質其實就是計算出預測窗口。這里以anchor窗口為基准,計算Ground Truth對其的平移縮放變化參數,以及預測窗口【可能第一次迭代就是anchor】對其的平移縮放參數,因為是以anchor窗口為基准,所以只要使這兩組參數越接近,以此構建目標函數求最小值,那預測窗口就越接近Ground Truth,達到回歸的目的;
文中提到, Fast R-CNN中基於RoI的bounding-box回歸所輸入的特征是在特征圖上對任意size的RoIs進行Pool操作提取的,所有size RoI共享回歸參數,而在Faster R-CNN中,用來bounding-box回歸所輸入的特征是在特征圖上相同的空間size【3×3】上提取的,為了解決不同尺度變化的問題,同時訓練和學習了k個不同的回歸器,依次對應為上述9種anchors,這k個回歸量並不分享權重。因此盡管特征提取上空間是固定的【3×3】,但由於anchors的設計,仍能夠預測不同size的窗口。
文中提到了三種共享特征網絡的訓練方式?
① 交替訓練
訓練RPN,得到的區域建議來訓練Fast R-CNN網絡進行微調;此時網絡用來初始化RPN網絡,迭代此過程【文中所有實驗采用】;② 近似聯合訓練
如上圖所示,合並兩個網絡進行訓練,前向計算產生的區域建議被固定以訓練Fast R-CNN;反向計算到共享卷積層時RPN網絡損失和Fast R-CNN網絡損失疊加進行優化,但此時把區域建議【Fast R-CNN輸入,需要計算梯度並更新】當成固定值看待,忽視了Fast R-CNN一個輸入:區域建議的導數,則無法更新訓練,所以稱之為近似聯合訓練。實驗發現,這種方法得到和交替訓練相近的結果,還能減少20%~25%的訓練時間,公開的python代碼中使用這種方法;③ 聯合訓練
需要RoI池化層對區域建議可微,需要RoI變形層實現,具體請參考這片paper:Instance-aware Semantic Segmentation via Multi-task Network Cascades。圖像Scale細節問題?
文中提到訓練和檢測RPN、Fast R-CNN都使用單一尺度,統一縮放圖像短邊至600像素;
在縮放的圖像上,對於ZF網絡和VGG-16網絡的最后卷積層總共的步長是16像素,因此在縮放前典型的PASCAL圖像上大約是10像素【~500×375;600/16=375/10】。網上關於Faster R-CNN中三種尺度這么解釋:
原始尺度:原始輸入的大小,不受任何限制,不影響性能;
歸一化尺度:輸入特征提取網絡的大小,在測試時設置,源碼中opts.test_scale=600。anchor在這個尺度上設定,這個參數和anchor的相對大小決定了想要檢測的目標范圍;
網絡輸入尺度:輸入特征檢測網絡的大小,在訓練時設置,源碼中為224×224。
以上6行博主並不懂,還需要仔細研究源碼。理清文中anchors的數目。
文中提到對於1000×600的一張圖像,大約有20000(~60×40×9)個anchors,忽略超出邊界的anchors剩下6000個anchors,利用非極大值抑制去掉重疊區域,剩2000個區域建議用於訓練;
測試時在2000個區域建議中選擇Top-N【文中為300】個區域建議用於Fast R-CNN檢測。
&結果怎么樣
PASCAL VOC實驗【使用ZF網絡】
屬性 數目 目標類別 20 PASCAL VOC 2007訓練集 5k PASCAL VOC 2007測試集 5k
a.第1組實驗
目的:驗證RPN方法的有效性;
做法:ZF檢測網絡訓練和測試時分別使用Selective Search、EdgeBoxes和RPN+ZF【共享】方法,Selective Search、EdgeBoxes測試時使用2000窗口建議,RPN+ZF測試時采用300窗口建議;
結果:RPN+ZF方法獲得59.9%的mAP,由於卷積層共享並且只有300個候選窗口,RPN+ZF方法檢測速度更快;b.第2組實驗
目的:驗證RPN和ZF檢測網絡共享卷積層的影響;
做法:在之前所述4步訓練算法進行到第2步后停止;
結果:未實現卷積層共享的RPN+ZF的方法獲得58.7%的mAP,這由於4步訓練算法的第3步使用了微調后檢測器特征來微調RPN網絡,使得建議窗口質量得到提高;c.第3組實驗
目的:使用不同RPN候選窗數目下,評估其對檢測網絡mAP的影響;
做法:使用Selective Search方法訓練檢測網絡ZF並固定不變【RPN與ZF沒有共享卷積層】,測試時采用不同RPN候選窗數目進行;
結果:測試時300候選窗RPN獲得56.8%的mAP,這是由於訓練和測試的區域建議方法不一致造成;使用Top-100窗口建議仍然有55.1%的mAP,說明Top-100結果比較准確;未使用非極大值抑制的6000個區域建議全部使用進行檢測獲得55.2%的mAP,說明非極大值抑制並未損壞精度,反而可能減少了誤報;d.第4組實驗
目的:驗證RPN網絡cls窗口分類層影響;
做法:使用Selective Search方法訓練檢測網絡ZF並固定不變【RPN與ZF沒有共享卷積層】,移除RPN網絡中cls窗口分類層【缺少分數就沒有了非極大值抑制和Top排名】,從未評分的窗口建議中隨機采用N個 ;
結果:N=1000時,mAP為55.8%影響不大,但N=100時mAP為44.6%,說明cls窗口分類層的評分准確度高,影響檢測結果精度;e.第5組實驗
目的:驗證RPN網絡reg窗口回歸層影響;
做法:使用Selective Search方法訓練檢測網絡ZF並固定不變【RPN與ZF沒有共享卷積層】,移除RPN網絡reg窗口回歸層【候選區域直接變成沒有回歸的anchor boxes】;
結果:選擇Top-300進行實驗,mAP掉到了52.1%,說明窗口回歸提高了區域建議的質量,雖然說anchor boxes能應對不同尺度和寬高比,但是對於精確檢測遠遠不夠;f.第6組實驗
目的:驗證優質量網絡對RPN產生區域建議的影響;
做法:使用Selective Search方法訓練檢測網絡ZF並固定不變【RPN與ZF沒有共享卷積層】,采用VGG-16網絡訓練RPN提供候選區域;
結果:與第3組實驗測試時300候選窗RPN獲得56.8%的mAP相比,采用VGG-16訓練RPN使得mAP達到59.2%,表明VGG-16+RPN提供區域建議質量更高【不像死板板的Selective Search,RPN可以從更好的網絡中獲利進行變化】,因此RPN和檢測網絡同時采用VGG-16並共享卷積層會如何呢?結果見下。RPN網絡和檢測網絡同時采用VGG-16並共享卷積層,在PASCAL VOC 2007訓練集上訓練,測試集上獲得69.9%的mAP;在聯合數據集如PASCAL VOC 2007和2012訓練集上訓練RPN網絡和檢測網絡,PASCAL VOC 2007測試集上mAP會更高。
對於檢測速度而言,采用ZF模型,可以達到17fps;采用VGG-16模型,可以達到5fps,由於卷積共享,RPN網絡僅僅花10ms計算額外的層,而且,由於僅僅選取Top-N【文中為300】進行檢測,檢測網絡中的非極大值抑制、池化、全連接以及softmax層花費時間是極短的。
召回率分析。所謂召回率即區域建議網絡找出的為真的窗口與Ground Truth的比值【IoU大於閾值即為真】,文中實驗表明Selective Search、EdgeBoxes方法從Top-2000、Top-1000到Top-300的召回率下降明顯,區域建議越少下降越明顯,而RPN網絡召回率下降很少,說明RPN網絡Top-300區域建議已經同Ground Truth相差無己,目的性更明確。
MS COCO實驗【使用VGG-16網絡】
屬性 數目 目標類別 80 Microsoft COCO訓練集 80k Microsoft COCO驗證集 40k Microsoft COCO測試集 20k
采用8-GPU並行訓練,則RPN有效mini-batch 為8張圖,Fast R-CNN有效mini-batch為16張圖;
RPN和Fast R-CNN以0.003【由0.001改為0.003,由於有效mini-batch被改變了】的學習率迭代240k次,以0.0003的學習率迭代80k次;
對於anchors,在三種尺度三種長寬比基礎上增加了64^2的尺度,這是為了處理Microsoft COCO數據集上的小目標【新數據集上不直接套用這一點值得學習】;
增加定義負樣本IoU,重疊閾值由[0.1,0.5) 到[0,0.5),這能提升COOC數據集上mAP;
使用COCO訓練集訓練,COCO測試集上獲得42.1%的mAP @0.5 和21.5%的mAP @[.5,.95]。6.與VGG-16相比,利用ResNet-101網絡,在COCO驗證集上mAP從41.5%/21.2%(@0.5/@[.5,.95])變化到48.4%/27.2%,歸功於RPN網絡可以從更好的特征提取網絡中學到更好的區域建議。
7.由於Microsoft COCO數據集種類包含PASCAL VOC數據集種類,文中在Microsoft COCO數據集上訓練,在PASCAL VOC數據集上測試,驗證大數據量下訓練是否有助於提高mAP?
采用VGG-16模型,當僅僅利用Microsoft COCO數據集訓練時,PASCAL VOC 2007測試集上mAP達到76.1%【泛化能力強,未過擬合】;當利用Microsoft COCO數據集訓練的模型初始化,PASCAL VOC 2007+2012訓練集進行微調,PASCAL VOC 2007測試集上mAP達到78.8%,此時每一個單體類別的AP較其它樣本訓練的都達到最高,而每張圖測試時間仍然約為200ms。
&還存在什么問題
采用VGG-16模型,可以達到5fps,這個速度並沒有完全達到實時性,還有繼續提升的空間,這將在YOLO模型中得以改進。