1. 程式人生 > >深度學習演算法之YOLOv2

深度學習演算法之YOLOv2

一. 久違的新版本

       YOLO 問世已久,不過風頭被SSD蓋過不少,原作者自然不甘心,YOLO v2 的提出給我們帶來了什麼呢?

       先看一下其在 v1的基礎上做了哪些改進,直接引用作者的實驗結果了:


      條目不少,好多Trick,我們一個一個來看:

 A)Batch Normalization(批量規範化)

       先建立這樣一個觀點: 對資料進行預處理(統一格式、均衡化、去噪等)能夠大大提高訓練速度,提升訓練效果。

       批量規範化  正是基於這個假設的實踐,對每一層輸入的資料進行加工。示意圖:


       Batch Normalization,簡稱 BN,由Google提出,是指對資料的 歸一化、規範化、正態化。BN 作為近幾年最火爆的Trick之一,主流的CNN都已整合。

       該方法的提出基於以下背景:

1)神經網路每層輸入的分佈總是發生變化,通過標準化上層輸出,均衡輸入資料分佈,加快訓練速度;

      可以設定較大的學習率和衰減,而不用去care初始引數,BN總能快速收斂,調參狗的福音

2)通過規範化輸入,降低啟用函式在特定輸入區間達到飽和狀態的概率,避免 gradient vanishing 問題;

      舉個例子:0.95^64 ≈ 0.0375    計算累積會產生資料偏離中心,導致誤差的放大或縮小

3)輸入規範化對應樣本正則化,在一定程度上可以替代 Drop Out;

      Drop Out的比例也可以被無視了,全自動的節奏。

       BN 的做法是 在卷積池化之後,啟用函式之前,對每個資料輸出進行規範化(均值為 0,方差為 1)


       公式很簡單,第一部分是 Batch內資料歸一化(其中 E為Batch均值,Var為方差),Batch資料近似代表了整體訓練資料。

       第二部分是亮點,即引入 附加引數 γ 和 β(Scale & Shift),Why? 因為簡單的歸一化 相當於只使用了啟用函式中近似線性的部分(如下圖紅色虛線),破壞了原始資料的特徵分佈,這會降低模型表達能力。


       這兩個引數需要通過訓練得到:


       關於這一層的函式定義、反向求導 等具體推理本章不再做進一步介紹,大家肯定可以搜到很多專門講 BN的文獻。

B)High Resolution Classifier

      YOLO 對應訓練過程分為兩步,第一步是通過 ImageNet 訓練集 進行高解析度的預訓練,這一步訓練的是分類網路第二步是訓練檢測網路,是在分類網路的基礎上進行 fine tune。

      之前的 YOLO v1以解析度224*224訓練分類網路,YOLO v2 將分類網路的解析度提高到 448*448,高解析度樣本對於效果有一定的提升(文中mAp提高了約4%)。

      高解析度對於精度的提高是顯而易見的,這點我們不去論證。

C)New Network(新網路)

      為保證後續 Anchor Boxes 講解的連續性,這裡將New Network提前。

      作者對網路進行了改進:

      1)不同於SSD的VGG-16網路,作者採用的基礎網路是Googlenet,並且加入了自己的訂製,來看資料對比:

                                                      Googlenet       vs       VGG-16

              前向傳播運算量(一次)           85.2億次                                  306.9億次

              精度(224 * 224)                         88%                                         90%                         single-crop,top-5 accuracy


              整體來看,VGG-16整體精確度較高,但計算量過於複雜,價效比不高。

       2)YOLO v2採用了常用的3 * 3卷積核,在每一次池化操作後把通道數翻倍。借鑑了network in network的思想,網路使用了全域性平均池化(global average pooling)做預測,把1 * 1的卷積核置於3 * 3的卷積核之間,用來壓縮特徵。

            YOLO v2包含19個卷積層、5個最大值池化層(max pooling layers )。

