YOLOv2論文閱讀理解

YOLO9000: Better, Faster, Stronger

注:本文不區分YOLO9000或者YOLOv2的描述,儘管本質上它們可能微微有所區別,但統一用YOLOv2描述本文提到的算法。

YOLOv2

標題的名字就是提出的網絡能檢測9000種物體,因爲網絡訓練的時候是通過某種方式結合了檢測數據集和分類數據集(沒有真實邊界框)進行訓練的,所以有一定能力檢測那些只在分類數據集出現而沒有在檢測數據集出現過的物體,但mAP很低,大致只有十幾。一般來講分類任務的訓練樣本標籤比較容易標,相比之下檢測任務的框就比較難標記,短期內也不見得檢測樣本會有大規模的增加,所以作者傾向於用一種弱監督的方式來利用未標記的數據做檢測。值得注意的是,YOLOv2仍一如既往地保持實時運行的能力。

網絡改進與提高

YOLOv1一個最大的問題就是容易發生定位錯誤,因此其與利用了region proposal的算法對比來說有更低的召回率。本文的工作就是基於第一版的YOLO,考慮更多更新的理念,其中涉及到的一些改進羅列如下面這張表:

在這裏插入圖片描述

下面對YOLOv2較於YOLOv1最大的改進進行分析,具體的改進所帶來的提升看上面那個。(我猜那個hi-res應該是結合多尺度分辨率訓練的意思(hierarchical-resolution?),即不斷改變輸入圖像尺寸,**僅個人理解)

1、批規範化:YOLOv2移除了YOLOv1中的dropout層,並且在所有的卷積層後面添加Batch normalization。

2、多分辨率訓練:實際訓練時先用低分辨率在ImageNet上訓練分類,然後分辨率增大到448×448448\times 448在ImageNet繼續fine tune分類任務10個epoch,最後再把分類任務改成檢測任務進行fine tune。

3、使用Anchor Boxes(寬高不同的幾個預選框):移除了YOLOv1中的全連接層,學習Faster R-CNN中的region proposal network預測座標補償(offsets),採用了anchor boxes方法。通過預測補償而不是直接預測座標位置大大簡化了檢測問題,也使得網絡的訓練變得更容易。不過使用anchor boxes會使原本只需要預測的98個boxes增加到上千個。anchor boxes的出現使得mAP微微下降0.3個點,但使召回率上升7%個點,總體來說還是提升比較多。

4、增大輸出尺寸:YOLOv2移除了一個池化層,使得分辨率上升一個量級,並且把YOLOv1的輸入尺寸448×448448\times 448改成了416×416416\times 416,這樣就保證最後一層特徵映射一定有一箇中心點,方便預測那些幾何中心恰好和特徵映射中心重合的物體。

5、anchor boxes聚類:一般anchor boxes的大小和比值設定一般是手選的,而網絡能根據這些預設定的boxes尺寸去適配學習到合適的參數。但是作者認爲如果可以通過優化這些預先能設定好的尺寸,就能使得網絡把所有注意力集中在要學的東西。爲了解決這個問題,這裏採用了一個k-means聚類的方法,並且用IOU指標作爲距離度量方法(傳統的度量方法歐式距離會使得小物體更敏感,而IOU是和框的尺寸解耦的,與框大小沒有關係)。該定義的距離d(box,centroid)=1IOU(box,centroid)d(box, centroid)=1-IOU(box, centroid),從公式中可知IOU越大,這個距離也就越小,說明兩個IOU重合度高的框容易被分到一個類。這裏一共聚了5個類,也就是在實際訓練中每個grid都會有5個預設定好的anchor boxes。下面這張表,例舉了anchor boxes個數和是否使用k-means帶來的提升:

在這裏插入圖片描述

6、定位預測:在預測(x, y)的時候採用sigmoid來把數值限制在(0, 1)中,因爲如果不這麼限定,可能原本A grid負責的一個物體會跑到B grid中,極大導致訓練的不穩定性。具體的計算方式如下,其中cx,cyc_x, c_y是某個grid相對於輸入圖片左上角的位置補償。

在這裏插入圖片描述

這個公式中具體的參數都可以從下面那種圖直觀看到:

在這裏插入圖片描述

