論文名稱:YOLOv4: Optimal Speed and Accuracy of Object Detection
論文下載地址:https://arxiv.org/abs/2004.10934
文章目錄
- 0 前言
- 1 YOLOv4中的亮點
- 1.1 網路結構
- 1.2 優化策略
- 1.2.1 Eliminate grid sensitivity
- 1.2.2 Mosaic data augmentation
- 1.2.3 IoU threshold(正樣本匹配)
- 1.2.4 Optimizer Anchors
- 1.2.5 CIoU(定位損失)
- 2 CSPDarknet53網路結構
- 3 YOLOv4網路結構
0 前言
YOLOv4是2020年Alexey Bochkovskiy等人發表在CVPR上的一篇文章,并不是Darknet的原始作者Joseph Redmon發表的,但這個作業已經被Joseph Redmon大佬認可了,之前我們有聊過YOLOv1~YOLOv3以及Ultralytics版的YOLOv3 SPP網路結構,如果不了解的可以參考之前的視頻,YOLO系列網路詳解,如果將YOLOv4和原始的YOLOv3相比效果確實有很大的提升,但和Ultralytics版的YOLOv3 SPP相比提升確實不大,但畢竟Ultralytics的YOLOv3 SPP以及YOLOv5都沒有發表過正式的文章,所以不太好講,所以今天還是先簡單聊聊Alexey Bochkovskiy的YOLOv4,

1 YOLOv4中的亮點
如果之前有閱讀過YOLOv4這篇論文的小伙伴,你會發現作者就是把當年所有的常用技術羅列了一遍,然后做了一堆消融實驗,實驗程序及結果寫的還是很詳細的,但對我個人而言感覺有點雜亂,沒能很好的突出重點,如果大家對實驗不敢興趣的話,直接從論文3.4章節往后看就行了,
1.1 網路結構
在論文3.4章節中介紹了YOLOv4網路的具體結構:
- Backbone:
CSPDarknet53 - Neck:
SPP,PAN - Head:
YOLOv3
相比之前的YOLOv3,改進了下Backbone,在Darknet53中引入了CSP模塊(來自CSPNet),在Neck部分,采用了SPP模塊(Ultralytics版的YOLOv3 SPP就使用到了)以及PAN模塊(來自PANet),Head部分沒變還是原來的檢測頭,
關于CSPDarnet53,后面有專門的章節講解,這里暫時跳過,關于SPP(Spatial Pyramid Pooling)模塊之前講YOLO系列網路詳解時詳細介紹過,SPP就是將特征層分別通過一個池化核大小為5x5、9x9、13x13的最大池化層,然后在通道方向進行concat拼接在做進一步融合,這樣能夠在一定程度上解決目標多尺度問題,如下圖所示,

PAN(Path Aggregation Network)結構其實就是在FPN(從頂到底資訊融合)的基礎上加上了從底到頂的資訊融合,如下圖(b)所示,

但YOLOv4的PAN結構和原始論文的融合方式又略有差異,如下圖所示,圖(a)是原始論文中的融合方式,即特征層之間融合時是直接通過相加的方式進行融合的,但在YOLOv4中是通過在通道方向Concat拼接的方式進行融合的,

1.2 優化策略
有關訓練Backbone時采用的優化策略就不講了有興趣自己看下論文的4.2章節,這里直接講下訓練檢測器時作者采用的一些方法,在論文4.3章節,作者也羅列了一堆方法,并做了部分消融實驗,這里我只介紹確實在代碼中有使用到的一些方法,
1.2.1 Eliminate grid sensitivity
在原來YOLOv3中,關于計算預測的目標中心坐標計算公式是:
b
x
=
σ
(
t
x
)
+
c
x
b
y
=
σ
(
t
y
)
+
c
y
b_x = \sigma(t_x) + c_x \\ b_y = \sigma(t_y) + c_y
bx?=σ(tx?)+cx?by?=σ(ty?)+cy?
其中:
- t x t_x tx?是網路預測的目標中心 x x x坐標偏移量(相對于網格的左上角)
- t y t_y ty?是網路預測的目標中心 y y y坐標偏移量(相對于網格的左上角)
- c x c_x cx?是對應網格左上角的 x x x坐標
- c y c_y cy?是對應網格左上角的 y y y坐標
-
σ
\sigma
σ是
sigmoid激活函式,將預測的偏移量限制在0到1之間,即預測的中心點不會超出對應網格區域
?

