这周接着详细解析小白YOLOv5全流程-训练+实现数字识别_牛大了2022的博客-CSDN博客_yolov5识别数字,上周入门教大家下载配置环境,如果没有的话请参考上一篇的文章深度学习Week12-训练自己的数据集(YOLOv5)_牛大了2022的博客-CSDN博客
YOLOv5配置了4种不同大小的网络模型,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中 YOLOv5s 是网络深度和宽度最小但检测速度最快的模型(之前数字监测就是用yolov5s),其他3种模型都是在YOLOv5s的基础上不断加深、加宽网络使得网络规模扩大,在增强模型检测性能的同时增加了计算资源和速度消耗。出于对检测精度、模型大小、检测速度的综合考量,本文选择YOLOv5s作为研究对象进行介绍。
./models/yolov5s.yaml文件是YOLOv5s网络结构的定义文件,如果你想改进算法的网络结构,需要先修改该文件中的相关参数,然后再修改./models/common.py与./models/yolo.py中的相关代码。
本周任务:将yolov5s网络模型中第4层的C3*2修改为C3*1,第6层的C3*3修改为C3*2。
任务提示:仅需修改./models/yolov5s.yaml文件。
# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
·depth_multiple:控制子模块数量=int(number*depth)(该参数与任务有关)
·width_multiple:控制卷积核的数量=int(number*width)
四种模型的这两者不同。
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初始化了9个anchors,在三个Detect层使用(3个feature map)中使用,每个feature map的每个grid_cell 都有三个anchor进行预测。分配规则:
尺度越大的 feature map 越靠前,相对原图的下采样率越小,感受野越小,所以相对可以预测一些尺度比较小的物体,所有分配到的 anchors 越小;
尺度越小的 feature map 越靠后,相对原图的下采样率越大,感受野越大,所以相对可以预测一些尺度比较大的物体,所有分配到的 anchors 越大。
即可以在小特征图(feature map)上检测大目标,也可以在大特征图上检测小目标。
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
]
这是yolov5s的backbone,可以看到每一个模块算一行,每行都由四个参数构成。分别是:
·from:表示当前模块的输入来自那一层的输出,-1表示来自上一层的输出。
·number:表示当前模块的理论重复次数,实际的重复次数还要由上面的参数depth_multiple共同决定,决定网络模型的深度。
·module:模块类名,通过这个类名去common.py中寻找相应的类,进行模块化的搭建网络。
·args:是一个1ist,模块搭建所需参数,channe1,kernel_size,stride,padding,bias等,会在网络搭建过程中根据不同层进行改变。
# 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)
]
和backbone一样
找到后打开,然后进行修改
改好后之后训练选yolov5s模型就可以了~详情见顶端文章链接。
(运行train.py文件后,将可以在控制台看到网络模型的输出)