YOLO將物體檢測作爲一個迴歸問題進行求解,輸入圖像經過一次inference,便能得到圖像中所有物體的位置和其所屬類別及相應的置信概率。而rcnn/fast rcnn/faster rcnn將檢測結果分爲兩部分求解:物體類別(分類問題),物體位置即bounding box(迴歸問題)。
YOLO檢測網絡包括24個卷積層和2個全連接層,如下圖所示。(YOLO網絡借鑑了GoogLeNet分類網絡結構,不同的是,YOLO未使用inception-module,而是使用1x1卷積層(此處1x1卷積層的存在是爲了跨通道信息整合)+ 3x3卷積層簡單替代。)
(1) 將原圖劃分爲SxS的網格。如果一個目標的中心落入某個格子,這個格子就負責檢測該目標。
(2) 每個網格要預測B個bounding boxes,以及C個類別概率Pr(classi|object)。
在YOLO中,每個格子只有一個C類別,即相當於忽略了B個bounding boxes,每個格子只判斷一次類別,這樣做非常簡單粗暴。
(3) 每個bounding box除了要回歸自身的位置之外,還要附帶預測一個confidence值。這個confidence代表了所預測的box中含有目標的置信度和這個bounding box預測的有多準兩重信息:
如果有目標落中心在格子裏Pr(Object)=1;否則Pr(Object)=0。 第二項是預測的bounding box和實際的ground truth之間的IOU.
每個bounding box都包含了5個預測量:(x, y, w, h, confidence),其中(x, y)代表預測box相對於格子的中心,(w, h)爲預測box相對於圖片的width和height比例,confidence就是上述置信度。需要說明,這裏的x, y, w和h都是經過歸一化的.
(4) 由於輸入圖像被分爲SxS網格,每個網格包括5個預測量:(x, y, w, h, confidence)和一個C類,所以網絡輸出是SxSx(5xB+C)大小
訓練:
Loss = λcoord * 座標預測誤差 +(含object的box confidence預測誤差 + λnoobj * 不含object的box confidence預測誤差)
+ 類別預測誤差
(1) bounding box的(x, y, w, h)的座標預測誤差。
檢測算法的實際使用中,一般都有這種經驗:對不同大小的bounding box預測中,相比於大box大小預測偏一點,小box大小測偏一點肯定更不能被忍受。所以在Loss中同等對待大小不同的box是不合理的。爲了解決這個問題,作者用了一個比較取巧的辦法,即對w和h求平方根進行迴歸。從後續效果來看,這樣做很有效,但是也沒有完全解決問題。
(2) bounding box的confidence預測誤差
由於絕大部分網格中不包含目標,導致絕大部分box的confidence=0,所以在設計confidence誤差時同等對待包含目標和不包含目標的box也是不合理的,否則會導致模型不穩定。作者在不含object的box的confidence預測誤差中乘以懲罰權重λnoobj=0.5。
除此之外,同等對待4個值(x, y, w, h)的座標預測誤差與1個值的conference預測誤差也不合理,所以作者在座標預測誤差誤差之前乘以權重λcoord=5
(3) 分類預測誤差
縮進即每個box屬於什麼類別,需要注意一個網格只預測一次類別,即默認每個網格中的所有B個bounding box都是同一類。
(1) 對於bounding box的寬和高做如下normalization,使得輸出寬高介於0~1:
(2) 使用(row, col)網格的offset歸一化bounding box的中心座標:
x,y爲當前座標相對於格子左上角點的座標。
測試:
在檢測目標的時候,每個網格預測的類別條件概率和bounding box預測的confidence信息相乘,就得到每個bounding box的class-specific confidence score:
等式左邊第一項就是每個網格預測的類別信息,第二三項就是每個bounding box預測的confidence。這個乘積即encode了預測的box屬於某一類的概率,也有該box準確度的信息。
非極大值抑制(NMS)
- 將所有框的得分排序,選中最高分及其對應的框;
- 遍歷其餘的框,如果和當前最高分框的重疊面積(IOU)大於一定閾值,我們就將框刪除;
- 從未處理的框中繼續選一個得分最高的,重複上述過程。
優缺點
- 優點:
- 缺點:
參考:https://www.zybuluo.com/rianusr/note/1417734
原文:https://arxiv.org/abs/1506.02640