yolo系列文章之yolov1詳解

論文地址:You Only Look Once: Unified, Real-Time Object Detection

主要思想

先前的目標檢測研究主要將目標檢測問題看作一個分類問題,稍加改動分類器將其應用到目標檢測任務中。在做着的工作中,將目標檢測問題看作一個回歸問題,在空間上分割邊界框及其聯繫的類別概率。單個神經網絡在一次評估中直接從完整圖像上預測邊界框和類別概率。由於整個檢測pipeline是一個單一網絡,因此可以直接對檢測性能進行端到端的優化。

整個的yolo架構非常快,基礎的yolo模型可以達到實時的45FPS(每秒45幅圖片),其中一個小版本的Fast yolo可以達到155FPS,對比現在最優的目標檢測器,儘管yolo在位置的預測上產生更多的錯誤,但是相對不太可能在背景上預測物體產生假陽性(false positive)。yolo能夠學習到非常通用的表達,而且從自然圖像到其他領域(例如藝術品)泛化時,能夠得到超出RCNN,DPM等算法的結果。

整體介紹

RCNN目標檢測器採用區域建議( region proposal)的方法,先生成一系列的區域,然後利用分類器,對每個區域進行分類,分類之後,應用後處理來精修框,移除重複的框,基於場景中的其他物體重新給bbox評定得分。這種複雜的pipeline很慢並且很難優化,各部分必須單獨訓練,訓練過程較慢。

YOLO直接將目標檢測問題看作一個回歸問題,直接利用一個單一的網絡,從圖像像素直接生成bbox坐標和類別的概率。you only look once就可以直到物體在哪,是什麼。

YOLO的優點

  • unified model 使得yolo的速度非常快
  • 不像 sliding window和基於region proposal的rcnn系列方法,YOLO在訓練與測試時可以看到整張圖片,對全局的語義信息進行編碼,因此相對可以產生較少的背景的假陽性(false positive)
  • YOLO的泛化能力好,在自然圖像上訓練,在藝術品圖像測試可以得到更好的效果

YOLO的缺點:YOLO準確率相對於RCNN系列的文章還有很大的差距,尤其是在小目標的識別上,還有很大的差距

訓練測試還有預訓練模型均開源://pjreddie.com/yolo/

網絡結構介紹

YOLO是一個unified network,直接利用一張圖片的全局特徵來預測所有的bbox與所有的類別得分。

將一幅圖片分成SxS個柵格, 如果一個物體的中心落到了某個柵格中,那麼這個柵格就會用來預測這個物體。

每個柵格預測B個bbox和這些bbox的置信度得分,這些置信度反映了這個模型對於bbox中包含物體以及準確程度,如果在一個柵格中不存在物體那麼這個置信度就為0,如果存在,那麼置信度為預測框與真實bbox的IOU值。

每個bbox包含5個預測值:x, y, w, h, confiden,這個x, y是bbox的中心,w, h為bbox的寬高,confidence為這個bbox與ground truth的IOU。

每個網格單元還預測C個條件類別概率。這些概率以包含目標的網格單元為條件。每個網格單元我們只預測的一組類別概率,而不管邊界框的的數量B是多少。

然後利用類別的條件概率乘以bbox的confidence就得到每個bbox的特定類別的置信度得分。

由於grid cell的數目為SxS,bbox的數目為B,每個bbox預測x, y, w, h, confiden5個值,一共有C個類別,那麼最終輸出為SxSx(Bx5+C)大小的張量。

網絡結構圖:

yolov1_1.png

在pascal voc數據集上的實驗中S = 7,B = 2, C = 20, 最終的輸出為7x7x30

訓練過程中使用ImageNet預訓練模型,並且使用圖像的寬高將預測輸出的w和h歸一化到0, 1的範圍內,同時利用grid cell的位置偏移,將bbox的中心x, y歸一化到0,1。最後一層使用線性激活函數,其他層使用leak Relu。

優化了模型輸出中的平方和誤差。我們使用平方和誤差,因為它很容易進行優化,但是它並不完全符合我們最大化平均精度的目標。分類誤差與定位誤差的權重是一樣的,這可能並不理想。另外,在每張圖像中,許多網格單元不包含任何對象。這將這些單元格的「置信度」分數推向零,通常壓倒了包含目標的單元格的梯度。這可能導致模型不穩定,從而導致訓練早期發散。

為了改善這一點,我們增加了邊界框坐標預測損失,並減少了不包含目標邊界框的置信度預測損失。我們使用兩個參數 λ*{coord} λ*{noobj} 來完成這個工作。我們設置λ*{coord} =5和λ*{noobj} =0.5。

平方和誤差同樣給大bbox和小bbox誤差賦予了相同的權重。我們的誤差指標應該反映出,大的bbox的偏差的重要性不如小bbox。為了部分解決這個問題,我們預測邊界框寬度和高度的平方根,而不是寬度和高度。

YOLO對於每個grid cell來預測多個邊界框,在訓練的時候對於每個cell選擇具有最大IOU的bbox來預測目標,這導致邊界框預測器之間的專業化。每個預測器可以更好地預測特定大小,方向角,或目標的類別,從而改善整體召回率。

yolov1_2.png
其中$1^{obj}*i$表示目標是否出現在網格單元i中,$1^{obj}*{ij}$表示網格單元i中的第j個邊界框預測器「負責」該預測

YOLO的限制

YOLO對邊界框的預測加了很強的空間約束,因為每個網格單元只預測兩個盒子,只能有一個類別。這個空間約束限制了我們的模型可以預測的鄰近目標的數量。我們的模型在密集的物體中表現不好,例如鳥群。

由於我們的模型學習從數據中預測邊界框,因此它很難泛化到新的、不常見的長寬比或其他構造的目標。由於採用了多個下採樣層,我們的模型也使用相對較粗糙的特徵來預測邊界框。

最後,當我們訓練一個近似檢測性能的損失函數時,我們的損失函數會同樣的對待小邊界框與大邊界框的誤差。大邊界框的小誤差通常是良性的,但小邊界框的小誤差對IOU的影響要大得多。我們的主要錯誤來源是不正確的定位。

總結

YOLO是一個unified目標檢測器,構建簡單,並且可以直接在整張圖像上進行訓練,整個模型可以進行端到端的訓練,快速高效。