文章《You Only Look Once: Unified, Real-Time Object Detection》提出方法下面簡稱YOLO。
目前,基於深度學習算法的一系列目標檢測算法大致可以分為兩大流派:
1.兩步走(two-stage)算法:先產生候選區域然后再進行CNN分類(RCNN系列),
2.一步走(one-stage)算法:直接對輸入圖像應用算法並輸出類別和相應的定位(YOLO系列)
之前的R-CNN系列雖然准確率比較高,但是即使是發展到Faster R-CNN,檢測一張圖片如下圖所示也要7fps(原文為5fps),為了使得檢測的工作能夠用到實時的場景中,提出了YOLO。
YOLO的檢測思想不同於R-CNN系列的思想,它將目標檢測作為回歸任務來解決。
下面來看看YOLO的整體結構:
由上兩圖所示,網絡是根據GoogLeNet改進的,輸入圖片為448*448大小,輸出為7×7×(2×5+20)
,現在看來這樣寫輸出維度很奇怪,下面來看一下輸出是怎么定義的。
將圖片分為S×S
個單元格(原文中S=7),之后的輸出是以單元格為單位進行的:
1.如果一個object的中心落在某個單元格上,那么這個單元格負責預測這個物體。
2.每個單元格需要預測B個bbox值(bbox值包括坐標和寬高,原文中B=2),同時為每個bbox值預測一個置信度(confidence scores)。也就是每個單元格需要預測B×(4+1)個值。
3.每個單元格需要預測C(物體種類個數,原文C=20,這個與使用的數據庫有關)個條件概率值.
所以,最后網絡的輸出維度為S×S×(B×5+C)
,這里雖然每個單元格負責預測一種物體(這也是這篇文章的問題,當有小物體時可能會有問題),但是每個單元格可以預測多個bbox值(這里可以認為有多個不同形狀的bbox,為了更准確的定位出物體,如下圖所示)。
因為這里是當作回歸問題來解決的,所以所有的輸出包括坐標和寬高最好都定義在0到1之間。網上看見一張比較詳細的圖如下。
來看一下每個單元格預測的B個(x,y,w,h,confidence)的向量和C的條件概率中,每個參數的含義(假設圖片寬為{w_i}高為{hi},將圖片分為S×S):
1.(x,y)是bbox的中心相對於單元格的offset
對於下圖中藍色框的那個單元格(坐標為(xcol=1,yrow=4)),假設它預測的輸出是紅色框的bbox,設bbox的中心坐標為(xc,yc),那么最終預測出來的(x,y)是經過歸一化處理的,表示的是中心相對於單元格的offset,計算公式如下:
x=xcwiS−xcol,y=ychiS−yrow
2.(w,h)是bbox相對於整個圖片的比例
預測的bbox的寬高為wb,hb
,(w,h)表示的是bbox的是相對於整張圖片的占比,計算公式如下:
w=wbwi,h=hbhi
3.confidence
這個置信度是由兩部分組成,一是格子內是否有目標,二是bbox的准確度。定義置信度為Pr(Object)∗IOUtruthpred
。
這里,如果格子內有物體,則Pr(Object)=1,此時置信度等於IoU。如果格子內沒有物體,則Pr(Object)=0
,此時置信度為0
4.C類的條件概率
條件概率定義為Pr(Classi|Object)
,表示該單元格存在物體且屬於第i類的概率。
在測試的時候每個單元格預測最終輸出的概率定義為,如下兩圖所示(兩幅圖不一樣,代表一個框會輸出B列概率值)
Pr(Classi|Object)∗Pr(Object)∗IOUtruthpred=Pr(Classi)∗IOUtruthpred
最后將(S×S)×B×20 列的結果送入NMS,最后即可得到最終的輸出框結果
最后來看一下訓練YOLO使用的損失函數定義(本想自己用latex打的,后來有個符號一直打不出來,使用網友的圖如下)
這里強調兩點:
1.每個圖片的每個單元格不一定都包含object,如果沒有object,那么confidence就會變成0,這樣在優化模型的時候可能會讓梯度跨越太大,模型不穩定跑飛了。為了平衡這一點,在損失函數中,設置兩個參數λcorrd
和λnoobj,其中λcorrd控制bbox預測位置的損失,λnoobj控制單個格內沒有目標的損失。
2.對於大的物體,小的偏差對於小的物體影響較大,為了減少這個影響,所以對bbox的寬高都開根號。
---------------------
轉自:CSDN
作者:Michaelliu_dev
原文:https://blog.csdn.net/liuxiaoheng1992/article/details/81983280