YOLOv2學習tips

Abstract部分

使用一種新穎的muli-scale(多尺度)訓練方法,相同的YOLOv2模型可以運行在不同的大小的圖片上,提供速度和精度之間的輕鬆tradeoff(權衡)

提出了一種jointly train(聯合訓練)的object detection(目標檢測)和classification(分類)的方法。使用這種方法,我們在COCO檢測數據集和ImageNet分類數據集上同時訓練YOLO9000。我們的聯合訓練方法允許YOLO9000預測沒有標記檢測數據的目標類的檢測。

Introduction 部分

分類標記等其他任務的數據集相比,當前目標檢測數據集是有限的。最常見的檢測數據集包含數十到數十萬的圖像,具有幾十到幾百個標籤。分類數據集具有數百萬個具有數十或數十萬類別的圖像。

提出了一種新方法來利用我們已經擁有的大量分類數據,並使用它來擴大當前檢測系統的範圍。我們的方法使用目標分類的hierarchical view(層次視圖),允許我們將不同的數據集合在一起

提出了joint training(聯合訓練)算法,允許我們在detection(檢測)和classfication(分類)數據上訓練目標檢測器。我們的方法利用標記的檢測圖像來學習精確地定位目標,同時使用分類圖像來增加其詞彙和魯棒性

Better部分

Batch Normalization

batch normalization 也有助於規範化模型,可以在捨棄dropout優化後依然不會過擬合


tips:

Batch Normalization閱讀筆記 - 香蕉樹下的老中醫的文章 - 知乎
https://zhuanlan.zhihu.com/p/34480619


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%的提升。


tips:

High-Resolution Net—深度與分辨率兼具的Pose estimation方法 - autocyz的文章 - 知乎
https://zhuanlan.zhihu.com/p/57756503


Convolutional With Anchor Boxes

去掉了全連接層並引入anchor boxes來預測bounding boxes。

  1. 去掉了一個池化層以確保輸出的卷積特徵圖有更高的分辨率
  2. 通過縮減網絡,讓圖片輸入分辨率爲416 * 416,這一步的目的是爲了讓後面產生的卷積特徵圖寬高都爲奇數,這樣就可以產生一個center cell
    大物體通常佔據了圖像的中間位置, 就可以只用中心的一個cell來預測這些物體的位置,否則就要用中間的4個cell來進行預測,這個技巧可稍稍提升效率
  3. 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%,說明可以通過進一步的工作來加強準確率,的確有改進空間


tips:

Achor Boxes

到目前爲止,對象檢測中存在一個問題:每個grid只能檢測一個object,如果想讓一個grid檢測多個object,可以使用anchor box這個概念
在這裏插入圖片描述
具體思路:

  1. 預先定義不同形狀的anchor box(以兩個爲例)
  2. 把預測結果和anchor box 關聯起來,定義類別標籤(如上圖右邊的向量)
    在這裏插入圖片描述
    引入anchor box 之後,每個對象分配一對(grid,anchor box)信息,即對象在目標標籤中的編碼方式
    在這裏插入圖片描述
    有兩個anchor boxes,所以右邊的y變爲16維(2*8,其中8是因爲該例子中有三個對象類別,如果有更多的類別,y的維度會越高)
    在這裏插入圖片描述
    手寫第一個y向量表示對於一個grid中同時出現兩個對象(人和車)的情況
    手寫第二個y向量表示對於一個grid中只出現了一個向量(車)的情況
    https://mooc.study.163.com/learn/2001281004?tid=2001392030&trace_c_p_k2=7cf7e1b144de4352aeae0c28ea1adab3#/learn/content?type=detail&id=2001729339
    https://zhuanlan.zhihu.com/p/63024247

Dimension Clusters

利用Kmeans聚類,解決了anchor boxes的尺寸選擇問題
作者在使用anchor的時候遇到了兩個問題,第一個是anchor boxes寬高維度往往是精選的先驗框(hand-picked priors),雖說在訓練過程中網絡也會學習調整boxes的寬高維度,最終得到準確的bounding boxes。但是,如果一開始就選擇了更好的、更有代表性的先驗boxes維度,那麼網絡就更容易學到準確的預測位置。
因此,作者使用了K-means聚類方法類訓練bounding boxes,可以自動找到更好的boxes寬高維度。傳統的K-means聚類方法使用的是歐氏距離函數,也就意味着較大的boxes會比較小的boxes產生更多的error,聚類結果可能會偏離。爲此,作者採用的評判標準是IOU得分(也就是boxes之間的交集除以並集),這樣的話,error就和box的尺度無關了,最終的距離函數爲:
d(box,centroid)=1IOU(box,centroid)d(box, centroid) = 1-IOU(box, centroid)
在召回率和模型複雜度之間進行平衡之後,取了k=5。意味着作者選擇了5種大小的box維度來進行定位預測,這與手動精選的box維度不同。結果中扁長的框較少,而瘦高的框更多。


tips:

k-means

關於 K means 聚類算法,你需要知道這些東西 - AI研習社的文章 - 知乎
https://zhuanlan.zhihu.com/p/42489014
K-Means聚類算法(一):算法思路 - 清雨影的文章 - 知乎
https://zhuanlan.zhihu.com/p/20432322


Direct location prediction

