YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读

>- **🍨 本文为[🔗365天深度学习训练营](小团体~第八波) 中的学习记录博客**
>- **🍖 原作者:[K同学啊](K同学啊-优快云博客)**

YOLOv5介绍       

YOLOv5配置了4种不同大小的网络模型,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中YOLOv5s 是网络深度和宽度最小但检测速度最快的模型,其他3种模型都是在 YOLOv5s 的基础上不断加深、加宽网络使得网络规模扩大,在增强模型检测性能的同时增加了计算资源和速度消耗。出于对检测精度、模型大小、检测速度的综合考量,本文选择 YOLOv5s作为研究对象进行介绍。
./models/yolov5s.yaml 文件是YOLOv5s网络结构的定义文件,如果你想改进算法的网络结构,需要先修改该文件中的相关参数,然后再修改./models/common.py与./models/yolo.py 中的相关代码

YOLOv5模型结构介绍    


 C3模块

以下为yaml文件中内容

1、参数配置

# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple

·····depth_multiple:控制子模块数量,=int(numberdepth multiple)(该参数与任务有关)
·····width multiple :控制卷积核的数量,=int(numberwidth multiple)
通过这两个参数就可以实现不同复杂度的模型设计。

YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四种模型的区别仅在于 depth multiple与 width multiple 这个两个参数的不同。

思考:nc 决定了模型的输出类别数量,模型要检测的类别数量如果是4,那80要不要修改为4?

2、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

小 目标 3 组:[10, 13],[16, 30],[33, 23]
中 目标 3 组:[30,61],[62,45],[59,119]
大 目标 3 组:[116,90],[156,198],[373,326]

YOLOv5 初始化了9个anchors,在三个Detect层使用(3个feature map)中使用,每个feature map的每个 grid_cell 都有三个anchor进行预测。分配的规则是:

尺度越大的 feature map 越靠前,相对原图的下采样率越小,感受野越小,所以相对可以预测一些尺度比较小的物体,所有分配到的anchors 越小;
尺度越小的 feature map越靠后,相对原图的下采样率越大,感受野越大,所以相对可以预测一些尺度比较大的物体,所有分配到的 anchors 越大。

即可以在小特征图(feature map)上检测大目标,也可以在大特征图上检测小目标。
YOLOv5 根据工程经验得到了这么3组 anchors,对于很多数据集而言确实挺合适的。但是也不能保证这3组 anchors 就适用于所有的数据集,所有 YOLOv5 还有一个 anchor 进化的策略:使用 k-means 和遗传进化算法,找到与当前数据集最吻合的 anchors。


k-means:对当前数据集中所有的标注信息中的目标框的尺寸做聚类,输出9对anchors的值

3、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, 3, C3, [256]],
    [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
    [-1, 6, C3, [512]],
    [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
    [-1, 3, C3, [1024]],
    [-1, 1, SPPF, [1024, 5]], # 9
  ]

 这是YOLOv5的backbone,可以看到每一个模块算一行,每行都由四个参数构成。分别是:

from:表示当前模块的输入来自那一层的输出,“-1 表示来自上一层的输出,层编号由 8 开始计数。
number:表示当前模块的理论重复次数,实际的重复次数还要由上面的参数 depth_multiple 共同决定,该参数影响整体网络模型的深度,实际的重复次数=number*depth_multiple。
module:模块类名,通过这个类名在 common.py 中寻找相应的类,进行模块化的搭建网络
args:是一个 list,模块搭建所需参数,依次是channel,bkernel_size,stride,padding,bias 等。
4、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的head,数据格式和backbone-样。

5、整体模型
我们是要将yolov5s.yaml网络模型中第4层的C3 * 2修改为C3 * 1,第6层的C3 * 3修改为C3 * 2。

    原来的第4层:[-1, 6, C3, [256]]
    原来的第6层:[-1, 9, C3, [512]]
    (6 * 0.33=2,9* 0.33=3)

因为number*depth_multiple=实际的重复次数,3 * 0.33=1,6 * 0.33=2,所以修改后为:

    修改后的第4层:[-1, 3, C3, [256]]
    修改后的第6层:[-1, 6, C3, [512]]

完整如下:

# 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, 3, C3, [256]],
    [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
    [-1, 6, C3, [512]],
    [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
    [-1, 3, C3, [1024]],
    [-1, 1, SPPF, [1024, 5]], # 9
  ]

打开终端 输入命令运行一定要在专属目录下运行

终端执行(有GPU):python ./train.py --img 900 --batch 16 --epoch 100 --data ./Fruit_test/fruit.yaml --cfg ./models/yolov5s.yaml --weights ./yolov5s.pt --device '0'

 

我们运行 train.py 文件后,将可以在控制台看到网络模型的输出(如下)。将该输出与文章开头给出的 yolo5s网络结构图放在一起看将有助于理

 

6、总结

我上面的对比图显示c3模块减少之后参数量也变小了很多。

第一次自己上手改网络,操作很简单。这只是利用现有模块进行更改数量,更改网络结构,但是并不是更改模块。下周我将更改模块,拥有自己的模块。然后使用。改造自己的网络。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值