專欄 | 目標檢測演算法之YOLOv2
- 2019 年 12 月 2 日
- 筆記
前言
昨天介紹了 YOLO 系列的第一個演算法 YOLOv1,並詳細分析了 YOLOv1 的網路結構以及損失函數等。今天我們將來分析一下 YOLO 目標檢測演算法系列的 YOLOv2 和 YOLO9000。
YOLOv2
- 原理
YOLOv1 作為 One-Stage 目標檢測演算法的開山之作,速度快是它最大的優勢。但我們知道,YOLOv1 的定位不夠准,並且召回率低。為了提升定位準確度,提高召回率,YOLOv2 在 YOLOv1 的基礎上進行了改進。具體的改進方法如圖 Fig1 所示:

Fig 1
可以看到 YOLOv2 通過增加一些 Trick 使得 v1 的 map 值從 63.4 提高到了 78.6,說明了 YOLOv2 改進方法的有效性。接下來我們就分析一下這些改進方法。
- 批量歸一化
這個應該不用多說了,YOLOv2 在每個卷積層後面增加了 VB 層,去掉全連接的 dropout。使用 BN 策略將 map 值提高了 2%。
- 高解析度
當前大多數目標檢測網路都喜歡使用主流分類網路如 VGG,ResNet 來做 Backbone,而這些網路大多是在 ImageNet 上訓練的,而解析度的大小必然會影響到模型在測試集上的表現。所以,YOLOv2 將輸入的解析度提升到

,同時,為了使網路適應高解析度,YOLOv2 先在 ImageNet 上以

的解析度對網路進行 10 個 epoch 的微調,讓網路適應高解析度的輸入。通過使用高解析度的輸入,YOLOv2 將 map 值提高了約 4%。
- 基於卷積的 Anchor 機制
YOLOv1 利用全連接層直接對邊界框進行預測,導致丟失較多空間資訊,定位不準。YOLOv2 去掉了 YOLOv1 中的全連接層,使用 Anchor Boxes 預測邊界框,同時為了得到更高解析度的特徵圖,YOLOv2 還去掉了一個池化層。由於圖片中的物體都傾向於出現在圖片的中心位置,若特徵圖恰好有一個中心位置,利用這個中心位置預測中心點落入該位置的物體,對這些物體的檢測會更容易。所以總希望得到的特徵圖的寬高都為奇數。YOLOv2 通過縮減網路,使用 416×416 的輸入,模型下取樣的總步長為 32,最後得到 13×13 的特徵圖,然後對 13×13 的特徵圖的每個 cell 預測 5 個 anchor boxes,對每個 anchor box 預測邊界框的位置資訊、置信度和一套分類概率值。使用 anchor boxes 之後,YOLOv2 可以預測 13x13x5=845 個邊界框,模型的召回率由原來的 81% 提升到 88%,mAP 由原來的 69.5% 降低到 69.2%.召回率提升了 7%,準確率下降了 0.3%。這裡我們和 SSD 以及 Faster-RCNN 做個對比,Faster RCNN 輸入大小為 1000*600 時的 boxes 數量大概是 6000,在 SSD300 中 boxes 數量是 8732。顯然增加 box 數量是為了提高 object 的定位準確率。
- 維度聚類
在 Faster-RCNN 中,Anchor 都是手動設定的,YOLOv2 使用 k-means 聚類演算法對訓練集中的邊界框做了聚類分析,嘗試找到合適尺寸的 Anchor。另外作者發現如果採用標準的 k-means 聚類,在 box 的尺寸比較大的時候其誤差也更大,而我們希望的是誤差和 box 的尺寸沒有太大關係。所以通過 IOU 定義了如下的距離函數,使得誤差和 box 的大小無關:

