深度學習:Image Object Detection方法
詳述:
1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation
論文:https://arxiv.org/abs/1311.2524
程式碼:https://github.com/rbgirshick/rcnn
技術路線:selective search + CNN + SVMs
Step1:候選框提取(selectivesearch)
訓練:給定一張圖片,利用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)
論文:https://arxiv.org/abs/1406.4729
程式碼:https://github.com/ShaoqingRen/SPP_net
技術路線:selective search + spp-net + SVMs
傳統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
論文:http://arxiv.org/abs/1504.08083
程式碼:https://github.com/rbgirshick/fast-rcnn
技術路線:selective search +vgg16 + ROI pooling+ 2 loss
基於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
論文:http://arxiv.org/abs/1506.01497
程式碼:https://github.com/ShaoqingRen/faster_rcnn【matlab】
https://github.com/rbgirshick/py-faster-rcnn【python】
技術路線:vgg16卷積層+ RPN+ Fast-r-cnn
在之前介紹的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的Recallvs. IoU overlap ratio圖中recall值會明顯下降;但RPN提取的proposal數目由2000減少到300時,Recallvs. 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
論文:https://arxiv.org/abs/1506.02640
程式碼:https://github.com/frischzenger/yolo-windows 【darknet】
https://github.com/xingwangsfu/caffe-yolo
技術路線:端到端的迴歸和分類的CNN
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)。
注意:類別是針對每個網格的,置信度評分是針對每個bounding box的。
如果將輸入影象劃分為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 實驗
5.2.1 實時檢測識別系統對比
5.2.2 VOC2007準確率比較
5.2.3 YOLO的缺點:
YOLO對相互靠的很近的物體,還有很小的群體 檢測效果不好,這是因為一個網格中只預測了兩個框,並且只屬於一類。
對測試影象中,同一類物體出現的新的不常見的長寬比和其他情況是。泛化能力偏弱。
由於損失函式的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。
5.3 總結
YOLO是一種支援端到端訓練和測試的卷積神經網路,在保證一定準確率的前提下能影象中多目標的檢測與識別。
6.SSD:Single Shot MultiBox Detector
論文:http://arxiv.org/abs/1512.02325
程式碼:https://github.com/weiliu89/caffe/tree/ssd
技術路線:端到端的迴歸和分類的CNN
由於YOLO簡單粗暴的將影象進行網格劃分,然後對每個網格進行處理,這樣導致不精確等一系列問題,而基於proposal的faster r-cnn定位較為精確的優點,SSD就結合了YOLO和faster的anchor進行檢測。
6.1 網路模型
SSD網路包括兩個部分,前面的是基礎網路,用於影象分類的標準網路,但是把涉及到分類的層全部裁掉,後面的網路是作者設計的Extra Feature layers,主要實現以下目標:
Multi-scale feature maps for detection:加入卷積特徵層,得到不同尺度的特徵層,從而實現多尺度目標檢測 ,用於不同尺度的目標預測的卷積模型是不同的。
Convolutional predictors for detection :對於每個新增的特徵層,使用一組卷積濾波器,可以得到一組固定數目的目標檢測的預測 。對於一個尺寸為m*n,p通道的特徵層,使用一個 3*3*p 的小核作為一個基礎元素來預測一個可能檢測的資訊(類別資訊,位置資訊)
Default boxes and aspect ratios :在 Faster R-CNN中使用了 anchor boxes 實現不同大小和寬高比的物體提取 ,本文使用了類似的一組 default bounding boxes,和 Faster R-CNN 主要區別是在不同尺度的特徵層上進行這些default bounding boxes 檢測運算的。
6.2 訓練
在訓練時,建立ground truth和 default boxes的對應關係。對於每個ground truth,我們選擇不同位置、寬高比、尺度的 default boxes 與之匹配,選擇重合最大的 default boxe。這個和 original MultiBox [7] 是相似的。但是不同於 MultiBox,我們match default boxes to any ground truth with jaccard overlap higher than a threshold(0.5),這麼做是為了簡化學習問題。訓練SSD和訓練使用候選區域及池化的標準檢測器最大不同之處在於,ground truth需要被賦予一組固定集合檢測輸出中某一個特定輸出。當這個賦值確定之後,損失函式和後向傳播就可以被端到端的應用。
6.3 測試
SSD能達到58幀每秒,精度有72.1。速度超過Faster R-CNN 有8倍,但達到類似的精度。