注:1.本博文持續更新中,文章較長,能夠收藏方便下次閱讀。2.本人原創,謝絕轉載。git
1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentationgithub
技術路線: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)ide
訓練:提取特徵的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複用了VGG訓練ImageNet獲得的網絡模型,即VGG16模型以初始化Fast-R-CNN中RoI Layer之前的全部層。Fast R-CNN的網絡結構總體能夠總結以下:13個convolution layers + 4個pooling layers+RoI layer+2個fc layer+兩個parrel層(即SoftmaxLoss layer和SmoothL1Loss layer)。在Fast R-CNN中,原來VGG16中第5個pooling layer被新的ROI layer替換掉。
3.3 Finetuning for detection
3.3.1 fast r-cnn在網絡訓練階段採用了一些trick,每一個minibatch是由N幅圖片(N=2)中提取獲得的R個proposal(R=128)組成的。這種minibatch的構造方式比從128張不一樣圖片中提取1個proposal的構造方式快64倍。雖然minibatch的構造速度加快,但也在必定程度上形成收斂速度減慢。此外,fast-r-cnn摒棄了以前svm訓練分類器的方式,而是選用softmax classifer和bounding-box regressors聯合訓練的方式更新cnn網絡全部層參數。注意:在每2張圖中選取128個proposals時,須要嚴格保證至少25%的正樣本類(proposals與groundtruth的IoU超過0.5),剩下的可所有視做背景類。在訓練網絡模型時,不須要任何其餘形式的數據擴增操做。
3.3.2 multi-task loss:fast r-cnn包括兩個同等水平的sub-layer,分別用於classification和regression。其中,softmax loss對應於classification,smoothL1Loss對應於regression. 兩種Loss的權重比例爲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.multi-task loss訓練方式能提升算法準確度
2.multi-scale圖像訓練fast r-cnn相比較single-scale圖像訓練相比對mAP的提高幅度很小,可是卻增長了很高的時間成本。所以,綜合考慮訓練時間和mAP,做者建議直接用single尺度的圖像訓練fast-r-cnn。
3.用於訓練的圖像越多,訓練獲得的模型準確率也會越高。
4.SoftmaxLoss訓練方式比SVMs訓練獲得的結果略好一點,所以沒法證實SoftmaxLoss在效果上必定比svm強,可是簡化了訓練流程,無需分步驟訓練模型。
5.proposal並非提取的越多效果越好,太多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