在YOLO模型上採用anchor boxes的第二個問題是模型不穩定性,特別是在前面幾輪訓練。大部分不穩定因素來源於預測boxes位置(x,y)
因此,作者將預測offsets改變爲YOLO的預測的grid cell的location coordinate,將ground trunth限定在0到1之間(用logistic activation使其限定在0到1的區間)


tips:

在這裏插入圖片描述


網絡對feature map中的每個cell預測5個bounding boxes。對每一個bounding boxes,模型預測5個匹配性值tx,ty,tw,th,tot_x,t_y,t_w,t_h,t_o,其中前四個是座標,to是置信度。如果這個cell距離圖像左上角的邊距爲(cx,cy)以及該cell對應box(bounding box prior)的長和寬分別爲(pw,ph),那麼預測值可以表示爲:

bx=σ(tx)+cxb_x = \sigma(t_x)+c_x
by=σ(ty)+cyb_y = \sigma(t_y)+c_y
bw=pwetwb_w = p_we^{t_{w}}
bh=phethb_h = p_he^{t_{h}}
Pr(object)IOU(b,object)=σ(to)Pr(object)*IOU(b,object) = \sigma(t_o)

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

更精確的特徵(finer grained features)可以提高對於小目標的檢測。作者向網絡加入passtrough層(轉移層)以增加特徵。passthrough類似於ResNet,將高分辨率特徵和低分辨率特徵結合,使26×26×512的特徵圖轉化爲13×13×2048的特徵圖(可以和原始特徵連接)。該改進增加了1%的性能。


tips:

passtrough層

本質其實就是特徵重排,26*26*512的feature map分別按行和列隔點採樣,可以得到4幅13*13*512的特徵,把這4張特徵按channel串聯起來,就是最後的13*13*2048的feature map.還有就是,passthrough layer本身是不學習參數的,直接用前面的層的特徵重排後拼接到後面的層,相當於做了一次特徵融合,越在網絡前面的層,感受野越小,有利於小目標的檢測。


Multi-Scale Training

原來的YOLO網絡使用固定的448 * 448的圖片作爲輸入,現在加入anchor boxes後,輸入變成了416 * 416。目前的網絡只用到了卷積層和池化層,那麼就可以進行動態調整(意思是可檢測任意大小圖片)
不同於固定輸入網絡的圖片尺寸的方法,作者在幾次迭代後就會微調網絡。每經過10次訓練,就會隨機選擇新的圖片尺寸,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%,仍然高於平均水準

Faster部分

Darknet-19

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


tips:

VGG

一文讀懂VGG網絡 - Amusi的文章 - 知乎
https://zhuanlan.zhihu.com/p/41423739

Global Average Pooling

https://www.jianshu.com/p/04f7771f4da2
Global average pooling– - mountain blue的文章 - 知乎
https://zhuanlan.zhihu.com/p/37683646


最終得出的基礎模型就是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。 初始的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)策略。

Stronger 部分

提出了一種聯合訓練的機制:使用detection數據集訓練模型detection相關parts,使用classification數據集訓練模型classification相關parts。
這樣訓練會有一些問題:detection datasets的標籤更爲“上層”,例如狗,船啊啥的。而對應的classification datasets的標籤就“下層”了很多,比如狗就有很多種,例如“Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”等等。
而我們一般在模型中分類使用的是softmax,softmax計算所有種類的最終的概率分佈。softmax會假設所有種類之間是互斥的,但是, 實際過程中,“上層”和“下層”之間是有對應的關係的。(例如中華田園犬,博美都屬於狗),照着這樣的思路,論文整出了一個層次性的標籤結構muti-label model


tips:

softmax

詳解softmax函數以及相關求導過程 - 憶臻的文章 - 知乎
https://zhuanlan.zhihu.com/p/25723112


Hierarchical classification

ImageNet的標籤的來源是WordNet(一個語言數據庫)。例如
在這裏插入圖片描述
很多分類數據集採用扁平化的標籤。而整合數據集則需要結構化標籤。
WordNet是一個有向圖結構(而非樹結構),因爲語言是複雜的(例如“dog”既是“canine”又是“domestic animal”),爲了簡化問題,作者從ImageNet的概念中構建了一個層次樹結構(hierarchical tree)來代替圖結構方案。

創建層次樹的步驟是:

  1. 遍歷ImageNet的所有視覺名詞
  2. 對每一個名詞,在WordNet上找到從它所在位置到根節點(“physical object”)的路徑。 許多同義詞集只有一條路徑。所以先把這些路徑加入層次樹結構。
  3. 然後迭代檢查剩下的名詞,得到路徑,逐個加入到層次樹。路徑選擇辦法是:如果一個名詞有兩條路徑到根節點,其中一條需要添加3個邊到層次樹,另一條僅需添加1條邊,那麼就選擇添加邊數少的那條路徑。

最終結果是一顆 WordTree (視覺名詞組成的層次結構模型)。用WordTree執行分類時,預測每個節點的條件概率.例如: 在“terrier”節點會預測:

如果想求得特定節點的絕對概率,只需要沿着路徑做連續乘積。例如 如果想知道一張圖片是不是“Norfolk terrier ”需要計算:
在這裏插入圖片描述
分類時假設 圖片包含物體:Pr(physicalobject)=1Pr(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很難對“太陽鏡”,“游泳褲”這些類別建模。

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