YOLOv2 論文筆記

論文地址:YOLO9000: Better, Faster, Stronger
項目主頁:YOLO: Real-Time Object Detection

最近博客下很多人請求Caffe 代碼,受人所託,已經不再提供,且關閉本文評論,望請見諒

概述

時隔一年,YOLO(You Only Look Once: Unified, Real-Time Object Detection)從v1版本進化到了v2版本,作者在darknet主頁先行一步放出源代碼,論文在我們等候之下終於在12月25日發佈出來,本文對論文重要部分進行了翻譯理解工作,不一定完全對,如有疑問,歡迎討論。博主如果有新的理解,也會更新文章。

新的YOLO版本論文全名叫“YOLO9000: Better, Faster, Stronger”,主要有兩個大方面的改進:

第一,作者使用了一系列的方法對原來的YOLO多目標檢測框架進行了改進,在保持原有速度的優勢之下,精度上得以提升。VOC 2007數據集測試,67FPS下mAP達到76.8%,40FPS下mAP達到78.6%,基本上可以與Faster R-CNN和SSD一戰。這一部分是本文主要關心的地方。

第二,作者提出了一種目標分類與檢測的聯合訓練方法,通過這種方法,YOLO9000可以同時在COCO和ImageNet數據集中進行訓練,訓練後的模型可以實現多達9000種物體的實時檢測。這一方面本文暫時不涉及,待後面有時間再補充。

回顧YOLOv1

YOLOv2始終是在v1版本上作出的改進,我們先簡單回顧YOLOv1的檢測步驟:

這裏寫圖片描述

(1) 給個一個輸入圖像,首先將圖像劃分成7 * 7的網格。

(2) 對於每個網格,每個網格預測2個bouding box(每個box包含5個預測量)以及20個類別概率,總共輸出7×7×(2*5+20)=1470個tensor

(3) 根據上一步可以預測出7 * 7 * 2 = 98個目標窗口,然後根據閾值去除可能性比較低的目標窗口,再由NMS去除冗餘窗口即可。

YOLOv1使用了end-to-end的迴歸方法,沒有region proposal步驟,直接回歸便完成了位置和類別的判定。種種原因使得YOLOv1在目標定位上不那麼精準,直接導致YOLO的檢測精度並不是很高。

YOLO檢測原理參考推薦博客:論文閱讀:You Only Look Once: Unified, Real-Time Object Detection

YOLOv2精度的改進(Better)

先來一個總覽圖,看看它到底用了多少技巧,以及這些技巧起了多少作用:

這裏寫圖片描述

Batch Normalization

CNN在訓練過程中網絡每層輸入的分佈一直在改變, 會使訓練過程難度加大,但可以通過normalize每層的輸入解決這個問題。新的YOLO網絡在每一個卷積層後添加batch normalization,通過這一方法,mAP獲得了2%的提升。batch normalization 也有助於規範化模型,可以在捨棄dropout優化後依然不會過擬合。

High Resolution Classifier

目前的目標檢測方法中,基本上都會使用ImageNet預訓練過的模型(classifier)來提取特徵,如果用的是AlexNet網絡,那麼輸入圖片會被resize到不足256 * 256,導致分辨率不夠高,給檢測帶來困難。爲此,新的YOLO網絡把分辨率直接提升到了448 * 448,這也意味之原有的網絡模型必須進行某種調整以適應新的分辨率輸入。

對於YOLOv2,作者首先對分類網絡(自定義的darknet)進行了fine tune,分辨率改成448 * 448,在ImageNet數據集上訓練10輪(10 epochs),訓練後的網絡就可以適應高分辨率的輸入了。然後,作者對檢測網絡部分(也就是後半部分)也進行fine tune。這樣通過提升輸入的分辨率,mAP獲得了4%的提升。

Convolutional With Anchor Boxes

之前的YOLO利用全連接層的數據完成邊框的預測,導致丟失較多的空間信息,定位不準。作者在這一版本中借鑑了Faster R-CNN中的anchor思想,回顧一下,anchor是RNP網絡中的一個關鍵步驟,說的是在卷積特徵圖上進行滑窗操作,每一箇中心可以預測9種不同大小的建議框。看到YOLOv2的這一借鑑,我只能說SSD的作者是有先見之明的。

