【論文泛讀】 YOLO v2:Better,Faster,Stronger
文章目錄
- 【論文泛讀】 YOLO v2:Better,Faster,Stronger
- 摘要 Abstract
- 介紹 Introduction
- 預測更準確(Better)
- batch normalization 批歸一化
- High Resolution Classifier
- Convolutional With Anchor Boxes
- Dimension Clusters
- Direct location prediction
- Fine-Grained Features
- Multi-Scale Training
- 速度更快(Faster)
- YOLO v2 誤差函式
- 識別物件更多(Stronger)/ YOLO9000
- 總結
論文鏈接: YOLO9000: Better, Faster, Stronger
這次來講解一下YOLO v2演算法(CVPR2016的文章),之前已經講解過YOLO v1,YOLO v1以完全端到端的模式實作達到實時水平的目標檢測,但是它追求速度而犧牲了部分檢測精度,所以原作者在YOLO v1的基礎上進行了改進,得到了YOLO9000,相對于YOLO v1來說,在繼續保持處理速度的基礎上,從預測更準確(Better),速度更快(Faster),識別物件更多(Stronger)這三個方面進行了改進,其中識別更多物件也就是擴展到能夠檢測9000種不同物件,稱之為YOLO9000,
摘要 Abstract
我們介紹YOLO9000,一個最先進的,實時目標檢測系統,可以檢測超過9000個目標類別,首先,我們提出對YOLO檢測方法的各種改進方法,包括新穎的和從以前的作業中得出的,改進的模型YOLOv2在如PASCAL VOC和COCO標準檢測任務是最先進的,使用一種新穎的多尺度訓練方法,相同的YOLOv2模型可以運行在不同的大小的圖片上,提供速度和精度之間的輕松權衡,在67 FPS時,YOLOv2在VOC 2007上獲得76.8 mAP,在40 FPS時,YOLOv2獲得78.6 mAP,性能優于最先進的方法,例如使用ResNet的faster RCNN和SSD,同時運行速度明顯更快,最后,我們提出了一種聯合訓練目標檢測和分類的方法,使用這種方法,我們在COCO檢測資料集和ImageNet分類資料集上同時訓練YOLO9000,我們的聯合訓練方法允許YOLO9000預測沒有標記檢測資料的目標類的檢測,我們在ImageNet檢測資料集上驗證我們的方法,YOLO9000在ImageNet檢測驗證集上獲得19.7 mAP,盡管只有200個類中的44類檢測資料,在不在COCO的156類中,YOLO9000獲得16.0 mAP,但是YOLO可以檢測超過200個類;它預測超過9000個不同目標類別的檢測,它仍然實時運行,
介紹 Introduction
通用目標檢測應該快速,準確,并且能夠識別各種各樣的目標,與分類和標記等其他任務的資料集相比,當前目標檢測資料集是有限的,最常見的檢測資料集包含數十到數十萬的影像,具有幾十到幾百個標簽,分類資料集具有數百萬個具有數十或數十萬類別的影像,這也是因為目標檢測標注的成本較高,
如此,作者提出了一種新方法來利用我們已經擁有的大量分類資料(ImageNet),并使用它來擴大當前檢測系統的范圍,并且使用目標分類的層次視圖,將不同的資料集合在一起,
除此之外,還提出了一種聯合訓練的方法,在檢測和分類資料上訓練目標檢測器,利用標記的檢測影像來學習精確地定位目標,同時使用分類影像來增加其詞匯和魯棒性,
使用這種方法,我們訓練YOLO9000,一個實時目標檢測器,可以檢測超過9000不同的目標類別,首先,我們改進基本的YOLO檢測系統,以產生YOLOv2,一個最先進的,實時檢測器,然后我們使用我們的資料集組合方法和聯合訓練演算法來訓練來自ImageNet的超過9000個類的模型以及來自COCO的檢測資料,
作者的代碼和預訓練模型都在http://pjreddie.com/yolo9000/
預測更準確(Better)
前面有提過,雖然YOLOv1檢測速度很快,但是在精度上卻不R-CNN系列的檢測方法,YOLOv1在物體定位方面(localization)不夠準確,并且召回率(recall)較低,YOLOv2共提出了幾種改進策略來提升YOLO模型的定位準確度和召回率,從而提高mAP,YOLOv2在改進中遵循一個原則:保持檢測速度,這也是YOLO模型的一大優勢,YOLOv2的改進方法如下圖所示,可以看到,大部分的改進策略都可以比較顯著的提高模型的mAP,

