尊重原創:http://blog.csdn.net/jesse_mx/article/details/53925356
論文位址:YOLO9000: Better, Faster, Stronger
項目首頁: YOLO: Real-Time Object Detection
Caffe實作: caffe-yolo9000
( 最近部落格下很多人請求caffe-yolov2代碼,願意研究的我都發送了,不過這裡要聲明:該第三方實作相對于論文中的精度,仍有很多差距,反正我已經暫時棄坑)
概述
時隔一年,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) 以及 tx,ty 使用的是如下公式:
後來修改博文時,發現這個公式有誤,作者應該是把加号寫成了減号。理由如下,anchor的預測公式來自于Faster-RCNN,我們來看看人家是怎麼寫的:
公式中,符号的含義解釋一下:x 是坐标預測值,xa 是anchor坐标(預設固定值),x∗ 是坐标真實值(标注資訊),其他變量 y,w,h 以此類推,t 變量是偏移量。然後把前兩個公式變形,就可以得到正确的公式:
x=(tx∗wa)+xay=(ty∗wa)+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