目標檢測--YOLO_v1算法學習總結

論文名稱:You only look once unified real-time object detection 

論文鏈接

1.YOLO v1 算法簡介

作者在YOLO算法中把物體檢測(object detection)問題處理成迴歸問題,用一個卷積神經網絡結構就可以從輸入圖像直接預測bounding box和類別概率。

 

2.YOLO算法的優缺點

1、YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。

2、YOLO是基於圖像的全局信息進行預測的。這一點和基於sliding window以及region proposal等檢測算法不一樣。與Fast R-CNN相比,YOLO在誤檢測(將背景檢測爲物體)方面的錯誤率能降低一半多。

3、YOLO可以學到物體的generalizable representations。可以理解爲泛化能力強。

4、準確率高,有實驗證明。

1、位置精確性差,對於小目標物體以及物體比較密集的也檢測不好,比如一羣小鳥。 

2、YOLO雖然可以降低將背景檢測爲物體的概率,但同時導致召回率較低。

 

3.YOLO v1 算法內容

算法結構圖如Fig1:結構上主要的特點就是 統一檢測(unified detection),不再是原來許多步驟組成的物體檢測,這使得模型的運行速度快,可以直接學習圖像的全局信息,且可以end-to-end訓練。

 

a.算法首先把輸入圖片劃分成S*S個格子,實際上這個格子不用我們手動劃分,因爲可以利用卷積核操作的方法結合卷積神經網絡的特性,實際上每個格子的大小就是卷積核的大小。

 

b.將圖片放入卷積神經網絡中,進行訓練,要求每個格子都有兩個預測的bounding boxes,每個box包含5個值(x,y---對象的中心位置,w,h---邊界框的大小,c---confidence,置信度),也要求每個格子都預測該格子裏面的物體是什麼類別的概率,即:預測C個假定類別的概率。

note:

1)這裏x,y中心座標是與格子的相對照的,x,y是說處於某個格子中的某一位置,一般我們設格子均爲1的正方形。同時每個格子預測的w,h是相對於總的w,h來說的,也就是佔總的比值。因此x,y,w,h都是範圍處於0~1

2)置信度confidence:每個bounding box都對應一個confidence score,其計算公式爲:

 

Pr(object)*IOU-----如果沒有object,Pr(object)=0,confidence=0;

如果有object,Pr(object)=1,confidence=IOU(交併比);

交併比:預測框與真實框的比值

3)所以如何判斷一個grid cell中是否包含object呢?

答案是:如果一個object的ground truth的中心點座標在一個grid cell中,那麼這個grid cell就是包含這個object,也就是說這個object的預測就由該grid cell負責。 

4)每個格子預測類別的概率都是個條件概率,條件爲:該格子預測有object

5)類別置信度(class-specific confidence scores):

類別置信度=Pr(Class|object)*Pr(object)*IOU

-----如果沒有object,Pr(object)=0,類別置信度=0;

如果有object,Pr(object)=1,類別置信度=Pr(Class)*IOU;

 

c.假設我們輸入的圖片是劃分成7*7個格子,最終的輸出是一個7*7*30的張量:

30包括20個類別概率,2個bounding boxes(分別有5個預測值xywhc)

 

如上圖:

兩個框分別對應紅色格子預測的兩個bounding boxes,這兩個bounding boxes怎麼來的?

我們先求出每一個bounding boxes對應的類別置信度

 

 

 

然後對每個格子重複以上操作

 

d.接下來,我們開始對上面所有類別置信度進行逐類分析:

---爲什麼要逐類分析--因爲我們最後希望能用框把每個類別都框出來,逐類分析幫助我們更精確的確定框的位置

 

先設置閾值,小於閾值的進行置零,然後對該類的置信度進行降序排列,最後再用非極大值限制法對剩下的bboxes進行置零

 

f.非極大值限制法(Non-Maximum Suppression)

根據之前的降序,我們第一次先選出最大的類別置信度,然後根據降序,將其他的類別置信度的框逐個和最大的類別置信度所對應的框進行計算IOU,如果IOU>0.5,那麼就該類別置信度置零,保留最大的。第一趟輪完後,再進行第二趟,之前保留下來的最大置信度,不再參與其中,重複此操作。最終我們會發現,只有兩個框留下來

 

g.畫框

最終根據保留下來的類別置信度,在每一個boundingboxes中選擇最大的置信度,如果score大於0,取最大的score,則表示該框的對象爲最大score所對應的對象,如果小於0,說明這個bounding box裏面沒有物體,跳過即可。

 

 

4.YOLO損失函數

損失函數方面,作者採用sum-squared error的方式把localization error(bounding box的座標誤差)和classificaton error整合在一起。但是如果二者的權值一致,容易導致模型不穩定,訓練發散。因爲很多grid cell是不包含物體的,這樣的話很多grid cell的confidence score爲0。所以採用設置不同權重方式來解決,一方面提高localization error的權重,另一方面降低沒有object的box的confidence loss權值,loss權重分別是5和0.5。而對於包含object的box的confidence loss權值還是原來的1。詳見下面的原文解釋和loos function函數。

 

 

 

這裏詳細講一下loss function。在loss function中,前面兩行表示localization error(即座標誤差),第一行是box中心座標(x,y)的預測,第二行爲寬和高的預測。這裏注意用寬和高的開根號代替原來的寬和高,這樣做主要是因爲相同的寬和高誤差對於小的目標精度影響比大的目標要大。舉個例子,原來w=10,h=20,預測出來w=8,h=22,跟原來w=3,h=5,預測出來w=1,h=7相比,其實前者的誤差要比後者小,但是如果不加開根號,那麼損失都是一樣:4+4=8,但是加上根號後,變成0.15和0.7。

第三、四行表示bounding box的confidence損失,就像前面所說的,分成grid cell包含與不包含object兩種情況。這裏注意下因爲每個grid cell包含兩個bounding box,所以只有當ground truth 和該網格中的某個bounding box的IOU值最大的時候,才計算這項。

第五行表示預測類別的誤差,注意前面的係數只有在grid cell包含object的時候才爲1。

所以具體實現的時候是什麼樣的過程呢?

 

訓練的時候:輸入N個圖像,每個圖像包含M個objec,每個object包含4個座標(x,y,w,h)和1個label。然後通過網絡得到7*7*30大小的三維矩陣。每個1*30的向量前5個元素表示第一個bounding box的4個座標和1個confidence,第6到10元素表示第二個bounding box的4個座標和1個confidence。最後20個表示這個grid cell所屬類別。注意這30個都是預測的結果。然後就可以計算損失函數的第一、二 、五行。至於第二三行,confidence可以根據ground truth和預測的bounding box計算出的IOU和是否有object的0,1值相乘得到。真實的confidence是0或1值,即有object則爲1,沒有object則爲0。 這樣就能計算出loss function的值了。

 

測試的時候:輸入一張圖像,跑到網絡的末端得到7*7*30的三維矩陣,這裏雖然沒有計算IOU,但是由訓練好的權重已經直接計算出了bounding box的confidence。然後再跟預測的類別概率相乘就得到每個bounding box屬於哪一類的概率。

 

 

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