YOLO V1、V2、V3算法 精要解說


前言

  之前無論是傳統目標檢測,還是RCNN,亦或是SPP NET,Faste Rcnn,Faster Rcnn,都是二階段目標檢測方法,即分為“定位目標區域”與“檢測目標”兩步,而YOLO V1,V2,V3都是一階段的目標檢測。

  從R-CNN到FasterR-CNN網絡的發展中,都是基於proposal+分類的方式來進行目標檢測的,檢測精度比較高,但是檢測速度不行,YOLO提供了一種更加直接的思路:

  直接在輸出層回歸boundingbox的位置和boundingbox所屬類別的置信度,相比於R-CNN體系的目標檢測,YOLO將目標檢測從分類問題轉換為回歸問題。其主要特點是

  •速度快,能夠達到實時的要求,在TitanX的GPU上達到45fps;

  •使用全圖Context信息,背景錯誤(把背景當做物體)比較少;

  •泛化能力強;

  YOLO V1
  
 
 
UnifiedDetection(統一檢測)核心思想:
1.將輸入圖像划分為S*S個gridcell(網格單元);如果一個object物體的中心是位於這個gridcell內,那么這個gridcell就負責檢測這個物體;如下圖
2.每一個gridcell需要預測B個boundingboxes坐標信息(x,y,w,h)以及這些boundingboxes的置信度confidence。
YOLOv1中的坐標信息(x,y,w,h)表示的是boxes中心點坐標相對於當前圖像寬度、高度的比值,w、h是boxes的寬度、高度和實際圖像的寬度、高度的比值;
置信度confidence反映的是模型對於這個預測的boundingbox中包含物體的可能性大小。
3.每個gridcell還需要預測C個類別的概率(conditionalclassprobability),以判斷當前cell屬於哪個類別C。
•NOTE:Confidence置信度表示的是boundingboxes包含物體的概率值,而conditionalclassprobability表示的是每個gridcell屬於某個類別的概率值。
4.每個gridcell的class信息和每個boundingbox預測的confidence信息相乘,就可以得到每個boundingbox的class-specificconfidencescore。
論文建議: S=7,B=2,在PASCALVOC數據集中,最終預測值形狀為7x7x30的Tensor對象,C=20(該數據集的類別)
 這個30的維度是這樣的:S*S(B*5+C),5的意思是兩個邊框的x、y、w、h、confidence。(confidence 代表了所預測的 box 中含有 object 的置信度和這個 box 預測的有多准這兩重信息)
主干網絡:
  其主干網絡是 Googlenet

 

 其想做的事如此看來很清晰,先判斷是目標還是背景,若是目標,則再判斷是屬於這20個類別的哪個類(此VOC數據集是20個類別,別的數據集就是別的類別)

因為論文建議了我們一個grid cell最好是承載着兩個邊框,即bounding box,那么,這幅7*7個cell的圖就有98個邊框了,如下圖

 

 每個邊框都是上面公式計算來的,我有寫的,即背景還是物體的概率*20個類哪個類別的概率,如下圖

然后呢 ,就是處理這98個框框,如下圖

 

這總共是20個類別,一行行的這么處理,直到20行處理完畢

然后對結果遍歷,如果置信度的評分大於0,那這個框就可以代表此物體,如果得分小於0,就不行,如下圖

 

 來看一下損失函數吧,我把它分成了三類

總結一下,並分析一下優缺點:

優點
•運行速度快,因為是一階段的;
•背景預測錯誤的情況比較少;
缺點
•對於實際物體的效果沒有FasterR-CNN效果好;
•如果一個gridcell中包含多個相同類別的小物體,那么YOLOv1每個單元格最多可以檢測出兩個物體(論文的建議設置導致的,因為它建議一個grid cell 里面最好只是兩個邊框,如果不是兩個邊框,效果不會好)。如下圖

 YOLO V2

  算法的增強正是有了對原來的基礎不斷改進才得來的,YOLO V2相對於V1主要有三方面變化。

Better,Faster,Stronger:
•1.Better:從精度方面進行改進,讓效果從YOLOv1的63.4%mAP上升到YOLOv2的78.6%mAP,基本和FasterR-CNN以及SSD持平。
•2.Faster:網絡結構方面做了更改,讓模型速度更快;
•3.Stronger:對這個損失函數做一個變化;
 
•BatchNormalization
•在每一個卷積層后加入BatchNormalization,mAP提升2%,BatchNormalization有助於規范化模型,防止過擬合。
•HighResolutionClassifier:
•一般的目標檢測方法中,基本上會使用ImageNet預訓練的模型來提取特征,比如使用AlexNet或者VGG網絡,那么輸入的圖片會被resize到不足256*256的大小,這樣會導致分辨率不夠高,目標檢測比較困難;在YOLOv2中自定義了darknet分類網絡,將圖像的輸入分辨率更改為448*448,然后在ImageNet上訓練10輪,訓練后的網絡可以適應高分辨率的輸入;應用到檢測的時候,對檢測部分網絡進行finetune,mAP提升4%。

