YOLO
核心思想:從R-CNN
到Fast R-CNN
一直採用的思路是proposal
+分類 (proposal
提供位置信息, 分類提供類別信息)精度已經很高,但是速度還不行。 YOLO
提供了另一種更爲直接的思路: 直接在輸出層迴歸bounding box
的位置和bounding box
所屬的類別(整張圖作爲網絡的輸入,把Object Detection
的問題轉化成一個 Regression
問題)。
YOLO
的主要特點:
- 速度快,能夠達到實時的要求。在
Titan X
的GPU
上能夠達到45幀每秒。 - 使用全圖作爲
Context
信息,背景錯誤(把背景錯認爲物體)比較少。 - 泛化能力強。
大致流程:
-
Resize成
448*448
,圖片分割得到7*7
網格(cell
) -
CNN提取特徵和預測:
卷積部分負責提特徵。
全鏈接部分負責預測:a)
7*7*2=98
個bounding box(bbox)
的座標和是否有物體的 。b)7*7=49
個cell
所屬20個物體的概率。 -
過濾
bbox
(通過NMS
)
1. 網絡設計
網絡結構借鑑了GoogLeNet
。24個卷積層,2個全鏈接層。(用1×1 reduction layers
緊跟3×3 convolutional layers
取代Googlenet
的 inception modules
)
2. 訓練
預訓練分類網絡: 在 ImageNet 1000-class competition dataset
上預訓練一個分類網絡,這個網絡是Figure3
中的 前20個卷積網絡 + average-pooling layer
+ fully connected layer
(此時網絡輸入是224*224
)。
訓練檢測網絡:轉換模型去執行檢測任務,**《Object detection networks on convolutional feature maps》**提到說在預訓練網絡中增加捲積和全鏈接層可以改善性能。在他們例子基礎上添加4個卷積層和2個全鏈接層,隨機初始化權重。檢測要求細粒度的視覺信息,所以把網絡輸入也又224*224
變成448*448
。見Figure3
。
一幅圖片分成7x7
個網格(grid cell
),某個物體的中心落在這個網格中此網格就負責預測這個物體。
最後一層輸出爲 (7*7)*30
的維度。每個 1*1*30
的維度對應原圖7*7
個cell中的一個,1*1*30中含有類別預測和bbox座標預測。總得來講就是讓網格負責類別信息,bounding box
主要負責座標信息(部分負責類別信息:confidence
也算類別信息)。具體如下:
(1) 每個網格(1*1*30維度對應原圖中的cell)要預測2個bounding box (圖中黃色實線框)的座標 ,其中:中心座標的 相對於對應的網格歸一化到0-1
之間,, 用圖像的和歸一化到0-1
之間。 每個bounding box
除了要回歸自身的位置之外,還要附帶預測一個值。 這個confidence代表了所預測的box中含有object的置信度和這個box預測的有多準兩重信息:。其中如果有ground true box
(人工標記的物體)落在一個grid cell
裏,第一項取1,否則取0。 第二項是預測的bounding box
和實際的ground truth box
之間的IOU
值。即:每個bounding box
要預測共5個值 ,2個bounding box
共10個值,對應 1*1*30
維度特徵中的前10個。
(2) 每個網格還要預測類別信息,論文中有20類。7x7
的網格,每個網格要預測2個bounding box
和 20個類別概率,輸出就是 7x7x(5x2+20)
。 (通用公式: SxS
個網格,每個網格要預測B個bounding box
還要預測C個categories
,輸出就是SxSx(5*B+C)
的一個tensor
。 注意:class信息是針對每個網格的,confidence信息是針對每個bounding box的)。
損失函數設計:
損失函數的設計目標就是讓座標 這個三個方面達到很好的平衡。簡單的全部採用了sum-squared error loss
來做這件事會有以下不足: a) 8維的localization error
和20維的classification error
同等重要顯然是不合理的; b) 如果一個網格中沒有object
(一幅圖中這種網格很多),那麼就會將這些網格中的box
的confidence
push到0,相比於較少的有object
的網格,這種做法是overpowering
的,這會導致網絡不穩定甚至發散。 解決方案如下:
- 更重視8維的座標預測,給這些損失前面賦予更大的
loss weight
,記爲,在pascal VOC
訓練中取5。(上圖藍色框) - 對沒有
object
的bbox
的confidence loss
,賦予小的loss weight
,記爲 ,在pascal VOC
訓練中取0.5。(上圖橙色框) - 有
object
的bbox
的confidence loss
(上圖紅色框) 和類別的loss
(上圖紫色框)的loss weight
正常取1。 - 對不同大小的
bbox
預測中,相比於大bbox
預測偏一點,小box
預測偏一點更不能忍受。而sum-square error loss
中對同樣的偏移loss
是一樣。 爲了緩和這個問題,作者用了一個比較取巧的辦法,就是將box
的width
和height
取平方根代替原本的height
和width
。 如下圖:small bbox
的橫軸值較小,發生偏移時,反應到y軸上的loss
(下圖綠色)比big box
(下圖紅色)要大。
- 一個網格預測多個
bounding box
,在訓練時我們希望每個object(ground true box)
只有一個bounding box
專門負責(一個object
一個bbox
)。具體做法是與ground true box(object)
的IOU
最大的bounding box
負責該ground true box(object)
的預測。這種做法稱作bounding box predictor
的specialization
(專職化)。每個預測器會對特定(sizes,aspect ratio or classed of object)
的ground true box
預測的越來越好。(個人理解:IOU
最大者偏移會更少一些,可以更快速的學習到正確位置)。
3. 測試
Test的時候,每個網格預測的class信息和bounding box預測的confidence信息
相乘,就得到每個bounding box
的class-specific confidence score
。
- 等式左邊第一項就是每個網格預測的類別信息,第二三項就是每個
bounding box
預測的confidence
。這個乘積即encode
了預測的box
屬於某一類的概率,也有該box
準確度的信息。
- 對每一個網格的每一個
bbox
執行同樣操作:7x7x2 = 98 bbox
(每個bbox
既有對應的class
信息又有座標信息)
- 得到每個
bbox
的class-specific confidence score
以後,設置閾值,濾掉得分低的boxes
,對保留的boxes
進行NMS
處理,就得到最終的檢測結果。
缺陷:
YOLO
對相互靠的很近的物體(挨在一起且中點都落在同一個格子上的情況),還有很小的羣體檢測效果不好,這是因爲一個網格中只預測了兩個框,並且只屬於一類。- 測試圖像中,當同一類物體出現的不常見的長寬比和其他情況時泛化能力偏弱。
- 由於損失函數的問題,定位誤差是影響檢測效果的主要原因,尤其是大小物體的處理上,還有待加強。
本文圖片很多來自PPT:
內容主要參考如下博客:
RCNN學習筆記(6):You Only Look Once(YOLO):Unified, Real-Time Object Detection