下圖 Fig2 展示了聚類的簇的個數和 IOU 之間的關係,兩條曲線分別代表了 VOC 和 COCO 數據集的測試結果。最後結合不同的 K 值對召回率的影響,論文選擇了 K=5,Figure2 中右邊的示意圖是選出來的 5 個 box 的大小,這裡紫色和黑色也是分別表示兩個不同的數據集,可以看出其基本形狀是類似的。而且發現聚類的結果和手動設置的 anchor box 大小差別顯著。聚類的結果中多是高瘦的 box,而矮胖的 box 數量較少,這也比較符合數據集中目標的視覺效果。

Fig 2
在結果測試時,YOLOv2 採用的 5 種 Anchor 可以達到的 Avg IOU 是 61,而 Faster-RCNN 採用 9 種 Anchor 達到的平均 IOU 是 60.9,也即是說本文僅僅選取 5 種 Anchor 就可以達到 Faster-RCNN 中 9 種 Anchor 的效果。如 Table1 所示:

- 新 Backbone:Darknet-19
YOLOv2 採用 Darknet-19,其網路結構如下圖所示,包括 19 個卷積層和 5 個 max pooling 層,主要採用

卷積和

卷積,這裡

卷積可以壓縮特徵圖通道數以降低模型計算量和參數,每個卷積層後使用 BN 層以加快模型收斂同時防止過擬合。最終採用 global avg pool 做預測。採用 YOLOv2,模型的 mAP 值沒有顯著提升,但計算量減少了。

- 直接位置預測
YOLOv2 在引入 Anchor 的時候碰到第 2 個問題:模型不穩定,尤其是訓練剛開始階段。論文任務這種不穩定主要來自 box 的(x,y)預測值。我們知道在 Faster-RCNN 中,是通過預測下圖中的 tx 和 ty 來得到(x,y)值,也就是預測的是 offset。另外關於文中的這個公式,這個地方應該把後面的減號改成加號,這樣才能符合公式下面的 example。這裡xa和ya是 anchor 的坐標,wa和ha是 anchor 的 size,x和y是坐標的預測值,tx和ty是偏移量。

例子翻譯過來是:當預測

時,就會把 box 向右邊移動一定距離(具體為 anchor box 的寬度),預測

時,就會把 box 向左邊移動相同的距離。這個公式沒有任何限制,使得無論在什麼位置進行預測,任何 anchor boxes 可以在影像中任意一點結束,模型隨機初始化後,需要花很長一段時間才能穩定預測敏感的物體位置。
注意,高能來了!!!
分析了原因之後,YOLOv2 沒有採用直接預測 offset 的方法,還是沿用了 YOLO 演算法中直接預測相對於 grid cell 的坐標位置的方式。前面提到網路在最後一個卷積層輸出 13*13 大小的特徵圖,然後每個 cell 預測 5 個 bounding box,然後每個 bounding box 預測 5 個值:

和

(這裡的

類似 YOLOv1 中的 confidence)。

和

經過 sigmoid 函數處理後範圍在 0 到 1 之間,這樣的歸一化處理使得模型訓練更加穩定。

和

表示一個 cell 和影像左上角的橫縱距離。

和表示 bounding box 的寬高,這樣 bx 和 by 就是 cx 和 cy 這個 cell 附近的 anchor 來預測 tx 和 ty 得到的結果。如 Fig3 所示:

其中,

和

表示 grid cell 與影像左上角的橫縱坐標距離,黑色虛線框是 bounding box,藍色矩形框就是最終預測的結果。注意,上圖右邊裡面的

可以理解為

可以理解為

每一個輸出的 bounding box 是針對於一個特定的 anchor,anchor 其實是 bounding box 的 width 及 height 的一個參考。

和

是某個 anchor box 的寬和高,一個格子的 Cx 和 Cy 單位都是 1,