這裏寫圖片描述

爲了引入anchor boxes來預測bounding boxes,作者在網絡中果斷去掉了全連接層。剩下的具體怎麼操作呢?首先,作者去掉了後面的一個池化層以確保輸出的卷積特徵圖有更高的分辨率。然後,通過縮減網絡,讓圖片輸入分辨率爲416 * 416,這一步的目的是爲了讓後面產生的卷積特徵圖寬高都爲奇數,這樣就可以產生一個center cell。作者觀察到,大物體通常佔據了圖像的中間位置, 就可以只用中心的一個cell來預測這些物體的位置,否則就要用中間的4個cell來進行預測,這個技巧可稍稍提升效率。最後,YOLOv2使用了卷積層降採樣(factor爲32),使得輸入卷積網絡的416 * 416圖片最終得到13 * 13的卷積特徵圖(416/32=13)。

加入了anchor boxes後,可以預料到的結果是召回率上升,準確率下降。我們來計算一下,假設每個cell預測9個建議框,那麼總共會預測13 * 13 * 9 = 1521個boxes,而之前的網絡僅僅預測7 * 7 * 2 = 98個boxes。具體數據爲:沒有anchor boxes,模型recall爲81%,mAP爲69.5%;加入anchor boxes,模型recall爲88%,mAP爲69.2%。這樣看來,準確率只有小幅度的下降,而召回率則提升了7%,說明可以通過進一步的工作來加強準確率,的確有改進空間。

Dimension Clusters(維度聚類)

作者在使用anchor的時候遇到了兩個問題,第一個是anchor boxes的寬高維度往往是精選的先驗框(hand-picked priors),雖說在訓練過程中網絡也會學習調整boxes的寬高維度,最終得到準確的bounding boxes。但是,如果一開始就選擇了更好的、更有代表性的先驗boxes維度,那麼網絡就更容易學到準確的預測位置。

和以前的精選boxes維度不同,作者使用了K-means聚類方法類訓練bounding boxes,可以自動找到更好的boxes寬高維度。傳統的K-means聚類方法使用的是歐氏距離函數,也就意味着較大的boxes會比較小的boxes產生更多的error,聚類結果可能會偏離。爲此,作者採用的評判標準是IOU得分(也就是boxes之間的交集除以並集),這樣的話,error就和box的尺度無關了,最終的距離函數爲:

這裏寫圖片描述

作者通過改進的K-means對訓練集中的boxes進行了聚類,判別標準是平均IOU得分,聚類結果如下圖:

這裏寫圖片描述

可以看到,平衡複雜度和IOU之後,最終得到k值爲5,意味着作者選擇了5種大小的box維度來進行定位預測,這與手動精選的box維度不同。結果中扁長的框較少,而瘦高的框更多(這符合行人的特徵),這種結論如不通過聚類實驗恐怕是發現不了的。

當然,作者也做了實驗來對比兩種策略的優劣,如下圖,使用聚類方法,僅僅5種boxes的召回率就和Faster R-CNN的9種相當。說明K-means方法的引入使得生成的boxes更具有代表性,爲後面的檢測任務提供了便利。

這裏寫圖片描述

Direct location prediction(直接位置預測)

那麼,作者在使用anchor boxes時發現的第二個問題就是:模型不穩定,尤其是在早期迭代的時候。大部分的不穩定現象出現在預測box的 (x,y) 座標上了。在區域建議網絡中,預測 (x,y) 以及 txty 使用的是如下公式:

這裏寫圖片描述

後來修改博文時,發現這個公式有誤,作者應該是把加號寫成了減號。理由如下,anchor的預測公式來自於Faster-RCNN,我們來看看人家是怎麼寫的:

這裏寫圖片描述

公式中,符號的含義解釋一下:x 是座標預測值,xa 是anchor座標(預設固定值),x 是座標真實值(標註信息),其他變量 ywh 以此類推,t 變量是偏移量。然後把前兩個公式變形,就可以得到正確的公式:

