YOLO2
本文是對 YOLO9000: Better, Faster, Stronger (項目主頁) 的翻譯。加了個人理解和配圖。內容參考了 YOLOv2 論文筆記 - Jesse_Mx 。水平有限,錯誤之處歡迎指正。
1. 概述
YOLO2主要有兩個大方面的改進:
- 使用一系列的方法對YOLO進行了改進,在保持原有速度的同時提升精度得到YOLOv2。
- 提出了一種目標分類與檢測的聯合訓練方法,同時在COCO和ImageNet數據集中進行訓練得到YOLO9000,實現9000多種物體的實時檢測。
2 更精確(Better)
batch normalization
神經網路學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那麼網路的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那麼網路就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網路的訓練速度。(引用自 Implementation of Batch Normalization Layer)
解決辦法之一是對數據都要做一個歸一化預處理。YOLOv2網路通過在每一個卷積層後添加batch normalization,極大的改善了收斂速度同時減少了對其它regularization方法的依賴(捨棄了dropout優化後依然沒有過擬合),使得mAP獲得了2%的提升。
參考:Implementation of Batch Normalization LayerBatch Normalization導讀
High Resolution Classi?er
所有state-of-the-art的檢測方法基本上都會使用ImageNet預訓練過的模型(classifier)來提取特徵,例如AlexNet輸入圖片會被resize到不足256 * 256,這導致解析度不夠高,給檢測帶來困難。所以YOLO(v1)先以解析度224*224訓練分類網路,然後需要增加解析度到448*448,這樣做不僅切換為檢測演算法也改變了解析度。所以作者想能不能在預訓練的時候就把解析度提高了,訓練的時候只是由分類演算法切換為檢測演算法。
YOLOv2首先修改預訓練分類網路的解析度為448*448,在ImageNet數據集上訓練10輪(10 epochs)。這個過程讓網路有足夠的時間調整filter去適應高解析度的輸入。然後fine tune為檢測網路。mAP獲得了4%的提升。
Convolutional With Anchor Boxes.
YOLO(v1)使用全連接層數據進行bounding box預測(要把1470*1的全鏈接層reshape為7*7*30的最終特徵),這會丟失較多的空間信息定位不準。YOLOv2借鑒了Faster R-CNN中的anchor思想: 簡單理解為卷積特徵圖上進行滑窗採樣,每個中心預測9種不同大小和比例的建議框。由於都是卷積不需要reshape,很好的保留的空間信息,最終特徵圖的每個特徵點和原圖的每個cell一一對應。而且用預測相對偏移(offset)取代直接預測坐標簡化了問題,方便網路學習。
總的來說就是移除全連接層(以獲得更多空間信息)使用 anchor boxes 取預測 bounding boxes。具體做法如下:- 去掉最後的池化層確保輸出的卷積特徵圖有更高的解析度。
- 縮減網路,讓圖片輸入解析度為416 * 416,目的是讓後面產生的卷積特徵圖寬高都為奇數,這樣就可以產生一個center cell。因為作者觀察到,大物體通常佔據了圖像的中間位置,可以只用一個中心的cell來預測這些物體的位置,否則就要用中間的4個cell來進行預測,這個技巧可稍稍提升效率。
- 使用卷積層降採樣(factor 為32),使得輸入卷積網路的416 * 416圖片最終得到13 * 13的卷積特徵圖(416/32=13)。
- 把預測類別的機制從空間位置(cell)中解耦,由anchor box同時預測類別和坐標。因為YOLO是由每個cell來負責預測類別,每個cell對應的2個bounding box 負責預測坐標(回想YOLO中 最後輸出7*7*30的特徵,每個cell對應1*1*30,前10個主要是2個bounding box用來預測坐標,後20個表示該cell在假設包含物體的條件下屬於20個類別的概率,具體請參考 圖解YOLO 的圖示) 。YOLOv2中,不再讓類別的預測與每個cell(空間位置)綁定一起,而是讓全部放到anchor box中。下面是特徵維度示意圖(僅作示意並非完全正確)
加入了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%,說明可以通過進一步的工作來加強準確率,的確有改進空間。YOLOv2 論文筆記 - Jesse_Mx的博客 - 博客頻道 - CSDN.NET
Dimension Clusters(維度聚類)
使用anchor時,作者發現Faster-RCNN中anchor boxes的個數和寬高維度往往是手動精選的先驗框(hand-picked priors),設想能否一開始就選擇了更好的、更有代表性的先驗boxes維度,那麼網路就應該更容易學到準確的預測位置。解決辦法就是統計學習中的K-means聚類方法,通過對數據集中的ground true box做聚類,找到ground true box的統計規律。以聚類個數k為anchor boxs個數,以k個聚類中心box的寬高維度為anchor box的維度。
如果按照標準k-means使用歐式距離函數,大boxes比小boxes產生更多error。但是,我們真正想要的是產生好的IOU得分的boxes(與box的大小無關)。因此採用了如下距離度量:
聚類結果如下圖:
上面左圖: 隨著k的增大,IOU也在增大(高召回率),但是複雜度也在增加。所以平衡複雜度和IOU之後,最終得到k值為5。上面右圖:5聚類的中心與手動精選的boxes是完全不同的,扁長的框較少瘦高的框較多(這就是統計規律的力量)。作者做了對比實驗,5種boxes的Avg IOU(61.0)就和Faster R-CNN的9種Avg IOU(60.9)相當。 說明K-means方法的生成的boxes更具有代表性,使得檢測任務更好學習。
Direct location prediction
使用anchor boxes的另一個問題是模型不穩定,尤其是在早期迭代的時候。大部分的不穩定現象出現在預測box的(x,y)坐標時。
在區域建議網路(RPN)中會預測坐標就是預測tx,ty。對應的中心點(x,y)按如下公式計算:
可見預測tx=1就會把box向右移動anchor box的寬度,預測tx=-1就會把box向左移動相同的距離。
PS: YOLOv2論文中寫的是) 個人覺得這是錯誤的,因為Faster-RCNN論文里寫的是下圖:
這個公式沒有任何限制,無論在什麼位置進行預測,任何anchor boxes可以在圖像中任意一點。模型隨機初始化之後將需要很長一段時間才能穩定預測敏感的物體偏移。因此作者沒有採用這種方法,而是預測相對於grid cell的坐標位置,同時把ground truth限制在0到1之間(利用logistic激活函數約束網路的預測值來達到此限制)。
最終,網路在特徵圖(13 *13 )的每個cell上預測5個bounding boxes,每一個bounding box預測5個坐標值:tx,ty,tw,th,to。如果這個cell距離圖像左上角的邊距為(cx,cy)以及該cell對應的box維度(bounding box prior)的長和寬分別為(pw,ph),那麼對應的box為:
約束了位置預測的範圍,參數就更容易學習,模型就更穩定。使用Dimension Clusters和Direct location prediction這兩項anchor boxes改進方法,mAP獲得了5%的提升。Fine-Grained Features(細粒度特徵)
修改後的網路最終在13 * 13的特徵圖上進行預測,雖然這足以勝任大尺度物體的檢測,如果用上細粒度特徵的話可能對小尺度的物體檢測有幫助。Faser R-CNN和SSD都在不同層次的特徵圖上產生區域建議以獲得多尺度的適應性。YOLOv2使用了一種不同的方法,簡單添加一個 passthrough layer,把淺層特徵圖(解析度為26 * 26)連接到深層特徵圖。
passthroughlaye把高低解析度的特徵圖做連結,疊加相鄰特徵到不同通道(而非空間位置)
,類似於Resnet中的identity mappings。這個方法把26 * 26 * 512的特徵圖疊加成13 * 13 * 2048的特徵圖,與原生的深層特徵圖相連接。YOLOv2的檢測器使用的就是經過擴展後的的特徵圖,它可以使用細粒度特徵,使得模型的性能獲得了1%的提升。
Multi-ScaleTraining
原始YOLO網路使用固定的448 * 448的圖片作為輸入,加入anchor boxes後輸入變成416 * 416,由於網路只用到了卷積層和池化層,就可以進行動態調整(檢測任意大小圖片)。為了讓YOLOv2對不同尺寸圖片的具有魯棒性,在訓練的時候也考慮了這一點。
不同於固定網路輸入圖片尺寸的方法,每經過10批訓練(10 batches)就會隨機選擇新的圖片尺寸。網路使用的降採樣參數為32,於是使用32的倍數{320,352,…,608},最小的尺寸為320 * 320,最大的尺寸為608 * 608。 調整網路到相應維度然後繼續進行訓練。
這種機制使得網路可以更好地預測不同尺寸的圖片,同一個網路可以進行不同解析度的檢測任務,在小尺寸圖片上YOLOv2運行更快,在速度和精度上達到了平衡。
在低解析度圖片檢測中,YOLOv2是檢測速度快(計算消耗低),精度較高的檢測器。輸入為228 * 228的時候,幀率達到90FPS,mAP幾乎和Faster R-CNN的水準相同。使得其更加適用於低性能GPU、高幀率視頻和多路視頻場景。
在高解析度圖片檢測中,YOLOv2達到了先進水平(state-of-the-art),VOC2007 上mAP為78.6%,而且超過實時速度要求。下圖是YOLOv2和其他網路在VOC2007上的對比:
3.更快速(Faster)
為了精度與速度並重,作者在速度上也作了一些改進措施。
大多數檢測網路依賴於VGG-16作為特徵提取網路,VGG-16是一個強大而準確的分類網路,但是確過於複雜。224 * 224的圖片進行一次前向傳播,其卷積層就需要多達306.9億次浮點數運算。
YOLO使用的是基於Googlenet的自定製網路,比VGG-16更快,一次前向傳播僅需85.2億次運算,不過它的精度要略低於VGG-16。224 * 224圖片取 single-crop, top-5 accuracy,YOLO的定製網路得到88%(VGG-16得到90%)。
Darknet-19
YOLOv2使用了一個新的分類網路作為特徵提取部分,參考了前人的工作經驗。類似於VGG,網路使用了較多的3 * 3卷積核,在每一次池化操作後把通道數翻倍。借鑒了network in network的思想,網路使用了全局平均池化(global average pooling)做預測,把1 * 1的卷積核置於3 * 3的卷積核之間,用來壓縮特徵。使用batch normalization穩定模型訓練,加速收斂,正則化模型。
最終得出的基礎模型就是Darknet-19,包含19個卷積層、5個最大值池化層(max pooling layers )。Darknet-19處理一張照片需要55.8億次運算,imagenet的top-1準確率為72.9%,top-5準確率為91.2%。
Training for classi?cation
作者使用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框架)
初始的224 * 224訓練後把解析度上調到了448 * 448,使用同樣的參數又訓練了10次,學習率調整到了。高解析度下訓練的分類網路top-1準確率76.5%,top-5準確率93.3%。
Training for detection
為了把分類網路改成檢測網路,去掉原網路最後一個卷積層,增加了三個 3 * 3 (1024 ?lters)的卷積層,並且在每一個卷積層後面跟一個1 * 1的卷積層,輸出維度是檢測所需數量。
對於VOC數據集,預測5種boxes,每個box包含5個坐標值和20個類別,所以總共是5 * (5+20)= 125個輸出維度。
也添加了passthrough layer,從最後3 * 3 * 512的卷積層連到倒數第二層,使模型有了細粒度特徵。
學習策略是:先以的初始學習率訓練了160次,在第60次和第90次的時候學習率減為原來的十分之一。weight decay為0.0005,momentum為0.9,以及類似於Faster-RCNN和SSD的數據擴充(data augmentation)策略: random crops, color shifting, etc。使用相同的策略在 COCO 和VOC上訓練。
PS:下面的部分是在YOLOv2的基礎上得到YOLO9000。
4. 更強大(Stronger)
作者提出了一種在分類數據集和檢測數據集上聯合訓練的機制。使用檢測數據集的圖片去學習檢測相關的信息,例如bounding box 坐標預測,是否包含物體以及屬於各個物體的概率。使用僅有類別標籤的分類數據集圖片去擴展可以檢測的種類。
訓練過程中把監測數據和分類數據混合在一起。當網路遇到一張屬於檢測數據集的圖片就基於YOLOv2的全部損失函數(包含分類部分和檢測部分)做反向傳播。當網路遇到一張屬於分類數據集的圖片就僅基於分類部分的損失函數做反向傳播。
這種方法有一些難點需要解決。檢測數據集只有常見物體和抽象標籤(不具體),例如 「狗」,「船」。分類數據集擁有廣而深的標籤範圍(例如ImageNet就有一百多類狗的品種,包括 「Norfolk terrier」, 「Yorkshire terrier」, and 「Bedlington terrier」等. )。必須按照某種一致的方式來整合兩類標籤。
大多數分類的方法採用softmax層,考慮所有可能的種類計算最終的概率分布。但是softmax假設類別之間互不包含,但是整合之後的數據是類別是有包含關係的,例如 「Norfolk terrier」 和 「dog」。 所以整合數據集沒法使用這種方式(softmax 模型),
作者最後採用一種不要求互不包含的多標籤模型(multi-label model)來整合數據集。這種方法忽略了數據集的結構(例如 COCO數據集的所有類別之間是互不包含的)
Hierarchical classi?cation(層次式分類)
ImageNet的標籤參考WordNet(一種結構化概念及概念之間關係的語言資料庫)。例如:
很多分類數據集採用扁平化的標籤。而整合數據集則需要結構化標籤。WordNet是一個有向圖結構(而非樹結構),因為語言是複雜的(例如「dog」既是「canine」又是「domestic animal」),為了簡化問題,作者從ImageNet的概念中構建了一個層次樹結構(hierarchical tree)來代替圖結構方案。
創建層次樹的步驟是:
- 遍歷ImageNet的所有視覺名詞
- 對每一個名詞,在WordNet上找到從它所在位置到根節點(「physical object」)的路徑。 許多同義詞集只有一條路徑。所以先把這些路徑加入層次樹結構。
- 然後迭代檢查剩下的名詞,得到路徑,逐個加入到層次樹。路徑選擇辦法是:如果一個名詞有兩條路徑到根節點,其中一條需要添加3個邊到層次樹,另一條僅需添加一條邊,那麼就選擇添加邊數少的那條路徑。
最終結果是一顆 WordTree (視覺名片語成的層次結構模型)。用WordTree執行分類時,預測每個節點的條件概率。例如: 在「terrier」節點會預測:
如果想求得特定節點的絕對概率,只需要沿著路徑做連續乘積。例如 如果想知道一張圖片是不是「Norfolk terrier 」需要計算:
分類時假設 圖片包含物體:Pr(physical object) = 1.為了驗證這種方法作者在WordTree(用1000類別的ImageNet創建)上訓練了Darknet-19模型。為了創建WordTree1k作者天添加了很多中間節點,把標籤由1000擴展到1369。訓練過程中ground truth標籤要順著向根節點的路徑傳播:例如 如果一張圖片被標記為「Norfolk terrier」它也被標記為「dog」 和「mammal」等。為了計算條件概率,模型預測了一個包含1369個元素的向量,而且基於所有「同義詞集」計算softmax,其中「同義詞集」是同一概念的下位詞。
使用相同的訓練參數,層次式Darknet-19獲得71.9%的top-1精度和90.4%top-5精度。儘管添加了369個額外概念,且讓網路去預測樹形結構,精度只有略微降低。按照這種方式執行分類有一些好處,當遇到新的或未知物體類別,預測精確度降低的很溫和(沒有突然巨幅下降)。例如:如果網路看到一張狗的圖片,但是不確定狗的類別,網路預測為狗的置信度依然很高,但是,狗的下位詞(「xx狗」)的置信度就比較低。這個策略野同樣可用於檢測。不在假設每一張圖片都包含物體,取而代之使用YOLOv2的物體預測器(objectness predictor)得到Pr(physical object)的值。檢測器預測一個bounding box和概率樹(WordTree)。沿著根節點向下每次都走置信度最高的分支直到達到某個閾值,最終預測物體的類別為最後的節點類別。
Dataset combination with WordTree可以使用WordTree把多個數據集整合在一起。只需要把數據集中的類別映射到樹結構中的同義詞集合(synsets)。使用WordTree整合ImageNet和COCO的標籤如下圖:
joint classification and detection(聯合訓練分類和檢測)使用WordTree整合了數據集之後就可以在數據集(分類-檢測數據)上訓練聯合模型。我們想要訓練一個檢測類別很大的檢測器所以使用COCO檢測數據集和全部ImageNet的前9000類創造一個聯合數據集。為了評估我們使用的方法,也從ImageNet detection challenge 中向整合數據集添加一些還沒有存在於整合數據集的類別。相應的WordTree有9418個類別。由於ImageNet是一個非常大的數據集,所以通過oversampling COCO數據集來保持平衡,使ImageNet:COCO = 4:1。
使用上面的數據集訓練YOLO9000。採用基本YOLOv2的結構,anchor box數量由5調整為3用以限制輸出大小。
當網路遇到一張檢測圖片就正常反向傳播。其中對於分類損失只在當前及其路徑以上對應的節點類別上進行反向傳播。
當網路遇到一張分類圖片僅反向傳播分類損失。在該類別對應的所有bounding box中找到一個置信度最高的(作為預測坐標),同樣只反向傳播該類及其路徑以上對應節點的類別損失。反向傳播objectness損失基於如下假設:預測box與ground truth box的重疊度至少0.31IOU。
採用這種聯合訓練,YOLO9000從COCO檢測數據集中學習如何在圖片中尋找物體,從ImageNet數據集中學習更廣泛的物體分類。
作者在ImageNet detection task上評估YOLO9000。ImageNet detection task和COCO有44個物體類別是相同的。這意味著YOLO9000隻從大多數測試數據集中看到過分類數據而非檢測數據。最終整體精度為19.7mAP,在從未見過的156個物體檢測數據類別上精度為16.0mAP。這個結果高於DPM,但是YOLO9000是在不同數據集上進行半監督訓練。而且YOLO9000可以同時實時檢測9000多種其它物體類別。
作者也分析了YOLO9000在ImageNet上的性能,發現可以學習新的動物表現很好,但是學習衣服和設備這類物體則不行。因為從COCO數據集上動物類別那裡學習到的物體預測泛化性很好。但是COCO數據集並沒有任何衣服類別的標籤數據(只有"人"類別),所以YOLO9000很難對「太陽鏡」,「游泳褲」這些類別建模。
推薦閱讀:
※R-CNN &Fast RCNN & Faster RCNN
※YOLO演算法的原理與實現
※RCNN- 將CNN引入目標檢測的開山之作
※Fast R-CNN學習總結
TAG:深度学习DeepLearning | 目标检测 | 人工智能 |