yolo_v1

一.yolo概述

作者在YOLO算法中把物體檢測(object detection)問題處理成迴歸問題,用一個卷積神經網絡結構就可以從輸入圖像直接預測bounding box和類別概率。

YOLO算法的優點:1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。2、YOLO是基於圖像的全局信息進行預測的。這一點和基於sliding window以及region proposal等檢測算法不一樣。與Fast R-CNN相比,YOLO在誤檢測(將背景檢測爲物體)方面的錯誤率能降低一半多。3、YOLO可以學到物體的generalizable representations。可以理解爲泛化能力強。4、準確率高,有實驗證明。

yolov1只有7*7*2=98個proposal。

算法結構圖如Fig1:結構上主要的特點就是 unified detection,不再是原來許多步驟組成的物體檢測,這使得模型的運行速度快,可以直接學習圖像的全局信息,且可以end-to-end訓練。

                           

算法首先把輸入圖像劃分成S*S的格子,如果一個目標的中心落入格子,該格子就負責檢測該目標對應原文如下:

                        

算法首先把輸入圖像劃分成S*S的格子,然後對每個格子都預測B個bounding boxes。每一個Bounding box信息包含5個數據值,分別是x,y,w,h,和confidence。其中x,y是指當前格子預測得到的物體的bounding box的中心位置的座標。w,h是bounding box的寬度和高度。注意:實際訓練過程中,w和h的值使用圖像的寬度和高度進行歸一化到[0,1]區間內;x,y是bounding box中心位置相對於當前格子位置的偏移值,並且被歸一化到[0,1]。

confidence反映當前bounding box是否包含物體以及物體位置的準確性。

                                              

其中,若bounding box包含物體,則Pr(object) = 1;否則Pr(object) = 0. 

IOU(intersection over union)爲預測bounding box與ground truth的iou值。

每個bounding box都對應一個confidence score,如果grid cell裏面沒有object,confidence就是0,如果有,則confidence score等於預測的box和ground truth的IOU值,見上面公式。所以如何判斷一個grid cell中是否包含object呢?答案是:如果一個object的ground truth的中心點座標在一個grid cell中,那麼這個grid cell就是包含這個object,也就是說這個object的預測就由該grid cell負責。

即yolo的目標檢測完全是由一些grid cell負責的,即爲那些包含ground truth中心點的grid cell。

(正確與否待驗證。。。)

每個grid cell都預測C個類別概率,表示一個grid cell在包含object的條件下屬於某個類別的概率.。

注意預測c個類別的概率是以一個grid cell爲整體,而不管其中包含的B個bbox。

在測試時,每個box通過類別概率和box置信度相乘來得到特定類別置信分數:

         

                          

這個分數代表該類別出現在box中的概率和box和目標的合適度。在PASCAL VOC數據集上評價時,我們採用S=7,B=2,C=20(該數據集包含20個類別),最終預測結果爲7×7×30的tensor。 

這個乘法具體是怎麼做的呢?請看下圖:每個bounding box的confidence和每個類別的score相乘,得到每個bounding box屬於哪一類的confidence score。

這裏寫圖片描述

即得到每個bounding box屬於哪一類的confidence score。也就是說最後會得到20*(7*7*2)=20*98的score矩陣,括號裏面是bounding box的數量,20代表類別。接下來的操作都是20個類別輪流進行:在某個類別中(即矩陣的某一行),將得分少於閾值(0.2)的設置爲0,然後再按得分從高到低排序。最後再用NMS算法去掉重複率較大的bounding box(NMS:針對某一類別,選擇得分最大的bounding box,然後計算它和其它bounding box的IOU值,如果IOU大於0.5,說明重複率較大,該得分設爲0,如果不大於0.5,則不改;這樣一輪後,再選擇剩下的score裏面最大的那個bounding box,然後計算該bounding box和其它bounding box的IOU,重複以上過程直到最後)。最後每個bounding box的20個score取最大的score,如果這個score大於0,那麼這個bounding box就是這個socre對應的類別(矩陣的行),如果小於0,說明這個bounding box裏面沒有物體,跳過即可。具體細節參考最後的參考資料1。

                        

二.網絡結構

YOLO網絡借鑑了GoogLeNet分類網絡結構。不同的是,YOLO未使用inception
module,而是使用1x1卷積層(此處1x1卷積層的存在是爲了跨通道信息整合)+3x3卷積層簡單替代。
YOLO論文中,作者還給出一個更輕快的檢測網絡fast YOLO,它只有9個卷積層和2個全連接層。使用titan x GPU,fast YOLO可以達到155fps的檢測速度,但是mAP值也從YOLO的63.4%降到了52.7%,但卻仍然遠高於以往的實時物體檢測方法(DPM)的mAP值。