但在YOLOv4的論文中作者認為這樣做不太合理,比如當真實目標中心點非常靠近網格的左上角點(
σ
(
t
x
)
\sigma(t_x)
σ(tx?)和
σ
(
t
y
)
\sigma(t_y)
σ(ty?)應該趨近與0)或者右下角點(
σ
(
t
x
)
\sigma(t_x)
σ(tx?)和
σ
(
t
y
)
\sigma(t_y)
σ(ty?)應該趨近與1)時,網路的預測值需要非常小或者非常大時才能取到,而這種很極端的值網路一般無法達到,為了解決這個問題,作者引入了一個大于1的縮放系數(
s
c
a
l
e
x
y
{\rm scale}_{xy}
scalexy?):
b
x
=
(
σ
(
t
x
)
?
s
c
a
l
e
x
y
?
s
c
a
l
e
x
y
?
1
2
)
+
c
x
b
y
=
(
σ
(
t
y
)
?
s
c
a
l
e
x
y
?
s
c
a
l
e
x
y
?
1
2
)
+
c
y
b_x = (\sigma(t_x) \cdot {\rm scale}_{xy} - \frac{{\rm scale}_{xy}-1}{2}) + c_x \\ b_y = (\sigma(t_y) \cdot {\rm scale}_{xy} - \frac{{\rm scale}_{xy}-1}{2})+ c_y
bx?=(σ(tx?)?scalexy??2scalexy??1?)+cx?by?=(σ(ty?)?scalexy??2scalexy??1?)+cy?
通過引入這個系數,網路的預測值能夠很容易達到0或者1,我看現在比較新的實作方法包括YOLOv5都將
s
c
a
l
e
x
y
{\rm scale}_{xy}
scalexy?設定2,即:
b
x
=
(
σ
(
t
x
)
?
2
?
0.5
)
+
c
x
b
y
=
(
σ
(
t
y
)
?
2
?
0.5
)
+
c
y
b_x = (\sigma(t_x) \cdot 2 - 0.5) + c_x \\ b_y = (\sigma(t_y) \cdot 2 - 0.5) + c_y
bx?=(σ(tx?)?2?0.5)+cx?by?=(σ(ty?)?2?0.5)+cy?
下面是我繪制的 y = σ ( x ) y = \sigma(x) y=σ(x)(sigma)和 y = σ ( x ) ? 2 ? 0.5 y = \sigma(x) \cdot 2 - 0.5 y=σ(x)?2?0.5(scale)的曲線,很明顯通過引入縮放系數scale以后, x x x在同樣的區間內, y y y的取值范圍更大,或者說 y y y對 x x x更敏感了,

1.2.2 Mosaic data augmentation
在資料預處理時將四張圖片拼接成一張圖片,增加學習樣本的多樣性,之前在YOLO系列網路詳解P4中講過,這里不在贅述,

1.2.3 IoU threshold(正樣本匹配)
在YOLOv3中針對每一個GT都只分配了一個Anchor,但在YOLOv4包括之前講過的YOLOv3 SPP中一個GT可以同時分配給多個Anchor,它們是直接使用Anchor模板(注意不是繪制在圖上的每個Anchor,不要把Anchor模板和Anchor弄混了)與GT Boxes進行粗略匹配,然后在定位到對應Anchor的位置,匹配流程大致如下圖所示:比如說針對某個預測特征層采用如下三種Anchor模板AT 1、AT 2、AT 3
- 將每個GT Boxes與每個Anchor模板進行匹配(這里直接將GT和Anchor模板左上角對齊,然后計算IoU)
- 如果GT與某個Anchor模板的IoU大于給定的閾值,則將GT分配給該Anchor模板,如下圖中的
AT 2 - 將GT投影到對應預測特征層上,根據GT的中心點定位到對應
cell的左上角 - 將匹配上的Anchor模板(
AT 2)以對應cell的左上角為中心繪制得到Anchor,則該Anchor為正樣本
在YOLOv4中IoU的閾值設定的是0.213.

