YOLOv1論文閱讀理解

You Only Look Once: Unified, Real-Time Object Detection

YOLOv1

早期檢測任務是用分類的方法來做定位,一般分爲兩個階段。YOLOv1直接把檢測問題作爲迴歸問題來做,在一次推斷中直接能端到端(一階段)得到邊界框(bounding boxes)和分類概率。Fast YOLO的速度是當時其他實時檢測網絡的n倍,mAP也是至少2倍。YOLOv1在藝術品檢測方面比DPM和R-CNN好,不過作者承認自己總體檢測精度和SOTA的相比還是稍微有點落後。

本文提及R-CNN先使用region proposal方法來得到潛在的邊界框,然後對這些框進行分類,再後面進行座標值的微調,重新計算框的得分,使得結果更加精確。但是R-CNN有個缺點就是訓練是分多個步驟進行的,相比之下YOLOv1可以直接端到端訓練一個神經網絡即可。YOLOv1的推斷速度非常快,即使不使用batch運算,在一塊 Titan X GPU上的運行速度是45 fps,而Fast YOLO版本能達到150 fps。

YOLOv1最主要是思想是,網絡的輸出的特徵形狀是S×SS\times S個像素點(先不考慮channel),其可以對應到輸入圖像的S×SS\times S的格子(grid,其中每個grid包含一片像素區域,簡單理解就是最終輸出的像素點映射到輸入就是一小片像素區域,這裏一定要好好理解一下,不然下面都看不懂!),如果某個物體的中心落在某個格子中,那麼就由這個格子來負責檢測這個物體。每個格子負責B個邊界框和格子的自信度(confidence),自信度可以理解爲這裏多大概率是可以預測到這個物體。自信度的計算方法是r(Object)IOUpredtruth{r(Object)*IOU^{truth}_{pred}},如果不存在物體這個值就是0。

每個格子有5個預測值,即(x, y, w, h, confidence),其中(x, y)表示落在這個grid單元的物體中心。(w, h)就表示這個物體的寬高,最後的(confidence)就表示上面提到的自信度。除此了前面提到的5種值,每個grid還會預測CC個類各自的概率P()P(物體屬於哪個類),對於每個grid,無論設置的框個數BB爲多少,YOLOv1只預測一次這個概率(這個也是YOLOv1一個很大的缺陷,對於圖像中有密集型物體,基本無能爲力)。

在這裏插入圖片描述

如上圖所示第一張圖有S×SS\times S的格子,注意事實上YOLOv1用的是一種沒那麼直觀的映射方法,其不是實際在輸入圖上進行了格子劃分,而是認爲一個S×SS\times S的輸出恰好就完成了這種劃分任務。比如假設原圖尺寸是448×448×3448\times 448\times 3,那麼經過網絡的各種池化、卷積,最終在網絡末端生成了S×S×(B5+C)S\times S\times(B*5+C)維度的特徵映射層,實際上就是假想是對原圖了進行了一個grid的劃分(再次注意實際上並沒做任何預處理,網絡是end to end的)。從最終的輸出層看,每個grid(實際維度是1×1×(B5+C)1\times 1\times(B*5+C),共有S×SS\times S個)根據比例縮放關係,負責回原圖對應格子上的物體檢測任務。

YOLOv1在 PASCAL VOC上設定B=2B=2S=7S=7,由於該數據集共有20個類,所以網絡的輸出是一個7×7×307\times 7\times 30的向量(每個1×1×301\times 1\times 30的向量相當於負責輸入圖像的一個grid,共有7×77\times 7個這種向量,每個向量與輸入圖像具有很強的對應關係)。

YOLOv1的網絡結構是參考了GoogLeNet,前面用了24個卷積層,後面連了兩個全連接層,除了最後一層用的普通線性激活單元,其餘層用的是泄露值爲0.1的leaky RELU。作者順便訓練了一個Fast YOLO版本,但只是把24個卷積層換成了9個,其它參數設定和訓練過程均與YOLOv1 baseline的設定都是一樣的。
在這裏插入圖片描述
網絡在實際訓練的時候用了在ImageNet上訓練過的模型作爲預訓練模型,圖像的輸入分辨率爲224×224224\times 224,只訓練了前20個卷積層,用的是自己寫的Darknet框架。在fine tune的時候又在20個層的基礎上添加了剩餘的4個卷積層,而且分辨率也擴大到448×448448\times 448。這裏有個細節,生成的邊界框的(w, h)是圖像寬高的一個比值,所以其大小在0和1之間。另外邊界框的(x, y)座標也是某個對應grid的補償,所以這個值也是在0和1之間。

在計算loss的時候,用的是平方和誤差,因爲這個誤差簡單粗暴好優化。不過也有一些缺點,不如對定位誤差和分類誤差採取相同的誤差計算方式並不太合適。而且如果一個grid不包含任何物體,這個格子的confidence就是0,其在計算梯度時有碾壓那些包含有物體的趨勢。爲了進行減少這種失衡,作者減少了confidence計算的權重。另外還有一個問題,這種誤差計算對於大物體和小物體採取的策略仍舊是一樣的,而實際上需要使得在大物體中的小偏差的影響要小於在小物體中的偏差。因此在計算(w,h)的loss的時候,作者直接對寬高取了根號。整體的loss計算方式如下:
在這裏插入圖片描述
裏面個那個1iobj1^{obj}_{i}表示物體是否出現在了第i個格子,而1ijobj1^{obj}_{ij}則表示第i個格子中的第j個box。前面的λ\lambda係數就是表示某種的加權,如座標損失加權、是否有物體加權。在訓練的時候YOLOv1有用上dropout策略,而數據增強採用的是隨機縮放(最大到1.2倍),還有在HSV顏色域隨機調整因子爲1.5的曝光度和飽和度。

在推斷的時候,由於多個格子可能對同一相同都進行了預測,這裏採用了R-CNN中使用的非極大值抑制策略(NMS),刪除了冗餘的邊界框,使得結果更加清晰精準。

如前面提到,YOLOv1有一個很大缺陷就是不管某個grid的預測了幾個box,最終只輸出一個,如果實際圖片的物體分佈很密集,這個算法就會有很大概率漏檢。而且YOLOv1很難處理諸如鳥羣這種小物體,因此其還有一個很主要的缺點就是錯誤定位,因爲一般來講同樣的偏差大小對於小物體往往比對大物體更有毀滅影響。

在提到一些相關工作時,作者解釋傳統物體檢測方法的第一步一般是先提取一些魯棒特徵,如Haar、SIFT、HOG、卷積特徵等,然後才進行分類和定位。這些分類器或者定位器要麼是用在滑動窗口上,要麼是用於部分通過各種辦法挑選好的候選區域。而YOLOv1則直接把這兩個步驟合二爲一,只用一個神經網絡就解決一切,極大加快了計算速度。

除了用上訴提到的baseline網絡,本文作者也嘗試用VGG-16訓練了一個版本,其推斷速度當然更慢,所以他們主要還是把中心聚焦於自己提出來的版本。下面這個表是幾個代表算法在PASCAL VOC 2007上的檢測效果:
在這裏插入圖片描述
YOLOv1在預測背景上要比R-CNN好一些,作者嘗試把R-CNN檢測後的結果再用YOLO跑一遍,mAP有所提升。

文章具體的一些結果細節就不進行展開了。

YOLOv1總體上還是一篇很具有開創性的文章,其提出了一階段的檢測思想,雖然總體的效果略遜色於二階段的網絡,但其無敵的推斷速度,還是具有很強的實用場景。

YOLOv2
YOLOv3

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