代碼基于yolov5 v6.0
目錄:
- yolo源碼注釋1——文件結構
- yolo源碼注釋2——數據集配置文件
- yolo源碼注釋3——模型配置文件
- yolo源碼注釋4——yolo-py
模型配置文件一般放在 models
文件夾下的 XXX.yaml
文件中,以 yolov5s.yaml
為例:
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80 # 類別個數,一定要與使用的數據集保持一致depth_multiple: 0.33 # 深度倍數,對數量大于1個模塊進行數量控制,具體看 yolo.py 中的 parse_model 函數
width_multiple: 0.50 # 寬度倍數,卷積操作中控制卷積核數量,具體看 yolo.py 中的 parse_model 函數# 檢測框的大小
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 檢測大目標的三個檢測框尺寸
# 1. P3 代表淺層的特征圖,淺層的特征圖較大包含更多的小目標
# 2. P5 代表深層的特則圖,深層的特征圖較小包含更多的大目標
# 3. YOLOv5 根據工程經驗得到了這3組anchors,可以用于大多數數據集
# 4. 在源代碼中是針對 coco 數據集使用 K++ 算法求解出的大、中、小三種大小檢測框
# 5. 如果需要修改檢測框大小,建議也是用 K++ 算法進行求解# YOLOv5 v6.0 backbone
# 主干網絡使用的模塊,用于特征提取,可以替換為其他特征提取網絡
# 由于沒有分neck模塊,故spp寫在了backbone部分
backbone:# 模塊格式如下:[from, number, module, args]# form: 當前的輸入來自哪一層的輸出, -1 表示上一層# number: 當前模塊的理論重復次數,當該值大于 1 時,與 depth_multiple 共同決定實際重復次數# module: 模塊名字,通過這個類名去 common.py 中尋找相應的類,進行模塊化的搭建網絡# args: 搭建模塊需要的參數,具體看 common.py 中對應的類的要求[ [ -1, 1, Conv, [ 64, 6, 2, 2 ] ], # 0-P1/2,模塊編號為0[ -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,模塊編號為0]# YOLOv5 v6.0 head
# 參數解釋同backbone
# 沒有區分neck模塊,所以head部分包含了PANet+Detect部分
head:[ [ -1, 1, Conv, [ 512, 1, 1 ] ],[ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],[ [ -1, 6 ], 1, Concat, [ 1 ] ], # cat backbone 接受兩層的輸出作為輸入:[ -1, 6 ] 表示上一層以及編號為 6 的層[ -1, 3, C3, [ 512, False ] ], # 13,模塊編號為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, 15 ], 1, Concat, [ 1 ] ], # cat head P4[ -1, 3, C3, [ 512, False ] ], # 20 (P4/16-medium)[ -1, 1, Conv, [ 512, 3, 2 ] ],[ [ -1, 11 ], 1, Concat, [ 1 ] ], # cat head P5[ -1, 3, C3, [ 1024, False ] ], # 23 (P5/32-large)[ [ 18, 21, 24 ], 1, Detect, [ nc, anchors ] ], # Detect(P3, P4, P5)]