1. 程式人生 > >解讀YOLO目標檢測方法

解讀YOLO目標檢測方法

Ross Girshick提出的Faster R-CNN把目標檢測的速度提高了一大步,在用Titan X時檢測速度可以達到7fps,同時準確度達到73mAP。但在實際使用時這樣的速度還是達不到實時的目地的,幾乎在提出Faster R-CNN的同時,Joseph Redmon和Ross Girshick又提出了一種叫做YOLO的檢測方法,速度可以達到45fps,YOLO的名字取自You only look once,從名字就能看出它的速度有多快。雖然45fps已經達到了實時的目標,但YOLO從出生那天起自身就帶有很多的缺陷,最大的問題就是mAP只有63,這樣的準確度就讓實用價值打上了折扣,但不管怎麼說作為第一個達到實時檢測目標的結構YOLO還是有很多值得參考的地方的。

一、整體結構

YOLO之前的結構都會先對輸入的圖片提取要檢測的區域(proposal),然後僅對proposal區域進行分類,因為整個過程分為提取proposal+檢測兩個階段,速度就打了折扣。YOLO則直接砍掉了提取proposal的過程,一次迴歸就完成bbox位置、目標置信度、分類的工作。圖1是它的基本結構:

圖1:YOLO結構

輸入的圖片是448x448的尺寸,經過24個卷積+2個全連線層變成[1,7,7,30]的輸出,這個結構的特徵提取部分有點像GoogLeNet,只是用(1x1卷積+relu+3x3卷積+relu)代替了GoogLeNet上的inception結構。最後的輸出長寬方向都只有7個點,也就是說原始的448x448圖片可以在長寬方向各7等分,49個小區域各自提煉成最終輸出上的一個點;此外在特徵維度上最後的輸出的長度是30,代表了每個點都有30種要進行迴歸的輸出。具體是哪30種資料呢?包括了2個bounding box的位置[x,y,w,h],2個bounding box的confidence值,20個類別的分類概率,加在一起就有BX5+C=30(B=2個bounding box, C=20個分類)個輸出。7x7個區域每個都有30個輸出,所以整個圖就有SXSX(BX5+C)=1470個要回歸的資料(S=7,是原圖上等分的數目)。

圖2:YOLO要同時訓練bounding box位置、置信度、分類概率來完成目標識別圖2:YOLO要同時訓練bounding box位置、置信度、分類概率來完成目標識別

下面來詳述上面那30個輸出的含義:

bounding box位置:在Faster R-CNN中每個anchor都有9個不同尺寸的形狀來確保能覆蓋到原圖上的目標,到了YOLO就做了簡化,每個區域只用了兩種尺寸的形狀來覆蓋目標,如圖3紅色的區域就用黃色的兩個bounding box。每個bounding box都用[x,y,w,h]來定位,x、y代表中心點在原圖上的座標位置,w、h代表bounding box的長寬。事實上這種簡化成兩個bounding box的方法會犧牲效能,這也是YOLO準確度低的原因,在後來的YOLO2、SSD方法中重新啟用了Faster R-CNN的多個anchor的方式來提升mAP。

圖3:每個小區域(紅色框)對應有兩個bounding box(黃色框)

confidence值:confidence是指某個小區域是否被用作識別目標,以及該區域對應的bounding box覆蓋目標的準確度,confidence可以用公式1表示。如果ground truth的中心點落在小區域(圖3紅框)內部,第一項Pr(Object)就等於1,否則是0;IOU是bounding box和ground truth間的重疊部分面積佔兩者總覆蓋面積的比例。在Faster R-CNN中IOU只被用來得出Pr(Object),並沒有真正用於迴歸計算,到了YOLO中IOU也參與到迴歸,這麼做能得到更加精確的目標位置。

公式1

要注意的是某一個ground truth只會對應小區域內IOU最大的那個bounding box。也就是說ground truth和bounding box是一一對應的關係。

如果同時有多個目標落在同一個區域內,該區域內的bounding box只選用IOU最大的目標來計算confidence。

分類概率:在作者的論文中只選擇了20個類別來做識別,根據ground truth的類別來給每個小區域打上label。

二、loss計算

再看下loss的計算,公式2是YOLO的全部loss組成,分為4個部分

