网络可视化工具:netron
在线版本:https://lutzroeder.github.io/netron/
netron 对 pt 格式的权重文件兼容性不好,直接使用 netron 工具打开,无法显示整个网络。
可使用YOLOv5代码中models/export.py脚本将pt权重文件转换为onnx格式,再用netron工具打开,就可以看到YOLOv5网络的整体架构。
# 导出onnx文件 pip install onnx>=1.7.1 -i https://pypi.tuna.tsinghua.edu.cn/simple # for ONNX export pip install coremltools==4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # for CoreML export python models/export.py --weights weights/yolov5s.pt --img 640 --batch 1
yolov5s.yaml 解析(YOLOv5 的配置文件)
nc: 80 # number of classes, 数据集上的类别数
# 以下两个参数为缩放因子, 通过这两个参数就可以实现不同复杂度的模型设计
depth_multiple: 0.33 # model depth multiple, 控制网络深度(即控制 BottleneckCSP 的数目)
width_multiple: 0.50 # layer channel multiple, 控制网络宽度, 控制 Conv 通道个数(卷积核数量)
# depth_multiple 表示 BottleneckCSP 模块层的缩放因子,将所有的 BottleneckCSP 模块的 Bottleneck 乘上该参数得到最终个数。控制子模块数量=int(number*depth)
# width_multiple 表示卷积通道的缩放因子,就是将配置里面的 backbone 和 head 部分有关 Conv 通道的设置,全部乘以该系数。控制卷积核的数量=int(number*width)
以上三个参数,会用于模型搭建 yolo.py 文件中
# 读取 yaml 中的 anchors 和 parameters anchors, nc, gd, gw = d['anchors'], d['nc'], d['depth_multiple'], d['width_multiple']
通过深度参数 depth gain, 在搭建每层时, 实际深度 = 理论深度(每一层的参数n)* depth_multiple,起到动态调整模型深度的作用
n = max(round(n * gd), 1) if n > 1 else n # depth gain
在模型中间层的每一层的实际输出 channel = 理论channel(每一层的参数c2)* width_multiple,起到动态调整模型宽度的作用。
# 控制宽度(卷积核个数)的代码 c2 = make_divisible(c2 * gw, 8) if c2 != no else c2
# anchors 先验框的配置
anchors:
# 三个不同尺度的先验框
- [10,13, 16,30, 33,23] # P3/8 检测小目标,第一个先验框宽为10,高为13
- [30,61, 62,45, 59,119] # P4/16 检测中目标,P4即stride=16(经过了16倍的下采样以后尺度上的anchor的大小)
- [116,90, 156,198, 373,326] # P5/32 检测大目标,对应原图上 anchor 的大小也是最大的
yolov5 初始化了 9 个 anchors,在三个 Detect