YOLO

 

YOLO

YOLO算法整體來說就是把輸入的圖片劃分爲S*S格子,這裏是3*3個格子。當被檢測的目標的中點落入這個格子時,這個格子負責檢測這個目標,如圖中的人。我們把這個圖片輸入到網絡中,最後輸出的尺寸也是S*S*n(n是通道數),這個輸出的S*S與原輸入圖片S*S相對應(都是3*3)。假如我們網絡一共能檢測20個類別的目標,那麼輸出的通道數n=2*(4+1)+20=30。這裏的2指的是每個格子有兩個標定框(論文指出的),4代表標定框的座標信息, 1代表標定框的置信度, 20是檢測目標的類別數。所以網絡最後輸出結果的尺寸是S*S*n=3*3*30。

 

關於標定框

上面說網絡的輸出是S x S x (5*B+C) 的一個 tensor(S尺寸,B標定框個數,C檢測類別數,5標定框的信息)。

5分爲4+1。4代表標定框的位置信息。座標的重點x,y,座標的高寬h,w。如下圖,我們和假設圖片的左上角是(0,0)

右下角爲(1,1)我們就可以求得標定框的位置信息了。

 這裏的1表示每個標定框的置信度以及標定框的準確度信息。公式表示如下,

左邊代表包含這個標定框的格子裏是否有目標有1沒有0,右邊達標標定框的準確程度, 右邊的部分是把兩個標定框(一個是groundtruth一個是預測的標定框)進行一個IOU操作,即兩個標定框的交集比並集,數值越大,即標定框重合越多,越準確。

同時,我們可以計算出各個邊界框類別置信度(class-specific confidence scores):

邊界框類別置信度表徵的是該邊界框中目標屬於各個類別的可能性大小以及邊界框匹配目標的好壞。後面會說,一般會根據類別置信度來過濾網絡的預測框。

網絡結構

 Yolo採用卷積網絡來提取特徵,然後使用全連接層來得到預測值。網絡結構參考GooLeNet模型,包含24個卷積層和2個全連接層。對於卷積層,主要使用1x1卷積來做channle reduction,然後緊跟3x3卷積。對於卷積層和全連接層,採用Leaky ReLU激活函數。但是最後一層卻採用線性激活函數。
 

網絡訓練

1首先我們現在imageNet上預訓練20個卷積

2在預訓練模型的基礎上+全局平均池化層,之後隨機初始化的4個卷積層和2個全連接層。

3由於檢測任務一般需要更高清的圖片,所以將網絡的輸入從224x224增加到了448x448。

網絡結果如下:

損失函數分析 

下面是訓練損失函數的分析,Yolo算法將目標檢測看成迴歸問題,所以採用的是均方差損失函數。但是對不同的部分採用了不同的權重值。首先區分定位誤差和分類誤差。對於定位誤差,即邊界框座標預測誤差,採用較大的權重λcoord=5λcoord=5。然後其區分不包含目標的邊界框與含有目標的邊界框的置信度,對於前者,採用較小的權重值λnoobj=0.5λnoobj=0.5。其它權重值均設爲1。然後採用均方誤差,其同等對待大小不同的邊界框,但是實際上較小的邊界框的座標誤差應該要比較大的邊界框要更敏感。爲了保證這一點,將網絡的邊界框的寬與高預測改爲對其平方根的預測,即預測值變爲
另外一點時,由於每個單元格預測多個邊界框。但是其對應類別只有一個。那麼在訓練時,如果該單元格內確實存在目標,那麼只選擇與ground truth的IOU最大的那個邊界框來負責預測該目標,而其它邊界框認爲不存在目標。這樣設置的一個結果將會使一個單元格對應的邊界框更加專業化,其可以分別適用不同大小,不同高寬比的目標,從而提升模型性能。大家可能會想如果一個單元格內存在多個目標怎麼辦,其實這時候Yolo算法就只能選擇其中一個來訓練,這也是Yolo算法的缺點之一。要注意的一點時,對於不存在對應目標的邊界框,其誤差項就是隻有置信度,左標項誤差是沒法計算的。而只有當一個單元格內確實存在目標時,才計算分類誤差項,否則該項也是無法計算的。
綜上討論,最終的損失函數計算如下:

其中第一項是邊界框中心座標的誤差項,1objij1ijobj指的是第ii個單元格存在目標,且該單元格中的第jj個邊界框負責預測該目標。第二項是邊界框的高與寬的誤差項。第三項是包含目標的邊界框的置信度誤差項。第四項是不包含目標的邊界框的置信度誤差項。而最後一項是包含目標的單元格的分類誤差項,1obji1iobj指的是第ii個單元格存在目標。
 

YOLO缺點

YOLO 對相互靠的很近的物體,還有很小的羣體檢測效果不好,這是因爲一個網格中只預測了兩個框,並且只屬於一類。

同一類物體出現的新的不常見的長寬比和其他情況時,泛化能力偏弱。

由於損失函數的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。


YOLOv2

YOLOv2:代表着目前業界最先進物體檢測的水平,它的速度要快過其他檢測系統(FasterR-CNN,ResNet,SSD),使用者可以在它的速度與精確度之間進行權衡。

YOLO9000:這一網絡結構可以實時地檢測超過 9000 種物體分類,這歸功於它使用了 WordTree,通過 WordTree 來混合檢測數據集與識別數據集之中的數據。

YOLOv1雖然檢測速度很快,但是在檢測精度上卻不如R-CNN系檢測方法,YOLOv1在物體定位方面(localization)不夠準確,並且召回率(recall)較低。下面是YOLOv2改進的各部分。