是相對於某個格子左上角的偏移量。
- 細粒度特徵
YOLOv2 提取 Darknet-19 最後一個 max pool 層的輸入,得到 26x26x512 的特徵圖。經過 1x1x64 的卷積以降低特徵圖的維度,得到 26x26x64 的特徵圖,然後經過 pass through 層的處理變成 13x13x256 的特徵圖(抽取原特徵圖每個 2×2 的局部區域組成新的 channel,即原特徵圖大小降低 4 倍,channel 增加 4 倍),再與 13x13x1024 大小的特徵圖連接,變成 13x13x1280 的特徵圖,最後在這些特徵圖上做預測。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%。這個過程可以在下面的 YOLOv2 的結構圖中看得很清楚:

- 多尺度訓練
OLOv2 中使用的 Darknet-19 網路結構中只有卷積層和池化層,所以其對輸入圖片的大小沒有限制。YOLOv2 採用多尺度輸入的方式訓練,在訓練過程中每隔 10 個 batches,重新隨機選擇輸入圖片的尺寸,由於 Darknet-19 下取樣總步長為 32,輸入圖片的尺寸一般選擇 32 的倍數{320,352,…,608}。採用 Multi-Scale Training, 可以適應不同大小的圖片輸入,當採用低解析度的圖片輸入時,mAP 值略有下降,但速度更快,當採用高解析度的圖片輸入時,能得到較高 mAP 值,但速度有所下降。
這種機制使得網路可以更好地預測不同尺寸的圖片,意味著同一個網路可以進行不同解析度的檢測任務,在小尺寸圖片上 YOLOv2 運行更快,在速度和精度上達到了平衡。在小尺寸圖片檢測中,YOLOv2 成績很好,輸入為 228 * 228 的時候,幀率達到 90FPS,mAP 幾乎和 Faster R-CNN 的水準相同。使得其在低性能 GPU、高幀率影片、多路影片場景中更加適用。在大尺寸圖片檢測中,YOLOv2 達到了 SOAT 結果,VOC2007 上 mAP 為 78.6%,仍然高於平均水準,下圖是 YOLOv2 和其他網路的精度對比:

速度對比:

訓練
YOLOv2 的訓練主要包括三個階段。
第一階段:作者使用 Darknet-19 在標準 1000 類的 ImageNet 上訓練了 160 次,用的隨機梯度下降法,starting learning rate 為 0.1,polynomial rate decay 為 4,weight decay 為 0.0005 ,momentum 為 0.9。訓練的時候仍然使用了很多常見的數據擴充方法(data augmentation),包括 random crops, rotations, and hue, saturation, and exposure shifts。(這些訓練參數是基於 darknet 框架,和 caffe 不盡相同)初始的 224 * 224 訓練後,作者把解析度上調到了 448 * 448,然後又訓練了 10 次,學習率調整到了 0.001。高解析度下訓練的分類網路在 top-1 準確率 76.5%,top-5 準確率 93.3%。
第二個階段:分類網路訓練完後,就該訓練檢測網路了,作者去掉了原網路最後一個卷積層,轉而增加了三個 3 * 3 * 1024 的卷積層(可參考 darknet 中 cfg 文件),並且在每一個上述卷積層後面跟一個 1 * 1 的卷積層,輸出維度是檢測所需的數量。對於 VOC 數據集,預測 5 種 boxes 大小,每個 box 包含 5 個坐標值和 20 個類別,所以總共是 5 * (5+20)= 125 個輸出維度。同時也添加了轉移層(passthrough layer ),從最後那個 3 * 3 * 512 的卷積層連到倒數第二層,使模型有了細粒度特徵。作者的檢測模型以 0.001 的初始學習率訓練了 160 次,在 60 次和 90 次的時候,學習率減為原來的十分之一。其他的方面,weight decay 為 0.0005,momentum 為 0.9,依然使用了類似於 Faster-RCNN 和 SSD 的數據擴充(data augmentation)策略。
總結
YOLOv2 借鑒了很多其它目標檢測方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度檢測。除此之外,YOLOv2 在網路設計上做了很多 tricks,使它能在保證速度的同時提高檢測準確率,Multi-Scale Training 更使得同一個模型適應不同大小的輸入,從而可以在速度和精度上進行自由權衡。