ConvolutionalwithAnchorBoxes:
•借鑒FasterR-CNN中的anchor思想,產生多個boundingboxes先驗框,通過這種方式可以提升模型的recall召回率。
•刪除全部的全連接層,去掉最后一個池化層,以確保輸出的特征圖具有更高的分辨率,然后通過縮減網絡讓圖片輸入分辨率為416*416,這樣最終輸出的特征圖為13*13;
•DimensionCluster(維度聚類):
相當於考試時你偷看了一眼答案是BADDCDDD,但你不知道是第幾道題是這些答案,於是你盡量遇到不會的時候多選D.
這里是基於訓練數據的真實框的大小來做的密度的聚類
•AnchorBoxes的寬高緯度通常需要通過精選的先驗框來給定,然后通過網絡學習轉換系數,最終得到准確的boundingbox候選框;如果可以通過維度聚類一開始就給定更具有代表性的boxes維度,那么網絡就會更容易預測位置。
•使用K-Means聚類方法來訓練boundingboxes;采用IoU作為KMeans聚類的距離公式。

 下圖是聚類的不同標准下的平均IOU值

DirectLocationPrediction(直接位置預測):
•在AnchorBoxes中,模型不是特別穩定,原因是:模型的位置預測值為偏移量的值(在整個圖像上的),在模型中相當於anchor可以檢測很遠目標的box的情況,范圍太大,反向傳播的就會很慢,這樣就會導致模型收斂比較慢。
•YOLOv2中不采用直接的offset方法,使用了 預測相對於grid  cell的坐標位置的方法,並且 將ground truth通過logistic函數限制在0~1之間,這樣的范圍更小,有利於反向傳播的速度,。
•通過DimensionCluster+DirectLocationPrediction的改進,mAP提升5%。
 具體做法如下:

  其沿用了Faster RCNN中Anchor box(錨點框)的思想,通過kmeans方法在VOC數據集(COCO數據集)上對檢測物體的寬高進行了聚類分析,得出了5個聚類中心,因此選取5個anchor的寬高: (聚類時衡量指標distance = 1-IOU(bbox, cluster))

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

  這樣每個grid cell將對應5個不同寬高的anchor, 如下圖所示:(上面給出的寬高是相對於grid cell,對應的實際寬高還需要乘以32(2的5次方),因為這里給出的原圖大小是416*416大小的,經過卷積啊池化啊下采樣了5次后變成了13*13大小的)

關於預測的bbox的計算:(416*416-------13*13 為例),卷積池化等經歷了5次下采樣,縮小了2的5次方倍(看下面這三段話的時候,記得看此行往上數第9到12行字,相信你會明白的)

    (1) 輸入圖片尺寸為416*416, 最后輸出結果為13*13*125,這里的125指5*(5 + 20),5表示5個anchor,25表示[x, y, w, h, confidence ] + 20 class ),即每一個anchor預測一組值。

    (2) 對於每一anchor預測的25個值, x, y是相對於該grid cell左上角的偏移值,需要通過logistic函數將其處理到0-1之間。如13*13大小的grid,對於index為(6, 6)的cell,預測的x, y通過logistic計算為xoffset, yoffset,   則對應的實際x = 6 + xoffset,   y = 6+yoffset, 由於0<xoffset<1, 0<yoffset<1, 預測的實際x, y總是在(6,6)的cell內。對於預測的w, h是相對於anchor的寬高,還需乘以anchor的(w, h), 就得到相應的寬高

     (3) 由於上述尺度是在13*13下的,需要還原為實際的圖片對應大小,還需乘以縮放倍數32

Fine-GrainedFeatures(細粒度特征):
•在FasterR-CNN和SSD中,通過不同的方式獲得了多尺度的適應性,FasterR-CNN中使用不同的scale,SSD直接從不同大小的featuremap上來提取ROI區域;為了提升對小尺度物體的檢測,在YOLOv2中加入了轉移層(passthroughlayer),這個層次的功能就是將淺層特征圖(26*26*256)連接到深層特征圖(13*13*512)中,類似ResNet的殘差網絡結構。
•對於26*26*512的特征圖按行、按列隔一個進行采樣,產生4個13*13*512維度的新特征圖,然后concat合並得到13*13*2048的特征圖,最后將其連接到深層特征圖上。相當於做了特征融合,對於小目標檢測比較有效。
•通過這種結構,mAP提升了1%。
 即如下圖這樣提取特征,范圍更大,最后再融合到一起
Multi-ScaleTraining:
•由於YOLOv2中僅存在卷積層和池化層,所以可以進行動態調整,每經過10個epoch,隨機選擇新的圖片尺寸進行訓練。由於YOLOv2中降采樣的參數為32,所以以32個像素為增量值設置不同大小的圖像來進行訓練,最小尺寸320,最大尺寸608,尺寸可選值{320,352,....,608}總共十個不同尺寸的的圖像。
•這種設計讓YOLO在低性能的GPU、高幀率視頻等場景的應用更加適合。
 下面是一個對比,YOLO V2的map在高分辨率時最高,40幀率也滿足實時性的要求
