目前,基於深度學習算法的一系列目標檢測算法大致可以分爲兩大流派:
- 兩步走(two-stage)算法:先產生候選區域 (Region Proposals) 然後再進行CNN分類(RCNN系列)。分類問題
- 一步走(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):
- (x,y)是bbox的中心相對於單元格的offset
對於下圖中藍色框的那個單元格(座標爲()),假設它預測的輸出是紅色框的bbox,設bbox的中心座標爲(),那麼最終預測出來的(x,y)是經過歸一化處理的,表示的是中心相對於單元格的offset,計算公式如下:
- (w,h)是bbox相對於整個圖片的比例
預測的bbox的寬高爲,(w,h)表示的是bbox的是相對於整張圖片的佔比,計算公式如下:
- confidence置信度
這個置信度是由兩部分組成,一是格子內是否有目標,二是bbox的準確度。定義置信度爲。
這裏,如果格子內有物體,則,此時置信度等於IoU。如果格子內沒有物體,則,此時置信度爲0。 - C類的條件概率
條件概率定義爲,表示該單元格存在物體且屬於第i類的概率。
在測試的時候每個單元格預測最終輸出的概率定義爲,如下兩圖所示(兩幅圖不一樣,代表一個框會輸出B列概率值)
最後將 列的結果送入NMS(非極大值抑制),最後即可得到最終的輸出框結果。
這裏需要注意兩點:
- 每個圖片的每個單元格不一定都包含object,如果沒有object,那麼confidence就會變成0,這樣在優化模型的時候可能會讓梯度跨越太大,模型不穩定跑飛了。爲了平衡這一點,在損失函數中,設置兩個參數和,其中控制bbox預測位置的損失,控制單個格內沒有目標的損失。
- 對於大的物體,小的偏差對於小的物體影響較大,爲了減少這個影響,所以對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