YOLO v2受到faster rcnn的啓發,引入了anchor。同時使用了K-Means方法,對anchor數量進行了討論,在精度和速度之間作出折中。而且修改了網絡結構,去掉了全鏈接層,改爲了全卷積結構。在訓練時引入了世界樹(WordTree)結構,將檢測和分類問題作成了一個統一的框架,而且提出了一種層次性聯合訓練方法,將ImageNet分類數據集和COCO檢測數據集同時對模型訓練。網絡
使用Batch normalizationapp
神經網絡學習過程本質就是爲了學習數據分佈,一旦訓練數據與測試數據的分佈不一樣,那麼網絡的泛化能力也大大下降;另一方面,一旦每批訓練數據的分佈各不相同(batch 梯度降低),那麼網絡就要在每次迭代都去學習適應不一樣的分佈,這樣將會大大下降網絡的訓練速度。框架
解決辦法之一是對數據都要作一個歸一化預處理。YOLOv2網絡經過在每個卷積層後添加batch normalization,極大的改善了收斂速度同時減小了對其它regularization方法的依賴(捨棄了dropout(一種經常使用的過擬合處理方法)優化後依然沒有過擬合),使得mAP得到了2%的提高。dom
高分辨率ide
全部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%的提高。性能
引入anchor Box學習
YOLO(v1)使用全鏈接層數據進行bounding box預測(要把1470*1的全連接層reshape爲7*7*30的最終特徵),這會丟失較多的空間信息定位不許。YOLOv2借鑑了Faster R-CNN中的anchor思想: 簡單理解爲卷積特徵圖上進行滑窗採樣,每一箇中心預測9種不一樣大小和比例的建議框。因爲都是卷積不須要reshape,很好的保留的空間信息,最終特徵圖的每一個特徵點和原圖的每一個cell一一對應。並且用預測相對偏移(offset)取代直接預測座標簡化了問題,方便網絡學習。測試
具體作法:
去掉最後的池化層確保輸出的卷積特徵圖有更高的分辨率。
縮減網絡,讓圖片輸入分辨率爲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(維度聚類)
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) \]
直接座標預測
使用anchor boxes的另外一個問題是模型不穩定,尤爲是在早期迭代的時候。大部分的不穩定現象出如今預測box的(x,y)座標時。
在區域建議網絡(RPN)中會預測座標就是預測tx,ty。對應的中心點(x,y)按以下公式計算:
\[ x=(t_x\times w_a)+x_a\\ y=(t_y\times h_a)+y_a\\ \]
這個公式沒有任何限制,不管在什麼位置進行預測,任何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爲:
細粒度特徵
修改後的網絡最終在13 * 13的特徵圖上進行預測,雖然這足以勝任大尺度物體的檢測,若是用上細粒度特徵的話可能對小尺度的物體檢測有幫助。Faser R-CNN和SSD都在不一樣層次的特徵圖上產生區域建議以得到多尺度的適應性。YOLOv2使用了一種不一樣的方法,簡單添加一個 passthrough layer,把淺層特徵圖(分辨率爲26 * 26)鏈接到深層特徵圖。
passthroughlaye把高低分辨率的特徵圖作連結,疊加相鄰特徵到不一樣通道(而非空間位置),相似於Resnet中的identity mappings。這個方法把26 * 26 * 512的特徵圖疊加成13 * 13 * 2048的特徵圖,與原生的深層特徵圖相鏈接。
YOLOv2的檢測器使用的就是通過擴展後的的特徵圖,它可使用細粒度特徵,使得模型的性能得到了1%的提高。
多尺度訓練
不一樣於固定網絡輸入圖片尺寸的方法,每通過10批訓練(10 batches)就會隨機選擇新的圖片尺寸。網絡使用的降採樣參數爲32,因而使用32的倍數{320,352,…,608},最小的尺寸爲320 * 320,最大的尺寸爲608 * 608。 調整網絡到相應維度而後繼續進行訓練。
這種機制使得網絡能夠更好地預測不一樣尺寸的圖片,同一個網絡能夠進行不一樣分辨率的檢測任務,在小尺寸圖片上YOLOv2運行更快,在速度和精度上達到了平衡。
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 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框架)
初始的224 * 224訓練後把分辨率上調到了448 * 448,使用一樣的參數又訓練了10次,學習率調整到了\[ 10^{-3} \]。高分辨率下訓練的分類網絡top-1準確率76.5%,top-5準確率93.3%。
也添加了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上訓練。
論文提出了一種聯合訓練的機制:使用識別數據集訓練模型識別相關部分,使用分類數據集訓練模型分類相關部分。
衆多周知,檢測數據集的標註要比分類數據集打標籤繁瑣的多,因此ImageNet分類數據集比VOC等檢測數據集高出幾個數量級。因此在YOLOv1中,邊界框的預測其實並不依賴於物體的標籤,YOLOv2實現了在分類和檢測數據集上的聯合訓練。對於檢測數據集,能夠用來學習預測物體的邊界框、置信度以及爲物體分類,而對於分類數據集能夠僅用來學習分類,可是其能夠大大擴充模型所能檢測的物體種類。
做者選擇在COCO和ImageNet數據集上進行聯合訓練,遇到的第一問題是二者的類別並非徹底互斥的,好比"Norfolk terrier"明顯屬於"dog",因此做者提出了一種層級分類方法(Hierarchical classification),根據各個類別之間的從屬關係(根據WordNet)創建一種樹結構WordTree,結合COCO和ImageNet創建的詞樹(WordTree)
經過對YOLOv1網絡結構和訓練方法的改進,提出了YOLOv2/YOLO9000實時目標檢測系統。YOLOv2在YOLOv1的基礎上進行了一系列的改進,在快速的同時達到state of the art。同時,YOLOv2能夠適應不一樣的輸入尺寸,根據須要調整檢測準確率和檢測速度(值得參考)。做者綜合了ImageNet數據集和COCO數據集,採用聯合訓練的方式訓練,使該系統能夠識別超過9000種物品。除此以外,做者提出的WordTree能夠綜合多種數據集的方法能夠應用於其它計算機數覺任務中。可是對於重疊的分類,YOLOv2依然沒法給出很好的解決方案。