YOLO_原理詳述

問題背景:“end-to-end方法的典型代表就是有名的yolo。前面的方法中,CNN本質的作用還是用來分類,定位的功能其並沒有做到。而yolo這種方法就是隻通過CNN網絡,就能夠實現目標的定位和識別。”
這是在知乎上看到的一句話。我突然像看看YOLO的厲害之處在哪?所以寫這篇博文。

本文參考鏈接:
https://zhuanlan.zhihu.com/p/25236464

文中標藍部分爲暫未弄清楚的部分,留坑。也歡迎各位dalao指教。


一、創新

YOLO將物體檢測作爲迴歸問題求解。基於一個單獨的end-to-end網絡,完成從原始圖像的輸入到物體位置和類別的輸出。從網絡設計上,YOLO與rcnn、fast rcnn及faster rcnn的區別如下:

[1] YOLO訓練和檢測均是在一個單獨網絡中進行。YOLO沒有顯示地求取region proposal的過程。而rcnn/fast rcnn 採用分離的模塊(獨立於網絡之外的selective search方法)求取候選框(可能會包含物體的矩形區域),訓練過程因此也是分成多個模塊進行。Faster rcnn使用RPN(region proposal network)卷積網絡替代rcnn/fast rcnn的selective
search模塊,將RPN集成到fast rcnn檢測網絡中,得到一個統一的檢測網絡。儘管RPN與fast rcnn共享卷積層,但是在模型訓練過程中,需要反覆訓練RPN網絡和fast rcnn網絡(注意這兩個網絡核心卷積層是參數共享的)。

[2]YOLO將物體檢測作爲一個迴歸問題進行求解,輸入圖像經過一次inference(推理),便能得到圖像中所有物體的位置和其所屬類別及相應的置信概率。而rcnn/fast rcnn/faster rcnn將檢測結果分爲兩部分求解:物體類別(分類問題),物體位置即bounding box(迴歸問題)。

這裏寫圖片描述

二、網絡結構

這裏寫圖片描述
YOLO檢測網絡包括24個卷積層和2個全連接層。其中,卷積層用來提取圖像特徵,全連接層用來預測圖像位置和類別概率值。採用了多個下采樣層,網絡學到的物體特徵並不精細,因此也會影響檢測效果。YOLO網絡借鑑了GoogLeNet分類網絡結構。看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值。(mAp60%+,這大概是YOLO沒有大力推廣的原因。。。)

三、輸出

YOLO將輸入圖像分成SxS個格子,每個格子負責檢測‘落入’該格子的物體。何爲之落入?若某個物體的中心位置的座標落入到某個格子,那麼這個格子就負責檢測出這個物體。如下圖所示,圖中物體狗的中心點(紅色原點)落入第5行、第2列的格子內,所以這個格子負責預測圖像中的物體狗。


這裏寫圖片描述

每個格子輸出B個bounding box(包含物體的矩形區域)信息,以及C個物體屬於某種類別的概率信息。B、C是由卷積網絡的結構確定?

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是否包含物體以及物體位置的準確性,計算方式如下:


confidence = P(object)* IOU,

其中,若bounding box包含物體,則P(object) = 1;否則P(object) = 0。
IOU(intersection over union)爲預測bounding box與物體真實區域的交集面積(以像素爲單位,用真實區域的像素面積歸一化到[0,1]區間)。
因此,YOLO網絡最終的全連接層的輸出維度是 S*S*(B*5 + C)。
YOLO論文中,作者訓練採用的輸入圖像分辨率是448x448,S=7,B=2;採用VOC 20類標註物體作爲訓練數據,C=20。因此輸出向量爲7*7*(20 + 2*5)=1470維。作者開源出的YOLO代碼中,全連接層輸出特徵向量各維度對應內容如下:


這裏寫圖片描述

注:

*由於輸出層爲全連接層,因此在檢測時,YOLO訓練模型只支持與訓練圖像相同的輸入分辨率。

*雖然每個格子可以預測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作爲物體檢測輸出,即每個格子最多隻預測出一個物體。當物體佔畫面比例較小,如圖像中包含畜羣或鳥羣時,每個格子包含多個物體,但卻只能檢測出其中一個。這是YOLO方法的一個缺陷將全部bbox輸出的缺陷是什麼?爲什麼不能這麼做?

