YoloV1
一. Yolo的核心思想就是把整張圖作爲網絡的輸入, 直接在輸出層迴歸bounding box的位置及其類別.
二. 實現方法:
- 將圖像分成S*S個網格, 每個網格預測B個bounding box, 每個bounding box輸出5個值, 包括p, x, y, w, h
- 每個網格還需要輸出C個類別概率. 所以給定一張圖片, 網絡輸出維度爲S * S * (5*B+C). 例如在PASCAL VOC中, 圖像輸入爲448 * 448, S=7, B=2, 20個類別, 於是輸出爲7 * 7 * 30.
- 網絡結構:
網絡基本結構爲GoogleNet, 只是去掉了Inception模塊用1 * 1 + 3 * 3 的卷積結構替代(簡化). 最後把GoogleNet的classifier output用4個卷積層和2個全連接層替換掉, 得到想要的輸出維度. 因爲使用了全連接層, 預測圖片必須和訓練圖片分辨率一致. - 損失函數:
訓練的時候, 分三個部分計算損失, 包括"座標損失", “IOU損失"和"類別損失”.
座標損失: 只計算label中有物體的格子所對應的box.
用label中的座標x,y, w, h與predict得到的box的x',y', w', h'做平方和損失.
其餘沒有物體的格子中的box座標不計入損失函數中.
x, y, w, h都歸一化到0-1之間.
應該更重視座標預測, 所以座標損失賦予更大的權重, 5.
注意: 座標損失中, w和h的計算取了根號, 原因是相等的誤差值, 對大物體的影響應該小於對小物體的影響. 根據平方根函數(如下圖)來看, 取平方根能一定程度緩解這個問題(仍然沒有解決).
IOU損失: 計入損失函數的目的是爲了優化所有box的p值(置信度).
對於有物體的格子, 它的box中的p值應該儘可能的大, 此時把IOU作爲p值, 就是希望p儘可能等於1, 表示predict的座標與label的座標儘可能重合.
對於沒有物體的格子, 它的box中的p值應該儘可能等於0, 方便後續根據p值把這些box過濾掉.
同時, 因爲沒有物體的格子更多, 數據不平衡, 所以對這些box設置權重爲0.5, 減弱每個box的影響.
類別損失: 關注有物體的格子做的分類預測是否準確, 把分類誤差計入損失中.
-
訓練過程:
a. 先用ImageNet預訓練: Yolo的前20個卷積層 + 1個average池化層 + 1個全連接層做分類. 圖像分辨率爲224 * 224.
b. 前20個卷積層得到了初始化, 然後接上4個卷積層 + 2個全連接層得到檢測模型. 在Pascal Voc上用448 * 448的圖片訓練檢測模型. -
預測:
預測的時候, 對網絡得到的所有box, 先把p小於0.5(閾值, 可調節)的box先去掉, 然後對剩下的box, 用非極大值抑制法(NMS)篩選得到最終的結果. -
Yolo的優點:
a. 快: 高準確率下的實時檢測.
b. 背景誤檢率低. 因爲Yolo能看到全局圖像, 而基於region的rcnn/fast rcnn等只能看到局部圖像. -
Yolo的缺點:
a. 對相互靠近的物體以及小物體的檢測效果不好, 因爲一個格子只能檢測一個物體, 並且算loss的時候即使對w和h開了根號, 小物體的位置偏差仍然對loss貢獻不大, 因此沒有做到很好的優化.
b. 泛化能力弱, 對於非常見形狀的物體檢測效果不好.
YoloV2
YoloV2的目標是提高定位的準確度, 以及改善recall(召回率/查全率).
改進之處有:
- Batch Normalization: 卷積層全部使用Batch Normalization, 同時取消Dropout.
- 高分辨率分類器: V1中用224 * 224的圖片來訓練分類器網絡, 然後用448 * 448的圖像來微調檢測網絡. V2除了224 * 224的圖像, 還用了448 * 448的圖像來微調分類器網絡, 讓filter有時間來調整.