YOLO — You Only Look Once 介紹

C.C.Lo
13 min readAug 24, 2017

--

[前言]

近幾年的Object Detection由於CNN的關係準確度與運算速度也大幅度的提升,Must-Read paper有R-CNN, Fast R-CNN, Faster R-CNN, YOLO, SSD。

這篇post主要是記錄YOLO的翻譯筆記,其實網路上也有很多介紹文章了但因為最近需要實作所以就好好的把論文看一遍並且記錄下來。

[Introduction]

Classical Object Detection的流程主要分為三個部分:

Object Detection = Object Localization + Feature Extraction + Image Classification

將三個不同的演算法湊在一塊以完成Object Detection這項任務。近年比較經典的有DPM(Deformable Parts Models),DPM是先以sliding windows approach來取得candidate localizations,再透過SIFT取features後交由SVM來分類。而在CNN重返榮耀後,R-CNN透過CNN來取features,由於CNN所抓取出來的features相對泛用,並同時擁有極佳的辨識與分類的效果使得偵測結果大幅提升,R-CNN是先由selective search來預測約2k個region proposals,免除原先sliding windows大量不必要的運算,接著將取得的proposals皆透過CNN(論文中是使用AlexNet)來取得features,最後交由SVM來分類,而分類完成後會透過bounding-box regression來re-fine所得到的detection。每個部份獨立所以必須分開訓練使得流程很慢並且難最佳化。

本文中提出YOLO將object detection視為一個single regression problem,YOLO在從影像輸入到輸出預測結果僅靠一個CNN來實現,利用CNN來同時預測多個bounding-box並且針對每一個box來計算物體的機率,而在訓練的時候也是直接拿整張圖丟到NN中來訓練,這樣end-to-end的算法可以避免傳統object detection的必須分開訓練的缺點,並且大幅加快運算速度,一般的YOLO版本可以在single Titan X GPU可以有45FPS,而輕量化版本甚至達到150FPS。

相較於sliding window和region proposals是對於局部的區域來辨識物體,YOLO在訓練與使用階段皆是針對整張影像,所以對於背景的偵測效果有較佳的結果,其背景錯誤偵測率僅有Fast R-CNN的一半。

透過YOLO訓練學習到的物體特徵很泛用(generalization),即使將透過nature images訓練出來的YOLO拿來測試artwork仍然可以outperform其他像是DPM以及R-CNN的測試結果,並且因為很泛用所以即使是拿new-domain或是不在預期中的輸入來測試YOLO還是可以很穩定。

[Unified Detection]

YOLO

YOLO將原本分散的object detection 步驟融合成一個single neural network,透過整張影像的features來預測每一個bounding box,並且同時計算每個bounding box對於每一個class的機率,YOLO不僅是從整張影像來偵測物體並且end-to-end訓練與運算以及可以即時運算仍維持著高精準度。

每個影像切成SxS的格子(grid),如果格子中間有物體則該格子會負責去偵測該物體。每個格子又會預測B個bounding boxes與其confidence scores, 其中conf. scores表對應b-box含有物體的信心程度以及該b-box中的物體的精準度

conf. score = Pr(Object) * IOU (groundtruth)

如果該b-box的原生grid cell不含有物體,則理想conf. score應為0,否則理想conf. score的分數應和IOU相同。(最佳的情況是不含有物體則 Pr(Object) = 0 ;含有物體則 Pr(Object) = 1)

每個b-box都有五個預測參數,x, y, w, h, confidence,(x, y)表示box中心相對於grid cell的位移,而w, h為b-box長寬,confidence即為IOU (between predicted box and any ground truth box)。

另外會將每一個grid cell對每個類別去計算該類別出現的機率(conditional class probabilities),測試時是將conditional class probabilities乘上每個b-box的conf. predictions

Pr(Class-i|Object) * Pr(Object) * IOU = Pr(Class-i) * IOU

這樣對每個b-box皆會求出class-specific conf. score

影像切成SxS個grid cell,每個grid cell預測B個b-box與C class的機率,最後的tensor dimension為

tensor dimension: S x S x (B * 5 + c) ( B*5因為B有5維)

YOLO在PASCAL VOC上使用的參數 S=7, B=2, C=20, 故VOC final predition為7x7x30 tensor.

[2.1 Network Design]

YOLO CNN model Architecture

主要實作與測試於PASCAL VOC dataset。YOLO有24 conv. layers和 2 fc layers;另外有一個僅有9 conv. layers的Fast版本Fast YOLO。最後的輸出為7x7x30的tensor。

[2.2 Training]

2012 ImageNet 1000-class dataset來pretrain 前20層conv. layers與avg.-pooling layer + fc layer。大概花了1週的訓練時間而最後 top-5 accuracy達到88% (ImageNet 2012 validation set),其中training & inference皆是使用darknet framework。訓練後在model後面加上隨機參數的4個conv. layer & 2 fc layers以提高model performance(Ren et al.)。由於object detection需要更多的紋理細節特徵所以將原本輸入從224x224提高至448x448,最後的fc layer同時預測每一類別的機率以及b-box coordinates,同時會將b-box的w,h 針對影像的w,h來正規化至0到1以及將x, y也針對該grid cell正規化至0到1。在CNN中final layer用linear activation而其他neuron的activation則是使用leaky ReLU。

