Yolo v2 論文名稱 Yolo9000:Better,Faster,Stronger

該論文實際上包含了2個模型,Yolov2 和 Yolo9000,Yolo v2 是在 Yolo v1 基礎上進行了改進, 此外作者提出了一種 檢測和分類 的聯合訓練方法,並用該方法在 COCO 檢測數據集 和 ImageNet 分類數據集上訓練 Yolo v2,把得到的模型稱為 Yolo9000,其可以預測超過 9000 類物體

 

Yolo v2 改進策略

Yolo v1 雖然速度很快,但與 R-CNN 系列相比,它的 mAP 相對較低,且 定位 精度 和 召回率也較低;

Yolo v2 在保證速度的前提下,提出瞭如下改進措施,明顯提高了 mAP,且 定位 精度和 recall 也有提高

yolo目標檢測實際流程圖_卷積

可以看到 mAP 從 63 提高到了 78 

 

Yolo v2 算法的邏輯同 Yolo v1,也是 分為多個 cell, 每個 cell 生成 bbox,然後迴歸,本文只講述不同點

 

Batch Normalize 

BN 我在其他博客詳細闡述過;

在 Yolo v2 中增加了 BN,去掉了 Dropout,使得:

收斂更快:使得梯度保持在合理範圍,避免梯度消失

收斂效果更好:以 relu 為例,BN 把輸出規範到 0-1 附近,小於 0 的神經元被歸 0,相當於棄掉該神經元,Dropout,避免過擬合

mAP 提高 2.4% 

 

主網絡

Yolo v1 的主網絡是 GoogleNet,Yolo v2 的主網絡是作者自己設計,稱為 Darknet-19,包括19個卷積層和5個 max pooling 層,

網絡結構類似於 VGG16,主要採用 3x3 卷積,每次 2x2 max pooling 後,feature map 的尺寸降低 2倍, channels 增加2 倍,

與 NIN (network in network)類似,最後採用 globel avgpool 做預測,

在 3x3 的卷積之間,加上 1x1 的卷積壓縮特徵圖,以降低參數量,

卷積層後面加上了 BN 層,

Darknet-19的top-1準確度為72.9%,top-5準確度為91.2%,但是模型參數相對小一些,

使用Darknet-19之後,YOLOv2的mAP值沒有顯著提升,但是計算量卻可以減少約33%

yolo目標檢測實際流程圖_yolo目標檢測實際流程圖_02

作者用這個網絡是為了更快,自己可以更換

 

passthrough 檢測細粒度特徵

這是一種類似於 resnet 的設計;

目標檢測的難點是目標有大有小,在經過多層卷積後,特徵圖中小目標的特徵已經不明顯甚至被忽略,

為了更好地識別較小的目標,在最後的特徵圖中加上更細粒度的特徵是有必要的,

Yolo v2 引入了 passthrough 層保留細粒度特徵,如下圖

yolo目標檢測實際流程圖_卷積_03

在最後一個 max pooling 之前,假設feature map 大小為 26x26x512,

然後經過 max pooling,變為 13x13x512,後面經過連續卷積,變為 13x13x1024,

然後把 26x26 加到 13x13 的 feature map 上,最終得到 13x13x3072 的 feature map

 

那麼問題來了,不同的卷積池化層的輸出尺寸肯定不同,如何相加呢?方式如下

yolo目標檢測實際流程圖_yolo目標檢測實際流程圖_04

 另外,作者在後期的實現中借鑑了ResNet網絡,不是直接對高分辨特徵圖處理,而是增加了一箇中間卷積層,先採用64個 

 卷積核進行卷積,然後再進行passthrough處理,這樣 

 的特徵圖得到 

 的特徵圖。這算是實現上的一個小細節。

使用Fine-Grained Features之後YOLOv2的性能有1%的提升

 

全卷積網絡 支持 多尺度輸入

