1. 程式人生 > >[目標檢測]YOLO原理

[目標檢測]YOLO原理

本文轉自:https://www.cnblogs.com/fariver/p/7446921.html

1 YOLO

創新點: 端到端訓練及推斷 + 改革區域建議框式目標檢測框架 + 實時目標檢測

1.1 創新點

(1) 改革了區域建議框式檢測框架: RCNN系列均需要生成建議框,在建議框上進行分類與迴歸,但建議框之間有重疊,這會帶來很多重複工作。YOLO將全圖劃分為SXS的格子,每個格子負責中心在該格子的目標檢測,採用一次性預測所有格子所含目標的bbox、定位置信度以及所有類別概率向量來將問題一次性解決(one-shot)。

1.2 Inference過程

YOLO網路結構由24個卷積層與2個全連線層構成,網路入口為448x448(v2為416x416),圖片進入網路先經過resize,網路的輸出結果為一個張量,維度為:


其中,S為劃分網格數,B為每個網格負責目標個數,C為類別個數。該表示式含義為:

 

(1) 每個小格會對應B個邊界框,邊界框的寬高範圍為全圖,表示以該小格為中心尋找物體的邊界框位置。

(2) 每個邊界框對應一個分值,代表該處是否有物體及定位準確度:

(3) 每個小格會對應C個概率值,找出最大概率對應的類別P(Class|object),並認為小格中包含該物體或者該物體的一部分。

1.3 分格思想實現方法

一直困惑的問題是:分格思想在程式碼實現中究竟如何體現的呢?
在yolov1的yolo.cfg檔案中:

[net]
batch=1
subdivisions=1
height=448
width=448
channels=3
momentum=0.9
decay=0.0005
saturation=1.5
exposure=1.5
hue=.1

conv24 。。。

[local]
size=3
stride=1
pad=1
filters=256
activation=leaky
[dropout]
probability=.5
[connected]
output= 1715
activation=linear

[detection]
classes=20
coords=4
rescore=1
side=7
num=3
softmax=0
sqrt=1
jitter=.2

object_scale=1
noobject_scale=.5
class_scale=1
coord_scale=5

最後一個全連線層輸出特徵個數為1715,而detction層將該1715的特徵向量整個為一個,的張量。其中,side∗side即為原圖中S∗S的小格。為什麼side位置的輸出會對應到原圖中小格的位置呢?因為訓練過程中會使用對應位置的GT監督網路收斂,測試過程中每個小格自然對應原圖小格上目標的檢測。

預測處理過程資料的歸一化

在訓練yolo前需要先準備資料,其中有一步為:

python voc_label.py

中有個convert函式

def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

GT邊界框轉換為(xc, yc, w, h)的表示方式,wc, yc, w, h被歸一化到0~1之間。
再看損失函式
參見博文

1.4 YOLO缺點

1) 對小物體及鄰近特徵檢測效果差:當一個小格中出現多於兩個小物體或者一個小格中出現多個不同物體時效果欠佳。原因:B表示每個小格預測邊界框數,而YOLO默認同格子裡所有邊界框為同種類物體。

(2) 圖片進入網路前會先進行resize為448 x 448,降低檢測速度(it takes about 10ms in 25ms),如果直接訓練對應尺寸會有加速空間。

(3) 基礎網路計算量較大,yolov2使用darknet-19進行加速。

1.5 實驗結論

(1) 速度更快(實時):yolo(24 convs) -> 45 fps,fast_yolo(9 convs) -> 150 fps

(2) 全圖為範圍進行檢測(而非在建議框內檢測),帶來更大的context資訊,使得相對於Fast-RCNN誤檢率更低,但定位精度欠佳。

1.6 YOLO損失函式

Yolo損失函式的理解學習於潛伏在程式碼中
** Loss = λcoord * 座標預測誤差(1) + 含object的box confidence預測誤差 (2)+ λnoobj* 不含object的box confidence預測誤差(3) + 每個格子中類別預測誤差(4) **


 

(1) 整個損失函式針對邊界框損失(圖中1, 2, 3部分)與格子(4部分)主體進行討論。

(2) 部分1為邊界框位置與大小的損失函式,式中對寬高都進行開根是為了使用大小差別比較大的邊界框差別減小。例如,一個同樣將一個100x100的目標與一個10x10的目標都預測大了10個畫素,預測框為110 x 110與20 x 20。顯然第一種情況我們還可以失道接受,但第二種情況相當於把邊界框預測大了一倍,但如果不使用根號函式,那麼損失相同,都為200。但把寬高都增加根號時:

顯然,對小框預測偏差10個畫素帶來了更高的損失。通過增加根號,使得預測相同偏差與更小的框產生更大的損失。但根據YOLOv2的實驗證明,還有更好的方法解決這個問題。

(3) 若有物體落入邊界框中,則計算預測邊界框含有物體的置信度Ci和真實物體與邊界框IoUCiˆ的損失,我們希望兩差值越小損失越低。

(4) 若沒有任何物體中心落入邊界框中,則Ciˆ為0,此時我們希望預測含有物體的置信度Ci越小越好。然而,大部分邊界框都沒有物體,積少成多,造成loss的第3部分與第4部分的不平衡,因此,作才在loss的三部分增加權重λnobj=0.5 。

