YOLO v2概述
YOLO v1雖然檢測速度快,但在定位方面不夠準(zhǔn)確,并且召回率較低。為了提升定位準(zhǔn)確度,改善召回率,YOLO v2在YOLO v1的基礎(chǔ)上提出了幾種改進(jìn)策略,如下圖所示,一些改進(jìn)方法能有效提高模型的mAP。
這個(gè)圖片的第2行第1列是進(jìn)行改進(jìn)的點(diǎn),第2行第3列應(yīng)該看紅色數(shù)字標(biāo)注的列,有√
就是有改進(jìn),空白就是沒改進(jìn),第2行第4列就是今天咱們的主角yolo V2,集所有BUFF于一身得到最強(qiáng)mAP值,第3行是對應(yīng)的mAP值。下面我們按順序逐一講解:
Batch Normalization(批歸一化)
- 舍棄了Dropout。因?yàn)镈ropout經(jīng)常在全連接層用到,為了防止過擬合。在這里也就表示去掉了全連接層。不知道的復(fù)習(xí)一下神經(jīng)網(wǎng)絡(luò)基礎(chǔ)算法。
- 那么既然沒有了全連接層,對圖像輸入的大小還有要求嗎?當(dāng)然是沒有了,因?yàn)橹挥腥B接層的參數(shù)限制了輸入圖像的大小,卷積層又不影響。
- 每一個(gè)卷積層后都加入Batch Normalization,也就是網(wǎng)絡(luò)的每一層都做歸一化,收斂起來相對簡單。
可以這樣理解,加上BN之后就相當(dāng)于月考,有利于下一步的發(fā)展。不加BN相當(dāng)于年考,中間學(xué)的怎么樣不清楚。 - 從第一張圖可以看到,經(jīng)過Batch Normalization之后的網(wǎng)絡(luò)會提升2%的mAP。
- 目前Batch Normalization已經(jīng)成為網(wǎng)絡(luò)模型必備處理方法了。也就是一個(gè)學(xué)校發(fā)現(xiàn)月考挺好,然后其他學(xué)校紛紛效仿,最終全國統(tǒng)一了。
High Resolution Classifier(高分辨率預(yù)訓(xùn)練分類網(wǎng)絡(luò))
- V1訓(xùn)練的時(shí)候用的224224,測試的時(shí)候用的448448。效果并不是很好,V2在訓(xùn)練時(shí)額外加了10次448*448的微調(diào),使得mAP提升了約4%。
- 為什么 V1不用224224呢?可能是因?yàn)楫?dāng)時(shí)設(shè)備不允許??!訓(xùn)練時(shí)間也要呈平方倍增長。比如224224訓(xùn)練用了10h,448*448就要用100h,傷不起。
New Network:Darknet-19
YOLO v2采用Darknet-19,其網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示,包括19 1919個(gè)卷積層和5 55個(gè)max pooling層,主要采用3 × 3卷積和1 × 1卷積,這里1 × 1卷積可以壓縮特征圖通道數(shù)以降低模型計(jì)算量和參數(shù),每個(gè)卷積層后使用BN層以加快模型收斂同時(shí)防止過擬合。最終采用global avg pool 做預(yù)測。采用 YOLO v2,模型的mAP值沒有顯著提升,但計(jì)算量減少了。
- 實(shí)際輸入圖像大小416x416,為什么是416x416?首先要可以整除 2 5 2^5 25,因?yàn)?次降采樣后h和w的一個(gè)像素點(diǎn)相當(dāng)于原始圖像的32個(gè)像素點(diǎn),最后做還原用到。
- 最終得到13*13的Grid Cell。
- 縮減網(wǎng)絡(luò),讓圖片的輸入分辨率為416x416,目的是讓后面產(chǎn)生的卷積特征圖寬高都為奇數(shù),這樣就可以產(chǎn)生一個(gè)center cell。因?yàn)榇笪矬w通常占據(jù)了圖像的中間位置,可以只用一個(gè)中心的cell來預(yù)測這些物體的位置,否則就要用中間的4個(gè)cell來進(jìn)行預(yù)測,這個(gè)技巧可稍稍提升效率。也就是所有大物體的中心點(diǎn)都落在了center cell,如果是偶數(shù)的話,所有大物體的中心位置就可能分布在4個(gè)cell中。
各參數(shù)計(jì)算方法:
神經(jīng)網(wǎng)絡(luò)中的filter (濾波器)與kernel(內(nèi)核)的概念
可參考 :https://blog.csdn.net/m0_54634272/article/details/128519246
-
kernel(內(nèi)核): 是一個(gè)2維矩陣,長 × 寬;
-
filter(濾波器):是一個(gè)三維立方體,長× 寬 × 深度, 其中深度便是由多少張內(nèi)核構(gòu)成;
-
兩者之間的關(guān)系:可以說 kernel 是filter 的基本元素, 多張kernel 組成一個(gè)filter;
-
那么, 一個(gè)filter 中應(yīng)該包含多少張 kernel 呢?
答:是由輸入的通道個(gè)數(shù)所確定, 即,輸入通道是3個(gè)特征時(shí),則后續(xù)的每一個(gè)filter中包含3張kernel ;
filter輸入通道是包含128個(gè)特征時(shí), 則一個(gè)filter中所包含kernel 數(shù)是128張。 -
那么一層中應(yīng)該有多少個(gè)filter 構(gòu)成呢?
答: 我們想要提取多少個(gè)特征,即我們想要輸出多少個(gè)特征,那么這一層就設(shè)置多少個(gè)filter; -
一個(gè)filter 負(fù)責(zé)提取某一種特征,N個(gè)filter 提取 N 個(gè)特征;
-
Filters(卷積核個(gè)數(shù)):是可以人為指定的,在
out_channels
設(shè)置,如果設(shè)置為2,就會生成兩個(gè)形狀相同,初始參數(shù)不同的filter。 -
Size:卷積核的大小
-
Stride(步長):往往決定了輸出特征圖的大小。h/stride和w/stride。
-
Q:為什么要加入1x1的卷積層
- A:我們以下面這張圖舉例,經(jīng)過Maxpool層之后特征圖的個(gè)數(shù)翻倍了。3x3的卷積無非是特征濃縮的過程。
3x3接3x3
和3x3接1x1再接3x3
的效果是差不多的,不過第二種節(jié)省了很多參數(shù)。還保持了整體網(wǎng)絡(luò)結(jié)構(gòu)沒有太大影響。
- A:我們以下面這張圖舉例,經(jīng)過Maxpool層之后特征圖的個(gè)數(shù)翻倍了。3x3的卷積無非是特征濃縮的過程。
-
Q:maxpool特征圖個(gè)數(shù)翻倍?
- A:池化操作就是用一個(gè)kernel,比如2x2的,就去輸入圖像上對應(yīng)2x2的位置上,選取這四個(gè)數(shù)字中最大的作為輸出結(jié)果。這就叫最大池化。
輸出通道=輸入通道
這里特征圖翻倍是因?yàn)樽髡咴O(shè)置了out_channels=2
- A:池化操作就是用一個(gè)kernel,比如2x2的,就去輸入圖像上對應(yīng)2x2的位置上,選取這四個(gè)數(shù)字中最大的作為輸出結(jié)果。這就叫最大池化。
-
Q:1x1節(jié)省了參數(shù)?
- A:參數(shù)的概念:確定一個(gè)卷積層的結(jié)構(gòu)所需要的信息(例如:kernel_size, stride, padding, input_channels, output_channels),看下這張圖,顯然是(1)圖的計(jì)算量和參數(shù)少。
- A:參數(shù)的概念:確定一個(gè)卷積層的結(jié)構(gòu)所需要的信息(例如:kernel_size, stride, padding, input_channels, output_channels),看下這張圖,顯然是(1)圖的計(jì)算量和參數(shù)少。
Anchor卷積
在YOLO-V1
中使用全連接層進(jìn)行bounding box
預(yù)測,這會丟失較多的空間信息,導(dǎo)致定位不準(zhǔn)。YOLO-V2
借鑒了Faster R-CNN
中anchor
的思想,我們知道Faster R-CNN
中的anchor
就是在卷積特征圖上進(jìn)行滑窗采樣,每個(gè)中心預(yù)測9
個(gè)不同大小和比例的anchor
。
總的來說YOLO-V2
移除了全連接層(以獲得更多的空間信息)使用anchor boxes
去預(yù)測bounding boxes
。并且YOLO-V2
中的anchor box
可以同時(shí)預(yù)測類別和坐標(biāo)。具體做法如下:
- 跟
YOLO-V1
比起來,去掉最后的池化層,確保輸出的卷積特征圖有更高的分辨率。 - 使用卷積層降采樣(
factor=32
),使得輸入卷積網(wǎng)絡(luò)的416x416
的圖片最終得到13x13
的卷積特征圖(416/32=13
)。 - 由
anchor box
同時(shí)預(yù)測類別和坐標(biāo)。因?yàn)?code>YOLO-V1是由每個(gè)cell
來負(fù)責(zé)預(yù)測類別的,每個(gè)cell
對應(yīng)的兩個(gè)bounding box
負(fù)責(zé)預(yù)測坐標(biāo)。YOLO-V2
中不再讓類別的預(yù)測與每個(gè)cell
綁定一起,而是全部都放到anchor box
中去預(yù)測。
加入了anchor
之后,我們來計(jì)算下,假設(shè)每個(gè)cell
預(yù)測9
個(gè)anchor
,那么總計(jì)會有13x13x9=1521
個(gè)boxes
,而之前的網(wǎng)絡(luò)僅僅預(yù)測了7x7x2=98
個(gè)boxes
。具體每個(gè)網(wǎng)格對應(yīng)的輸出維度如下圖:
YOLOV1和YOLOV2網(wǎng)格輸出維度對比
我們知道YOLO-V1
輸出7x7x30
的檢測結(jié)果,如上圖,其中每個(gè)網(wǎng)格輸出的30
個(gè)數(shù)據(jù)包括兩個(gè)候選框的位置,有無包含物體的置信度,以及網(wǎng)格中包含物體類別的20
個(gè)概率值。YOLO-V2
對此做了些改進(jìn),將物體類別的預(yù)測任務(wù)交給了候選框,而不再是網(wǎng)格擔(dān)任了,那么假如是9
個(gè)候選框,那么就會有9x25=225
個(gè)數(shù)據(jù)的輸出維度,其中25
為每個(gè)候選框的位置,有無物體的置信度以及20
個(gè)物體類別的概率值。這樣的話,最后網(wǎng)絡(luò)輸出的檢測結(jié)果就應(yīng)該是13x13x225
,但是上面網(wǎng)絡(luò)框架中是125
,是怎么回事兒呢?我們接著看。
Dimension Clusters(Anchor Box的寬高由聚類產(chǎn)生)
在Faster R-CNN和SSD中,先驗(yàn)框都是手動(dòng)設(shè)定的,帶有一定的主觀性。 YOLO v2采用k-means聚類算法對訓(xùn)練集中的邊界框做了聚類分析,選用boxes之間的IOU值作為聚類指標(biāo)。綜合考慮模型復(fù)雜度和召回率,最終選擇5 個(gè)聚類中心,得到5個(gè)先驗(yàn)框,發(fā)現(xiàn)其中中扁長的框較少,而瘦高的框更多,更符合行人特征。通過對比實(shí)驗(yàn),發(fā)現(xiàn)用聚類分析得到的先驗(yàn)框比手動(dòng)選擇的先驗(yàn)框有更高的平均IOU值,這使得模型更容易訓(xùn)練學(xué)習(xí)。
- Faster R-CNN和SSD的做法
- 大致就是這么個(gè)意思:設(shè)定了3種長寬不同的比例,然后根據(jù)物體可能的大小設(shè)定3個(gè)不同的尺寸,最終得到9個(gè)Anchor Box。但是這樣真的好嗎?不太符合現(xiàn)實(shí)中的物體。
- YOLO V2聚類提取先驗(yàn)框的做法
- 首先數(shù)據(jù)集是我真實(shí)需要的,我想從這里面提取出5類框,這樣做顯然更符合實(shí)際情況。于是就按照大小、長寬比等根據(jù)K-mean算法得到了更接近實(shí)際的5類先驗(yàn)框。
- 首先數(shù)據(jù)集是我真實(shí)需要的,我想從這里面提取出5類框,這樣做顯然更符合實(shí)際情況。于是就按照大小、長寬比等根據(jù)K-mean算法得到了更接近實(shí)際的5類先驗(yàn)框。
K-means聚類中的距離
在使用anchor
時(shí),Faster R-CNN
中anchor boxes
的個(gè)數(shù)和寬高維度往往是手動(dòng)精選的先驗(yàn)框(hand-picked priors
),如果能夠一開始就選擇了更好的,更有代表性的先驗(yàn)boxes
維度,那么網(wǎng)絡(luò)就應(yīng)該更容易學(xué)到精準(zhǔn)的預(yù)測位置。YOLO-V2中利用K-means
聚類方法,通過對數(shù)據(jù)集中的ground truth box
做聚類,找到ground truth box
的統(tǒng)計(jì)規(guī)律。以聚類個(gè)數(shù)k
為anchor boxes
個(gè)數(shù),以k
個(gè)聚類中心box
的寬高為anchor box
的寬高。
可以復(fù)習(xí)一下K-means聚類算法:
基礎(chǔ)聚類算法:K-means算法
但是,如果按照標(biāo)準(zhǔn)的k-means
使用歐式距離函數(shù),計(jì)算距離的時(shí)候,大boxes比小boxes產(chǎn)生更多的error
。但是,我們真正想要的是產(chǎn)生好的IoU
得分的boxes
(與box大小無關(guān)),因此采用了如下距離度量方式:
d
(
b
o
x
,
c
e
n
t
r
o
i
d
s
)
=
1
?
I
O
U
(
b
o
x
,
c
e
n
t
r
o
i
d
s
)
d(box,centroids) = 1 - IOU(box,centroids)
d(box,centroids)=1?IOU(box,centroids)
假設(shè)有兩個(gè)框,一個(gè)是3x5
,一個(gè)框是5x5
,那么歐式距離計(jì)算為:
(
2.5
?
1.5
)
2
+
(
2.5
?
2.5
)
2
=
1
\sqrt{{(2.5-1.5)^2+(2.5-2.5)^2}}=1
(2.5?1.5)2+(2.5?2.5)2?=1
IoU
的計(jì)算如下,為了統(tǒng)計(jì)寬高聚類,這里默認(rèn)中心點(diǎn)是重疊的:
(
3
?
5
)
/
(
5
?
5
)
=
0.6
(3*5)/(5*5)=0.6
(3?5)/(5?5)=0.6
當(dāng)兩個(gè)框無限接近時(shí),IOU值也就趨于1,此時(shí)
d
(
b
o
x
,
c
e
n
t
r
o
i
d
s
)
d(box,centroids)
d(box,centroids)接近于0,K-means聚類算法將這樣的框聚在一起。
- Q:為什么說不使用歐式距離呢?
- A:距離度量如果使用標(biāo)準(zhǔn)的歐氏距離,大盒子會比小盒子產(chǎn)生更多的錯(cuò)誤。例100x100和90x90的盒子與10x10和9x9的盒子。因此這里使用其他的距離度量公式。
- 說人話:k不是等于5嘛。這樣做會把大多數(shù)小中盒子聚在一起,而大盒子占據(jù)了其他4份,顯然不科學(xué)。
-
(
50
?
45
)
2
+
(
50
?
45
)
2
=
50
\sqrt{{(50-45)^2+(50-45)^2}}=50
(50?45)2+(50?45)2?=50
(
5
?
4.5
)
2
+
(
5
?
4.5
)
2
=
0.5
\sqrt{{(5-4.5)^2+(5-4.5)^2}}=0.5
(5?4.5)2+(5?4.5)2?=0.5
這里,為了得到較好的聚類個(gè)數(shù),算法里做了組測試,如下圖,隨著k
的增大IoU
也在增大,但是復(fù)雜度也在增加。
k-means聚類個(gè)數(shù)的選擇
所以平衡復(fù)雜度和IoU
之后,最終得到k
值為5
??梢詮挠疫叺木垲惤Y(jié)果上看到5
個(gè)聚類中心的寬高與手動(dòng)精選的boxes
是完全不同的,扁長的框較少,瘦高的框較多(黑絲框?qū)?yīng)VOC2007
數(shù)據(jù)集,紫色框?qū)?yīng)COCO
數(shù)據(jù)集)。 這樣就能明白為什么上面網(wǎng)絡(luò)框架中的輸出為什么是13x13x125
了,因?yàn)橥ㄟ^聚類選用了5
個(gè)anchor。
- 雖然說k值越大分的越細(xì),差距也就越小,但是也不能設(shè)置太多的
anchor boxes
吧,而且在5之后曲線上升的就不是那么快了,所以選了一個(gè)折中的值5。 - 通過增加anchor boxes的方法雖然mAP值有所下降,但是查全率(Recall)提升了7個(gè)點(diǎn)。
直接位置預(yù)測(Directed Location Prediction)
Yolo v2同RPN等網(wǎng)絡(luò)一樣使用了卷積來生成anchor boxes的位置信息。但它在使用像Faster-RCNN或SSD中那樣來進(jìn)行位置偏離計(jì)算的方法來預(yù)測predicted box的位置時(shí)發(fā)現(xiàn)訓(xùn)練時(shí)非常容易出現(xiàn)震蕩。如下為RPN網(wǎng)絡(luò)所用的位置計(jì)算公式:
x
=
x
p
+
w
p
?
t
x
x = x_p+w_p *t_x
x=xp?+wp??tx?
y
=
y
p
+
h
p
?
t
y
y = y_p+h_p *t_y
y=yp?+hp??ty?
- bbox :中心為 ( x p , y p ) (x_p,y_p) (xp?,yp?);寬高為 ( w p , h p ) (w_p,h_p) (wp?,hp?)
- 當(dāng)tx=1時(shí),則將bbox在x軸向右移動(dòng)wp;tx=-1,則將bbox在y軸向左移動(dòng)wp。y也是同樣的邏輯
- 上面的坐標(biāo)轉(zhuǎn)換很容易懂,但不好訓(xùn)練。因?yàn)?x,y 并沒有遵守什么約束,所以可能預(yù)測的 bbox 會遍布一張圖片任何角落。
- V2中沒有使用偏移量,而是選擇相對gride cell 的偏移量。
根據(jù)上面的學(xué)習(xí),我們知道這里用到了類似Faster R-CNN
中的anchor
,但是使用anchor boxes
有一個(gè)問題,就是會使得模型不穩(wěn)定,尤其是早期迭代的時(shí)候。大部分的不穩(wěn)定現(xiàn)象出現(xiàn)在預(yù)測box
的中心坐標(biāo)時(shí),所以YOLO-V2
沒有用Faster R-CNN
的預(yù)測方式。
YOLO-V2位置預(yù)測(tx,ty)就是預(yù)測邊界框中心點(diǎn)相對于對應(yīng)cell
左上角位置的相對偏移值,為了將邊界框中心點(diǎn)約束在當(dāng)前cell
中,使用了sigmoid
函數(shù)處理偏移值,這樣預(yù)測的偏移值就在(0,1)
范圍內(nèi)了(每個(gè)cell的尺度看作1)。
- Q:為什么加上sigmoid之后就是(0,1)了呢?
- A:看圖就知道了
- A:看圖就知道了
我們具體來看以下這個(gè)預(yù)測框是怎么產(chǎn)生的?
在網(wǎng)格特征圖(13x13)
的每個(gè)cell
上預(yù)測5
個(gè)anchor
,每一個(gè)anchor
預(yù)測5
個(gè)值:(tx,ty,tw,th,t0)。如果這個(gè)cell距離圖像左上角的邊距為(cx,cy),cell
對應(yīng)的先驗(yàn)框(anchor
)的長和寬分別為(pw,ph),那么網(wǎng)格預(yù)測框?yàn)橄聢D藍(lán)框。如下圖:
P
r
(
o
b
j
e
c
t
)
?
I
O
U
(
b
,
o
b
j
e
c
t
)
=
σ
(
t
0
)
Pr(object)*IOU(b,object) = \sigma(t_0)
Pr(object)?IOU(b,object)=σ(t0?)
其中
b
x
,
b
y
,
b
w
,
b
h
,
σ
b_x,b_y,b_w,b_h,σ
bx?,by?,bw?,bh?,σ 分別代表predict box的中心坐標(biāo)x,y和它的長和寬,還有目標(biāo)為物體b的概率。
候選框如何生成?
總的來說,虛線框?yàn)閍nchor box就是通過先驗(yàn)聚類方法產(chǎn)生的框,而藍(lán)色的為調(diào)整后的預(yù)測框。算法通過使用維度聚類和直接位置預(yù)測這亮相anchor boxes的改進(jìn)方法,將mAP提高了5%。接下來,我們繼續(xù)看下還有哪些優(yōu)化?
細(xì)粒度特征(Fine-Grained Features)
感受野
3個(gè)3*3卷積核的優(yōu)勢:
- 省參數(shù)
- 每一次卷積之后都要進(jìn)行BN,相當(dāng)于月考,而一個(gè)7X7的卷積核就相當(dāng)于期末考。
SSD
通過不同Scale
的Feature Map
來預(yù)測Box
,實(shí)現(xiàn)多尺度,不熟悉的可以看下面:
目標(biāo)檢測算法SSD結(jié)構(gòu)詳解
而YOLO-V2
則采用了另一種思路:通過添加一個(gè)passthrough layer
,來獲取之前的26x26x512
的特征圖特征,也就是前面框架圖中的第25
步。對于26x26x512
的特征圖,經(jīng)過重組之后變成了13x13x2048
個(gè)新的特征圖(特征圖大小降低4倍,而channels
增加4倍),這樣就可以與后面的13x13x1024
特征圖連接在一起形成13x13x3072
大小的特征圖,然后再在此特征圖的基礎(chǔ)上卷積做預(yù)測。如下圖:
YOLO-V2
算法使用經(jīng)過擴(kuò)展后的特征圖,利用了之前層的特征,使得模型的性能獲得了1%
的提升。文章來源:http://www.zghlxwxcb.cn/news/detail-475573.html
多尺度訓(xùn)練(Multi-Scale)
原始的YOLO
網(wǎng)絡(luò)使用固定的448x448
的圖片作為輸入,加入anchor boxes
后輸入變成了416x416
,由于網(wǎng)絡(luò)只用到了卷積層和池化層,就可以進(jìn)行動(dòng)態(tài)調(diào)整,檢測任意大小的圖片。為了讓YOLO-V2
對不同尺寸圖片具有魯棒性,在訓(xùn)練的時(shí)候也考慮到了這一點(diǎn)。
不同于固定網(wǎng)絡(luò)輸入圖片尺寸的方法,每經(jīng)過10
批訓(xùn)練(10 batches
)就會隨機(jī)選擇新的圖片尺寸。網(wǎng)絡(luò)使用的降采樣參數(shù)為32
,于是使用32
的倍數(shù){320,352,…,608},最小尺寸為320x320
,最大尺寸為608x608
。調(diào)整網(wǎng)絡(luò)到相應(yīng)維度然后繼續(xù)訓(xùn)練。這樣只需要調(diào)整最后一個(gè)卷積層的大小即可,如下圖:
這種機(jī)制使得網(wǎng)絡(luò)可以更好地預(yù)測不同尺寸的圖片,同一個(gè)網(wǎng)格可以進(jìn)行不同分辨率的檢測任務(wù),在小尺寸圖片上YOLO-V2
運(yùn)行更快,在速度和精度上達(dá)到了平衡。文章來源地址http://www.zghlxwxcb.cn/news/detail-475573.html
到了這里,關(guān)于深度學(xué)習(xí)目標(biāo)檢測_YOLOV2超詳細(xì)解讀的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!