在 Yolo v1 中,輸入只能是 448x448,因為後面有全連接層,所以輸入尺寸固定; 

在 Yolo v2 中,使用卷積層替代了全連接層,使得輸入尺寸可變;

注意,全卷積不同尺寸輸入的輸出尺寸也不同;【思考如何處理?】

 

此外,在 Yolo v2 中,如果輸入是 448,需要 resize 為 416x416,為什麼呢?

作者發現,很多圖像中的大物體的中心都落在圖像的中心,【想象一下,不難明白】

而 Yolo v2 進過下采樣的步長為 32,448 經過 32 的下采樣為 14x14,這樣圖像的中心為 4 個 cell,用4個cell 來預測物體顯然不合適,

416 經過 32 的下采樣為 13x13,這樣圖像的中心為 1 個 cell,1個 cell 預測物體比較合適;

故輸入尺寸需遵循原則:使得 32 下采樣後 卷積尺寸為 奇數

 

引入 anchor box

Yolo v2 借鑑了 Faster R-CNN 中 anchor box(先驗框)的思路,事先設定了 多個(num) 不同 大小和 寬高比的建議框,每個 cell 生成 num 個 bbox,,這大大增加了 bbox 和 可預測物體的數量,13x13x9=1521,動輒上千,作者這樣做的結果是 recall 大幅增加,但 mAP 略微下降;

yolo目標檢測實際流程圖_寬高_05

 

================ 擴展 ================ 

recall 增加,mAP 降低

在 Yolo v1 中,每個 cell 生成 2 個 bbox,且只有一個 bbox 負責為 cell 預測,這使得模型最多預測 49 個物體,造成 recall 很低;

Yolo v2 生成大量的 bbox,能框到更多的物體,召回率就高了,由 81% 升到 88%,框了更多的物體,自然更容易出錯,mAP 下降

 

Yolo v2 anchor box 與 Yolo v1 bbox 輸出

1. Yolo v1 中每個 cell 的 bbox 共享分類概率值,Yolo v2 中每個 cell 的每個 bbox 都對應各自的分類概率值;

換句話説,v1 中每個 cell 預測一個物體,v2 中每個 bbox 預測一個物體;

(x,y,w,h,c) 輸出無差異;

 

Dimension Cluster

在 Yolo v1 中,bbox 是虛擬的,利用迴歸生成;

在 Faster R-CNN 中,人為設定 anchor box 的尺寸;【見上圖】

在 Yolo v2 中,anchor box 也是預先設定,只是具體寬高比通過 KMeans 生成;  【anchor 沒有 center,只有 w h】

這麼做是為了選擇更合適的先驗框,使得模型更容易學習,從而做出更好的預測;

具體做法如下,把訓練集中所有的 ground truth 進行 KMeans 聚類,正常情況下,KMeans 聚類以距離來衡量,此處聚類是為了找出常用的建議框尺寸,故作者以 IOU 作為衡量標準

yolo目標檢測實際流程圖_yolo目標檢測實際流程圖_06

 

yolo目標檢測實際流程圖_yolo目標檢測實際流程圖_07

上圖左邊為對 VOC 數據集和 COCO 數據集的建議框分別聚類結果,

【隨着 k 的增加,每個類別的 建議框 與 其平均建議框 的 IOU 逐漸增大,這句話是官方給出的,個人覺得沒用】

 隨着 k 的增加,每個 cell 生成的 bbox 增加,recall 會增加,但是模型複雜度也會增加,綜合考慮了 recall 和 複雜度,作者選擇 k=5

 

預測邊框的位置 

所有手動生成 建議框 的位置預測都是對 建議框的中心做平移,對建議框的寬高做拉伸,只是各個算法的公式略有不同;

Faster-RCNN 計算公式如下

yolo目標檢測實際流程圖_yolo目標檢測實際流程圖_08

 xa,ya 是建議框的中心,wa,ha 是建議框的寬高,x,y 是預測框中心,tx,ty 是需要學習的參數;