D)Convolutional With Anchor Boxes

      Faster的 Anchor 機制又一次得到印證,與SSD一樣,Anchor建立了和原始座標的對應關係:

      定義了不同的Scale和寬高比,一箇中心對應K個不同尺度和寬高比的Boxes

      

     YOLO v1:    S*S* (B*5 + C)   =>  7*7(2*5+20)

           其中B對應Box數量,5對應 Rect 定位+置信度。

           每個Grid只能預測對應兩個Box,這兩個Box共用一個分類結果(20 classes),

           這是很不合理的臨時方案,看來作者為第二篇論文預留了改進,沒想被 SSD 搶了風頭。

     YOLO v2:    S*S*K* (5 + C)   =>  13*13*9(5+20)

           解析度改成了13*13,更細的格子劃分對小目標適應更好,再加上與Faster一樣的K=9,計算量增加了不少。

           通過Anchor Box改進,mAP由69.5下降到69.2,Recall由81%提升到了88%。

     SSD(-):    S*S*K*(4 + C)  => 7*7*6*( 4+21 )

           對應C=21,代表20種分類類別和一種 背景類。

E)Dimension Clusters(維度聚類)

      還是針對Anchors,Faster的Anchor對應 K=9,那麼為什麼等於9呢?寬高比為什麼定位成這樣(1:1,1:2,2:1)?

      對於SSD選擇了K=6,那麼K到底等於幾合適?寬高比又該怎麼設計? 作者給出瞭解決方案,這個解決方案就是聚類。

      作者在 VOC和COCO上通過Ground Truth進行聚類統計(採用K-means演算法),得到如下兩個有用資訊:

       1)從K=1到K=5,IOU曲線上升較快(對應匹配度高),因此從效果和複雜度進行Trade Off, 選定了 Anchor Box個數為5;對應左圖

       2)統計發現,瘦高的框比扁平的框要多一些(人比車多?),選定了5種不同 寬高比+Scale 的 Anchor Box;對應右圖

      

       注:k-mans 採用的距離函式(度量標準) 描述為:

          d(box,centroid) = 1 - IOU(box,centroid)

       作者實驗發現,5種boxes的Avg IOU(61.0)就和Faster R-CNN的9種Avg IOU(60.9)相當。 說明K-means方法的生成的boxes更具有代表性。

F)Direct location prediction(直接位置預測)

       直接Anchor Box迴歸導致模型不穩定,對應公式也可以參考 Faster-RCNN論文,該公式沒有任何約束,中心點可能會出現在影象任何位置,這就有可能導致迴歸過程震盪,甚至無法收斂


       針對這個問題,作者在預測位置引數時採用了強約束方法:

       1)對應 Cell 距離左上角的邊距為(Cx,Cy),σ定義為sigmoid啟用函式,將函式值約束到[0,1],用來預測相對於該Cell 中心的偏移(不會偏離cell);

       2)預定Anchor(文中描述為bounding box prior)對應的寬高為(Pw,Ph),預測 Location 是相對於Anchor的寬高 乘以係數得到;

       如下圖所示:


      作者通過使用 維度聚類 和 直接位置預測 這兩項Anchor Boxes改進方法,將 mAP 提高了5%。

G)Fine-Grained Features(細粒度特徵)

      SSD通過不同Scale的Feature Map來預測Box來實現多尺度,而YOLO v2則採用了另一種思路:新增一個passthrough layer,來獲取上一層26x26的特徵,並將該特徵同最後輸出特徵(13*13)相結合,以此來提高對小目標的檢測能力。

      通過Passthrough 把26 * 26 * 512的特徵圖疊加成13 * 13 * 2048的特徵圖,與原生的深層特徵圖相連線。

      YOLO v2 使用擴充套件後的的特徵圖(add passthrough),將mAP提高了了1%

     PS:這裡實際上是有個Trick,網路最後一層是13*13,相對原來7*7的網路來講,細粒度的處理目標已經double了,再加上上一層26*26的Feature共同決策,這兩層的貢獻等價於SSD的4層以上,但計算量其實並沒有增加多少。

H)Multi-Scale Training(多尺度訓練)

      為了讓 YOLOv2 適應不同Scale下的檢測任務,作者嘗試 通過不同解析度圖片的訓練來提高網路的適應性

      PS:網路只用到了卷積層和池化層,可以進行動態調整(檢測任意大小圖片)

