1. 程式人生 > >YOLOV1原理

YOLOV1原理

問題背景:“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