YOLO v2-原理

論文: YOLO9000:Better,Faster,Stronger 
論文鏈接:https://arxiv.org/abs/1612.08242

參考:https://blog.csdn.net/u014380165/article/details/77961414

YOLO9000是CVPR2017的最佳論文提名。首先講一下這篇文章一共介紹了YOLO v2和YOLO9000兩個模型,二者略有不同。前者主要是YOLO的升級版(關於YOLO v1的介紹可以參考:YOLO v1算法詳解),後者的主要檢測網絡也是YOLO v2,同時對數據集做了融合,使得模型可以檢測9000多類物體。而提出YOLO9000的原因主要是目前檢測的數據集數據量較小,因此利用數量較大的分類數據集來幫助訓練檢測模型。

接下來基本上按照文章的順序來解讀一下算法,這樣讀起來也比較清晰。主要包括三個部分:Better,Faster,Stronger,其中前面兩部分基本上講的是YOLO v2,最後一部分講的是YOLO9000。
 

Better

Batch Normalization

        在所有卷積層加入批歸一化,移除dropout層

High Resolution Classifier

        首先fine-tuning的作用不言而喻,現在基本跑個classification或detection的模型都不會從隨機初始化所有參數開始,所以一般都是用預訓練的網絡來finetuning自己的網絡,而且預訓練的網絡基本上都是在ImageNet數據集上跑的,一方面數據量大,另一方面訓練時間久,而且這樣的網絡都可以在相應的github上找到。 

先在分類網絡,以448x448大小輸入,迭代10個epochs,然後在檢測網絡上微調。提升4% mAP。

Convolutional with Anchor Boxes

       借鑑Faster-RCNN的思想,用anchor boxes預測bounding boxes。去掉一個池化層,增大卷積層輸出的分辨率;實際輸入減小爲416而不是448,輸出特徵圖大小13x13.。

雖然加入anchor使得MAP值下降了一點(69.5降到69.2),但是提高了recall(81%提高到88%)

Dimension Clusters

我們知道在Faster R-CNN中anchor box的大小和比例是按經驗設定的,然後網絡會在訓練過程中調整anchor box的尺寸。但是如果一開始就能選擇到合適尺寸的anchor box,那肯定可以幫助網絡越好地預測detection。所以作者採用k-means的方式對訓練集的bounding boxes做聚類,試圖找到合適的anchor box。

另外作者發現如果採用標準的k-means(即用歐式距離來衡量差異),在box的尺寸比較大的時候其誤差也更大,而我們希望的是誤差和box的尺寸沒有太大關係。所以通過IOU定義瞭如下的距離函數,使得誤差和box的大小無關:

這裏寫圖片描述

最後選擇k=5,而且發現聚類的結果和手動設置的anchor box大小差別顯著。聚類的結果中多是高瘦的box,而矮胖的box數量較少。

Direct location prediction

作者在引入anchor box的時候遇到的第二個問題:模型不穩定,尤其是在訓練剛開始的時候。作者認爲這種不穩定主要來自預測box的(x,y)值。我們知道在基於region proposal的object detection算法中,是通過預測下圖中的tx和ty來得到(x,y)值,也就是預測的是offset。

Fine-Grained Features

加了一層passthrough layer,將前一層26x26的feature map與13x13的feature map連接,類似於Resnet。結合了不同分辨率,mAP提升1%。

Multi-scale Training

每10個batch隨機選擇一個新的輸入Size,注意這一步是在檢測數據集上fine tune時候採用的,不要跟前面在Imagenet數據集上的兩步預訓練分類模型混淆,本文細節確實很多。

Faster

Darknet-19

大多數檢測網絡依賴vgg-16,但是vgg-16太複雜了。YOLO用了Googlenet,速度快了一些但是準確率下降了2%。本文提出了darknet-19,這個網絡包含19個卷積層和5個max pooling層,而在YOLO v1中採用的GooleNet,包含24個卷積層和2個全連接層,因此Darknet-19整體上卷積卷積操作比YOLO v1中用的GoogleNet要少,這是計算量減少的關鍵。最後用average pooling層代替全連接層進行預測。這個網絡在ImageNet上取得了top-5的91.2%的準確率。

 

Training for Classification 


這裏的2和3部分在前面有提到,就是訓練處理的小trick。這裏的training for classification都是在ImageNet上進行預訓練,主要分兩步:1、從頭開始訓練Darknet-19,數據集是ImageNet,訓練160個epoch,輸入圖像的大小是224*224,初始學習率爲0.1。另外在訓練的時候採用了標準的數據增加方式比如隨機裁剪,旋轉以及色度,亮度的調整等。2、再fine-tuning 網絡,這時候採用448*448的輸入,參數的除了epoch和learning rate改變外,其他都沒變,這裏learning rate改爲0.001,並訓練10個epoch。結果表明fine-tuning後的top-1準確率爲76.5%,top-5準確率爲93.3%,而如果按照原來的訓練方式,Darknet-19的top-1準確率是72.9%,top-5準確率爲91.2%。因此可以看出第1,2兩步分別從網絡結構和訓練方式兩方面入手提高了主網絡的分類準確率。

Training for Detection 


在前面第2步之後,就開始把網絡移植到detection,並開始基於檢測的數據再進行fine-tuning。首先把最後一個卷積層去掉,然後添加3個3*3的卷積層,每個卷積層有1024個filter,而且每個後面都連接一個1*1的卷積層,1*1卷積的filter個數根據需要檢測的類來定。比如對於VOC數據,由於每個grid cell我們需要預測5個box,每個box有5個座標值和20個類別值,所以每個grid cell有125個filter(與YOLOv1不同,在YOLOv1中每個grid cell有30個filter,還記得那個7*7*30的矩陣嗎,而且在YOLOv1中,類別概率是由grid cell來預測的,也就是說一個grid cell對應的兩個box的類別概率是一樣的,但是在YOLOv2中,類別概率是屬於box的,每個box對應一個類別概率,而不是由grid cell決定,因此這邊每個box對應25個預測值(5個座標加20個類別值),而在YOLOv1中一個grid cell的兩個box的20個類別值是一樣的)。另外作者還提到將最後一個3*3*512的卷積層和倒數第二個卷積層相連。最後作者在檢測數據集上fine tune這個預訓練模型160個epoch,學習率採用0.001,並且在第60和90epoch的時候將學習率除以10,weight decay採用0.0005。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章