1. 程式人生 > >You Only Look Once: Unified, Real-Time Object Detection 論文閱讀

You Only Look Once: Unified, Real-Time Object Detection 論文閱讀

本文僅是對論文的解讀,供個人學習使用,如果有侵權的地方,還請聯絡我刪除博文

一、簡述

Yolo方法是一種目標檢測的方法。整個演算法的框架其實是一個迴歸的過程。現在簡單介紹一個下這個演算法的運轉流程。建立網路模型,輸入影象,然後其輸出結果記錄了影象中的Bounding Box(後文簡稱bbox)和相關類別的概率,與真實結果進行誤差比對,進而優化網路引數。具體的實現細節會在後文中給出。

 

二、Yolo模型的優勢

  1. Yolo模型只需要掃描一遍影象(相當於在影象上執行一次Yolo)就能預測出現目標的位置。這帶來了很高的時間效益。論文中也給出了Yolo執行時間的實驗結果。這些結果記錄在:
    http://pjreddie.com/yolo/
  2. 由於Fast-RNN是基於sliding window和region proposal的技術。但Yolo演算法在訓練初期和測試時看到的都是整個影象,一種很直觀地感受就是Fast-RNN相對於Yolo更容易把背景塊誤當成檢測目標。
  3. Yolo具有很高的泛化能力,可以應用於很多新的領域

 

三、統一檢測

首先,將輸入的影象分成 S \times S 的網格,如果一個目標的中心落入一個網格單元,那麼這個單元就負責檢測這個目標。

每個網格單元預測B個bbox 和 confidence score,這裡的confidence score表示該單元對包含這個物體的置信度。

confidence \ score=Pr(Object) \times IOU^{truth}_{pred}

很顯然的是,如果不包含某個目標,即Pr(object)=0,那這個目標對應的confidence score為0。如果不為0,則confidence score也就等於真實的bbox與預測的bbox的IOU值:

設真實的bbox面積為S1,預測的為S2,這裡的IOU定義如下:

 

IOU=\frac{S1\cap S2}{S1\cup S2}

對於每個bbox,其包含了5種預測,簡單書寫成如下的形式方便理解:

\tilde{y}=\begin{bmatrix} x\\ y\\ w\\ h\\ p\\ \end{bmatrix}

其中x,y分別表示了bbox的中心相對於網格單元框的位置,可以簡單的把網格單元框左上角的點當成(0,0),右下角的點當作(1,1),這樣就能求得相對位置,x,y都是小於等於1的。

w,h表示了bbox的長和寬,這是相對於整張圖片的比例,因為這個框可以超過網格單元的限制。p表示了IOU

每個網格單元還預測C個條件類別概率,而不管bbox數量B是多少個。

實際測試過程中,把每個網格單元預測出的類別概率與對應的bbox的confidence score也就是IOU進行相乘即:

Pr(Classi|Object) \times Pr(Object) \times IOU^{truth}_{pred}=Pr(Classi) \times IOU^{truth}_{pred}

這就得到了每個bbox具體類別的confidence score,這個式子的最前面是網格預測類別的概率,後面兩項是每個bbox的IOU,二者結合反映了bbox是否含有目標物件和bbox預測的精準度。

論文中給出事例,將影象分成S×S的網格,並且每個網格單元預測B個邊界框,這些邊界框的置信度以及C個類別概率。這些預測被編碼為S×S×(B×5+C)的張量

 

四、網路設計

Figure 3

Yolo的網路架構受GoogleNet影象分類模型啟發,使用1×1卷積層降低特徵空間,後面是3×3,但並沒有使用Inception模組。另外還有一個快速版本的YOLO,這個網路規模較之前的24層,僅有9層網路。並且兩個版本的訓練測試引數都是相同的。

 

五、訓練

預訓練階段,使用圖3中的前20個卷積層,接著是平均池化層和全連線層。在ImageNet 2012驗證集上獲得了單一裁剪影象88%的top-5準確率。

檢測過程中,又添加了四個卷積層和兩個全連線層

為了能更精細化檢測結果,將輸入影象解析度由224×224提升到448×448

最後一層使用線性啟用函式,其他層使用Leaky Relu作為啟用函式

所有預測結果歸一到0~1

為了防止過擬合,第一個全連線層後面接了一個keep_prob=0.5的Dropout層

對原始影象做資料提升(翻轉,縮放,高斯噪聲等)

論文中在Pascal VOC2012上的訓練過程中,使用了每個批次64大小,Adam優化演算法,這裡的Adam的動量引數為0.9,0.0005的衰減。對於學習率,在第一個epochs,將學習率從0.001提升到0.01,以0.01的學習率訓練75個epochs,最後以0.001學習率訓練30個epochs,最後用0.0001學習率訓練30個epochs

對於資料增強,引入高達原始影象20%大小的隨機縮放和轉換。我們還在HSV色彩空間中使用高達1.5的因子來隨機調整影象的曝光和飽和度。

 

六、損失函式

模型使用的損失函式如下圖所示:

關於損失函式的選擇,簡單的想法是使用MSE損失函式,但這並不能達到最大化平均精度的目標,分類誤差與定位誤差同等重要,這可能帶來不好的影響。

因此定義瞭如上圖所示的損失函式,整個函式分成五個部分。

  • 1_{ij}^{obj}表示網格單元 i 中第 j 個bbox,通過賦予較大的權重\lambda_{coord},增加網路對這部分優化的側重點,論文中提供的值是5
  • 對不同大小的bbox的預測,由之前IOU的定義,相對較小的bbox對IOU的影響更大,而較大的bbox影響較小。通過取平方根,進而減小這種差異
  • 這部分是對含有檢測物件的網格單元的預測
  • 1_{ij}^{noobj}表示網格單元不含有檢測物件,這裡賦予較小的權重。因為訓練初期的時候,很多網格單元並不包含任何物件,那麼優化不包含任何物件的單元網格所帶來的梯度效益將遠大於包含物件的,這樣的網路可能不穩定甚至發散。論文提供的值是0.5
  • 第一第二部分是對bbox的優化,第三第四部分是對網格單元的優化,那麼最後一個部分就是對類別損失的優化。

 

七、非極大值抑制

YOLO演算法中,可能會出現多個網格都檢測出到同一目標的情況。論文中使用了NMS的演算法,簡述一下演算法原理:

  • 對最後輸出的網格單元的向量(參照上面提到的向量結構),設定閾值,過濾掉那些類別概率P低於閾值的,這樣仍會有多個向量仍存在高概率。
  • 將這些向量按P進行排序,對P值最大的bbox,計算其他所有的bbox的與它的IOU,如果IOU超過給定的IOU,則直接刪除這個bbox。
  • 對剩下的bbox再進行步驟2過程。直到剩餘的bbox為空

 

八、Yolo的缺點

  1. 容易產生定位錯誤
  2. 對小物體的檢測效果不好(一個網格單元就兩個bbox)
  3. 與其他的目標檢測系統相比例如faster-RNN,精度要低