7、細粒度特徵:網絡把較前的26×2626\times 26分辨率的特徵映射層通過一個通道疊加到最後的13×1313\times 13的特徵映射層。爲了可以使得尺寸適配,直接通過通道concatenate,本文的做法是把大分辨率特徵映射中相鄰的特徵像素打散到不同的通道中,使得26×26×51226\times 26\times 512變成13×13×102413\times 13\times 1024。(說是類似ResNet的做法?)

8、多尺度訓練:YOLOv2的圖像輸入從原本YOLOv1的448×448448\times 448換成了416×416416\times 416,但是訓練固定尺寸並不能給網絡帶來圖片不同尺度預測的魯棒性,因此,YOLOv2採取了一種多尺度的訓練策略。具體是每當進行10個batches的運算後,隨機從一個32倍數像素的集合{320,352,...,608}\{320, 352, ..., 608\}挑選一個尺寸進行訓練,也就是最小訓320像素的,最大有608像素。當然,實際預測的時候用小像素能提高運算速度,比如288×288288\times 288的能達到90 fps。高分辨率的時候,mAP能達到SOTA效果。

下表是YOLOv2用不同分辨率輸入得到的輸出結果,所有網絡的權重都來自於同一個訓練好的模型,也就是不同分辨率測試所用的權重都是一樣的,而沒有針對某個分辨率單獨練一個權重。速度測試是基於Titan X。

在這裏插入圖片描述

優化結構提升質量與速度

一些檢測網絡用VGG-16來作爲檢測器,但作者認爲其浮點計算量太大,因此YOLOv1採用了基於GoogLenet的結構,其比VGG-16的浮點計算少很多。在ImageNet分類方面,YOLOv1結果的效果僅僅比VGG-16遜色2個百分點。這次作者爲YOLOv2新提出了一個Darknet-19,類似VGG,大部分用的都是3×33\times 3的濾波器,每遇到下采樣,就加倍通道數。參考NIN網絡,Darknet-19採用了1×11\times 1的核來壓縮通道數量。整個Darknet-19包含有19個卷積層和5個池化層,下面是具體的結構信息。

在這裏插入圖片描述

分類時:類似YOLOv1,YOLOv2在數據增強方面採用了隨機裁剪、旋轉、調整色度、飽和度和曝光度(exposure shifts不知是否是這麼翻譯)。

檢測時:把分類的最後一層移掉,然後使用1024個3×33\times 3的核來生成特徵映射,然後用1×11\times 1的核來生成最終需要的通道數目。比如對於VOC,作者預測了5個邊界框,每個有5個座標相關信息和20個類別,因此就會需要125個1×1×10241\times 1\times 1024的核。

更魯棒、功能更強

本文作者提出了一種能結合分類和檢測數據的一種訓練策略,使得網絡對標準的檢測數據集中沒出現過的一些類別也有一定的泛化能力。在訓練的時候,當輸入的訓練數據是標準的檢測數據集,就會計算標準的YOLOv2損失函數,也就是所有的損失項都會用上,而當數據集是用於分類的,就只對特定的分類相關的loss進行計算。

當然這種簡單操作也有一些問題,比如檢測狗只標記“Dog”,對於分類任務可能比較細化,即可能會把狗標記爲“Norfolk terrier”或者“Yorkshire terrier”等等(都是狗的類別),這就會導致明明都是狗類,而在檢測的時候就會有些波動。具體怎麼處理的作者利用了文本層級分類的信息,這裏在原文中有比較詳細的描述,有興趣自行了解。

作者把最終的效果在ImageNet detection任務上進行了測試,該任務共有44種與COCO數據集一模一樣的類別,也就是數據集中剩餘的大部分類別是YOLOv2沒有使用完整的標準檢測數據集學習過的。儘管如此,對於包含有156中YOLOv2從沒見過的檢測數據,效果仍有16mAP。不過對於衣物等樣式過多的物體類別,YOLOv2可以說基本是瞎子了,什麼都預測不到。

總結

大幅優化了YOLOv1沒注意到的一些結構特性。提出了Darknet-19。能巧用分類數據使得檢測器能檢測一些沒學習過的box。作者提到未來弱監督可能是一個還不錯的研究方向。

YOLOv1
YOLOv3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章