四、Loss函數

YOLO使用均方和誤差作爲loss函數來優化模型參數,即網絡輸出的S*S*(B*5 + C)維向量與真實圖像的對應S*S*(B*5 + C)維向量的均方和誤差。如下式所示。


這裏寫圖片描述

其中,coordError、iouError和classError分別代表預測數據與標定數據之間的座標誤差、IOU誤差和分類誤差。具體的公式如下:


這裏寫圖片描述

其中,x,y,w,C,p爲網絡預測值,x,y,w,C,p帽 爲標註值。ii(obj)(i)表示物體落入格子i中,ii(obj)(ij) 表示物體落入格子i的第j個bounding box內。ii(noobj)(ij) 表示物體未落入格子i的第j個bounding box內。YOLO方法模型訓練依賴於物體識別標註數據,因此,對於非常規的物體形狀或比例,YOLO的檢測效果並不理想。???不是都依賴於標註數據嗎?

可以看到,式中有幾項是帶係數的,這是因爲:
[1] 位置相關誤差(座標、IOU)與分類誤差對網絡loss的貢獻值是不同的。

[2] 在計算IOU誤差時,落入物體的格子與無落入物體的格子,二者的IOU誤差對網絡loss的貢獻值是不同的。若採用相同的權值,那麼無落入物體的格子的confidence值近似爲0,反過來,變相放大了落入物體的格子的confidence誤差在計算網絡參數梯度時的影響。

[3]對於相等的誤差值,大物體誤差對檢測的影響應小於小物體誤差對檢測的影響。這是因爲,相同的位置偏差佔大物體的比例遠小於同等偏差佔小物體的比例。YOLO將物體大小的信息項(w和h)進行求平方根來改進這個問題。(注:這個方法並不能完全解決這個問題)。那有沒有其他什麼好方法解決這一問題?

五、訓練

YOLO模型訓練分爲兩步:

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

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

六、效果

下表給出了YOLO與其他物體檢測方法,在檢測速度和準確性方面的比較結果(使用VOC 2007數據集)。


這裏寫圖片描述
這裏寫圖片描述

綜上,YOLO具有如下優點

1.快。YOLO將物體檢測作爲迴歸問題進行求解,整個檢測網絡pipeline簡單。在titan x GPU上,在保證檢測準確率的前提下(63.4% mAP,VOC 2007 test set),可以達到45fps的檢測速度。
2.背景誤檢率低。YOLO在訓練和推理過程中關注整張圖像的整體信息,而基於region proposal的物體檢測方法(如rcnn/fast rcnn),在檢測過程中,只關注候選框內的局部圖像信息。因此,對於後者,若當圖像背景中的部分數據被包含在候選框中送入檢測網絡進行檢測時,容易被誤檢測成物體。測試證明,YOLO對於背景圖像的誤檢率低於fast rcnn誤檢率的一半。
3.通用性強。YOLO對於藝術類作品中的物體檢測同樣適用。它對非自然圖像物體的檢測率遠遠高於DPM和RCNN系列檢測方法。

但相比RCNN系列物體檢測方法,YOLO具有以下缺點
1.識別物體位置精準性差。
2.召回率低。召回率?

爲提高物體定位精準性和召回率,YOLO作者提出了YOLO9000,提高訓練圖像的分辨率,引入了faster rcnn中anchor box的思想,對各網絡結構及各層的設計進行了改進,輸出層使用卷積層替代YOLO的全連接層,聯合使用coco物體檢測標註數據和imagenet物體分類標註數據訓練物體檢測模型。相比YOLO,YOLO9000在識別種類、精度、速度、和定位準確性等方面都有大大提升。挖坑,YOLO9000。

七、實踐

使用YOLO訓練自己的物體識別模型也非常方便,只需要將配置文件中的20類,更改爲自己要識別的物體種類個數即可。訓練時,建議使用YOLO提供的檢測模型(使用VOC 20類標註物體訓練得到)去除最後的全連接層初始化網絡挖坑,試一試。

YOLO作者開源代碼請見
https://pjreddie.com/darknet/yolov1/
Windows版可以參考鏈接,支持Visual Studio編譯。
https://github.com/zhaolili/darknet

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