Leaky ReLU

loss function為sum-squared error,因為sum-squared error相對好最佳化,但在最佳化過程中會將localization error weights equally使得其結果其實不會達到最好,而在訓練過程中很多grid cell包含沒有任何object使得conf. score趨近0,導致有object的grid cell造成的誤差會被放大,如此可能會使得model不穩定並且在訓練過程中發散。為了補償這個問題增加了b-box predition的loss權重並且減少未包含物體的conf. predition的loss權重,let lambda-coord = 5 & lambda-noobj = 0.5。

sum-squared error對於不同大小的boxes的權重也相同,但實際上對於同樣的離散值而言較大的box應該影響誤差較小,所以透過利用寬高的平方根來解決此問題。

最後因為YOLO對於每個grid cell都會計算幾個b-box,在訓練的過程會將對於每個辨識出來的object含有最大IOU的bounding box選為該object的bounding box predictor來代表該物體

最後在訓練時,主要是最佳化下面的loss function:

YOLO Loss Function

loss function在訓練時只會在該grid cell中含有object才考慮其分類的錯誤誤差,而只會在該bounding box為object predictor時才會考慮其bounding box error (5-d)。

最後訓練的參數如下

[TRAINING PARAMS]
135 epochs on training & validation form PASCAL VOC 2007/2012,
batch size = 64,
momentum = 0.9,
decay = 0.0005,
learning rate:
0–75 epochs = 10^-2,
75–105 epochs = 10^-3,
105–135 epochs = 10^-4,
dropout rate = 0.5
data augmentation for 20% more date size
randomly adjust exposure and saturation up to 1.5x in HSV space

[2.3 Inference]

實際測試的時候跟訓練一樣,直接將影像透過一個network即可求得結果,因為這樣所以YOLO真的很快,比傳統classifier-based的演算法快。因為切成格子的關係會使得其空間訊息分散開,通常還是可以明確的知道哪個格子包含物體,而對於大物體或者是物體再邊邊的多個格子也可以定位的到,不過若加入NMS(non-maximal expression)可以提高mAP2–3%

[2.4 Limitaion of YOLO]

YOLO的架構對於每個格子再空間上的限制是每個格子只會預測兩個bounding boxes以及一個class,因此對於很小的物體會較難辨識。

[Comparison to Other Detection Systems]

這邊將YOLO與近期內效果比較好的演算法拿來比較。

Deformable parts models

DPM是用sliding window的方式來處理object detection的定位問題,並且再用分別的演算法來進行features extraction & image classification,YOLO則是將三個部分透過一個神經網路來達成,並且相對於傳統的feature extractor需要先擷取全部的feature,YOLO可以直接透過不同影像輸入即可馬上訓練,並且可以讓模型速度更快以及更精準。

R-CNN

R-CNN用region proposals來取代sliding window來定位物體位置,並且用CNN擷取特徵後透過SVM來分類,最後再微調bounding box。其中每一個步驟都需要特別訓練以及tuned過,並且整體的運算速度很慢,一張影像約需要47s。YOLO則是在定位時給予一些限制並且僅求98個bounding box(相較於R-CNN 2000個 pproposals)來使得速度可以提升。

paper中還有一些其他效果較好的模型比較,實際上都大同小異。

[Experiments]

在這節呈現測試結果

[4.1 Comparison to Other Real-Time Systems]

Real-Time System on PASCAL VOC 2007

首先是Real-Time Detector,在YOLO提出的時候可以達到即時偵測的模型僅有100Hz DPM & 30Hz DPM,雖然這兩個模型的FPS可以達到100跟30,但其mAP僅有20%多,相對的YOLO可以達到63.4%且仍有45FPs,而Fast YOLO甚至可以達到155FPS的速度還有52.7% mAP。

另外是比較mAP的部分,YOLO就沒有辦法辨識的較Fast R-CNN和Faster R-CNN好,即使YOLO將原本GoogLeNet的架構換成VGG-16雖然有提升mAP但還是不夠好。

[4.2 VOC 2007 Error Analysis]

Error Analysis: Fast R-CNN vs. YOLO

在VOC 2007的錯誤分析中,可以看到YOLO對於背景的誤辨識率極低(4.75%)相較於Fast R-CNN的13.6%,但Fast R-CNN對於定位的錯誤率就表現得比YOLO較佳許多。

[4.3 Combining Fast R-CNN and YOLO]

Model combination experiments on VOC 2007

因為Fast R-CNN跟YOLO錯誤辨識的類型不太相同,所以透過將Fast R-CNN與YOLO結合,可以看到結合後的mAP達到75%,因為在辨識錯誤的部分兩個演算法有互補的功能,但運算速度方面就是會變得跟Fast R-CNN差不多了。

[Conclusion]

這篇論文提出YOLO將傳統object detection中不同步驟的算法透過一個NN model來達到相同的目的,並且因為這樣end-to-end的特性使得訓練速度提升並且模型更加泛用,以及在實際測試時候的運算速度極快。

--

--