在 Yolo 論文中,是 -xa,但是根據 Faster-RCNN 應該是 +xa;

 

這個公式在問題在於,t 沒有任何約束,使得 x,y 即預測框可能在圖像的任意位置,如果初始預測框與 anchor box 偏移太大,就會導致很難學習到 tx,ty,或者説學習不穩定;

在 Yolo v2 中添加了約束,使得 預測框的中心 被限定在 建議框中心所在的 cell 中,

如下圖所示,虛線 p 為 建議框,藍色 cell 為 p 中心所在的 cell,藍色框為 預測框,Yolo v2 的約束保證 藍色框的中心 在 藍色 cell 內;

如何做到的呢?

設 cx,cy 是 藍色 cell 左上角到圖像左上角的距離,那麼 cx 加上一個 小於 cell 邊長的數就能保證得到的座標在 藍色 cell 內,即 cx+w*cell邊長,0<w<1

Yolo v2 中把 cell 大小歸一化為 1x1,用 func(t) 代替 w,使得  0<func(t)<1,很明顯,sigmoid 就可以;

故 Yolo v2 計算公式如下

yolo目標檢測實際流程圖_數據集_09

bx,by,bw,bh 是預測框的中心和寬高,Pr(object)*IOU(b,object) 為預測框的置信度,t 為 模型輸出;

在 Yolo v1 中用 C 表示置信度,是根據 loss 直接預測的;Yolo v2 需要對 t0 進行 sigmoid 變換

 

yolo目標檢測實際流程圖_卷積_10

這樣做使得預測框 與 先驗框不會偏離太大,容易學習,學習快,準確度也更高;

當然這樣做得益於 Yolo 系列對圖像進行了劃分,RCNN 系列是沒有的;

 

由於 cell 歸一化為 1,那麼 feature map 大小為 W,H,如13,13,下面我們需要計算 bx,by 相對於 feature map 的位置

yolo目標檢測實際流程圖_數據集_11

 

yolo目標檢測實際流程圖_數據集_12

 

yolo目標檢測實際流程圖_數據集_13

 

yolo目標檢測實際流程圖_卷積_14

然後 拿 bx 乘以整個圖像的像素值如 448x448,就得到了 圖像上的 實際位置

 

採用 高分辨率 圖像分類模型

目標檢測任務一般都會在 ImageNet 1000 數據集上預訓練 CNN 網絡進行特徵提取,其輸入為 224x224,這個分辨率較低,不利於目標檢測,

在 Yolo v1 中,將輸入 resize 為 448x448,提高分辨率,但是這樣直接切換分辨率,模型可能難以快速適應高分辨率;

在 Yolo v2 中,預訓練階段增加了 10 個 epochs,採用 448x448 輸入來 finetune CNN 網絡,這使得在用 檢測數據 finetune 之前模型已經適應了 高分辨率,

mAP 提升了約 4%

 

多尺度訓練

Yolo v2 是全卷積網絡,支持多尺度輸入,為了讓模型能夠適應多尺度輸入,在訓練時也採用多尺度訓練,具體做法如下:

由於 Yolo v2 是 32 位下采樣,故作者選擇 32 的整數倍 [320,352,...608] 多個尺寸作為模型輸入,每 10 個 batch 就隨機更換一種尺寸,

 

yolo目標檢測實際流程圖_yolo目標檢測實際流程圖_15

 

Loss

論文中並沒有明確指出 Yolo v2 的 loss function,網上大多是這麼寫的

yolo目標檢測實際流程圖_yolo目標檢測實際流程圖_16

公式解析:

W 為最終 feature map 的寬度;H 為最終 feature map 的高度,如 (13,13);

A 為每個 cell 的 anchor box 數,論文中為 5;每個 anchor box 對應一個 預測框;

三個求和 代表 遍歷每個 cell 的每個 預測框,