1Batch Normalization(提升2.4)

Batch Normalization可以提升模型收斂速度,而且可以起到一定正則化效果,降低模型的過擬合。在YOLOv2中,每個卷積層後面都添加了Batch Normalization層,並且不再使用droput。

2High Resolution Classifier

YOLOv1在採用224×224分類模型預訓練後,將分辨率增加至=448×448,並使用這個高分辨率在檢測數據集上finetune。但是直接切換分辨率,檢測模型可能難以快速適應高分辨率。所以YOLOv2增加了在ImageNet數據集上使用448×448=來finetune分類網絡這一中間過程(10 epochs),這可以使得模型在檢測數據集上finetune之前已經適用高分辨率輸入。使用高分辨率分類器後,YOLOv2的mAP提升了約4%。

3Convolutional With Anchor Boxes

我們在YOLO算法中是使用長寬比來表示物體的標定框的大小,但是檢測圖像中的目標有很多不同的長寬比,因此YOLO算法在精確的定位上是比較困難的。

YOLO借鑑了Faster-R-CNN網絡中的先驗框的策略(RPN部分),這個策略可以使模型更容易學習。

YOLOv2移除了YOLOv1中的全連接層而採用了卷積和anchor boxes來預測邊界框。

YOLOv2中把輸入的尺寸調整到416*416的大小,這是爲了適應高分辨率。同時416可以整除32,網絡正好是32倍下採樣率。

416/32=13,即我們輸出的尺寸是13*13,這樣特徵圖恰好只有一箇中心位置。對於一些大物體,它們中心點往往落入圖片中心位置,此時使用特徵圖的一箇中心點去預測這些物體的邊界框相對容易些。

YOLOv2使用了anchor boxes之後,每個位置的各個anchor box都單獨預測一套分類概率值。

 圖爲Ng網課截圖。其中編號2表示使用YOLOv2來檢測汽車的輸出y。

4Dimension Clusters

在Faster R-CNN和SSD中,先驗框的維度(長和寬)都是手動設定的,帶有一定的主觀性。如果選取的先驗框維度比較合適,那麼模型更容易學習,從而做出更好的預測。因此,YOLOv2採用k-means聚類方法對訓練集中的邊界框做了聚類分析。

5New Network: Darknet-19

YOLOv2採用了一個新的基礎模型(特徵提取器),稱爲Darknet-19,包括19個卷積層和5個maxpooling層,

與VGG網絡有着類似的結構,使用大量的3*3和1*1卷積在增加網絡深度的同時,把計算量調小。

6Direct location prediction

用 Anchor Box 的方法,會讓 model 變得不穩定,尤其是在最開始的幾次迭代的時候。大多數不穩定因素產生自預測 Box 的(x,y)位置的時候。按照之前 YOLO的方法,網絡不會預測偏移量,而是根據 YOLO 中的網格單元的位置來預測座標,這就讓 Ground Truth 的值介於 0 到 1 之間。而爲了讓網絡的結果能落在這一範圍內,網絡使用一個 Logistic Activation 來對於網絡預測結果進行限制,讓結果介於 0 到 1 之間。 網絡在每一個網格單元中預測出 5 個 Bounding Boxes,每個 Bounding Boxes 有五個座標值 tx,ty,tw,th,t0,他們的關係見下圖(Figure3)。假設一個網格單元對於圖片左上角的偏移量是 cx、cy,Bounding Boxes Prior 的寬度和高度是 pw、ph,那麼預測的結果見下圖右面的公式: 

因爲使用了限制讓數值變得參數化,也讓網絡更容易學習、更穩定。Dimension clusters和Direct location prediction,使 YOLO 比其他使用 Anchor Box 的版本提高了近5%。

7Fine-Grained Features

YOLO 修改後的特徵圖大小爲 13*13,這個尺寸對檢測圖片中尺寸大物體來說足夠了,同時使用這種細粒度的特徵對定位小物體的位置可能也有好處。Faster-RCNN、SSD 都使用不同尺寸的特徵圖來取得不同範圍的分辨率,而 YOLO 採取了不同的方法,YOLO 加上了一個 Passthrough Layer 來取得之前的某個 26*26 分辨率的層的特徵。這個 Passthrough layer 能夠把高分辨率特徵與低分辨率特徵聯繫在一起,聯繫起來的方法是把相鄰的特徵堆積在不同的 Channel 之中,這一方法類似與 Resnet 的 Identity Mapping,從而把 26*26*512 變成 13*13*2048。YOLO 中的檢測器位於擴展後(expanded )的特徵圖的上方,所以他能取得細粒度的特徵信息,這提升了 YOLO 1% 的性能。

8Multi-Scale Training

區別於之前的補全圖片的尺寸的方法,YOLOv2 每迭代幾次都會改變網絡參數。每 10 個 Batch,網絡會隨機地選擇一個新的圖片尺寸,由於使用了下采樣參數是  32,所以不同的尺寸大小也選擇爲 32 的倍數 {320,352…..608},最小 320*320,最大 608*608,網絡會自動改變尺寸,並繼續訓練的過程。


這一政策讓網絡在不同的輸入尺寸上都能達到一個很好的預測效果,同一網絡能在不同分辨率上進行檢測。當輸入圖片尺寸比較小的時候跑的比較快,輸入圖片尺寸比較大的時候精度高,所以你可以在 YOLOv2 的速度和精度上進行權衡。

 

 

 

 

 

 

 

 

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