1. 程式人生 > >R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD, R-FCN系列深度學習檢測方法梳理

R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD, R-FCN系列深度學習檢測方法梳理

 注:1.本博文持續更新中,文章較長,可以收藏方便下次閱讀。2.本人原創,謝絕轉載。

1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation

技術路線:selective search + CNN + SVMs

Step1:候選框提取(selective search)

訓練:給定一張圖片,利用seletive search方法從中提取出2000個候選框。由於候選框大小不一,考慮到後續CNN要求輸入的圖片大小統一,將2000個候選框全部resize到227*227解析度(為了避免影象扭曲嚴重,中間可以採取一些技巧減少影象扭曲)。

測試:給定一張圖片,利用seletive search方法從中提取出2000個候選框。由於候選框大小不一,考慮到後續CNN要求輸入的圖片大小統一,將2000個候選框全部resize到227*227解析度(為了避免影象扭曲嚴重,中間可以採取一些技巧減少影象扭曲)。

Step2:特徵提取(CNN)

訓練:提取特徵的CNN模型需要預先訓練得到。訓練CNN模型時,對訓練資料標定要求比較寬鬆,即SS方法提取的proposal只包含部分目標區域時,我們也將該proposal標定為特定物體類別。這樣做的主要原因在於,CNN訓練需要大規模的資料,如果標定要求極其嚴格(即只有完全包含目標區域且不屬於目標的區域不能超過一個小的閾值),那麼用於CNN訓練的樣本數量會很少。因此,寬鬆標定條件下訓練得到的CNN模型只能用於特徵提取。

測試:得到統一解析度227*227的proposal後,帶入訓練得到的CNN模型,最後一個全連線層的輸出結果---4096*1維度向量即用於最終測試的特徵。

Step3:分類器(SVMs)

訓練:對於所有proposal進行嚴格的標定(可以這樣理解,當且僅當一個候選框完全包含ground truth區域且不屬於ground truth部分不超過e.g,候選框區域的5%時認為該候選框標定結果為目標,否則位背景),然後將所有proposal經過CNN處理得到的特徵和SVM新標定結果輸入到SVMs分類器進行訓練得到分類器預測模型。

測試:對於一副測試影象,提取得到的2000個proposal經過CNN特徵提取後輸入到SVM分類器預測模型中,可以給出特定類別評分結果。