lmax_iou<Thresh 表示對於每個 預測框,計算它與所有 Ground Truth 的 IOU,並取最大的 IOU,如果 Max IOU < Thresh,表示它與所有 Ground Thresh 都不匹配,這個預測框就定義為背景,即沒有目標,       【論文中 Thresh=0.6】

如果是背景,lmax_iou<Thresh 為 1,否則為 0,

b 表示預測框的置信度,真實的背景置信度為 0,誤差就是 (0-b)^2,

第一項表示背景的置信度誤差;

lt<12800 表示前 12800 次迭代,12800 次後面的迭代不納入計算,

Σr€(x,y,w,h) 表示 遍歷 x,y,w,h,求和,

prior 表示 anchor box,b 表示 預測框,

第二項表示在前 12800 次迭代中 計算 預測框與先驗框的位置偏差,即 xywh 的差,

這樣做的目的是讓 預測框快速學習到先驗框的形狀;

yolo目標檢測實際流程圖_數據集_17

 表示 第 k 個預測框內有對象,

如何確定預測框內有對象呢?對於某個 ground truth,首先計算它的中心落在哪個 cell,然後計算該 cell 對應的 anchor box 與 該 ground truth 的 IOU, 這裏計算 IOU 時有點特殊,只比較形狀,不比較位置,通常的做法是,把 anchor box 和 ground truth 都移動到圖像左上角,然後計算 IOU,IOU 最大的那個 anchor box 與 ground truth 匹配,這個 anchor box 對應的預測框內就有對象,這個預測框負責預測 ground truth,

上述只是邏輯,具體實現時自行設計,

第3.1項表示 ground truth 與對應的預測框的座標誤差;

既然 

yolo目標檢測實際流程圖_數據集_17

 可以約束預測框內有對象,那麼置信度的計算就只是 IOU 了,IOUtruthk 表示 ground truth 的置信度,b 表示預測框的置信度,

λobj 是個係數,論文中取值為 1,

第3.2項表示 預測框與 ground truth 的置信度誤差;

第3.3項表示 預測框與 ground truth 的類別誤差;

一堆 λ 都是權重;

 

模型訓練與預測

訓練

Yolo v2 訓練主要分為 3 個階段

1. 在 ImageNet 上預訓練 Darknet-19,輸入為 224x224,訓練 160 個 epoch

2. 將輸入改為 448x448,繼續在 ImageNet 上 finetune Darknet-19,訓練 10 個 epoch

3. 修改 Darknet-19 分類模型為檢測模型,並在 檢測數據集上 finetune 模型

網絡修改如下:移除最後一個卷積層、global avgpooling層以及softmax層,並且新增了三個 

yolo目標檢測實際流程圖_卷積_19

卷積層,同時增加了一個pass through層,最後使用 

yolo目標檢測實際流程圖_卷積_20

 卷積層輸出預測結果,輸出的channels數為: 

yolo目標檢測實際流程圖_卷積_21

 

yolo目標檢測實際流程圖_卷積_22

 

預測

由於anchors數為5,對於VOC數據集輸出的channels數就是125,而對於COCO數據集則為425。

以VOC數據集為例,最終的預測矩陣為 

 (shape為 

 ),可以先將其reshape為 

 ,其中 

 為邊界框的位置和大小 

 , 

 為邊界框的置信度,而 

 為類別預測值。

 

模型效果

用 VOC 數據集進行測試,輸入尺寸較小時,Yolo v2 mAP 較低,速度非常快,輸入尺寸較大時,mAP 很高,速度略慢

yolo目標檢測實際流程圖_寬高_23

 

Yolo 9000

後續更新... 

 

 

 

參考資料:

https://zhuanlan.zhihu.com/p/35325884

https://zhuanlan.zhihu.com/p/47575929

https://zhuanlan.zhihu.com/p/40659490

https://zhuanlan.zhihu.com/p/74540100