(5) 對於每個格子而言,作者設計只能包含同種物體。若格子中包含物體,我們希望希望預測正確的類別的概率越接近於1越好,而錯誤類別的概率越接近於0越好。loss第4部分中,若pi(c)ˆ中c為正確類別,則值為1,若非正確類別,則值為0。
參考譯文
參考潛伏在程式碼中

2 YOLOv2

yolov1基礎上的延續,新的基礎網路,多尺度訓練,全卷積網路,Faster-RCNN的anchor機制,更多的訓練技巧等等改進使得yolov2速度與精度都大幅提升,改進效果如下圖:

2.1 BatchNorm

Batchnorm是2015年以後普遍比較流行的訓練技巧,在每一層之後加入BN層可以將整個batch資料歸一化到均值為0,方差為1的空間中,即將所有層資料規範化,防止梯度消失與梯度爆炸,如:

0.930=0.04

加入BN層訓練之後效果就是網路收斂更快,並且效果更好。YOLOv2在加入BN層之後mAP上升2%。
關於BN作用

 

2.2 預訓練尺寸

yolov1也在Image-Net預訓練模型上進行fine-tune,但是預訓練時網路入口為224 x 224,而fine-tune時為448 x 448,這會帶來預訓練網路與實際訓練網路識別影象尺寸的不相容。yolov2直接使用448 x 448的網路入口進行預訓練,然後在檢測任務上進行訓練,效果得到3.7%的提升。

2.3 更細網路劃分

yolov2為了提升小物體檢測效果,減少網路中pooling層數目,使最終特徵圖尺寸更大,如輸入為416 x 416,則輸出為13 x 13 x 125,其中13 x 13為最終特徵圖,即原圖分格的個數,125為每個格子中的邊界框構成(5 x (classes + 5))。需要注意的是,特徵圖尺寸取決於原圖尺寸,但特徵圖尺寸必須為奇數,以此儲存中間有一個位置能看到原圖中心處的目標。

2.4 全卷積網路

為了使網路能夠接受多種尺寸的輸入影象,yolov2除去了v1網路結構中的全連層,因為全連線層必須要求輸入輸出固定長度特徵向量。將整個網路變成一個全卷積網路,能夠對多種尺寸輸入進行檢測。同時,全卷積網路相對於全連線層能夠更好的保留目標的空間位置資訊。

2.5 新基礎網路

下圖為不同基礎網路結構做分類任務所對就的計算量,橫座標為做一次前向分類任務所需要的運算元目。可以看出作者所使用的darknet-19作為基礎預訓練網路(共19個卷積層),能在保持高精度的情況下快速運算。而SSD使用的VGG-16作為基礎網路,VGG-16雖然精度與darknet-19相當,但運算速度慢。關於darknet-19基礎網路速度

2.6 anchor機制

yolov2為了提高精度與召回率,使用Faster-RCNN中的anchor機制。以下為我對anchor機制使用的理解:在每個網格設定k個參考anchor,訓練以GT anchor作為基準計算分類與迴歸損失。測試時直接在每個格子上預測k個anchor box,每個anchor box為相對於參考anchor的offset與w,h的refine。這樣把原來每個格子中邊界框位置的全圖迴歸(yolov1)轉換為對參考anchor位置的精修(yolov2)。
至於每個格子中設定多少個anchor(即k等於幾),作者使用了k-means演算法離線對voc及coco資料集中目標的形狀及尺度進行了計算。發現當k = 5時並且選取固定5比例值的時,anchors形狀及尺度最接近voc與coco中目標的形狀,並且k也不能太大,否則模型太複雜,計算量很大。

2.7 新邊界框預測方式

這部分沒有看太懂,先佔個坑,等以後明白了再來補,感覺應該是在彌補大小邊界框迴歸誤差損失的問題吧。這裡發現有篇博文對這部分講得挺仔細的。

2.8 殘差層融合低階特徵

為了使用網路能夠更好檢測小物體,作者使用了resnet跳級層結構,網路末端的高階特徵層與前一層或者前幾層的低階細粒度特徵結合起來,增加網路對小物體的檢測效果,使用該方法能夠將mAP提高1%。
同樣,在SSD檢測器上也可以看出使用細粒度特徵(低階特徵)將進行小物體檢測的思想,但是不同的是SSD直接在多個低階特徵圖上進行目標檢測,因此,SSD對於小目標檢測效果要優於YOLOv2,這點可以coco測試集上看出,因為coco上小物體比較多,但yolov2在coco上要明顯遜色於ssd,但在比較簡單的檢測資料集voc上優於ssd。

2.9 多尺寸訓練

yolov2網路結構為全卷積網路FCN,可以適於不同尺寸圖片作為輸入,但要滿足模型在測試時能夠對多尺度輸入影象都有很好效果,作者訓練過程中每10個epoch都會對網路進行新的輸入尺寸的訓練。需要注意的是,因為全卷積網路總共對輸入影象進行了5次下采樣(步長為2的卷積或者池化層), 所以最終特徵圖為原圖的1/32。所以在訓練或者測試時,網路輸入必須為32的位數。並且最終特徵圖尺寸即為原圖劃分網路的方式
譯文參見
ref1
ref2比較明白
ref3