Yolov3網路架構分析
Yolov3網路架構分析
上圖三個藍色方框內表示Yolov3的三個基本元件:
l CBL:Yolov3網路結構中的最小元件,由Conv+Bn+Leaky_relu啟用函式三者組成。
l Res unit:借鑑Resnet網路中的殘差結構,讓網路可以構建的更深。
l ResX:由一個CBL和X個殘差元件構成,是Yolov3中的大元件。每個Res模組前面的CBL都起到下采樣的作用,因此經過5次Res模組後,得到的特徵圖是608->304->152->76->38->19大小。
其他基礎操作:
l Concat:張量拼接,會擴充兩個張量的維度,例如26*26*256和26*26*512兩個張量拼接,結果是26*26*768。Concat和cfg檔案中的route功能一樣。
l add:張量相加,張量直接相加,不會擴充維度,例如104*104*128和104*104*128相加,結果還是104*104*128。add和cfg檔案中的shortcut功能一樣。
Backbone中卷積層的數量:
每個ResX中包含1+2*X個卷積層,因此整個主幹網路Backbone中一共包含1+(1+2*1)+(1+2*2)+(1+2*8)+(1+2*8)+(1+2*4)=52,再加上一個FC全連線層,即可以組成一個Darknet53分類網路。不過在目標檢測Yolov3中,去掉FC層,不過為了方便稱呼,仍然把Yolov3的主幹網路叫做Darknet53結構。
- backbone:Darknet-53
在第1個卷積操作DarknetConv2D_BN_Leaky()中,是3個操作的組合,即
- 1個Darknet的2維卷積Conv2D層,即DarknetConv2D();
- 1個正則化(BN)層,即BatchNormalization();
- 1個LeakyReLU層,斜率是0.1,LeakyReLU是ReLU的變換;
backbone部分由Yolov2時期的Darknet-19進化至Darknet-53,加深了網路層數,引入了Resnet中的跨層加和操作。原文列舉了Darknet-53與其他網路的對比:
圖三. Darknet精度效能對比
Darknet-53處理速度每秒78張圖,比Darknet-19慢不少,但是比同精度的ResNet快很多。Yolov3依然保持了高效能。
(這裡解釋一下Top1和Top5:模型在ImageNet資料集上進行推理,按照置信度排序總共生成5個標籤。按照第一個標籤預測計算正確率,即為Top1正確率;前五個標籤中只要有一個是正確的標籤,則視為正確預測,稱為Top5正確率)
- Yolov3網路結構細節
DBL: 上圖左下角所示,也就是程式碼中的Darknetconv2d_BN_Leaky,是yolo_v3的基本元件。就是卷積+BN+Leaky relu。對於v3來說,BN和leaky relu(正則化和激勵)已經是和卷積層不可分離的部分了(最後一層卷積除外),共同構成了最小元件。
resn:n代表數字,有res1,res2, … ,res8等等,表示這個res_block裡含有多少個res_unit。這是yolo_v3的大元件,yolo_v3開始借鑑了ResNet的殘差結構,使用這種結構可以讓網路結構更深(從v2的darknet-19上升到v3的darknet-53,前者沒有殘差結構)。對於res_block的解釋,可以在圖1的右下角直觀看到,其基本元件也是DBL。
concat:張量拼接。將darknet中間層和後面的某一層的上取樣進行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。
網路結構解析:
- Yolov3中,只有卷積層,通過調節卷積步長控制輸出特徵圖的尺寸。所以對於輸入圖片尺寸沒有特別限制。流程圖中,輸入圖片以256*256作為樣例。Yolov3借鑑了金字塔特徵圖思想,小尺寸特徵圖用於檢測大尺寸物體,而大尺寸特徵圖檢測小尺寸物體。特徵圖的輸出維度為為輸出特徵圖格點數,一共3個Anchor框,每個框有4維預測框數值,1維預測框置信度,80維物體類別數。所以第一層特徵圖的輸出維度為。
- Yolov3總共輸出3個特徵圖,第一個特徵圖下采樣32倍,第二個特徵圖下采樣16倍,第三個下采樣8倍。輸入影象經過Darknet-53(無全連線層),再經過Yoloblock生成的特徵圖被當作兩用,第一用為經過3*3卷積層、1*1卷積之後生成特徵圖一,第二用為經過1*1卷積層加上取樣層,與Darnet-53網路的中間層輸出結果進行拼接,產生特徵圖二。同樣的迴圈之後產生特徵圖三。
- 上取樣層(upsample):作用是將小尺寸特徵圖通過插值等方法,生成大尺寸影象。例如使用最近鄰插值演算法,將8*8的影象變換為16*16。上取樣層不改變特徵圖的通道數。
- 啟用函式concat操作與加和操作的區別:加和操作來源於ResNet思想,將輸入的特徵圖,與輸出特徵圖對應維度進行相加,即
;而concat操作源於DenseNet網路的設計思路,將特徵圖按照通道維度直接進行拼接,例如8*8*16的特徵圖與8*8*16的特徵圖拼接後生成8*8*32的特徵圖。
LeakyReLU的啟用函式,如下
其中,Darknet的2維卷積DarknetConv2D,具體操作如下:
- 將核權重矩陣的正則化,使用L2正則化,引數是5e-4,即操作w引數;
- Padding,一般使用same模式,只有當步長為(2,2)時,使用valid模式。避免在降取樣中,引入無用的邊界資訊;
- 其餘引數不變,都與二維卷積操作Conv2D()一致;
kernel_regularizer是將核權重引數w進行正則化,而BatchNormalization是將輸入資料x進行正則化。
Leaky_Relu(yolov3)與mish(yolov4),如下
- 殘差流程
在darknet_body()中,執行5組resblock_body()殘差塊,重複[1, 2, 8, 8, 4]次,雙卷積(1x1和3x3)操作,每組均含有一次步長為2的卷積操作,因而一共降維5次32倍,即32=2^5,則輸出的特徵圖維度是13,即13=416/32。最後1層的通道(filter)數是1024,因此,最終的輸出結構是(?, 13, 13, 1024)。
- 特徵圖
特徵圖
在YOLO v3網路中,輸出3個不同尺度的檢測圖,用於檢測不同大小的物體。呼叫3次make_last_layers(),產生3個檢測圖,即y1、y2和y3。
13x13檢測圖
第1個部分,輸出維度是13x13。在make_last_layers()方法中,輸入引數如下:
- darknet.output:DarkNet網路的輸出,即(?, 13, 13, 1024);
- num_filters:通道個數512,用於生成中間值x,x會傳導至第2個檢測圖;
- out_filters:第1個輸出y1的通道數,值是錨框數*(類別數+4個框值+框置信度);
在make_last_layers()方法中,執行2步操作:
- 第1步,x執行多組1x1的卷積操作和3x3的卷積操作,filter先擴大再恢復,最後與輸入的filter保持不變,仍為512,則x由(?,13, 13, 1024)轉變為(?, 13, 13, 512);
- 第2步,x先執行3x3的卷積操作,再執行不含BN和Leaky的1x1的卷積操作,作用類似於全連線操作,生成預測矩陣y;
26x26檢測圖
第2個部分,輸出維度是26x26,包含以下步驟:
- 通過DarknetConv2D_BN_Leaky卷積,將x由512的通道數,轉換為256的通道數;
- 通過2倍上取樣UpSampling2D,將x由13x13的結構,轉換為26x26的結構;
- 將x與DarkNet的第152層拼接Concatenate,作為第2個尺度特徵圖;
52x52檢測圖
第3部分的輸出結構,52x52,與第2部分類似,如下:
邏輯如下:
- x經過128個filter的卷積,再執行上取樣,輸出為(?, 52, 52, 128);
- darknet.layers[92].output,與152層類似,結構是(?, 52, 52, 256);
- 兩者拼接之後是(?, 52, 52, 384);
- 最後輸入至make_last_layers,生成y3是(?, 52, 52, 18),忽略x的輸出;
- 最後,則是模型的重組,輸入inputs依然保持不變,即(?, 416, 416, 3),而輸出轉換為3個尺度的預測層,即[y1, y2,
y3]。
參考連結:
https://blog.csdn.net/loco1223/article/details/92078816
https://zhuanlan.zhihu.com/p/76802514
https://blog.csdn.net/weixin_47196664/article/details/106536656
人工智慧晶片與自動駕駛