公式2:YOLO的loss

公式的前兩項是全部SxSxB個bounding box的位置[x,y,w,h]相對於ground truth位置的迴歸損失值,1ijobj就是前面提到的Pr(Object),如果ground truth的中心點落在小區域(圖3紅框)內部,它就等於1,否則是0。

在有相同的預測偏差時,偏差給小尺寸的bbox帶來的影響要比大尺寸的bbox大的多,因為小尺寸bbox只要偏移一點識別就會完全不準,為了緩和這個問題,作者對w、h的迴歸損失採用開根號的方法來計算。如圖4:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。反過來可以理解成調整相同大小的損失梯度時,小尺寸bbox就偏移的更少,調整的就更精確。

圖4:開根號後小的bbox比大的bbox在w、h上的迴歸損失要大

公式2的第3項和第4項是置信度的迴歸損失,C就是某個小區域的bounding box的IOU值,第4項的1ijnoobj只有當ground truth的中心點不落在該區域才是1,否則是0,和1ijobj正好相反。這裡為什麼要有λcoord和λnoobj兩個權重,論文中的解釋是,大部分網格是不包含目標的,所以第4部分的Loss會比較大,以致於壓制其他部分的loss對整體loss的影響,會導致模型引數的不穩定,容易發散,所以會設定一個比較小的λnoobj和比較大的λcoord使得包含目標的網格的預測損失能夠有比較大的權重。

三、測試過程

完成訓練後再來看下結構怎麼用來測試。測試時需要將每個bbox的置信度乘上該小區域各個類的預測概率,得到每個類的置信度,見公式3。

公式3

得到了全部bbox的類別置信度後,再用一個門限過濾掉得分低的值,剩下的再用NMS做非極大值抑制,得出的結果就是最終的識別結果。

四、YOLO的優點

YOLO最大的優點就是不用再提取proposal,直接對全圖進行迴歸,原先的兩步流程變成了一步到位,自然速度就快了很多。為什麼能砍掉提取proposal的過程呢?在講到Faster R-CNN要有proposal的原因時,我們最常提到的一點是:如果對整張圖的特徵進行分類,目標周圍的不相關背景會帶來干擾,引起分類不準確。這個問題產生的根因是在Faster R-CNN的最後一級卷積層,空間維度上的資訊都已被pooling成了一個點,對一個包含了全部背景、前景資訊的點標註label,會造成計算出的loss中包含過多背景干擾,進而訓練的不準確。
到了YOLO,卷積的輸出不再是一個點,而是7x7個點,你可以給每個點都單獨標註上原圖對應區域的目標的label(不再是全圖一個label),這樣就能指引每個點按各自區域內的目標去收斂,不再受到周圍背景的干擾。
事實上YOLO的這種結構還是有些缺陷的,因為在輸出最終的7x7之前有兩個全連線層,這意味著7x7的每個點都攜帶有全圖資訊,我們並不需要全圖資訊,只要一個小區域的資訊就能滿足要求,有了全圖資訊反而會造成收斂變慢。YOLO的這個缺陷在一年後的SSD結構中有了全新的解決辦法。

五、YOLO的缺陷

YOLO有不少缺陷,幾個最明顯的問題是:
1、如果兩個要識別的物體中心點落在同一區域,但屬於不同的類別,就無法都識別出。原因很明顯:一個小區域雖然能輸出兩個bounding box,但都是同一類別,兩種類別的物體無論如何都不可能識別全。
2、如果兩個物體的類別是一樣的,是不是就能識別全呢?當兩個物體尺寸、位置([x,y,w,h])比較相近時答案就是否定的。前面介紹YOLO的輸出結構時提到訓練時gound truth和bounding box是一一對應的,一個ground truth在一個區域中選擇哪個bounding box來訓練由IOU的最大值來決定,由此可以推斷兩個尺寸、位置相近的ground truth一定對應同一個bounding box來訓練,到了測試階段兩個尺寸、位置相近的目標也就一定由同一個bounding box來識別,因為測試時一個bounding box只能對應有一個輸出([x,y,w,h]),所以就無法區分開兩種物體。
3、當長寬比和bbox的預設長寬比差異比較大時,IOU會很小,會影響檢測;

以上這些缺陷都成為了YOLO後來改進的方向。