深度学习训练营Y3之yolov5s.yaml解析

深度学习训练营

  • 原文链接
  • yolov5s.yaml源文件
  • Parameters
  • anchors
  • Backbone
    • 参数解释
  • Head
  • 参考内容

原文链接

  • 本文为365天深度学习训练营 中的学习记录博客
  • 参考文章:365天深度学习训练营-第P1周:实现mnist手写数字识别
  • 原作者: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)
  ]

head的主要内容是三个Dectect检测器(需要注意的是前两部分放在一起,不能分开来看),就是利用基于网络的anchor在不同大小的特征图上进行目标检测

参考内容

YOLOv5.yaml文件 & 超参详细介绍

你可能感兴趣的:(深度学习,深度学习,YOLO,python)