- ??🍨?本文為🔗365天深度學習訓練營中的學習記錄博客
- 🍖?原作者:K同學啊
yolov5s.yaml源文件
yolov5s.yaml
源文件的代碼如下
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 20 #80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
可以看到大致分為這四個部分:? ??Parameters,
anchor,
backbone,
head
Parameters
這一部分是yolov5s.yaml,
yolov5m.yaml,
yolov5l.yaml,
yolov5x.yaml
幾個文件之間主要的不同點,有不同的寬度與深度。
nc: 20 #80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
nc:分類的數量,根據你自己訓練的數據集當中的數量進行修改
depth__multiple:控制子模塊的數量
width_multiple:控制卷積核的數量
在Yolov5中,網絡的不斷加深,也在不斷增加網絡特征提取和特征融合的能力。
anchors
這里是anchors,原譯為拋錨,這里是因為yolov5增加了自適應錨定框(Auto Learning Bounding Box Anchors)
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32
anchor一共有三行,分別在圖片當中大,中,小的目標進行計算,
- 第一行在最大特征圖上,小數值檢測大目標
- 第二行在圖片第二大的特征圖上
- 第三行在最小的特征圖上,大數值檢測小目標
anchor每一行都是六個數,這與寬高并沒有聯系,這主要來自于anchor的生成原理
- yolov5 初始化了 9 個 anchors,在三個 Detect 層使用(3個feature map)中使用,每個 feature map 的每個 grid cell 都有三個 anchor 進行預測
對于輸出層(Prediction),經過特征提取和計算操作的時候,會生成不同特定大小的特征608/8=76,608/16=38,608/32=19
- 以上的數據都是依靠作者的經驗得到的三組anchors,這對于大部分的數據已經使用,但是為了精進,yolov5的代碼提供了k-means和遺傳算法計算符合當前數據集最合適的anchors,可以在autoanchor.py當中進行查看
?
Backbone
# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]
參數解釋
- from:表示當前模塊的來源取自于哪一層的輸出,比如-1表示取自上一層的輸出
- number:表示當前選擇的模塊需要重復的次數,比如3就是要重復3次,但這只是理論上的重復次數,具體還要看depth_multiple共同決定網絡模型的深度
- module:模塊類名,根據給到的類名到common.py當中尋找相應的類進行模塊化的搭建網絡
- args:是一個list,模塊搭建所需要的參數,channel(通道數),bias(偏差,殘差)等
- Focus:對特征圖進行切片操作,[64,3]得到[3,32,3],即輸入channel=3(RGB),輸出為64*0.50(width_multiple)=32,3為卷積核尺寸
- Conv:nn.conv(kenel_size=1,stride=1,groups=1,bias=False)+Bn+Leaky_ReLu.[-1, 1, Conv, [128, 3, 2]]具體主要含義是指輸入來自上一層,模塊數量(number)為1個,子模塊為Conv,網絡中最終有128*0.5=32個卷積核,卷積核尺寸為3,stride=2。
- BottleNeckCSP:借鑒CSPNet網絡結構,由3個卷積層和X個殘差模塊Concat組成,若有False,則沒有殘差模塊,那么組成結構為nn.conv+Bn+Leaky_ReLu
- SPP:[-1, 1, SPP, [1024, [5, 9, 13]]]表示5×5,9×9,13×13的最大池化方式,進行多尺度融合
Head
# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
總結
學習了YOLOv5s.yaml文件,基本了解了每個部分的內容和每一塊代碼的意義。