YOLOv2在第一個版本的基礎上做了不少的改進,包括網絡結構和訓練的小技巧,anchor機制的加入,本文將對這些改進做一個梳理。
總覽
作者的實驗結果總結,可以發現有很多的工程性質的trick,背后的理論卻不是很多,感覺上是實驗性質,能work,還要啥自行車呢?
改進分析
Batch Normalization
這個就像卷積網絡中的神器,加上之后又能防止過擬合又能加速收斂。原理上,對每一批訓練數據統計通道上的均值和方差,再做歸一化處理,預測的時候只有一張圖片,統計性質不好,用訓練集的期望代表均值和方差。具體原理有很多博文解釋,我一直處於不甚明白本質的狀態。
加上BN之后有了2個點的提升。
大尺度預訓練分類
目標檢測的基礎網絡一般都是從分類網絡來的,而且通常采用分類網絡的權值初始化。問題在於,分類網絡設計時輸入尺寸是224,而目標檢測對輸入尺寸是有要求的,一般輸入尺寸越大,准確率越好。這就導致初始化的權重不一定適合檢測網絡。
預訓練初始化,主要目的是初始化淺層的一些卷積核,這些卷積核所提取的特征被認為具有通用性,用448的輸入訓練分類,再作為初始化會比224的好很多,提升了4個點!
新網絡和跳躍結構
用了性能更好的網絡,加上了passthrough層,該層將\(26 \times 26 \times 512\)的淺層特征,通過一定的組合轉換成\(13 \times 13 \times 2048\)的特征圖,再與網絡深層對應空間大小的特征圖融合,提升1個點多。
多尺度訓練
這個不太明白,也是trick吧,確實有作用,能提升1個點!
anchor機制
每個網格對應5個box,並且這5個box的類別可以不同,具有先驗的wh,wh是對數據集的聚類分析得到的。
cxcy仍然和v1一樣,是距離當前網格左上角的偏差,並被歸一化到0-1之間,而寬高則變為相對於匹配的anchor的寬高,匹配anchor應該是根據IOU來的。
anchor機制的目標如下圖所示
對v2的一些個人理解
對於網絡和訓練上的改進,就不多說了,說一下anchor機制。
v2和v1有哪些差別?v2每個網格的box自帶wh,可以為不同的類別,我覺得這就是最大的差別,v2網格的每個box更合理一些。這樣的好處:1.對聚集的小目標更好;2.對不同大小的目標匹配不同的anchor box,計算wh時有各自的基准wh。
YOLO的anchor與SSD的有什么不同?1.YOLO固定了anchor box的中心點范圍;2.匹配機制不同,YOLO根據目標中心點確定網格,再從網格中選擇合適的box,貌似不存在匹配不到的情況,SSD根據IOU大小匹配,有些位置出現的某些大小的目標IOU都小於閾值,只能匹配一個IOU最大的;3.anchor box的寬高設置上,YOLO對數據集作聚類分析,其實SSD也可以借鑒了,這種聚類分析受到數據集的影響,對新數據集可能要重做一遍才比較好,泛化性不強。