天天看點

從YOLO到SSD再到YOLO9000(三)YOLOv2與YOLO9000

YOLOv2與YOLO9000

摘要

前篇介紹了基于回歸方法的深度學習目标檢測方法(YOLO,SSD),本篇将介紹YOLO的更新版YOLOv2,其主要有兩個大方面的改進:(1) 使用一系列的方法對YOLO進行了改進,在保持原有速度的同時提升精度得到YOLOv2;(2) 提出了一種目标分類與檢測的聯合訓練方法,通過WordTree來混合檢測資料集與識别資料集之中的資料,同時在COCO和ImageNet資料集中進行訓練得到YOLO9000,實作9000多種物體的實時檢測。

YOLOv2在YOLOv1的基礎上,使用新的網絡結構(darknet19)和技巧(Batch Normalization、High Resolution Classifier、Convolutional With Anchor Boxes等),提高了檢測速度和檢測精度。

作者提出了一種聯合訓練方法,可以同時使用檢測資料集和分類資料集來訓練檢測模型,用分層的觀點對物體分類,用檢測資料集學習準确預測物體的位置,用分類資料集來增加可識别的類别量,提升魯棒性。

我參考論文和代碼進行了實驗,YOLOv2相對于YOLOv1有很明顯的提升,但是YOLO9000使用感受并不好。YOLO9000的主要問題在于很難調整合适的分層門檻值,同時很多物體的檢測精度過低。

Better

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

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。具體做法如下:

  1. 去掉最後的池化層確定輸出的卷積特征圖有更高的分辨率。
  2. 縮減網絡,讓圖檔輸入分辨率為416*416,目的是讓後面産生的卷積特征圖寬高都為奇數,這樣就可以産生一個Center Cell。因為作者觀察到,大物體通常占據了圖像的中間位置,可以隻用一個中心的Cell來預測這些物體的位置,否則就要用中間的4個Cell來進行預測,這個技巧可稍稍提升效率。
  3. 使用卷積層降采樣(factor 為32),使得輸入卷積網絡的416 * 416圖檔最終得到13 * 13的卷積特征圖(416/32=13)。
  4. 把預測類别的機制從空間位置(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的大小無關)。是以采用了如下距離度量:

從YOLO到SSD再到YOLO9000(三)YOLOv2與YOLO9000

随着k的增大,IOU也在增大(高召回率),但是複雜度也在增加。是以平衡複雜度和IOU之後,最終得到k值為5。上面右圖:5聚類的中心與手動精選的Boxes是完全不同的,扁長的框較少瘦高的框較多。作者文中的對比實驗說明了K-means方法的生成的Boxes更具有代表性,使得檢測任務更好學習。

Direct Location Prediction

使用Anchor Boxes的另一個問題是模型不穩定,尤其是在早期疊代的時候。大部分的不穩定現象出現在預測Box的(x,y)坐标時。

在區域建議網絡(RPN)中會預測坐标就是預測tx,ty。對應的中心點(x,y)按如下公式計算:

從YOLO到SSD再到YOLO9000(三)YOLOv2與YOLO9000

公式中,符号的含義解釋一下:x是坐标預測值,xa 是anchor坐标(預設固定值),x∗ 是坐标真實值(标注資訊),其他變量 y,w,h 以此類推,t變量是偏移量。

從YOLO到SSD再到YOLO9000(三)YOLOv2與YOLO9000

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

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

從YOLO到SSD再到YOLO9000(三)YOLOv2與YOLO9000
從YOLO到SSD再到YOLO9000(三)YOLOv2與YOLO9000

定位預測值被歸一化後,參數就更容易得到學習,模型就更穩定。作者使用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。

從YOLO到SSD再到YOLO9000(三)YOLOv2與YOLO9000

這個方法把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%,而且超過實時速度要求。

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 filters)的卷積層,并且在每一個卷積層後面跟一個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上訓練。

Stronger

作者提出了一種在分類資料集和檢測資料集上聯合訓練的機制。使用檢測資料集的圖檔去學習檢測相關的資訊,例如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很難對“太陽鏡”,“遊泳褲”這些類别模組化。

繼續閱讀