結果生成:得到SVMs對於所有Proposal的評分結果,將一些分數較低的proposal去掉後,剩下的proposal中會出現候選框相交的情況。採用非極大值抑制技術,對於相交的兩個框或若干個框,找到最能代表最終檢測結果的候選框(非極大值抑制方法可以參考:http://blog.csdn.net/pb09013037/article/details/45477591)

R-CNN需要對SS提取得到的每個proposal進行一次前向CNN實現特徵提取,因此計算量很大,無法實時。此外,由於全連線層的存在,需要嚴格保證輸入的proposal最終resize到相同尺度大小,這在一定程度造成影象畸變,影響最終結果。 

2. SPP-Net : Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)

 傳統CNN和SPP-Net流程對比如下圖所示(引自http://www.image-net.org/challenges/LSVRC/2014/slides/sppnet_ilsvrc2014.pdf)

 

SPP-net具有以下特點:

1.傳統CNN網路中,卷積層對輸入影象大小不作特別要求,但全連線層要求輸入影象具有統一尺寸大小。因此,在R-CNN中,對於selective search方法提出的不同大小的proposal需要先通過Crop操作或Wrap操作將proposal區域裁剪為統一大小,然後用CNN提取proposal特徵。相比之下,SPP-net在最後一個卷積層與其後的全連線層之間添加了一個SPP (spatial pyramid pooling) layer,從而避免對propsal進行Crop或Warp操作。總而言之,SPP-layer適用於不同尺寸的輸入影象,通過SPP-layer對最後一個卷積層特徵進行pool操作併產生固定大小feature map,進而匹配後續的全連線層。

2.由於SPP-net支援不同尺寸輸入影象,因此SPP-net提取得到的影象特徵具有更好的尺度不變性,降低了訓練過程中的過擬合可能性。

3.R-CNN在訓練和測試是需要對每一個影象中每一個proposal進行一遍CNN前向特徵提取,如果是2000個propsal,需要2000次前向CNN特徵提取。但SPP-net只需要進行一次前向CNN特徵提取,即對整圖進行CNN特徵提取,得到最後一個卷積層的feature map,然後採用SPP-layer根據空間對應關係得到相應proposal的特徵。SPP-net速度可以比R-CNN速度快24~102倍,且準確率比R-CNN更高(下圖引自SPP-net原作論文,可以看到SPP-net中spp-layer前有5個卷積層,第5個卷積層的輸出特徵在位置上可以對應到原來的影象,例如第一個圖中左下角車輪在其conv5的圖中顯示為“^”的啟用區域,因此基於此特性,SPP-net只需要對整圖進行一遍前向卷積,在得到的conv5特徵後,然後用SPP-net分別提取相應proposal的特徵)。

SPP-Layer原理:

在RNN中,conv5後是pool5;在SPP-net中,用SPP-layer替代原來的pool5,其目標是為了使不同大小輸入影象在經過SPP-Layer後得到的特徵向量長度相同。其原理如圖如下所示

 

SPP與金字塔pooling類似,即我們先確定最終pooling得到的featuremap大小,例如4*4 bins,3*3 bins,2*2 bins,1*1 bins。那麼我們已知conv5輸出的featuremap大小(例如,256個13*13的feature map).那麼,對於一個13*13的feature map,我們可以通過spatial pyramid pooling (SPP)的方式得到輸出結果:當window=ceil(13/4)=4, stride=floor(13/4)=3,可以得到的4*4 bins;當window=ceil(13/3)=5, stride=floor(13/3)=4,可以得到的3*3 bins;當window=ceil(13/2)=7, stride=floor(13/2)=6,可以得到的2*2 bins;當window=ceil(13/1)=13, stride=floor(13/1)=13,可以得到的1*1 bins.因此SPP-layer後的輸出是256*(4*4+3*3+2*2+1*1)=256*30長度的向量。不難看出,SPP的關鍵實現在於通過conv5輸出的feature map寬高和SPP目標輸出bin的寬高計算spatial pyramid pooling中不同解析度Bins對應的pooling window和pool stride尺寸。

 原作者在訓練時採用兩種不同的方式,即1.採用相同尺寸的影象訓練SPP-net 2.採用不同尺寸的影象訓練SPP-net。實驗結果表明:使用不同尺寸輸入影象訓練得到的SPP-Net效果更好。

SPP-Net +SVM訓練:

 採用selective search可以提取到一系列proposals,由於已經訓練完成SPP-Net,那麼我們先將整圖代入到SPP-Net中,得到的conv5的輸出。接下來,區別於R-CNN,新方法不需要對不同尺寸的proposals進行Crop或Wrap,直接根據proposal在圖中的相對位置關係計算得到proposal在整圖conv5輸出中的對映輸出結果。這樣,對於2000個proposal,我們事實上從conv1--->conv5只做了一遍前向,然後進行2000次conv5 featuremap的集合對映,再通過SPP-Layer,就可以得到的2000組長度相同的SPP-Layer輸出向量,進而通過全連線層生成最終2000個proposal的卷積神經網路特徵。接下來就和R-CNN類似,訓練SVMs時對於所有proposal進行嚴格的標定(可以這樣理解,當且僅當一個候選框完全包含ground truth區域且不屬於ground truth部分不超過e.g,候選框區域的5%時認為該候選框標定結果為目標,否則位背景),然後將所有proposal經過CNN處理得到的特徵和SVM新標定結果輸入到SVMs分類器進行訓練得到分類器預測模型。

當然,如果覺得SVM訓練很麻煩,可以直接在SPP-Net後再加一個softmax層,用好的標定結果去訓練最後的softmax層引數。

3. Fast-R-CNN

基於R-CNN和SPP-Net思想,RBG提出了Fast-R-CNN演算法。如果選用VGG16網路進行特徵提取,在訓練階段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分別提升9倍和3倍;在測試階段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分別提升213倍和10倍。

R-CNN和SPP-Net缺點:

1.R-CNN和SPP-Net的訓練過程類似,分多個階段進行,實現過程較複雜。這兩種方法首先選用Selective Search方法提取proposals,然後用CNN實現特徵提取,最後基於SVMs演算法訓練分類器,在此基礎上還可以進一步學習檢測目標的boulding box。

2.R-CNN和SPP-Net的時間成本和空間代價較高。SPP-Net在特徵提取階段只需要對整圖做一遍前向CNN計算,然後通過空間對映方式計算得到每一個proposal相應的CNN特徵;區別於前者,RCNN在特徵提取階段對每一個proposal均需要做一遍前向CNN計算,考慮到proposal數量較多(~2000個),因此RCNN特徵提取的時間成本很高。R-CNN和SPP-Net用於訓練SVMs分類器的特徵需要提前儲存在磁碟,考慮到2000個proposal的CNN特徵總量還是比較大,因此造成空間代價較高。

3.R-CNN檢測速度很慢。RCNN在特徵提取階段對每一個proposal均需要做一遍前向CNN計算,如果用VGG進行特徵提取,處理一幅影象的所有proposal需要47s。

4.特徵提取CNN的訓練和SVMs分類器的訓練在時間上是先後順序,兩者的訓練方式獨立,因此SVMs的訓練Loss無法更新SPP-Layer之前的卷積層引數,因此即使採用更深的CNN網路進行特徵提取,也無法保證SVMs分類器的準確率一定能夠提升。

 Fast-R-CNN亮點:

1.Fast-R-CNN檢測效果優於R-CNN和SPP-Net

2.訓練方式簡單,基於多工Loss,不需要SVM訓練分類器。

3.Fast-R-CNN可以更新所有層的網路引數(採用ROI Layer將不再需要使用SVM分類器,從而可以實現整個網路端到端訓練)。

4.不需要將特徵快取到磁碟。

Fast-R-CNN架構:

Fast-R-CNN的架構如下圖所示(https://github.com/rbgirshick/fast-rcnn/blob/master/models/VGG16/train.prototxt,可以參考此連結理解網路模型):輸入一幅影象和Selective Search方法生成的一系列Proposals,通過一系列卷積層和Pooling層生成feature map,然後用RoI(region of ineterst)層處理最後一個卷積層得到的feature map為每一個proposal生成一個定長的特徵向量roi_pool5。RoI層的輸出roi_pool5接著輸入到全連線層產生最終用於多工學習的特徵並用於計算多工Loss。全連線輸出包括兩個分支:1.SoftMax Loss:計算K+1類的分類Loss函式,其中K表示K個目標類別,1表示背景;2.Regression Loss:即K+1的分類結果相應的Proposal的Bounding Box四個角點座標值。最終將所有結果通過非極大抑制處理產生最終的目標檢測和識別結果。

 

3.1 RoI Pooling Layer

事實上,RoI Pooling Layer是SPP-Layer的簡化形式。SPP-Layer是空間金字塔Pooling層,包括不同的尺度;RoI Layer只包含一種尺度,如論文中所述7*7。這樣對於RoI Layer的輸入(r,c,h,w),RoI Layer首先產生7*7個r*c*(h/7)*(w/7)的Block(塊),然後用Max-Pool方式求出每一個Block的最大值,這樣RoI Layer的輸出是r*c*7*7。

3.2 預訓練網路初始化

RBG採用前輩們訓練ImageNet時得到的網路模型(例如VGG16模型)初始化Fast-R-CNN模型中RoI層之前的所有層,我們可以把網路結構總結如下:13個卷積層+4個Pooling層+RoI層+2個FC層+兩個平級層(即SoftmaxLoss層和SmoothL1Loss層)。其中,VGG16的第5個Pool層倍RoI層替換掉。

3.3 Finetuning for detection

3.3.1 Fast-R-CNN在網路訓練階段採用了一些trick,每個minibatch由N個圖片(N=2)中的R個Proposal(R=128)組成。這種方式比從128張不同圖片中提取1個Proposal的方式塊64倍。當然,這種方式在一定程度會造成收斂速度變慢。另外,Fast-R-CNN無需SVM分類器,而是通過Softmax Classifer和Bounding-Box Regressors聯合訓練的方式更新所有引數。注意:從2張圖中選取128個proposals時,需要保證至少25%的proposals與groundtruth的IoU超過0.5,剩下的全部作為背景類。不需要其它任何資料擴增操作。

3.3.2 多工Loss:Fast R-CNN網路有兩個同級別子Layer,分別用於分類和迴歸。分類選用SoftmaxLoss,迴歸使用SmoothL1Loss.兩者的權重比例為1:1

3.3.3 SGD hyer-parameters:用於softmax分類任務和bounding-box迴歸的fc層引數用標準差介於0.01~0.001之間的高斯分佈初始化。

3.4 Truncated SVD快速檢測

在檢測段,RBG使用truncated SVD優化較大的FC層,這樣RoI數目較大時檢測端速度會得到的加速。

Fast-R-CNN實驗結論:

1.多工Loss學習方式可以提高演算法準確率

2.多尺度影象訓練Fast-R-CNN與單尺度影象訓練相比只能提升微小的mAP,但是時間成本卻增加了很多。因此,綜合考慮訓練時間和mAP,作者建議直接用一種尺度的影象訓練Fast-R-CNN.

3.基本上沒人不會贊成:訓練影象越多,模型準確率也會越高。

4.RBG的結果表明SoftmaxLoss的方式比SVMs分類器的結果略好一點點,雖然這不能絕對性說明自己的SoftmaxLoss好到哪兒去,但是至少大家不用再那麼麻煩的去分步訓練一個檢測和識別網路了。

5.不是說Proposal提取的越多效果會越好,提的太多反而會導致mAP下降。

4. Faster-R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

在之前介紹的Fast-R-CNN中,第一步需要先使用Selective Search方法提取影象中的proposals。基於CPU實現的Selective Search提取一幅影象的所有Proposals需要約2s的時間。在不計入proposal提取情況下,Fast-R-CNN基本可以實時進行目標檢測。但是,如果從端到端的角度考慮,顯然proposal提取成為影響端到端演算法效能的瓶頸。目前最新的EdgeBoxes演算法雖然在一定程度提高了候選框提取的準確率和效率,但是處理一幅影象仍然需要0.2s。因此,Ren Shaoqing提出新的Faster-R-CNN演算法,該演算法引入了RPN網路(Region Proposal Network)提取proposals。RPN網路是一個全卷積神經網路,通過共享卷積層特徵可以實現proposal的提取,RPN提取一幅像的proposal只需要10ms.

Faster-R-CNN演算法由兩大模組組成:1.PRN候選框提取模組 2.Fast R-CNN檢測模組。其中,RPN是全卷積神經網路,用於提取候選框;Fast R-CNN基於RPN提取的proposal檢測並識別proposal中的目標。

4.1 Region Proposal Network (RPN)

RPN網路的輸入可以是任意大小(但還是有最小解析度要求的,例如VGG是228*228)的圖片。如果用VGG16進行特徵提取,那麼RPN網路的組成形式可以表示為VGG16+RPN。

VGG16:參考https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt,可以看出VGG16中用於特徵提取的部分是13個卷積層(conv1_1---->conv5.3),不包括pool5及pool5後的網路層次結構。

RPN:RPN是作者重點介紹的一種網路,如下圖所示。RPN的實現方式:在conv5-3的卷積feature map上用一個n*n的滑窗(論文中作者選用了n=3,即3*3的滑窗)生成一個長度為256(對應於ZF網路)或512(對應於VGG網路)維長度的全連線特徵。然後在這個256維或512維的特徵後產生兩個分支的全連線層:1.reg-layer,用於預測proposal的中心錨點對應的proposal的座標x,y和寬高w,h;2.cls-layer,用於判定該proposal是前景還是背景。sliding window的處理方式保證reg-layer和cls-layer關聯了conv5-3的全部特徵空間。事實上,作者用全連線層實現方式介紹RPN層實現容易幫助我們理解這一過程,但在實現時作者選用了卷積層實現全連線層的功能。個人理解:全連線層本來就是特殊的卷積層,如果產生256或512維的fc特徵,事實上可以用Num_out=256或512, kernel_size=3*3, stride=1的卷積層實現conv5-3到第一個全連線特徵的對映。然後再用兩個Num_out分別為2*9=18和4*9=36,kernel_size=1*1,stride=1的卷積層實現上一層特徵到兩個分支cls層和reg層的特徵對映。注意:這裡2*9中的2指cls層的分類結果包括前後背景兩類,4*9的4表示一個Proposal的中心點座標x,y和寬高w,h四個引數。採用卷積的方式實現全連線處理並不會減少引數的數量,但是使得輸入影象的尺寸可以更加靈活。在RPN網路中,我們需要重點理解其中的anchors概念,Loss fucntions計算方式和RPN層訓練資料生成的具體細節。

Anchors:字面上可以理解為錨點,位於之前提到的n*n的sliding window的中心處。對於一個sliding window,我們可以同時預測多個proposal,假定有k個。k個proposal即k個reference boxes,每一個reference box又可以用一個scale,一個aspect_ratio和sliding window中的錨點唯一確定。所以,我們在後面說一個anchor,你就理解成一個anchor box 或一個reference box.作者在論文中定義k=9,即3種scales和3種aspect_ratio確定出當前sliding window位置處對應的9個reference boxes, 4*k個reg-layer的輸出和2*k個cls-layer的score輸出。對於一幅W*H的feature map,對應W*H*k個錨點。所有的錨點都具有尺度不變性。

Loss functions:在計算Loss值之前,作者設定了anchors的標定方法。正樣本標定規則:1.如果Anchor對應的reference box與ground truth的IoU值最大,標記為正樣本;2.如果Anchor對應的reference box與ground truth的IoU>0.7,標記為正樣本。事實上,採用第2個規則基本上可以找到足夠的正樣本,但是對於一些極端情況,例如所有的Anchor對應的reference box與groud truth的IoU不大於0.7,可以採用第一種規則生成。負樣本標定規則:如果Anchor對應的reference box與ground truth的IoU<0.3,標記為負樣本。剩下的既不是正樣本也不是負樣本,不用於最終訓練。訓練RPN的Loss是有classification loss (即softmax loss)和regression loss (即L1 loss)按一定比重組成的。計算softmax loss需要的是anchors對應的groundtruth標定結果和預測結果,計算regression loss需要三組資訊:1.預測框,即RPN網路預測出的proposal的中心位置座標x,y和寬高w,h;2.錨點reference box:之前的9個錨點對應9個不同scale和aspect_ratio的reference boxes,每一個reference boxes都有一箇中心點位置座標x_a,y_a和寬高w_a,h_a。3.ground truth:標定的框也對應一箇中心點位置座標x*,y*和寬高w*,h*。因此計算regression loss和總Loss方式如下:

 

RPN訓練設定:在訓練RPN時,一個Mini-batch是由一幅影象中任意選取的256個proposal組成的,其中正負樣本的比例為1:1。如果正樣本不足128,則多用一些負樣本以滿足有256個Proposal可以用於訓練,反之亦然。訓練RPN時,與VGG共有的層引數可以直接拷貝經ImageNet訓練得到的模型中的引數;剩下沒有的層引數用標準差=0.01的高斯分佈初始化。

4.2 RPN與Faster-R-CNN特徵共享

RPN在提取得到proposals後,作者選擇使用Fast-R-CNN實現最終目標的檢測和識別。RPN和Fast-R-CNN共用了13個VGG的卷積層,顯然將這兩個網路完全孤立訓練不是明智的選擇,作者採用交替訓練階段卷積層特徵共享:

交替訓練(Alternating training): Step1:訓練RPN;Step2:用RPN提取得到的proposal訓練Fast R-CNN;Step3:用Faster R-CNN初始化RPN網路中共用的卷積層。迭代執行Step1,2,3,直到訓練結束為止。論文中採用的就是這種訓練方式,注意:第一次迭代時,用ImageNet得到的模型初始化RPN和Fast-R-CNN中卷積層的引數;從第二次迭代開始,訓練RPN時,用Fast-R-CNN的共享卷積層引數初始化RPN中的共享卷積層引數,然後只Fine-tune不共享的卷積層和其他層的相應引數。訓練Fast-RCNN時,保持其與RPN共享的卷積層引數不變,只Fine-tune不共享的層對應的引數。這樣就可以實現兩個網路卷積層特徵共享訓練。相應的網路模型請參考https://github.com/rbgirshick/py-faster-rcnn/tree/master/models/pascal_voc/VGG16/faster_rcnn_alt_opt

4.3 深度挖掘

1.由於Selective Search提取得到的Proposal尺度不一,因此Fast-RCNN或SPP-Net生成的RoI也是尺度不一,最後分別用RoI Pooling Layer或SPP-Layer處理得到固定尺寸金字塔特徵,在這一過程中,迴歸最終proposal的座標網路的權重事實上共享了整個FeatureMap,因此其訓練的網路精度也會更高。但是,RPN方式提取的ROI由k個錨點生成,具有k種不同解析度,因此在訓練過程中學習到了k種獨立的迴歸方式。這種方式並沒有共享整個FeatureMap,但其訓練得到的網路精度也很高。這,我竟然無言以對。有什麼問題,請找Anchors同學。

2.採用不同解析度影象在一定程度可以提高準確率,但是也會導致訓練速度下降。採用VGG16訓練RPN雖然使得第13個卷積層特徵尺寸至少縮小到原圖尺寸的1/16(事實上,考慮到kernel_size作用,會更小一些),然並卵,最終的檢測和識別效果仍然好到令我無言以對。

3.三種scale(128*128,256*256,512*512),三種寬高比(1:2,1:1,2:1),雖然scale區間很大,總感覺這樣會很奇怪,但最終結果依然表現的很出色。

4.訓練時(例如600*1000的輸入影象),如果reference box (即anchor box)的邊界超過了影象邊界,這樣的anchors對訓練Loss不產生影響,即忽略掉這樣的Loss.一幅600*1000的圖經過VGG16大約為40*60,那麼anchors的數量大約為40*60*9,約等於20000個anchor boxes.去除掉與影象邊界相交的anchor boxes後,剩下約6000個anchor boxes,這麼多數量的anchor boxes之間會有很多重疊區域,因此使用非極值抑制方法將IoU>0.7的區域全部合併,剩下2000個anchor boxes(同理,在最終檢測端,可以設定規則將概率大於某閾值P且IoU大於某閾值T的預測框(注意,和前面不同,不是anchor boxes)採用非極大抑制方法合併)。在每一個epoch訓練過程中,隨機從一幅圖最終剩餘的這些anchors取樣256個anchor box作為一個Mini-batch訓練RPN網路。

4.3 實

1.PASCAL VOC 2007:使用ZF-Net訓練RPN和Fast-R-CNN,那麼SelectiveSearch+Fast-R-CNN, EdgeBox+Fast-R-CNN, RPN+Fast-R-CNN的準確率分別為:58.7%,58.6%,59.9%. SeletiveSeach和EdgeBox方法提取2000個proposal,RPN最多提取300個proposal,因此卷積特徵共享方式提取特徵的RPN顯然在效率是更具有優勢。

2.採用VGG以特徵不共享方式和特徵共享方式訓練RPN+Fast-R-CNN,可以分別得到68.5%和69.9%的準確率(VOC2007)。此外,採用VGG訓練RCNN時,需要花320ms提取2000個proposal,加入SVD優化後需要223ms,而Faster-RCNN整個前向過程(包括RPN+Fast-R-CNN)總共只要198ms.

3.Anchors的scales和aspect_ratio的數量雖然不會對結果產生明顯影響,但是為了演算法穩定性,建議兩個引數都設定為合適的數值。

4.當Selective Search和EdgeBox提取的proposal數目由2000減少到300時,Faste-R-CNN的Recall vs. IoU overlap ratio圖中recall值會明顯下降;但RPN提取的proposal數目由2000減少到300時,Recall vs. IoU overlap ratio圖中recall值會比較穩定。

4.4 總結

特徵共享方式訓練RPN+Fast-R-CNN能夠實現極佳的檢測效果,特徵共享訓練實現了買一送一,RPN在提取Proposal時不僅沒有時間成本,還提高了proposal質量。因此Faster-R-CNN中交替訓練RPN+Fast-R-CNN方式比原來的SlectiveSeach+Fast-R-CNN更上一層樓。

5.YOLO: You Only Look Once:Unified, Real-Time Object Detection

YOLO是一個可以一次性預測多個Box位置和類別的卷積神經網路,能夠實現端到端的目標檢測和識別,其最大的優勢就是速度快。事實上,目標檢測的本質就是迴歸,因此一個實現迴歸功能的CNN並不需要複雜的設計過程。YOLO沒有選擇滑窗或提取proposal的方式訓練網路,而是直接選用整圖訓練模型。這樣做的好處在於可以更好的區分目標和背景區域,相比之下,採用proposal訓練方式的Fast-R-CNN常常把背景區域誤檢為特定目標。當然,YOLO在提升檢測速度的同時犧牲了一些精度。下圖所示是YOLO檢測系統流程:1.將影象Resize到448*448;2.執行CNN;3.非極大抑制優化檢測結果。有興趣的童鞋可以按照http://pjreddie.com/darknet/install/的說明安裝測試一下YOLO的scoring流程,非常容易上手。接下來將重點介紹YOLO的原理。

 5.1 一體化檢測方案

YOLO的設計理念遵循端到端訓練和實時檢測。YOLO將輸入影象劃分為S*S個網路,如果一個物體的中心落在某網格(cell)內,則相應網格負責檢測該物體。在訓練和測試時,每個網路預測B個bounding boxes,每個bounding box對應5個預測引數,即bounding box的中心點座標(x,y),寬高(w,h),和置信度評分。這裡的置信度評分(Pr(Object)*IOU(pred|truth))綜合反映基於當前模型bounding box記憶體在目標的可能性Pr(Object)和bounding box預測目標位置的準確性IOU(pred|truth)。如果bouding box內不存在物體,則Pr(Object)=0。如果存在物體,則根據預測的bounding box和真實的bounding box計算IOU,同時會預測存在物體的情況下該物體屬於某一類的後驗概率Pr(Class_i|Object)。假定一共有C類物體,那麼每一個網格只預測一次C類物體的條件類概率Pr(Class_i|Object), i=1,2,...,C;每一個網格預測B個bounding box的位置。即這B個bounding box共享一套條件類概率Pr(Class_i|Object), i=1,2,...,C。基於計算得到的Pr(Class_i|Object),在測試時可以計算某個bounding box類相關置信度:Pr(Class_i|Object)*Pr(Object)*IOU(pred|truth)=Pr(Class_i)*IOU(pred|truth)。如果將輸入影象劃分為7*7網格(S=7),每個網格預測2個bounding box (B=2),有20類待檢測的目標(C=20),則相當於最終預測一個長度為S*S*(B*5+C)=7*7*30的向量,從而完成檢測+識別任務,整個流程可以通過下圖理解。

 5.1.1 網路設計

YOLO網路設計遵循了GoogleNet的思想,但與之有所區別。YOLO使用了24個級聯的卷積(conv)層和2個全連線(fc)層,其中conv層包括3*3和1*1兩種Kernel,最後一個fc層即YOLO網路的輸出,長度為S*S*(B*5+C)=7*7*30.此外,作者還設計了一個簡化版的YOLO-small網路,包括9個級聯的conv層和2個fc層,由於conv層的數量少了很多,因此YOLO-small速度比YOLO快很多。如下圖所示我們給出了YOLO網路的架構。

5.1.2 訓練

作者訓練YOLO網路是分步驟進行的:首先,作者從上圖網路中取出前20個conv層,然後自己添加了一個average pooling層和一個fc層,用1000類的ImageNet資料與訓練。在ImageNet2012上用224*224d的影象訓練後得到的top5準確率是88%。然後,作者在20個預訓練好的conv層後添加了4個新的conv層和2個fc層,並採用隨即引數初始化這些新新增的層,在fine-tune新層時,作者選用448*448影象訓練。最後一個fc層可以預測物體屬於不同類的概率和bounding box中心點座標x,y和寬高w,h。Boundingbox的寬高是相對於影象寬高歸一化後得到的,Bounding box的中心位置座標是相對於某一個網格的位置座標進行過歸一化,因此x,y,w,h均介於0到1之間。

在設計Loss函式時,有兩個主要的問題:1.對於最後一層長度為7*7*30長度預測結果,計算預測loss通常會選用平方和誤差。然而這種Loss函式的位置誤差和分類誤差是1:1的關係。2.整個圖有7*7個網格,大多數網格實際不包含物體(當物體的中心位於網格內才算包含物體),如果只計算Pr(Class_i),很多網格的分類概率為0,網格loss呈現出稀疏矩陣的特性,使得Loss收斂效果變差,模型不穩定。為了解決上述問題,作者採用了一系列方案:

1.增加bounding box座標預測的loss權重,降低bounding box分類的loss權重。座標預測和分類預測的權重分別是λcoord=5,λnoobj=0.5.

2.平方和誤差對於大和小的bounding box的權重是相同的,作者為了降低不同大小bounding box寬高預測的方差,採用了平方根形式計算寬高預測loss,即sqrt(w)和sqrt(h)。

訓練Loss組成形式較為複雜,這裡不作列舉,如有興趣可以參考作者原文慢慢理解體會。

5.1.3 測試

作者選用PASAL VOC影象測試訓練得到的YOLO網路,每幅圖會預測得到98個(7*7*2)個bouding box及相應的類概率。通常一個cell可以直接預測出一個物體對應的bounding box,但是對於某些尺寸較大或靠近影象邊界的物體,需要多個網格預測的結果通過非極大抑制處理生成。雖然YOLO對於非極大抑制的依賴不及R-CNN和DPM,但非極大抑制確實可以將mAP提高2到3個點。

 5.2 方法對比

作者將YOLO目標檢測與識別方法與其他幾種經典方案進行比較可知:

DPM(Deformable parts models): DPM是一種基於滑窗方式的目標檢測方法,基本流程包括幾個獨立的環節:特徵提取,區域劃分,基於高分值區域預測bounding box。YOLO採用端到端的訓練方式,將特徵提取、候選框預測,非極大抑制及目標識別連線在一起,實現了更快更準的檢測模型。

R-CNN:R-CNN方案分需要先用SeletiveSearch方法提取proposal,然後用CNN進行特徵提取,最後用SVM訓練分類器。如此方案,誠繁瑣也!YOLO精髓思想與其類似,但是通過共享卷積特徵的方式提取proposal和目標識別。另外,YOLO用網格對proposal進行空間約束,避免在一些區域重複提取Proposal,相較於SeletiveSearch提取2000個proposal進行R-CNN訓練,YOLO只需要提取98個proposal,這樣訓練和測試速度怎能不快?

Fast-R-CNN、Faster-R-CNN、Fast-DPM: Fast-R-CNN和Faster-R-CNN分別替換了SVMs訓練和SelectiveSeach提取proposal的方式,在一定程度上加速了訓練和測試速度,但其速度依然無法和YOLO相比。同理,將DPM優化在GPU上實現也無出YOLO之右。

5.3 實驗

5.3.1 實時檢測識別系統對比

5.3.2 VOC2007準確率比較

5.3.3 Fast-R-CNN和YOLO錯誤分析

如圖所示,不同區域分別表示不同的指標:

Correct:正確檢測和識別的比例,即分類正確且IOU>0.5

Localization:分類正確,但0.1<IOU<0.5

Similar:類別相似,IOU>0.1

Other:分類錯誤,IOU>0.1

Background: 對於任何目標IOU<0.1

可以看出,YOLO在定位目標位置時準確度不及Fast-R-CNN。YOLO的error中,目標定位錯誤佔據的比例最大,比Fast-R-CNN高出了10個點。但是,YOLO在定位識別背景時準確率更高,可以看出Fast-R-CNN假陽性很高(Background=13.6%,即認為某個框是目標,但是實際裡面不含任何物體)。

5.3.4 VOC2012準確率比較

由於YOLO在目標檢測和識別是處理背景部分優勢更明顯,因此作者設計了Fast-R-CNN+YOLO檢測識別模式,即先用R-CNN提取得到一組bounding box,然後用YOLO處理影象也得到一組bounding box。對比這兩組bounding box是否基本一致,如果一致就用YOLO計算得到的概率對目標分類,最終的bouding box的區域選取二者的相交區域。Fast-R-CNN的最高準確率可以達到71.8%,採用Fast-R-CNN+YOLO可以將準確率提升至75.0%。這種準確率的提升是基於YOLO在測試端出錯的情況不同於Fast-R-CNN。雖然Fast-R-CNN_YOLO提升了準確率,但是相應的檢測識別速度大大降低,因此導致其無法實時檢測。

使用VOC2012測試不同演算法的mean Average Precision,YOLO的mAP=57.9%,該數值與基於VGG16的RCNN檢測演算法準確率相當。對於不同大小影象的測試效果進行研究,作者發現:YOLO在檢測小目標時準確率比R-CNN低大約8~10%,在檢測大目標是準確率高於R-CNN。採用Fast-R-CNN+YOLO的方式準確率最高,比Fast-R-CNN的準確率高了2.3%。

5.4 總結

YOLO是一種支援端到端訓練和測試的卷積神經網路,在保證一定準確率的前提下能影象中多目標的檢測與識別。

6.SSD:Single Shot MultiBox Detector

7.R-FCN: Object Detection via Region-based Fully Convolutional Networks

R-FCN是由代季明等提出的end to end檢測網路,據論文所述R-FCN使用ResNet101作為backbone,在PASCAL VOC2007資料集上取得了理想的效果(mAP=83.6%,相比之下ResNet101 + Faster R-CNN: mAP = 85.6%,原始版本Faster R-CNN:mAP = 76.4%),且在inference時具有極佳的效率(ResNet101+R-FCN: 0.17s;ResNet101 + Faster R-CNN:3.36s; Faster RCNN:0.42s)。關鍵原因在於R-FCN使用了基於全圖-全卷積-可共享的postion-sensitive score maps 來處理RPN的對映和ROI的提取,避免Faster R-CNN對每一個proposal執行ROI pooling時在fc層進行權重計算消耗的時間。R-FCN的網路結構和實現思想非常有趣,其中全卷積的postion-sensitive score maps實現也不乏計算優化思想在其中。

R-FCN整體架構圖:全卷積實現

Fast-R-CNN中的ROI pooling:可以看出ROI Pooling後有一些fc操作,推及至Faster R-CNN,每一個proposal都需要執行一遍ROI pooling + fc操作,耗時自然也會超過ROI後不帶權重學習的R-FCN

相關推薦

R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD, R-FCN系列深度學習檢測方法梳理

 注:1.本博文持續更新中,文章較長,可以收藏方便下次閱讀。2.本人原創,謝絕轉載。 1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation 技術路線:selective searc

R-CNN,SPP-NET, Fast-R-CNN,Faster-R-CNN, YOLO, SSD系列深度學習檢測方法梳理

1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation 技術路線:selective search + CNN + SVMs

區域卷積神經網路(R-CNN,SPP-Net,Fast R-CNN,Faster R-CNN)

1 模型進化史 檢測框架可分為兩類: 兩級式檢測框架,包含一個用於區域提議的預處理步驟,使得整體流程是兩級式的,如R-CNN系列 單級式檢測框架,即無區域提議的框架,這是一種單獨提出的方法,不會將檢測提議分開,使得整個流程是單級式的,如YOLO系列

簡要介紹一下目標檢測的網路,r-cnn, spp-net, fast-rcnn, faster-rcnn

簡要介紹一下目標檢測的網路 (1)R-CNN的原理:先用框把物體找出來,然後將找出來的框放入CNN中進行分類,這就是RCNN的簡單原理。(2)SPP-net:直接輸入整張圖片,所有區域共享卷積計算。解決了R-CNN中每張圖片都要提取的區域(selective search演算

目標檢測學習總結之RCNN、SPP-netFast RCNN、Faster RCNN、YOLOSSD的區別

在計算機視覺領域,“目標檢測”主要解決兩個問題:影象上多個目標物在哪裡(位置),是什麼(類別)。 圍繞這個問題,人們一般把其發展歷程分為3個階段: 1. 傳統的目標檢測方法 2. 以R-CNN為代表的結合region proposal和CNN分類的目標檢測框架(R-CNN,

目標檢測演算法的演進(two-stage檢測演算法):R-CNNSPP-NetFast R-CNNFaster R-CNN、Mask R-CNN

什麼是目標檢測(object detection): 目標檢測(object detection),就是在給定的一張圖片中精確找到物體所在的位置,並標註出物體的類別。所以,目標檢測要解決的問題就是物體在哪裡以及是什麼的整個流程問題。 但是,在實際照片中,物體的尺寸變化範圍很大,擺放物體的

目標檢測模型以及一些網路R-CNNSPP-NETFast R-CNNFaster R-CNN

計算機視覺問題 semantic segmentation(no object,just pixels) classification+localization single object(異常檢測) objective detection 2D&3D

理解R-CNNSPP-NETFast R-CNNFaster R-CNN、FPN博文整理

1.總體https://www.cnblogs.com/skyfsm/p/6806246.html 2.R-CNN,SPP-NET對比https://blog.csdn.net/v1_vivian/article/details/73275259 3.Fast R-CNN http

一文讀懂目標檢測 R-CNN Fast R-CNN Faster R-CNN YOLO SSD

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

基於深度學習的目標檢測技術演進:R-CNNFast R-CNNFaster R-CNN

object detection我的理解,就是在給定的圖片中精確找到物體所在位置,並標註出物體的類別。object detection要解決的問題就是物體在哪裡,是什麼這整個流程的問題。然而,這個問題可不是那麼容易解決的,物體的尺寸變化範圍很大,擺放物體的角度,姿態不定,而且可以出現在圖片的任何地方,更何況物

【目標檢測】:SPP-Net深入理解(從R-CNNSPP-Net

一. 導論 SPP-Net是何凱明在基於R-CNN的基礎上提出來的目標檢測模型,使用SPP-Net可以大幅度提升目標檢測的速度,檢測同樣一張圖片當中的所有目標,SPP-Net所花費的時間僅僅是RCNN的百分之一,而且檢測的準確率甚至會更高。那麼SPP-Net是怎麼設計的呢?我們要想理解SPP-Net,先來回顧

Faster R-CNN 目標檢測演算法詳細總結分析(two-stage)(深度學習)(NIPS 2015)

論文名稱:《 Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 》 論文下載:https://papers.nips.cc/paper/5638-faster-r-cnn-t

Fast R-CNN 目標檢測演算法詳細總結分析(two-stage)(深度學習)(ICCV 2015)

論文名稱:《 Fast R-CNN 》 論文下載:https://arxiv.org/pdf/1504.08083.pdf 論文程式碼:https://github.com/rbgirshick/fast-rcnn 一、 網路結構:

[深度學習]Object detection物體檢測Faster R-CNN(5)

目錄 1.綜述 2.Region Proposal Networks (RPN) Anchor(錨) loss function Training RPNs 3.Sharing Features for RPN and Fast R-CNN  1.交替訓練&nb

[深度學習]Object detection物體檢測Fast R-CNN(4)

目錄 1.introduction 2.The RoI pooling layer 3.Initializing from pre-trained networks 4.Fine-tuning for detection 5.Multi-task loss 6.Truncat

深度學習論文翻譯解析(四):Faster R-CNN: Down the rabbit hole of modern object detection

論文標題:Faster R-CNN: Down the rabbit hole of modern object detection 論文作者:Zhi Tian , Weilin Huang, Tong He , Pan He , and Yu Qiao 論文地址:https://tryolab

深度學習目標檢測模型全面綜述:Faster R-CNNR-FCNSSD

選自medium 機器之心編輯部 Faster R-CNN、R-FCN 和 SSD 是三種目前最優且應用最廣泛的目標檢測模型,其他流行的模型通常與這三者類似。本文介紹了深度學習目標檢測的三種常見模型:Faster R-CNN、R-FCN 和 SSD。 圖為機

深度學習 + 論文詳解: Fast R-CNN 原理與優勢

論文連結p.s. 鑑於斯坦福大學公開課裡面模糊的 R-CNN 描述,這邊決定精讀對應的論文並把心得和摘要記錄於此。前言在機器視覺領域的物體識別分支中,有兩個主要的兩大難題需要解決:目標圖片裡面含了幾種“物體”,幾個“物體”?該些物體分別坐落於圖片的哪個位置?而 R-CNN 的

深度學習目標檢測(object detection)系列(四) Faster R-CNN

Faster R-CNN簡介 RBG團隊在2015年,與Fast R-CNN同年推出了Faster R-CNN,我們先從頭回顧下Object Detection任務中各個網路的發展,首先R-CNN用分類+bounding box解決了目標檢測問題,SP

[計算機視覺][神經網路與深度學習]Faster R-CNN配置及其訓練教程

Faster R-CNN教程 最後更新日期:2016年4月29日 本教程主要基於python版本的faster R-CNN,因為python layer的使用,這個版本會比matlab的版本速度慢10%,但是準確率應該是差不多的。 目前已經實現的有兩種方式: Alternative trainingAp