x=(txwa)+xay=(tywa)+ya

這個公式的理解爲:當預測 tx=1 ,就會把box向右邊移動一定距離(具體爲anchor box的寬度),預測 tx=1 ,就會把box向左邊移動相同的距離。

這個公式沒有任何限制,使得無論在什麼位置進行預測,任何anchor boxes可以在圖像中任意一點結束(我的理解是,tx 沒有數值限定,可能會出現anchor檢測很遠的目標box的情況,效率比較低。正確做法應該是每一個anchor只負責檢測周圍正負一個單位以內的目標box)。模型隨機初始化後,需要花很長一段時間才能穩定預測敏感的物體位置。

在此,作者就沒有采用預測直接的offset的方法,而使用了預測相對於grid cell的座標位置的辦法,作者又把ground truth限制在了0到1之間,利用logistic迴歸函數來進行這一限制。

這裏寫圖片描述

現在,神經網絡在特徵圖(13 *13 )的每個cell上預測5個bounding boxes(聚類得出的值),同時每一個bounding box預測5個坐值,分別爲 tx,ty,tw,th,to ,其中前四個是座標,to 是置信度。如果這個cell距離圖像左上角的邊距爲 (cx,cy) 以及該cell對應box(bounding box prior)的長和寬分別爲 (pw,ph) ,那麼預測值可以表示爲:

這裏寫圖片描述

這幾個公式參考上面Faster-RCNN和YOLOv1的公式以及下圖就比較容易理解。tx,ty 經sigmod函數處理過,取值限定在了0~1,實際意義就是使anchor只負責周圍的box,有利於提升效率和網絡收斂。σ 函數的意義沒有給,但估計是把歸一化值轉化爲圖中真實值,使用 e 的冪函數是因爲前面做了 ln 計算,因此,σ(tx) 是bounding box的中心相對柵格左上角的橫座標,σ(ty) 是縱座標,σ(to) 是bounding box的confidence score。

定位預測值被歸一化後,參數就更容易得到學習,模型就更穩定。作者使用Dimension Clusters和Direct location prediction這兩項anchor boxes改進方法,mAP獲得了5%的提升。

這裏寫圖片描述

Fine-Grained Features(細粒度特徵)

上述網絡上的修改使YOLO最終在13 * 13的特徵圖上進行預測,雖然這足以勝任大尺度物體的檢測,但是用上細粒度特徵的話,這可能對小尺度的物體檢測有幫助。Faser R-CNN和SSD都在不同層次的特徵圖上產生區域建議(SSD直接就可看得出來這一點),獲得了多尺度的適應性。這裏使用了一種不同的方法,簡單添加了一個轉移層( passthrough layer),這一層要把淺層特徵圖(分辨率爲26 * 26,是底層分辨率4倍)連接到深層特徵圖。

這裏寫圖片描述

這個轉移層也就是把高低兩種分辨率的特徵圖做了一次連結,連接方式是疊加特徵到不同的通道而不是空間位置,類似於Resnet中的identity mappings。這個方法把26 * 26 * 512的特徵圖連接到了13 * 13 * 2048的特徵圖,這個特徵圖與原來的特徵相連接。YOLO的檢測器使用的就是經過擴張的特徵圖,它可以擁有更好的細粒度特徵,使得模型的性能獲得了1%的提升。(這段理解的也不是很好,要看到網絡結構圖才能清楚)

補充:關於passthrough layer,具體來說就是特徵重排(不涉及到參數學習),前面26 * 26 * 512的特徵圖使用按行和按列隔行採樣的方法,就可以得到4個新的特徵圖,維度都是13 * 13 * 512,然後做concat操作,得到13 * 13 * 2048的特徵圖,將其拼接到後面的層,相當於做了一次特徵融合,有利於檢測小目標。

Multi-Scale Training