batch normalization 批歸一化
批歸一化提高了2的mAP
批歸一化有助于解決反向傳播程序中的梯度消失和梯度爆炸問題,降低對一些超引數(比如學習率、網路引數的大小范圍、激活函式的選擇)的敏感性,并且每個batch分別進行歸一化的時候,起到了一定的正則化效果(YOLO2不再使用dropout),從而能夠獲得更好的收斂速度和收斂效果,
通常,一次訓練會輸入一批樣本(batch)進入神經網路,批規一化在神經網路的每一層,在網路(線性變換)輸出后和激活函式(非線性變換)之前增加一個批歸一化層(BN),并且有個很重要的點,BN是對每一個神經元進行標準化,我之后會對Batch Normalization論文進行解讀和實作,
High Resolution Classifier
提高了大約4的mAP
目前大部分的檢測模型都會在先在ImageNet分類資料集上預訓練模型的主體部分(CNN特征提取器),而且大部分的ImageNet分類模型基本才用224 x 224的圖片進行輸入,解析度比較低,其實是不太適合檢測模型的,YOLOv1使用ImageNet的影像分類樣本采用 224 x 224作為輸入,來訓練CNN卷積層,然后在訓練物件檢測時,檢測用的影像樣本采用更高解析度的 448x448 的影像作為輸入,但這樣切換對模型性能有一定影響,

所以在YOLO v2中,先采用224x224的圖片進行預訓練,再采用448x448的高解析度的樣本對分類模型資訊微調 10 個 epoch,給時間給網路逐漸適應高解析度,
Convolutional With Anchor Boxes
召回率從81%提高到88%,但是mAP輕微下降0.3,
借鑒Faster RCNN的做法,YOLO2也嘗試采用先驗框(anchor),在每個grid預先設定一組不同大小和寬高比的邊框,來覆寫整個影像的不同位置和多種尺度,這些先驗框作為預定義的候選區在神經網路中將檢測其中是否存在物件,以及微調邊框的位置,
同時YOLO2移除了全連接層,另外去掉了一個池化層,使網路卷積層輸出具有更高的解析度,除此之外,還對影像進行收縮,使得我們的特征圖為奇數,因為這樣每一個特征圖就存在一個中心點,最后在池化層之前,與原影像大約是32倍,所以如果輸入416x416的影像,我們會得到(batch,13,13,5,25)
之前YOLO1并沒有采用先驗框,并且每個grid只預測兩個bounding box,整個影像98(7x7x2)個,YOLO2如果每個grid采用9個先驗框,總共有13x13x9=1521個先驗框,所以,相對YOLO1的81%的召回率,YOLO2的召回率大幅提升到88%,同時mAP有0.3%的輕微下降,
Dimension Clusters
提高了4.8的mAP
在之前的Faster R-CNN中,先驗框都是手工選取的,帶有一定的主觀性,如果選取的先驗框維度比較合適,那么模型更容易學習,從而做出更好的預測,因此,YOLOv2采用k-means聚類方法對訓練集中的邊界框做了聚類分析,
聚類演算法最重要的是選擇如何計算兩個邊框之間的“距離”,對于常用的歐式距離,大邊框會產生更大的誤差,但我們關心的是邊框的IOU,所以,YOLO2在聚類時采用以下公式來計算兩個邊框之間的“距離”,
d
(
b
o
x
,
c
e
n
t
r
o
i
d
)
=
1
?
I
O
U
(
b
o
x
,
c
e
n
t
r
o
i
d
)
d(box,centroid)=1?IOU(box,centroid)
d(box,centroid)=1?IOU(box,centroid)
centroid是聚類時被選作中心的邊框,box就是其它邊框,d就是兩者間的“距離”,IOU越大,“距離”越近,YOLO2給出的聚類分析結果如下圖所示:

