yolov2训练_一文看懂YOLO v2
我的CSDN博客:https://blog.csdn.net/litt1e
我的公眾號:工科宅生活
概述
新的YOLO版本論文全名叫“YOLO9000: Better, Faster, Stronger”,相較于YOLO主要有兩個大方面的改進:
第一,作者使用了一系列的方法對原來的YOLO多目標檢測框架進行了改進,在保持原有速度的優勢之下,精度上得以提升。
第二,作者提出了一種目標分類與檢測的聯合訓練方法,通過這種方法,YOLO9000可以同時在COCO和ImageNet數據集中進行訓練,訓練后的模型可以實現多達9000種物體的實時檢測。
我們根據論文中Better,Faster,Stronger三個方面來闡述YOLOv2的算法細節,其中會提到YOLO一些算法YOLO講解。
Better
Batch Normalization
神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度。
解決辦法之一是對數據都要做一個歸一化預處理。YOLOv2網絡通過在每一個卷積層后添加batch normalization,極大的改善了收斂速度同時減少了對其它regularization方法的依賴(舍棄了dropout優化后依然沒有過擬合),使得mAP獲得了2%的提升。
先建立這樣一個觀點: 對數據進行預處理(統一格式、均衡化、去噪等)能夠大大提高訓練速度,提升訓練效果。批量規范化 正是基于這個假設的實踐,對每一層輸入的數據進行加工。示意圖:
BN 的做法是 在卷積池化之后,激活函數之前,對每個數據輸出進行規范化(均值為 0,方差為 1)。
公式很簡單,第一部分是 Batch內數據歸一化(其中 E為Batch均值,Var為方差),Batch數據近似代表了整體訓練數據。
第二部分是亮點,即引入 附加參數 γ 和 β(Scale & Shift),Why? 因為簡單的歸一化 相當于只使用了激活函數中近似線性的部分(如下圖紅色虛線),破壞了原始數據的特征分布,這會降低模型表達能力。
High Resolution Classifier
預訓練分類模型采用了更高分辨率的圖片
YOLOv1先在ImageNet(224x224)分類數據集上預訓練模型的主體部分(大部分目標檢測算法),獲得較好的分類效果,然后再訓練網絡的時候將網絡的輸入從224x224增加為448x448。但是直接切換分辨率,檢測模型可能難以快速適應高分辨率。所以YOLOv2增加了在ImageNet數據集上使用448x448的輸入來finetune分類網絡這一中間過程(10 epochs),這可以使得模型在檢測數據集上finetune之前已經適用高分辨率輸入。使用高分辨率分類器后,YOLOv2的mAP提升了約4%。
Convolutional With Anchor Boxes
YOLOv1是利用全連接層直接預測bounding box的坐標。
YOLOv2則借鑒了Faster R-CNN的思想,引入anchor。
YOLOv2移除了YOLOv1中的全連接層而采用了卷積和anchor boxes來預測邊界框。為了使檢測所用的特征圖分辨率更高,移除其中的一個pool層。在檢測模型中,YOLOv2不是采418×418圖片作為輸入,而是采用416×416大小。因為YOLOv2模型下采樣的總步長為32,對于416×416大小的圖片,最終得到的特征圖大小為13×13,維度是奇數,這樣特征圖恰好只有一個中心位置。對于一些大物體,它們中心點往往落入圖片中心位置,此時使用特征圖的一個中心點去預測這些物體的邊界框相對容易些。所以在YOLOv2設計中要保證最終的特征圖有奇數個位置。
YOLOv2中引入anchor boxes,輸出feature map大小為13×13,每個cell有5個anchor box預測得到5個bounding box,一共有13×13×5=845個box。增加box數量是為了提高目標的定位準確率。
Dimension Clusters(維度聚類)
為了方便理解我們先講解一下k-means。
K-Means算法的思想很簡單,對于給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。如果用數據表達式表示,假設簇劃分為(C1,C2,…Ck),則我們的目標是最小化平方誤差E:
其中μi是簇Ci的均值向量,有時也稱為質心,表達式為:
K-Means采用的啟發式方式很簡單,用下面一組圖就可以形象的描述。
了解了K-means,我們再來看看YOLOv2中的Dimension Clusters。
k-means需要有數據,中心點個數是需要人為指定的,位置可以隨機初始化,但是還需要度量到聚類中心的距離。這里怎么度量這個距離是很關鍵的。
距離度量如果使用標準的歐氏距離,大盒子會比小盒子產生更多的錯誤。例(100-95)^2=25, (5-2.5)^2=6.25。因此這里使用其他的距離度量公式。聚類的目的是anchor boxes和臨近的ground truth有更大的IOU值,這和anchor box的尺寸沒有直接關系。自定義的距離度量公式:d(box,centroid)=1-IOU(box,centroid)
到聚類中心的距離越小越好,但IOU值是越大越好,所以使用 1 - IOU,這樣就保證距離越小,IOU值越大。
作者最終選取5個聚類中心作為先驗框。對于兩個數據集,5個先驗框的width和height如下:
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)
Direct Location prediction
作者在引入anchor box的時候遇到的第二個問題:模型不穩定,尤其是在訓練剛開始的時候。作者認為這種不穩定主要來自預測box的中心坐標(x,y)值。
在基于region proposal的目標檢測算法中,是通過預測tx和ty來得到(x,y)值,也就是預測的是offsets。
這個公式是無約束的,預測的邊界框很容易向任何方向偏移。因此,每個位置預測的邊界框可以落在圖片任何位置,這導致模型的不穩定性,在訓練時需要很長時間來預測出正確的offsets。
YOLOv2中沒有采用這種預測方式,而是沿用了YOLOv1的方法,就是預測邊界框中心點相對于對應cell左上角位置的相對偏移值。
網絡在最后一個卷積層輸出1313的feature map,有1313個cell,每個cell有5個anchor box來預測5個bounding box,每個bounding box預測得到5個值。
分別為:tx、ty、tw、th和to(類似YOLOv1的confidence)
為了將bounding box的中心點約束在當前cell中,使用sigmoid函數將tx、ty歸一化處理,將值約束在0~1,這使得模型訓練更穩定。
其實這與BBR回歸本質上差不多,BBR回歸(相關內容點此鏈接)的參數是offset偏移值,而YOLO v2回歸的是tx,ty,tw,th。它們都需要編碼解碼的過程來得到最終的坐標信息,差別只是已知信息的不同。
Fine-Grained Features
YOLOv2的輸入圖片大小為416×416,經過5次maxpooling之后得到13×13大小的特征圖,并以此特征圖采用卷積做預測。13×13大小的特征圖對檢測大物體是足夠了,但是對于小物體還需要更精細的特征圖(Fine-Grained Features)。因此SSD使用了多尺度的特征圖來分別檢測不同大小的物體,前面更精細的特征圖可以用來預測小物體。YOLOv2提出了一種passthrough層來利用更精細的特征圖。YOLOv2所利用的Fine-Grained Features是26×26大小的特征圖(最后一個maxpooling層的輸入),對于Darknet-19模型來說就是大小為26×26×512的特征圖。passthrough層與ResNet網絡的shortcut類似,以前面更高分辨率的特征圖為輸入,然后將其連接到后面的低分辨率特征圖上。前面的特征圖維度是后面的特征圖的2倍,passthrough層抽取前面層的每個2×2的局部區域,然后將其轉化為channel維度,對于26×26×512的特征圖,經passthrough層處理之后就變成了13×13×2048的新特征圖(特征圖大小降低4倍,而channles增加4倍,圖6為一個實例),這樣就可以與后面的13×13×1024特征圖連接在一起形成13×13×3072的特征圖,然后在此特征圖基礎上卷積做預測。
Multi-Scale Training
YOLOv2中只有卷積層和池化層,因此不需要固定的輸入圖片的大小。
為了讓模型更有魯棒性,作者引入了多尺度訓練。就是在訓練過程中,每迭代一定的次數,改變模型的輸入圖片大小。
注意:這一步是在檢測數據集上fine-tuning時候采用的,不要跟前面在Imagenet數據集上的兩步預訓練分類模型混淆。
網絡輸入是416×416,經過5次max pooling之后會輸出13×13的feature map,也就是下采樣32倍,因此作者采用32的倍數作為輸入的size,具體采用320、352、384、416、448、480、512、544、576、608共10種size。
輸入圖片大小為320×320時,特征圖大小為10×10,輸入圖片大小為608×608時,特征圖大小為19×19。
每次改變輸入圖片大小還需要對最后檢測層進行處理,然后開始訓練。
這種網絡訓練方式使得相同網絡可以對不同分辨率的圖像做檢測。
在輸入size較大時,訓練速度較慢,在輸入size較小時,訓練速度較快,而multi-scale training又可以提高準確率,因此算是準確率和速度都取得一個不錯的平衡。
Faster
Darknet-19
網絡包含19個卷積層和5個max pooling層,而在YOLOv1中采用的GooleNet,包含24個卷積層和2個全連接層,因此Darknet-19整體上卷積卷積操作比YOLOv1中用的GoogleNet要少,這是計算量減少的關鍵。最后用average pooling層代替全連接層進行預測。
YOLOv2的訓練
YOLOv2的訓練主要包括三個階段。
第一階段就是先在ImageNet分類數據集上預訓練Darknet-19,此時模型輸入為224×224,共訓練160個epochs。
第二階段將網絡的輸入調整為448*448,繼續在ImageNet數據集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度為76.5%,而top-5準確度為93.3%。
第三個階段就是修改Darknet-19分類模型為檢測模型,并在檢測數據集上繼續finetune網絡。
LOSS
(1)和YOLOv1一樣,對于訓練圖片中的ground truth,若其中心點落在某個cell內,那么該cell內的5個先驗框所對應的邊界框負責預測它,具體是哪個邊界框預測它,需要在訓練中確定,即由那個與ground truth的IOU最大的邊界框預測它,而剩余的4個邊界框不與該ground truth匹配。YOLOv2同樣需要假定每個cell至多含有一個grounth truth,而在實際上基本不會出現多于1個的情況。與ground truth匹配的先驗框計算坐標誤差、置信度誤差(此時target為1)以及分類誤差,而其它的邊界框只計算置信度誤差(此時target為0)。
(2)YOLOv2和YOLOv1的損失函數一樣,為均方差函數。但是看了YOLOv2的源碼(訓練樣本處理與loss計算都包含在文件region_layer.c中),并且參考國外的blog以及allanzelener/YAD2K(Ng深度學習教程所參考的那個Keras實現)上的實現,發現YOLOv2的處理比原來的v1版本更加復雜。
loss計算公式:
Stronger
帶標注的檢測數據集量比較少,而帶標注的分類數據集量比較大,因此YOLO9000主要通過結合分類和檢測數據集使得訓練得到的檢測模型可以檢測約9000類物體。
一方面要構造數據集(采用WordTree解決),另一方面要解決模型訓練問題(采用Joint classification and detection)。
參考文章:https://blog.csdn.net/lwplwf/article/details/82895409https://blog.csdn.net/l7H9JA4/article/details/79955903https://www.cnblogs.com/stingsl/p/6428694.htmlhttps://www.jianshu.com/p/032b1eecb335https://blog.csdn.net/oppo62258801/article/details/76796717https://blog.csdn.net/jesse_mx/article/details/53925356https://zhuanlan.zhihu.com/p/25167153
總結
以上是生活随笔為你收集整理的yolov2训练_一文看懂YOLO v2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python安装scipy出现红字_wi
- 下一篇: 我的世界怎么设置服务器维护中,我的世界服