最終輸出爲7×7×30的tensor。

三.訓練

作者採用ImageNet 1000-class 數據集來預訓練卷積層。預訓練階段,採用上圖網絡中的前20卷積層,外加average-pooling 層和全連接層。模型訓練了一週,獲得了top-5 accuracy爲0.88(ImageNet2012 validation set),與GoogleNet模型準確率相當。然後,將模型轉換爲檢測模型。作者向預訓練模型中加入了4個卷積層和兩層全連接層,提高了模型輸入分辨率(224×224->448×448)。最後一層預測類別概率和bounding box協調值。bounding box的寬和高通過輸入圖像寬和高歸一化到0-1區間。

實際訓練過程中,w和h的值使用圖像的寬度和高度進行歸一化到[0,1]區間內;x,y是bounding box中心位置相對於當前格子位置的偏移值,並且被歸一化到[0,1]。

最後一層採用linear activation,其它層使用 leaky rectified linear。

                                                       

損失函數方面,作者採用sum-squared error的方式把localization error(bounding box的座標誤差)和classificaton error整合在一起。但是如果二者的權值一致,容易導致模型不穩定,訓練發散。因爲很多grid cell是不包含物體的,這樣的話很多grid cell的confidence score爲0。所以採用設置不同權重方式來解決,一方面提高localization error的權重,另一方面降低沒有object的box的confidence loss權值,loss權重分別是5和0.5。而對於包含object的box的confidence loss權值還是原來的1。詳見下面的原文解釋和loos function函數。

             

    

這裏詳細講一下loss function。在loss function中,前面兩行表示localization error(即座標誤差),第一行是box中心座標(x,y)的預測,第二行爲寬和高的預測。這裏注意用寬和高的開根號代替原來的寬和高,這樣做主要是因爲相同的寬和高誤差對於小的目標精度影響比大的目標要大。舉個例子,原來w=10,h=20,預測出來w=8,h=22,跟原來w=3,h=5,預測出來w1,h=7相比,其實前者的誤差要比後者小,但是如果不加開根號,那麼損失都是一樣:4+4=8,但是加上根號後,變成0.15和0.7。
第三、四行表示bounding box的confidence損失,就像前面所說的,分成grid cell包含與不包含object兩種情況。這裏注意下因爲每個grid cell包含兩個bounding box,所以只有當ground truth 和該網格中的某個bounding box的IOU值最大的時候,才計算這項。
第五行表示預測類別的誤差,注意前面的係數只有在grid cell包含object的時候才爲1。

所以具體實現的時候是什麼樣的過程呢?

訓練的時候:輸入N個圖像,每個圖像包含M個object,每個object包含4個座標(x,y,w,h)和1個label。然後通過網絡得到7*7*30大小的三維矩陣。每個1*30的向量前5個元素表示第一個bounding box的4個座標和1個confidence,第6到10元素表示第二個bounding box的4個座標和1個confidence。最後20個表示這個grid cell所屬類別。注意這30個都是預測的結果。然後就可以計算損失函數的第一、二 、五行。至於第三四行,confidence可以根據ground truth和預測的bounding box計算出的IOU和是否有object的0,1值相乘得到。真實的confidence是0或1值,即有object則爲1,沒有object則爲0。 這樣就能計算出loss function的值了。

測試的時候:輸入一張圖像,跑到網絡的末端得到7*7*30的三維矩陣,這裏雖然沒有計算IOU,但是由訓練好的權重已經直接計算出了bounding box的confidence。然後再跟預測的類別概率相乘就得到每個bounding box屬於哪一類的概率。

四.分析

Limitations
一,YOLO的每一個網格只預測兩個boxes,一種類別。這導致模型對相鄰目標預測準確率下降。因此,YOLO對成隊列的目標(如 一羣鳥)識別準確率較低。
二,YOLO是從數據中學習預測bounding boxes,因此,對新的或者不常見角度的目標無法識別。
三,YOLO的loss函數對small bounding boxes和large bounding boxes的error平等對待,影響了模型識別準確率。因爲對於小的bounding boxes,small error影響更大。

YOLO模型訓練分爲兩步:

1)預訓練。使用ImageNet
1000類數據訓練YOLO網絡的前20個卷積層+1個average池化層+1個全連接層。訓練圖像分辨率resize到224x224。

2)用步驟1)得到的前20個卷積層網絡參數來初始化YOLO模型前20個卷積層的網絡參數,然後用VOC 20類標註數據進行YOLO模型訓練。爲提高圖像精度,在訓練檢測模型時,將輸入圖像分辨率resize到448x448。

                     

五.參考文獻

https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.p 

(非常清楚的圖解了yolo網絡,尤其是測試過程)

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