具體做法是:

     每經過10批訓練(10 batches)就會隨機選擇新的圖片尺寸,尺度定義為32的倍數,( 320,352,…,608 ),

     為了最後一層得到特徵圖尺度為13*13(416=13*32),YOLO v2 輸入圖片尺寸為416 * 416,降取樣引數為32。


二. 訓練過程

作者採用的深度學習框架是Darknet,該框架作者使用很少,具體不作描述。

a)預訓練 - 訓練分類網路(Training for classification)

       採用隨機梯度下降法SGD,在 ImageNet-1000分類資料集 上訓練了160個epochs,引數設定:

       初始學習率 - starting learning rate:0.1

       多項式速率衰減 - polynomial rate decay:4的冪次

       權值衰減 - weight decay:0.0005

       動量 - momentum:0.9

b)資料增廣方法(Data augmentation)

      採用了常見的data augmentation,包括:

      隨機裁剪、旋轉 - random crops、rotations

      色調、飽和度、曝光偏移 - hue、saturation、exposure shifts

c)多解析度訓練

      通過初始的224 * 224訓練後,把解析度上調到了448 * 448,同樣的引數又訓練了10個epochs,然後將學習率調整到了10^{-3}。

d)訓練檢測網路 - Training for detection

      把分類網路改成檢測網路,去掉原網路最後一個卷積層,增加了三個 3 * 3 (1024 filters)的卷積層,並且在每一個卷積層後面跟一個1 * 1的卷積層,輸出個數是檢測所需要的數量。

      初始學習率為10^{-3},訓練了160個epochs(劃分為60 | 10 | 90),權值衰減 與 momentum引數與前面一樣。


三. 交叉資料集訓練

       大家都知道,不同的資料集有不同的作用,通常我們採用一個數據集進行訓練,而作者提出了新的思路:

       通過ImageNet訓練分類,COCO和VOC資料集來訓練檢測,這是一個很有價值的思路,可以讓我們在公網上達到比較優的效果。 通過將兩個資料集混合訓練,如果遇到來自分類集的圖片則只計算分類的Loss,遇到來自檢測集的圖片則計算完整的Loss。

      這裡面是有問題的,ImageNet對應分類有9000種,而COCO則只提供80種目標檢測,這中間如何Match?答案就是multi-label模型,即假定一張圖片可以有多個label,並且不要求label間獨立。

      還是通過作者Paper裡的圖來說明,由於ImageNet的類別是從WordNet選取的,作者採用以下策略重建了一個樹形結構(稱為分層樹):

1)遍歷Imagenet的label,然後在WordNet中尋找該label到根節點(指向一個物理物件)的路徑;

2)如果路徑直有一條,那麼就將該路徑直接加入到分層樹結構中;

3)否則,從剩餘的路徑中選擇一條最短路徑,加入到分層樹。

     這個分層樹我們稱之為 Word Tree,作用就在於將兩種資料集按照層級進行結合。



        分類時的概率計算借用了決策樹思想,某個節點的概率值等於 該節點到根節點的所有條件概率之積

        另外,softmax操作也同時應該採用分組操作,下圖上半部分為ImageNet對應的原生Softmax,下半部分對應基於Word Tree的Softmax:


       通過上述方案構造WordTree,得到對應9418個分類,通過重取樣保證Imagenet和COCO的樣本資料比例為4:1(這個沒有太明顯的意義,你也可以改成6:1試試效果)。


四. 效果如何?

       YOLO v2 在大尺寸圖片上能夠實現高精度,在小尺寸圖片上執行更快,可以說在速度和精度上達到了平衡。

       總結下不同解析度下的震撼的效果:

1)低解析度 - 228 * 228,幀率達到90FPS,mAP幾乎與Faster媲美;

2)高解析度,在VOC2007 上mAP達到78.6%,同時FPS=40;

       看圖說話:

    

       相比SSD,YOLOv2添加了諸多工程Trick,雖然在演算法理論上並沒有明確的突破,但效果著實提升不少,相信實用性仍是我們的第一齣發點,為作者點贊!