目标检测之YOLOv2
寫在前面
前篇文章介紹了基于回歸方法的深度學習目標檢測方法(YOLO,SSD),本篇將介紹YOLO的升級版YOLOv2,其主要有兩個大方面的改進:(1) 使用一系列的方法對YOLO進行了改進,在保持原有速度的同時提升精度得到YOLOv2;(2) 提出了一種目標分類與檢測的聯合訓練方法,通過WordTree來混合檢測數據集與識別數據集之中的數據,同時在COCO和ImageNet數據集中進行訓練得到YOLO9000,實現9000多種物體的實時檢測。下面是對論文中要點和難點的一些解釋說明。
更精確
Batch Normalization
神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(Batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度。
解決辦法之一是對數據都要做一個歸一化預處理。YOLOv2網絡通過在每一個卷積層后添加batch normalization,極大的改善了收斂速度同時減少了對其它Regularization方法的依賴(舍棄了Dropout優化后依然沒有過擬合),使得mAP獲得了2%的提升。
High Resolution Classifier
所有State-Of-The-Art的檢測方法都在ImageNet上對分類器進行了預訓練。從AlexNet開始,多數分類器都把輸入圖像Resize到256*256以下,這會容易丟失一些小物體的信息。 YOLOv1先使用224*224的分辨率來訓練分類網絡,在訓練檢測網絡的時候再切換到448*448的分辨率,這意味著YOLOv1的卷積層要重新適應新的分辨率同時YOLOv1的網絡還要學習檢測網絡。 現在,YOLOv2直接使用448*448的分辨率來Fine Tune分類網絡,好讓網絡可以調整Filters來適應高分辨率。然后再用這個結果來Fine Tune檢測網絡。使用高分辨率的分類網絡提升了將近4%的mAP。
Convolutional With Anchor Boxes
YOLOv1使用全連接層數據進行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%,說明可以通過進一步的工作來加強準確率,的確有改進空間。
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的大小無關)。因此采用了如下距離度量:
d(box,centroid)=1?IOU(box,centroid)
聚類結果如下圖:
上面左圖:隨著k的增大,IOU也在增大(高召回率),但是復雜度也在增加。所以平衡復雜度和IOU之后,最終得到k值為5。上面右圖:5聚類的中心與手動精選的Boxes是完全不同的,扁長的框較少瘦高的框較多。作者文中的對比實驗說明了K-means方法的生成的Boxes更具有代表性,使得檢測任務更好學習。
Direct Location Prediction
使用Anchor Boxes的另一個問題是模型不穩定,尤其是在早期迭代的時候。大部分的不穩定現象出現在預測Box的(x,y)坐標時。
在區域建議網絡(RPN)中會預測坐標就是預測tx,ty。對應的中心點(x,y)按如下公式計算:
x=(tx?wa)+xa,y=(ty?ha)+ya
可見預測tx=1就會把box向右移動Anchor Box的寬度,預測tx=-1就會把Box向左移動相同的距離。這個公式沒有任何限制,無論在什么位置進行預測,任何Anchor Boxes可以在圖像中任意一點。模型隨機初始化之后將需要很長一段時間才能穩定預測敏感的物體偏移。因此作者沒有采用這種方法,而是預測相對于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)), bx,by,bw,bh的預測值見下圖, Pr(object)?IOU(b,object)=σ(t0)。
約束了位置預測的范圍,參數就更容易學習,模型就更穩定。使用Dimension Clusters和Direct Location Prediction這兩項Anchor Boxes改進方法,mAP獲得了5%的提升。
Fine-Grained Features
修改后的網絡最終在13 * 13的特征圖上進行預測,雖然這足以勝任大尺度物體的檢測,如果用上細粒度特征的話可能對小尺度的物體檢測有幫助。Faser R-CNN和SSD都在不同層次的特征圖上產生區域建議以獲得多尺度的適應性。YOLOv2使用了一種不同的方法,簡單添加一個Passthrough Layer,把淺層特征圖(分辨率為26 * 26)連接到深層特征圖。
Passthrough Laye把高低分辨率的特征圖做連結,疊加相鄰特征到不同通道(而非空間位置),類似于Resnet中的Identity Mappings。這個方法把26* 26*512的特征圖疊加成13* 13*2048的特征圖,與原生的深層特征圖相連接。
YOLOv2的檢測器使用的就是經過擴展后的的特征圖,它可以使用細粒度特征,使得模型的性能獲得了1%的提升。
Multi-Scale Training
原始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達到了先進水平,VOC2007 上mAP為78.6%,而且超過實時速度要求。下圖是YOLOv2和其他網絡在VOC2007上的對比:
更快速
為了精度與速度并重,作者在速度上也作了一些改進措施。大多數檢測網絡依賴于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, Hue, Saturation, Exposure Shifts。(參數都是基于作者的Darknet框架)
初始的224* 224訓練后把分辨率上調到了448* 448,使用同樣的參數又訓練了10次,學習率調整到了10^{-3}。高分辨率下訓練的分類網絡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的卷積層連到倒數第二層,使模型有了細粒度特征。
學習策略是:先以10^{-3}的初始學習率訓練了160次,在第60次和第90次的時候學習率減為原來的十分之一。Weight Decay為0.0005,Momentum為0.9,以及類似于Faster-RCNN和SSD的數據擴充(Data Augmentation)策略: Random Crops, Color Shifting, Etc。使用相同的策略在 COCO 和VOC上訓練。
更強大
作者提出了一種在分類數據集和檢測數據集上聯合訓練的機制。使用檢測數據集的圖片去學習檢測相關的信息,例如Bounding Box 坐標預測,是否包含物體以及屬于各個物體的概率。使用僅有類別標簽的分類數據集圖片去擴展可以檢測的種類。
訓練過程中把監測數據和分類數據混合在一起。當網絡遇到一張屬于檢測數據集的圖片就基于YOLOv2的全部損失函數(包含分類部分和檢測部分)做反向傳播。當網絡遇到一張屬于分類數據集的圖片就僅基于分類部分的損失函數做反向傳播。
這種方法有一些難點需要解決。檢測數據集只有常見物體和抽象標簽(不具體),例如 “狗”,“船”。分類數據集擁有廣而深的標簽范圍(例如ImageNet就有一百多類狗的品種,包括 “Norfolk terrier”, “Yorkshire terrier”, “Bedlington terrier”等. )。必須按照某種一致的方式來整合兩類標簽。
大多數分類的方法采用Softmax層,考慮所有可能的種類計算最終的概率分布。但是Softmax假設類別之間互不包含,但是整合之后的數據是類別是有包含關系的,例如 “Norfolk terrier” 和 “dog”。 所以整合數據集沒法使用這種方式(Softmax 模型),
作者最后采用一種不要求互不包含的多標簽模型(Multi-label Model)來整合數據集。這種方法忽略了數據集的結構(例如 COCO數據集的所有類別之間是互不包含的)。
Training For Detection
ImageNet的標簽參考WordNet(一種結構化概念及概念之間關系的語言數據庫)。例如:
很多分類數據集采用扁平化的標簽。而整合數據集則需要結構化標簽。WordNet是一個有向圖結構(而非樹結構),因為語言是復雜的(例如“dog”既是“canine”又是“domestic animal”),為了簡化問題,作者從ImageNet的概念中構建了一個層次樹結構(Hierarchical Tree)來代替圖結構方案。
創建層次樹的步驟是:
一、遍歷ImageNet的所有視覺名詞。
二、對每一個名詞,在WordNet上找到從它所在位置到根節點(Physical Object)的路徑。 許多同義詞集只有一條路徑。所以先把這些路徑加入層次樹結構。
三、迭代檢查剩下的名詞,得到路徑,逐個加入到層次樹。路徑選擇辦法是:如果一個名詞有兩條路徑到根節點,其中一條需要添加3個邊到層次樹,另一條僅需添加一條邊,那么就選擇添加邊數少的那條路徑。
最終結果是一顆 WordTree(視覺名詞組成的層次結構模型)。用WordTree執行分類時,預測每個節點的條件概率。如果想求得特定節點的絕對概率,只需要沿著路徑做連續乘積。
為了驗證這種方法作者在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.7 mAP,在從未見過的156個物體檢測數據類別上精度為16.0 mAP。這個結果高于DPM,但是YOLO9000是在不同數據集上進行半監督訓練。而且YOLO9000可以同時實時檢測9000多種其它物體類別。
作者也分析了YOLO9000在ImageNet上的性能,發現可以學習新的動物表現很好,但是學習衣服和設備這類物體則不行。因為從COCO數據集上動物類別那里學習到的物體預測泛化性很好。但是COCO數據集并沒有任何衣服類別的標簽數據(只有"人"類別),所以YOLO9000很難對“太陽鏡”,“游泳褲”這些類別建模。
小結
本篇對YOLOv2進行了介紹,參考文獻[2]對YOLOv2已經做了很好的闡述,上述內容只是在[2]的基礎上進行了進一步整理做了小幅度的修改。更多實現細節可以閱讀原論文和代碼。
參考文獻
[1] YOLOv2:"YOLO9000: Better, Faster, Stronge"
[2] YOLO2
[3] Batch Normalization導讀
[4] YOLO Project
總結
以上是生活随笔為你收集整理的目标检测之YOLOv2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R-FCN+ResNet-50 训练模型
- 下一篇: Ubuntu上用caffe的SSD方法训