yolov5默认模型文件格式为:".pt",使用上述可视化工具的时候,需要利用yolov5给的代码(export.py),将模型转为".torchscript.pt"格式,然后就可以完整地可视化网络结构了。
yolo5s四个针对coco数据集的预训练模型下载地址:
# Download latest models from https://github.com/ultralytics/yolov5/releases
下载好模型之后,我们在控制台激活虚拟环境,开始转换模型,使用如下指令:
(yolov5) D:yolov5yolov5-master>python models/export.py --weights ./weights/yolov5x.pt --img 640 --batch 1
我这里在网页版netron加载、可视化模型文件;
网页版netron:https://netron.app/
二、models/yolov5s.yaml网络配置文件讲解
在四个yaml文件中,5s 5m 5l 5x 也就下面网络的深度、宽度两个参数不同,其他一样的,你可以对比结构图。
1 # parameters 2 nc: 80 # number of classes 6 7 # eg:下面backbone中的模块:[-1, 9, C3, [512]] 8 # 重复9次,在yolo5s中,0.33 * 9 = 3,表示仅重复三次,表示backbone、head中bottleNeck(csp残差组件)重复次数 9 depth_multiple: 0.33 # model depth multiple 10 11 # width_multiple:卷积核个数,也就决定了当前层featuremap输出channels维度 12 # eg:[-1, 1, Focus, [64, 3]],中的64表示经过该模块后 13 # 得到64个特征图,但是由于这里网络宽度设置为0.5,所以 14 # 输出应该是0.5 * 64 = 32个特征图 15 width_multiple: 0.50 # layer channel multiple 16 17 # anchors 先验框,和V3一样 18 anchors: 19 - [10,13, 16,30, 33,23] # P3/8 # 负责大特征图(感受野小)上检测小目标 20 - [30,61, 62,45, 59,119] # P4/16 21 - [116,90, 156,198, 373,326] # P5/32 # 负责小特征图(感受野大)上检测大目标 22 23 # YOLOv5 backbone 24 backbone: 25 # [from, number, module, args] # 下面参数格式 26 # from:当前层输入来自哪里,例如:-1:连接上一层;6:表示第6层输入 27 # number:模块重复次数,例如:32行C3表示CSP残差组件,它默认重复9次,和上面深度参数相乘,得到5s版本模型 28 # module:模型名字 29 # args:模型参数,eg:卷积核尺寸 30 [[-1, 1, Focus, [64, 3]], # 0-P1/2 31 [-1, 1, Conv, [128, 3, 2]], # 1-P2/4 32 [-1, 3, C3, [128]], # bottleneckCSP:CSP残差组件,bottleneck表示残差组件 33 [-1, 1, Conv, [256, 3, 2]], # 3-P3/8 34 [-1, 9, C3, [256]], 35 [-1, 1, Conv, [512, 3, 2]], # 5-P4/16 36 [-1, 9, C3, [512]], 37 [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
# 5、9、13表示MaxPooling时候的三种情况,即:划分的网格 38 [-1, 1, SPP, [1024, [5, 9, 13]]], # 5、9、13表示SPP层中在多大区域进行maxPooling,eg:5表示在5×5区域找出最大值 39 [-1, 3, C3, [1024, False]], # 9 40 ] 41 42 # YOLOv5 head 43 head: 44 [[-1, 1, Conv, [512, 1, 1]], 45 [-1, 1, nn.Upsample, [None, 2, 'nearest']], # 上采样 46 [[-1, 6], 1, Concat, [1]], # cat backbone P4 ,这里的P4就是上述backbone中的P4,信息传递 47 [-1, 3, C3, [512, False]], # 13 48 49 [-1, 1, Conv, [256, 1, 1]], 50 [-1, 1, nn.Upsample, [None, 2, 'nearest']], 51 [[-1, 4], 1, Concat, [1]], # cat backbone P3,同理和backbone中的P3模块进行拼接 52 [-1, 3, C3, [256, False]], # 17 (P3/8-small) 53 54 [-1, 1, Conv, [256, 3, 2]], 55 [[-1, 14], 1, Concat, [1]], # cat head P4 56 [-1, 3, C3, [512, False]], # 20 (P4/16-medium) 57 58 [-1, 1, Conv, [512, 3, 2]], 59 [[-1, 10], 1, Concat, [1]], # cat head P5 60 [-1, 3, C3, [1024, False]], # 23 (P5/32-large) 61 62 [[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) # 17 20 23层在下图已经标注 63 ]
上述红色256、512、1024表示PANet不同尺度下特征图输入维度,如下图左边三个蓝色圈标注所示,不要误解为右边三个蓝色圈。最终,网络最后一层,三个卷积输出三个尺度特征图,输出维度都是na*(nc + 5),na = 3,表示三个先验框,nc = 80,表示80个类别,后面是1×1卷积、stride。
上面四个concat已经在下图红色数字标注
reference:https://blog.csdn.net/mary_0830/article/details/107124459