上圖左邊是選擇不同的聚類k值情況下,得到的k個centroid邊框,計算樣本中標注的邊框與各centroid的Avg IOU,顯然,邊框數k越多,Avg IOU越大,YOLO2選擇k=5作為邊框數量與IOU的折中,對比手工選擇的先驗框,使用5個聚類框即可達到61 Avg IOU,相當于9個手工設定的先驗框60.9 Avg IOU,
上圖右邊顯示了5種聚類得到的先驗框,VOC和COCO資料集略有差異,不過都有較多的瘦高形邊框,
Direct location prediction
借鑒于Faster RCNN的先驗框方法,在訓練的早期階段,其位置預測容易不穩定,其位置預測公式為:
x
=
(
t
x
?
w
a
)
+
x
a
y
=
(
t
y
?
h
a
)
+
y
a
\begin{aligned} x &= (t_x * w_a) + x_a\\ y &= (t_y * h_a) + y_a \end{aligned}
xy?=(tx??wa?)+xa?=(ty??ha?)+ya??
其中,
x
,
y
x,y
x,y是預測邊框的中心,
x
a
,
y
a
x_a,y_a
xa?,ya?是先驗框(anchor)的中心點坐標,
w
a
,
h
a
w_a,h_a
wa?,ha?是先驗框(anchor)的寬和高,
t
x
,
t
y
t_x,t_y
tx?,ty?是要學習的引數,
注意,YOLO論文中寫的是
x
=
(
t
x
?
w
a
)
?
x
a
x=(t_x?w_a)-x_a
x=(tx??wa?)?xa??,根據Faster RCNN,應該是"+",
由于
t
x
,
t
y
t_x,t_y
tx?,ty?的取值沒有任何約束,因此預測邊框的中心可能出現在任何位置,訓練早期階段不容易穩定,YOLO調整了預測公式,將預測邊框的中心約束在特定gird網格內,
b
x
=
σ
(
t
x
)
+
c
x
b
y
=
σ
(
t
y
)
+
x
y
b
w
=
p
w
e
t
w
b
h
=
p
h
e
t
h
P
r
(
o
b
j
e
c
t
)
?
I
O
U
(
b
.
o
b
j
e
c
t
)
=
σ
(
t
o
)
\begin{aligned} b_x &= σ(t_x) + c_x\\ b_y &= σ(t_y) + x_y \\ b_w &= p_we^{t^w} \\ b_h &= p_he^{t^h} \\ Pr(object)*IOU(b.object) &= σ(t_o) \end{aligned}
bx?by?bw?bh?Pr(object)?IOU(b.object)?=σ(tx?)+cx?=σ(ty?)+xy?=pw?etw=ph?eth=σ(to?)?
其中,
b
x
,
b
y
,
b
w
,
b
h
b_x,b_y,b_w,b_h
bx?,by?,bw?,bh?是預測邊框的中心和寬高,
P
r
(
o
b
j
e
c
t
)
?
I
O
U
(
b
,
o
b
j
e
c
t
)
Pr(object)?IOU(b,object)
Pr(object)?IOU(b,object)是預測邊框的置信度,YOLO1是直接預測置信度的值,這里對預測引數
t
o
t_o
to?進行σ變換后作為置信度的值,
c
x
,
c
y
c_x,c_y
cx?,cy?是當前網格左上角到影像左上角的距離,要先將網格大小歸一化,即令一個網格的寬=1,高=1,
p
w
,
p
h
p_w,p_h
pw?,ph?是先驗框的寬和高,
σ是sigmoid函式,
t
x
,
t
y
,
t
w
,
t
h
,
t
o
t_x,t_y,t_w,t_h,t_o
tx?,ty?,tw?,th?,to??是要學習的引數,分別用于預測邊框的中心和寬高,以及置信度,