原來的YOLO網絡使用固定的448 * 448的圖片作爲輸入,現在加入anchor boxes後,輸入變成了416 * 416。目前的網絡只用到了卷積層和池化層,那麼就可以進行動態調整(意思是可檢測任意大小圖片)。作者希望YOLOv2具有不同尺寸圖片的魯棒性,因此在訓練的時候也考慮了這一點。

不同於固定輸入網絡的圖片尺寸的方法,作者在幾次迭代後就會微調網絡。沒經過10次訓練(10 epoch),就會隨機選擇新的圖片尺寸。YOLO網絡使用的降採樣參數爲32,那麼就使用32的倍數進行尺度池化{320,352,…,608}。最終最小的尺寸爲320 * 320,最大的尺寸爲608 * 608。接着按照輸入尺寸調整網絡進行訓練。

這種機制使得網絡可以更好地預測不同尺寸的圖片,意味着同一個網絡可以進行不同分辨率的檢測任務,在小尺寸圖片上YOLOv2運行更快,在速度和精度上達到了平衡。

在小尺寸圖片檢測中,YOLOv2成績很好,輸入爲228 * 228的時候,幀率達到90FPS,mAP幾乎和Faster R-CNN的水準相同。使得其在低性能GPU、高幀率視頻、多路視頻場景中更加適用。

在大尺寸圖片檢測中,YOLOv2達到了先進水平,VOC2007 上mAP爲78.6%,仍然高於平均水準,下圖是YOLOv2和其他網絡的成績對比:

這裏寫圖片描述
這裏寫圖片描述

Further Experiments

作者在VOC2012上對YOLOv2進行訓練,下圖是和其他方法的對比。YOLOv2精度達到了73.4%,並且速度更快。同時YOLOV2也在COCO上做了測試(IOU=0.5),也和Faster R-CNN、SSD作了成績對比。總的來說,比上不足,比下有餘。

這裏寫圖片描述

這裏寫圖片描述

YOLOv2速度的改進(Faster)

YOLO一向是速度和精度並重,作者爲了改善檢測速度,也作了一些相關工作。

大多數檢測網絡有賴於VGG-16作爲特徵提取部分,VGG-16的確是一個強大而準確的分類網絡,但是複雜度有些冗餘。224 * 224的圖片進行一次前向傳播,其卷積層就需要多達306.9億次浮點數運算。

YOLOv2使用的是基於Googlenet的定製網絡,比VGG-16更快,一次前向傳播僅需85.2億次運算。可是它的精度要略低於VGG-16,單張224 * 224取前五個預測概率的對比成績爲88%和90%(低一點點也是可以接受的)。

Darknet-19

YOLOv2使用了一個新的分類網絡作爲特徵提取部分,參考了前人的先進經驗,比如類似於VGG,作者使用了較多的3 * 3卷積核,在每一次池化操作後把通道數翻倍。借鑑了network in network的思想,網絡使用了全局平均池化(global average pooling),把1 * 1的卷積核置於3 * 3的卷積核之間,用來壓縮特徵。也用了batch normalization(前面介紹過)穩定模型訓練。

最終得出的基礎模型就是Darknet-19,如下圖,其包含19個卷積層、5個最大值池化層(maxpooling layers ),下圖展示網絡具體結構。Darknet-19運算次數爲55.8億次,imagenet圖片分類top-1準確率72.9%,top-5準確率91.2%。

這裏寫圖片描述

Training for classification

作者使用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%。

Training for detection

分類網絡訓練完後,就該訓練檢測網絡了,作者去掉了原網絡最後一個卷積層,轉而增加了三個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分類的改進(Stronger)

這一部分,作者使用聯合訓練方法,結合wordtree等方法,使YOLOv2的檢測種類擴充到了上千種,具體內容待續。

總結和展望

作者大概說的是,之前的技術改進對檢測任務很有幫助,在以後的工作中,可能會涉足弱監督方法用於圖像分割。監督學習對於標記數據的要求很高,未來要考慮弱標記的技術,這將會極大擴充數據集,提升訓練量。

擴展閱讀:deepsystems.io:Illustration of YOLO

發佈了34 篇原創文章 · 獲贊 360 · 訪問量 73萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章