論trick的重要性之YOLOv2

歡迎關注個人我的微信公衆號:小紙屑算法

2015年6月,YOLOv1橫空出世,標誌着一步式物體檢測算法時代的到來,同年12月,經典一步式物體檢測算法SSD出世,在準確度和速度上均擊敗了傲嬌的YOLOv1。通過一年的探索,2016年12月,YOLOv1做者Joseph Redmon發佈YOLOv2,以圖扳回一城。微信

下圖是深度學習時代物體檢測算法的里程碑,能夠看到YOLO系列的相對位置。網絡

效果

YOLOv2的效果可謂很是理想(貌似沒有論文的結果不理想。。。。),以下圖,在VOC數據集上準確度作到了當時的SOTA(state of the art),速度上更不用說,YOLOv2確定是一騎絕塵,別的模型難以望其項背。性能

十個Trick

具體做者怎麼作到的呢?無他,惟有trick而已。做者使用了整十個trick來提高性能,下圖是做者給出的各個trick的對比試驗,由衷感嘆trick的重要性。學習

一、 batch norm

提高 2.4mPA Batch Normalization主要用來解決internal covariance shift問題,能夠加快訓練和收斂速度,同時還有必定的正則化做用。總體上,還能夠提高性能,這裏提高了2.4mPA,很是多了。如今基本是CV標配,dropout反而用的比較少。設計

二、hi-res classifier

提高 3.7mPA3d

上圖是YOLOv1的網絡結構,feature extractor network是在ImageNet上訓練的,這裏的classifier指的就是feature extractor network。 YOLOv1只是在224x224分辨率上訓練classifier,但物體檢測的圖片輸入是448x448,存在分辨率不匹配的狀況,因此YOLOv2採用的訓練策略是,先在224x224分辨率上訓練,最後10個epoch在448x448分辨率上訓練。性能提高3.7mPA,提高顯著。orm

三、convolutional 和四、anchor boxes

提高 -0.3mPA,但recall從81%提高到87%cdn

1)convolutionalblog

從YOLOv1的網絡結構能夠看出,YOLOv1輸入是448x448x3,輸出是7x7x30,YOLOv1輸出前的object detection layers是兩層全鏈接層。但明顯的7x7x30這種結構與卷積的輸出形式一致,所以用卷積實現更方便,也即將上圖中的兩個全鏈接層直接改成卷積層便可。 全卷積實現還有個很是大的好處,輸入圖片尺寸再也不固定,能夠任意變化,只要大於總體步長便可。這也是YOLOv2能夠在準度和速度之間作權衡的本質。當圖片分辨率高,輸出的分辨率也高,通常更準,但計算量也更大,速度會變慢。當圖片分辨率較小時,輸出的分辨率也較小,準度降低,但計算量更小,速度更快。 改成全卷積實現後,輸入圖片的分辨率也從448x448變爲418x418,總體分辨率縮減步長從64變爲32,加強位置語義,相對應的輸出分辨率也就從7x7變爲13x13,輸出的框更多。

2)anchor boxes

YOLOv1沒有使用anchor box,借鑑Faster R-CNN和SSD,YOLOv2也使用了anchor box,3個ratio,3個scale,總共9個anchor box,加強學習的多樣性,下降學習難度。 YOLOv2最終的輸出爲13x13x9x25。 用convolutional實現,並使用anchor box,最終致使準度降低0.3mAP,但recall從81%提高到87%,爲其餘trick提高準確度奠基基礎。

五、new network

提高0.4mAP 借鑑Inception、VGG和Network in Network等網絡模型優勢,做者從新設計了特徵提取網絡Darknet19。網絡結構以下圖。

最終準度提高0.4mAP,並不算多,但網絡速度更快,這纔是做者的主要目的。

六、dimension priors和七、location prediction

提高4.8mAP

1)dimension priors

第四項trick中,做者使用了3個固定ratio和3個固定scale,總共9個anchor box來提升框的多樣性。anchor box實際上是先驗框,網絡最終迴歸的是anchor box與GT之間的差別,很顯然,若是anchor box與GT約接近,則學習難度會更小。一個經常使用方法是,將真實的GT聚類產生anchor box。dimension priors就是經過聚類產生anchor box尺寸。 聚類中,每個樣本到中心點的距離通常用歐式距離,但這並不適合先驗框尺寸的迴歸,由於先驗框聚類是尋找與全部樣本框的平均IOU最大的中心點,也即1-IOU最小的中心點。所以做者把聚類的距離定義爲下式: d(box,controid) = 1 - IOU(box,controid) 最終平均IOU與類簇數量之間的關係以下圖:

能夠看出取5個Anchor Box比較合適。上圖中右圖是聚類後的Anchor Box尺寸,明顯,數據集中高瘦的樣本更多,寬矮的樣本很少。

2)location prediction

Faster R-CNN預測中心點座標,預測的是相對與anchor box長寬的相對值。

上式是Faster R-CNN中模型輸出與預測框中心座標、長寬的關係,x、y、w、h是預測框的中心點座標和長寬,x_a、y_a、w_a、h_a是GT框的中心點座標和長寬,t_x、t_y、t_w、t_h是模型輸出。 明顯的,t_x、t_y、t_w、t_h預測的都是相對值。

上圖是YOLOv2中模型輸出與預測框中心座標、長寬的關係。t_x、t_y、t_w、t_h是模型輸出,b_x、b_y、b_w、b_h是預測框的中心點座標和長寬,p_h、p_w是先驗框的長寬。 明顯的,t_w、t_h預測的都是相對值,與Faster R-CNN相同。但t_x、t_y預測是GT框相對於所在cell左上角的絕對座標。

這兩項改進的提高效果是極其顯著的,性能增長了4.8mAP。

八、passthrough

提高1.0mAP SSD使用多分辨率輸出,YOLOv2則採用了另一個思路,將高分辨率的特徵融合到輸出所用的分辨率的feature map。這其實離低分辨率特徵融合到高分辨率特徵的FPN很是近了,惋惜惋惜。 具體怎麼作的呢?以下圖

將最後一個26x26x512的feature map,reshape成13x13x2048,再與最後一個13x13x1024的feature map Concatenate。而後再進行物體檢測。

最終性能提高1.0mAP。

九、multi-scale

提高1.4mAP 再進行物體檢測訓練時(是在VOC或者COO上,不是在ImageNet),輸入圖片的分辨率不固定,而是隨機從{320, 352, …, 608}中選取一個。這樣使整個網絡具備分辨率自適應的能力,避免過擬合於一個分辨率。

十、hi-res detector

提高1.8mAP 由於全卷積實現,YOLOv2輸入的分辨率能夠任意調整,輸入分辨率越高,準度也越大。所以high resolution detector也能夠提高性能。

COCO上的性能表現

不幸的是,YOLOv2在COCO上的表現都不好,都不如SSD300。

主要是YOLOv2對小物體檢測不給力,backbone也不夠強大。這個問題在YOLOv3上有所改善,但仍是有所欠缺。

不過不要緊,快並且準度OK就好了,生產環境場景沒有COCO那麼複雜。

結論

YOLOv2充分展現了各個trick累計產生的巨大能量。昭示咱們,不要小看任何一個小trick的做用。 YOLOv2在COCO上的表現依舊差強人意,主要是YOLOv2對小物體檢測不給力,backbone也不夠強大。 真心但願看到一個又快又準的YOLOv4?

相關文章
相關標籤/搜索