由于σ函式將 t x , t y t_x,t_y tx?,ty?約束在(0,1)范圍內,所以根據上面的計算公式,預測邊框的藍色中心點被約束在藍色背景的網格內,約束邊框位置使得模型更容易學習,且預測更為穩定,
Fine-Grained Features
用了passthrough層提高了1的mAP,
物件檢測面臨的一個問題是影像中物件會有大有小,輸入影像經過多層網路提取特征,最后輸出的特征圖中(比如YOLO2中輸入416x416經過卷積網路下采樣最后輸出是13x13),較小的物件可能特征已經不明顯甚至被忽略掉了,為了更好的檢測出一些比較小的物件,最后輸出的特征圖需要保留一些更細節的資訊,將低層和高層的特征圖進行一個融合,
YOLO2引入一種稱為passthrough層的方法在特征圖中保留一些細節資訊,具體來說,就是在最后一個pooling之前,特征圖的大小是26x26x512,將其1拆4,直接傳遞(passthrough)到pooling后(并且又經過一組卷積)的特征圖,兩者疊加到一起作為輸出的特征圖,

具體的1拆4我借用了一張圖來解釋一下

根據YOLO2的代碼,作者借鑒了ResNet網路,不是直接對高分辨特征圖處理,而是增加了一個中間卷積層,特征圖先用1x1卷積從 26x26x512 降維到 26x26x64,再做1拆4并passthrough,
Multi-Scale Training
多尺度影像訓練對mAP有1的提升,
因為去掉了全連接層,YOLO2可以輸入任何尺寸的影像,因為整個網路下采樣倍數是32,作者采用了{320,352,…,608}等10種輸入影像的尺寸,這些尺寸的輸入影像對應輸出的特征圖寬和高是{10,11,…19},訓練時每10個batch就隨機更換一種尺寸,使網路能夠適應各種大小的物件檢測,

這其實是某種意義的資料增強,防止了過擬合,而且這些得益于網路中的結構平均池化層,平均池化層對我們的結果進行一個均值計算,而不用去考慮每個特征圖的寬高,所以說不用一直進行模型的調整,
速度更快(Faster)
為了進一步提升速度,YOLO2提出了Darknet-19(有19個卷積層和5個MaxPooling層)網路結構,DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮點運算量減少到約1/5,以保證更快的運算速度,

YOLO2的訓練主要包括三個階段,第一階段就是先在ImageNet分類資料集上預訓練Darknet-19,此時模型輸入為 224x224 ,共訓練160個epochs,然后第二階段將網路的輸入調整為 448x448 ,繼續在ImageNet資料集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度為76.5%,而top-5準確度為93.3%,第三個階段就是修改Darknet-19分類模型為檢測模型,移除最后一個卷積層、global avgpooling層以及softmax層,并且新增了三個 3x3x1024卷積層,同時增加了一個passthrough層,最后使用 1x1 卷積層輸出預測結果,輸出的channels數為:num_anchors*(5+num_classes) ,和訓練采用的資料集有關系,由于anchors數為5,對于VOC資料集(20種分類物件)輸出的channels數就是125,最終的預測矩陣T的shape為 (batch_size, 13, 13, 125),可以先將其reshape為 (batch_size, 13, 13, 5, 25) ,其中 T[:, :, :, :, 0:4] 為邊界框的位置和大小 ( t x , t y , t w , t h ) (t_x, t_y, t_w, t_h) (tx?,ty?,tw?,th?),T[:, :, :, :, 4] 為邊界框的置信度,而 T[:, :, :, :, 5:] 為類別預測值,

看一下passthrough層,圖中第25層route 16,意思是來自16層的output,即26x26x512,這是passthrough層的來源(細粒度特征),第26層1x1卷積降低通道數,從512降低到64(這一點論文在討論passthrough的時候沒有提到),輸出26x26x64,第27層進行拆分(passthrough層)操作,1拆4分成13x13x256,第28層疊加27層和24層的輸出,得到13x13x1280,后面再經過3x3卷積和1x1卷積,最后輸出13x13x125,
綜上所述,雖然YOLO2做出了一些改進,但總的來說網路結構依然很簡單,就是一些卷積+pooling,從416x416x3 變換到 13x13x5x25,稍微大一點的變化是增加了batch normalization,增加了一個passthrough層,去掉了全連接層,以及采用了5個先驗框,

