YOLO v1原理總結

論文原文:https://arxiv.org/pdf/1506.02640.pdf

 

1 網絡結構

1)結構
YOLO的結構非常簡單,就是單純的卷積、池化最後加了兩層全連接。單看網絡結構的話,和普通的CNN對象分類網絡幾乎沒有本質的區別,最大的差異是最後輸出層用線性函數做激活函數,因爲需要預測bounding box的位置(數值型),而不僅僅是對象的概率。

2)輸入和輸出的映射關係

 

3)輸入
輸入就是原始圖像,唯一的要求是縮放到448*448的大小。主要是因爲YOLO的網絡中,卷積層最後接了兩個全連接層,全連接層是要求固定大小的向量作爲輸入,所以倒推回去也就要求原始圖像有固定的尺寸。那麼YOLO設計的尺寸就是448*448。

4)輸出
輸出是一個 7*7*30 的張量(tensor)。

4.1)7*7網格
根據YOLO的設計,輸入圖像被劃分爲 7*7 的網格(grid),輸出張量中的 7*7 就對應着輸入圖像的 7*7 網格。輸入圖像中的每個網格對應輸出一個30維的向量。

4.2)30維向量
具體來看每個網格對應的30維向量中包含了哪些信息。

2 訓練

損失函數

簡單的全部採用了sum-squared error loss會有以下不足:
a) 8維的localization error和20維的classification error同等重要顯然是不合理。
b) 如果一些網格中沒有object(一幅圖中這種網格很多),那麼就會將這些網格中的bounding box的confidence 置爲0,相比於較少的有object的網格,這些不包含物體的網格對梯度更新的貢獻會遠大於包含物體的網格對梯度更新的貢獻,這會導致網絡不穩定甚至發散。

爲了解決這些問題,YOLO的損失函數的定義如下:

 

更重視8維的座標預測,給這些損失前面賦予更大的loss weight, 記爲 λcoord ,在pascal VOC訓練中取5。(上圖藍色框)
對沒有object的bbox的confidence loss,賦予小的loss weight,記爲 λnoobj ,在pascal VOC訓練中取0.5。(上圖橙色框)
有object的bbox的confidence loss (上圖紅色框) 和類別的loss (上圖紫色框)的loss weight正常取1。

對不同大小的bbox預測中,相比於大bbox預測偏一點,小box預測偏相同的尺寸對IOU的影響更大。而sum-square error loss中對同樣的偏移loss是一樣。
爲了緩和這個問題,作者用了一個巧妙的辦法,就是將box的width和height取平方根代替原本的height和width。 如下圖:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。

 

3 測試

Test的時候,每個網格預測的class信息 相乘,就得到每個bounding box的class-specific confidence score。

NMS(非極大值抑制)
NMS核心思想是:選擇得分最高的作爲輸出,與該輸出重疊的去掉,不斷重複這一過程直到所有備選處理完。

YOLO的NMS計算方法如下。
網絡輸出的7*7*30的張量,在每一個網格中,對象位於第j個bounding box的得分:

它代表着某個對象存在於第j個bounding box的可能性。

每個網格有:20個對象的概率*2個bounding box的置信度,共40個得分(候選對象)。49個網格共1960個得分。Andrew Ng建議每種對象分別進行NMS,那麼每種對象有 1960/20=98 個得分。

NMS步驟如下:
1)設置一個Score的閾值,低於該閾值的候選對象排除掉(將該Score設爲0)
2)遍歷每一個對象類別
 2.1)遍歷該對象的98個得分
  2.1.1)找到Score最大的那個對象及其bounding box,添加到輸出列表
  2.1.2)對每個Score不爲0的候選對象,計算其與上面2.1.1輸出對象的bounding box的IOU
  2.1.3)根據預先設置的IOU閾值,所有高於該閾值(重疊度較高)的候選對象排除掉(將Score設爲0)
  2.1.4)如果所有bounding box要麼在輸出列表中,要麼Score=0,則該對象類別的NMS完成,返回步驟2處理下一種對象
3)輸出列表即爲預測的對象

 

 

參考:

1. YOLO v1深入理解

 

2. yolov1原文地址以及論文翻譯

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