學習:YOLO系列之yolo v2
yolo_v2論文發表在CVPR2017。v2演算法在v1的基礎上可以說是飛躍性提升,吸取諸子百家之優勢。同時,v2的論文也是目前為止yolo系列論文裡乾貨最多的文章。
論文標題:《YOLO9000: Better, Faster, Stronger》
論文地址: https://arxiv.org/pdf/1612.08242v1.pdf
yolo_v2的一大特點是可以”tradeoff“,翻譯成中文就是”折中”。v2可以在速度和準確率上進行tradeoff,比如在67幀率下,v2在VOC2007資料集的mAP可以達到76.8; 在40幀率下,mAP可以達到78.6。這樣,v2就可以適應多種場景需求,在不需要快的時候,它可以把精度做很高,在不需要很準確的時候,它可以做到很快。
v2在v1上的提升:
batch normalization: BN能夠給模型收斂帶來顯著地提升,同時也消除了其他形式正則化的必要。作者在每層卷積層的後面加入BN後,在mAP上提升了2%。BN也有助於正則化模型。有了BN便可以去掉用dropout來避免模型過擬合的操作。BN層的新增直接將mAP硬拔了2個百分點,這一操作在yolo_v3上依然有所保留,BN層從v2開始便成了yolo演算法的標配。
**high resolution classifier:**所有最頂尖的檢測演算法都使用了基於ImageNet預訓練的分類器。從AlexNet開始,大多數分類器的輸入尺寸都是小於256x256的。最早的YOLO演算法用的是224x224,現在已經提升到448了。這意味著網路學習目標檢測的時候必須調整到新的解析度
對於YOLOv2,作者一開始在協調分類網路(指DarkNet-19)用的448X448全解析度在ImageNet上跑了10個epoch。這使得網路有時間去調整自己的filter來使得自己能夠在更高解析度的輸入上表現更佳。然後,作者們把這種更高解析度的分類網路用到detection上,發現mAP提升了4% 。
Convolutional With Anchor Boxes: 在yolo_v2的優化嘗試中加入了anchor機制。YOLO全連線層直接預測Bounding Box的座標值。Faster R-CNN並不是直接預測座標值。Faster R-CNN只是用RPN種的全連線來為每一個box預測offset
由於預測層是卷積性的,所以RPN預測offset是全域性性的。預測offset而不是座標簡化了實際問題,並且更便於網路學習。
作者去除了YOLO的全連線層,使用anchor框來預測bounding box。首先,作者去除了一層池化層以保證卷積輸出具有較高的解析度。作者把448X448的影象收縮到416大小。因為作者想讓輸出特徵圖的維度是奇數(416/32=13,13為奇數),這樣的話會有一箇中間單元格(center cell)。物體(尤其是大物體)經常佔據影象的中心,所以有一個單獨位置恰好在中心位置能夠很好地預測物體。YOLO的卷積層下采樣這些影象以32(即25)為取樣係數(416/32 = 13),所以輸出feature map為13x13。
使用了anchor boxes機制之後,準確率有一點點下降。YOLO(指YOLO v1)只能在每張圖給出98個預測框,但是使用了anchor boxes機制之後模型能預測超過1000個框。
儘管mAP稍微下降了一些,但是在召回率上的提升意味著模型有更多提升的空間。
Dimension Clusters: 當作者對yolo使用anchor機制時,遇到了兩個問題。1,模板框(prior)的大小是手動挑選的(指anchor prior的大小一開始使人為手動設定的,Faster R-CNN中k=9,大小尺寸一共有3x3種)。box的規格雖然後期可以通過線性迴歸來調整,但如果一開始就選用更合適的prior(模板框)的話,可以使網路學習更輕鬆一些。(本文將prior翻譯成模板框,是我自己的體會,僅供參考)
作者並沒有手動設定prior,而是在訓練集的b-box上用了k-means聚類來自動找到prior。如果用標準k-means(使用歐幾里得距離),較大box會比較小box出現更多的錯誤。然而,我們真正想要的是能夠使IOU得分更高的優選項,與box的大小沒有關係。因此,對於距離判斷,作者用了:d(box, centroid) = 1 - IOU(box, centroid)
作者對k-means演算法取了各種k值,並且畫了一個曲線圖
最終選擇了k=5,這是在模型複雜度和高召回率之間取了一個折中。聚類得到的框和之前手動挑選的框大不一樣。有稍微短寬的和高瘦一些的(框)。
我們比較了前後的平均IOU,如下表:
在k=5時聚類效果和Faster R-CNN中的9-anchor效果接近,而使用9-anchor的聚類,會有一個明顯的提升。這表明了使用k-means聚類來生成b-box的初始框,這個模型能有更好的表型以及更容易學習。
Direct location prediction: 當在YOLO中使用anchor boxes機制的時候,遇到了第二個問題:模型不穩定。尤其時早期迭代的時候。不穩定的因素主要來自於為box預測(x,y)位置的時候。在RPN中,網路預測了值tx和ty以及(x, y)座標,計算式如下:
例如,預測出意味著把框整體向右移動了一個框的距離。
這個公式沒有加以限制條件,所以任何anchor box都可以偏移到影象任意的位置上。隨機初始化模型會需要很長一段時間才能穩定產生可靠的offsets(偏移量)。
我們並沒有“預測偏移量”,而是遵循了YOLO的方法:直接預測對於網格單元的相對位置。
直接預測(x, y),就像yolo_v1的做法,不過v2是預測一個相對位置,相對單元格的左上角的座標(如上圖所示)。當(x, y)被直接預測出來,那整個bounding box還差w和h需要確定。yolo_v2的做法是既有保守又有激進,x和y直接暴力預測,而w和h通過bounding box prior的調整來確定。yolo為每個bounding box預測出5個座標
看上面的公式也可以看出,b-box的寬和高也是同時確定出來,並不會像RPN那樣通過regression來確定。和都是kmeans聚類之後的prior(模板框)的寬和高,yolo直接預測出偏移量和,相當於直接預測了bounding box的寬和高。使用聚類搭配直接位置預測法的操作,使得模型上升了5個百分點。
論文剛看到這兒的時候,我也很納悶,好像又沒用anchor,作者在前面花大篇幅講的anchor機制在這裡又被否定了。不過看到等我看到下面表格的時候我才明白:
從第四行可以看出,anchor機制只是試驗性在yolo_v2上鋪設,一旦有了dimension priors就把anchor拋棄了。最後達到78.6mAP的成熟模型上也沒用anchor boxes。
Fine-Grained Features:調整後的yolo將在13x13的特徵圖上做檢測任務。雖然這對大物體檢測來說用不著這麼細粒度的特徵圖,但這對小物體檢測十分有幫助。Fast R-CNN和SSD 都是在各種特徵圖上做推薦網路 以得到一個範圍內的解析度。我們採用不同的方法,只添加了一個passthrough層,從26x26的解析度得到特徵。
**multi-scale training:**用多種解析度的輸入圖片進行訓練。
**darknet-19:**用darknet-19作為yolo_v2的backbone網路。一般的檢測任務模型都會有一個分類網路作為backbone網路,比如faster R-CNN拿VGG作為backbone。yolo_v2用的自家的分類網路darknet-19作為base,體現出自家的優越性。同時在darknet-19中使用batch normalization來加速收斂。