1.2.4 Optimizer Anchors
在YOLOv3中使用anchor模板是:
| 目標型別 | Anchors模板 |
|---|---|
| 小尺度 | ( 10 × 13 ) , ( 16 × 30 ) , ( 33 × 23 ) (10 \times 13), (16 \times 30), (33 \times 23) (10×13),(16×30),(33×23) |
| 中尺度 | ( 30 × 61 ) , ( 62 × 45 ) , ( 59 × 119 ) (30 \times 61), (62 \times 45), (59 \times 119) (30×61),(62×45),(59×119) |
| 大尺度 | ( 116 × 90 ) , ( 156 × 198 ) , ( 373 × 326 ) (116 \times 90), (156 \times 198), (373 \times 326) (116×90),(156×198),(373×326) |
在YOLOv4中作者針對
512
×
512
512 \times 512
512×512尺度采用的anchor模板是:
| 目標型別 | Anchors模板 |
|---|---|
| 小尺度 | ( 12 × 16 ) , ( 19 × 36 ) , ( 40 × 28 ) (12 \times 16), (19 \times 36), (40 \times 28) (12×16),(19×36),(40×28) |
| 中尺度 | ( 36 × 75 ) , ( 76 × 55 ) , ( 72 × 146 ) (36 \times 75), (76 \times 55), (72 \times 146) (36×75),(76×55),(72×146) |
| 大尺度 | ( 142 × 110 ) , ( 192 × 243 ) , ( 459 × 401 ) (142 \times 110), (192 \times 243), (459 \times 401) (142×110),(192×243),(459×401) |
1.2.5 CIoU(定位損失)
在YOLOv3中定位損失采用的是MSE損失,但在YOLOv4中作者采用的是CIoU損失,之前在YOLO系列網路詳解P4中很詳細的講解過IoU Loss,DIoU Loss以及CIoU Loss,這里不在贅述,

2 CSPDarknet53網路結構
CSPDarknet53就是將CSP結構融入了Darknet53中,CSP結構是在CSPNet(Cross Stage Partial Network)論文中提出的,CSPNet作者說在目標檢測任務中使用CSP結構有如下好處:
- Strengthening learning ability of a CNN
- Removing computational bottlenecks
- Reducing memory costs
即減少網路的計算量以及對顯存的占用,同時保證網路的能力不變或者略微提升,CSP結構的思想參考原論文中繪制的CSPDenseNet,進入每個stage(一般在下采樣后)先將資料劃分成倆部分,如下圖所示的Part1和Part2,但具體怎么劃分呢,在CSPNet中是直接按照通道均分,但在YOLOv4網路中是通過兩個1x1的卷積層來實作的,在Part2后跟一堆Blocks然后在通過1x1的卷積層(圖中的Transition),接著將兩個分支的資訊在通道方向進行Concat拼接,最后再通過1x1的卷積層進一步融合(圖中的Transition),

接下來詳細分析下CSPDarknet53網路的結構,下圖是我根據開源倉庫https://github.com/Tianxiaomo/pytorch-YOLOv4中代碼繪制的CSPDarknet53詳細結構(以輸入圖片大小為
416
×
416
×
3
416 \times 416 \times 3
416×416×3為例),圖中:
- k k k代表卷積核的大小
- s s s代表步距
- c c c代表通過該模塊輸出的特征層channels
- 注意,
CSPDarknet53Backbone中所有的激活函式都是Mish激活函式

3 YOLOv4網路結構
下圖是我繪制的YOLOv4網路的詳細結構,大家在搭建或者學習程序中可以進行參考,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/437974.html
標籤:AI
上一篇:下班前幾分鐘,我徹底弄懂了P-R曲線、ROC與AUC
下一篇:人工智能——深度學習
