目標檢測學習之YOLO《You Only Look Once: Unified, Real-Time Object Detection》

  • YOLO

  • 貢獻

目前,基於深度學習算法的一系列目標檢測算法大致可以分爲兩大流派:

  1. 兩步走(two-stage)算法:先產生候選區域 (Region Proposals) 然後再進行CNN分類(RCNN系列)。分類問題
  2. 一步走(one-stage)算法:直接對輸入圖像應用算法並輸出類別和相應的定位(YOLO系列)。迴歸問題

YOLO算法的優點:
1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps,而Faster R-CNN才7 fps。
2、YOLO是基於圖像的全局信息進行預測的。這一點和基於sliding window以及region proposal等檢測算法不一樣。與Fast R-CNN相比,YOLO在誤檢測(將背景檢測爲物體)方面的錯誤率能降低一半多。
3、YOLO可以學到物體的generalizable representations。可以理解爲泛化能力強。
4、準確率高,有實驗證明。

在這裏插入圖片描述

  • 網絡結構

YOLO的檢測思想不同於R-CNN系列的思想,它將目標檢測作爲迴歸任務來解決。
下面來看看YOLO的整體結構:
在這裏插入圖片描述
在這裏插入圖片描述
由上兩圖所示,網絡是根據GoogLeNet改進的,輸入圖片爲448x448大小,輸出爲7x7x(2x5+20),現在看來這樣寫輸出維度很奇怪,下面來看一下輸出是怎麼定義的。
將圖片分爲個單元格(原文中S=7),之後的輸出是以單元格SxS爲單位進行的:
1.如果一個object的中心落在某個單元格上,那麼這個單元格負責預測這個物體。
2.每個單元格需要預測B個bbox值(bbox值包括座標和寬高,原文中B=2),同時爲每個bbox值預測一個置信度(confidence scores)。也就是每個單元格需要預測B×(4+1)個值。
3.每個單元格需要預測C(物體種類個數,原文C=20,這個與使用的數據庫有關)個條件概率值.
所以,最後網絡的輸出維度爲SxSx(Bx5xC),這裏雖然每個單元格負責預測一種物體(這也是這篇文章的問題,當有小物體時可能會有問題),但是每個單元格可以預測多個bbox值(這裏可以認爲有多個不同形狀的bbox,爲了更準確的定位出物體,如下圖所示)。
在這裏插入圖片描述

因爲這裏是當作迴歸問題來解決的,所以所有的輸出包括座標和寬高最好都定義在0到1之間。比較詳細的圖如下(抄自網上)。
在這裏插入圖片描述
來看一下每個單元格預測的B個(x,y,w,h,confidence)的向量和C的條件概率中,每個參數的含義(假設圖片寬爲{w_i}高爲{hi},將圖片分爲S x S):

  1. (x,y)是bbox的中心相對於單元格的offset
    對於下圖中藍色框的那個單元格(座標爲(xcol=1,yrow=4x_{col}=1,y_{row}=4)),假設它預測的輸出是紅色框的bbox,設bbox的中心座標爲(xc,ycx_c,y_c),那麼最終預測出來的(x,y)是經過歸一化處理的,表示的是中心相對於單元格的offset,計算公式如下:
    x=xcwiSxcol,y=ychiSyrowx=\frac{x_c}{w_i}{S}−x_{col} , y=\frac{y_c}{h_i}{S}−y_{row}
  2. (w,h)是bbox相對於整個圖片的比例
    預測的bbox的寬高爲wb,hbw_b,h_b,(w,h)表示的是bbox的是相對於整張圖片的佔比,計算公式如下:
    w=wbwi,h=hbhiw=\frac{w_b}{w_i} , h=\frac{h_b}{h_i}
  3. confidence置信度
    這個置信度是由兩部分組成,一是格子內是否有目標,二是bbox的準確度。定義置信度爲Pr(Object)IOUpredtruthP_r(Object)∗IOU^{truth}_{pred}
    這裏,如果格子內有物體,則Pr(Object)=1P_r(Object)=1,此時置信度等於IoU。如果格子內沒有物體,則Pr(Object)=0P_r(Object)=0,此時置信度爲0。
  4. C類的條件概率
    條件概率定義爲Pr(ClassiObject)P_r(Class_i |Object),表示該單元格存在物體且屬於第i類的概率。

在測試的時候每個單元格預測最終輸出的概率定義爲,如下兩圖所示(兩幅圖不一樣,代表一個框會輸出B列概率值)
Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruthP_r(Class_i|Object) ∗ P_r(Object) ∗ IOU^{truth}_{pred} = P_r(Class_i) ∗ IOU^{truth}_{pred}
在這裏插入圖片描述
在這裏插入圖片描述
最後將(S×S)×B×20(S\times S)\times B\times20 列的結果送入NMS(非極大值抑制),最後即可得到最終的輸出框結果。

  • 訓練YOLO使用的損失函數

在這裏插入圖片描述
這裏需要注意兩點:

  1. 每個圖片的每個單元格不一定都包含object,如果沒有object,那麼confidence就會變成0,這樣在優化模型的時候可能會讓梯度跨越太大,模型不穩定跑飛了。爲了平衡這一點,在損失函數中,設置兩個參數和,其中控制bbox預測位置的損失,控制單個格內沒有目標的損失。
  2. 對於大的物體,小的偏差對於小的物體影響較大,爲了減少這個影響,所以對bbox的寬高都開根號。
  • 主要參考

[1] You Only Look Once: Unified, Real-Time Object Detection
[2] https://www.jianshu.com/p/13ec2aa50c12
[3] https://blog.csdn.net/u014380165/article/details/72616238
[4] https://blog.csdn.net/m0_37192554/article/details/81092514

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