對比YOLO1的輸出張量,YOLO2的主要變化就是會輸出5個先驗框,且每個先驗框都會嘗試預測一個物件,輸出的 13x13x5x25 張量中,25維向量包含 20個物件的分類概率+4個邊框坐標+1個邊框置信度,
YOLO v2 誤差函式
誤差依然包括邊框位置誤差、置信度誤差、物件分類誤差,

公式中:
1 M a x I O U < T h r e s h 1_{Max IOU<Thresh} 1MaxIOU<Thresh?意思是預測邊框中,與真實物件邊框IOU最大的那個,其IOU<閾值Thresh,此系數為1,即計入誤差,否則為0,不計入誤差,YOLO2使用Thresh=0.6,
1 t < 128000 1_{t<128000} 1t<128000?意思是前128000次迭代計入誤差,注意這里是與先驗框的誤差,而不是與真實物件邊框的誤差,可能是為了在訓練早期使模型更快學會先預測先驗框的位置,
1 k t r u t h 1_{k}^{truth} 1ktruth?意思是該邊框負責預測一個真實物件(邊框內有物件),
各種 λ \lambda λ是不同型別誤差的調節系數,
識別物件更多(Stronger)/ YOLO9000
VOC資料集可以檢測20種物件,但實際上物件的種類非常多,只是缺少相應的用于物件檢測的訓練樣本,YOLO2嘗試利用ImageNet非常大量的分類樣本,聯合COCO的物件檢測資料集一起訓練,使得YOLO2即使沒有學過很多物件的檢測樣本,也能檢測出這些物件,
基本的思路是,如果是檢測樣本,訓練時其Loss包括分類誤差和定位誤差,如果是分類樣本,則Loss只包括分類誤差,
YOLO9000是在YOLOv2的基礎上提出的一種可以檢測超過9000個類別的模型,其主要貢獻點在于提出了一種分類和檢測的聯合訓練策略,眾多周知,檢測資料集的標注要比分類資料集打標簽繁瑣的多,所以ImageNet分類資料集比VOC等檢測資料集高出幾個數量級,在YOLO中,邊界框的預測其實并不依賴于物體的標簽,所以YOLO可以實作在分類和檢測資料集上的聯合訓練,對于檢測資料集,可以用來學習預測物體的邊界框、置信度以及為物體分類,而對于分類資料集可以僅用來學習分類,但是其可以大大擴充模型所能檢測的物體種類,
作者選擇在COCO和ImageNet資料集上進行聯合訓練,但是遇到的第一問題是兩者的類別并不是完全互斥的,比如"Norfolk terrier"明顯屬于"dog",所以作者提出了一種層級分類方法(Hierarchical classification),主要思路是根據各個類別之間的從屬關系(根據WordNet)建立一種樹結構WordTree,結合COCO和ImageNet建立的WordTree如下圖所示:

WordTree中的根節點為"physical object",每個節點的子節點都屬于同一子類,可以對它們進行softmax處理,在給出某個類別的預測概率時,需要找到其所在的位置,遍歷這個path,然后計算path上各個節點的概率之積,

通過聯合訓練策略,YOLO9000可以快速檢測出超過9000個類別的物體,總體mAP值為19,7%,我覺得這是作者在這篇論文作出的最大的貢獻,因為YOLOv2的改進策略亮點并不是很突出,但是YOLO9000算是開創之舉,

總結
總的來說,YOLO2通過一些改進明顯提升了預測準確性,同時繼續保持其運行速度快的優勢,YOLO9000則開創性的提出聯合使用分類樣本和檢測樣本的訓練方法,使物件檢測能夠擴展到缺乏檢測樣本的物件,
參考:
- 目標檢測|YOLOv2原理與實作(附YOLOv3)
- Batch Normalization原理與實戰
- 目標檢測那點兒事——更強的YOLO-9000
- YOLO v2 – Object Detection
- 【精讀AI論文】YOLO V2目標檢測演算法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297756.html
標籤:AI