Faster:
  為了改善YOLO模型的檢測速度,YOLOv2在Faster方面也做了一些改進。
•大多數神經網絡依賴於VGGNet來提取特征,VGG-16特征提取功能是非常強大的,但是復雜度有點高,對於224*224的圖像,前向計算高達306.9億次浮點數運算。
YOLOv2中使用基於GoogleNet的定制網絡DarkNet,一次前向傳播僅需要85.2億次浮點數計算。精度相比來降低2%(88%/90%)
DarkNet-19:
 •大量使用3*3的卷積;
•在3*3卷積前使用1*1卷積來壓縮通道;
•在每一個卷積后加入BN,穩定模型;
•使用GlobalAveragePooling;
•使用MaxPooling。
  模型訓練細節:
•分類模型訓練;使用下列參數及數據處理方式,將Darknet-19在標准的1000類ImageNet上訓練160epoch;
•隨機梯度下降
•startinglearningrate:0.1,初始學習率
•polynomialratedecay:4,線性的學習率下降
•weightdecay:0.0005,權重衰減的質數,權重的偏移,移動平均數形式
•momentum:0.9  動量
•輸入數據大小:224*224
•數據增強:randomcrops(隨機裁剪)、rotations(旋轉)、hue/saturation/exposureshifts(調整色度).
  分類模型訓練:
當初始224*244的訓練完成后(160epochs)
進行更高分辨率下的圖像分類訓練(訓練10epochs):•learning_rate:0.001  •輸入數據大小:448*448
目標檢測網絡的訓練:
將分類網絡的最后一個卷積層去掉,更改為三個3*3*1024的卷積層,並且每個卷積層后跟一個1*1的卷積層,輸出維度為檢測需要的數目;比如在VOC數據集中,需要預測5個框,每個框4個坐標值(偏移值)+1個置信度+20個類別概率值,也就是輸出為125維。同時將轉移層(passthroughlayer)從倒數第二層做一個連接的操作。
•訓練方式以及Loss的定義和YOLOv1類似。
 
YOLO V3
 
 先來觀摩一下效果和速度的對比,如下圖

 

 

YOLOv3對YOLOv1和YOLOv2的內容既有保留又有改進,其 保留的內容如下
•從YOLOv1開始,YOLO算法都是通過划分單元格的方式來檢測的,只是划分的數量不一樣;
•全部都是采用LeakyReLU激活函數;
•采用端到端的訓練;
•從YOLOv2開始,將BN和LeakyReLU放到每一個卷積層之后;
•從YOLOv2開始,多尺度訓練,在速度和准確率之間tradeoff。
•從YOLOv2開始,位置信息的預測全部是預測相對於gridcell的位置信息。
 
在YOLOv3中借鑒了大量其它網絡結構的優點,其 主要改進如下:
•1.YOLOv3的改進主要是backbone網絡的提升,從v2的darknet-19到v3的deaknet-53。在v3中,還提供了輕量高速的網絡tiny-darknet;
•2.借鑒FPN(特征金字塔)在不同scala的featuremap上提取特征信息,然后做融合。相比於v2中僅僅通過多尺度圖像的訓練來講,v3對於小目標的檢測效果更好;
•3.AnchorBoxes數目從v2中的5個提升到v3中的9個;
52*52大小的特征圖上:10x13,16x30,33x23。26*26大小的特征圖上 30x61,64x45,59x119  13*13大小的特征圖上:116x90,156x198,373x326
•4.采用Logistic分類器替換Softmax分類器;因為softmax做分類器的話,它一次只能分一個類別,無法針對一個單元格有多個物體,所以換成了logistic
•5.Loss損失函數進行了改進;
 

 yolo v3在保證實施率(fps>36)的情況下,盡量追求性能,下面是幾個主干網絡的對比

 

 darknet為論文中使用的,效果不錯,resnet在top5的准確率上和darknet一致。但是實時性略差,畢竟它本質是用來分類的網絡,若用於目標檢測還需要修改修改

下圖是特征金字塔的結構與其他幾種結構的對比圖

 

 下面是yolo v3的具體結構,其中特征金字塔部分參照上圖看,就能明白

來看一下損失函數吧,采用了類似YOLOv1的損失函數,其主要更改的地方是將v1中關於confidence和class類別概率部分的損失函數更改為logistic交叉熵損失函數(tf.nn.sigmoid_cross_entropy_with_logits)。

 

 

訓練操作類似YOLOv1和v2,主要特點如下:

•網絡結構darknet;

•輸入數據完整圖像,不進行hardnegativemining(難負樣本的挖掘,當然,我們自己實現代碼的時候可以做)或者其它操作;

•多尺度訓練multiscale;

•數據增強dataaugmentation;

•批歸一化batchnormalization; 

 來看一下效果對比:雖然如此,但是 工業界仍然使用SSD和YOLO,因為綜合考慮性能和速度。

 

 致此完畢全部內容,我求求你們關注我好不好,很不容易的,一個人打兩份工,晚上還要給別人織毛衣......

 

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM