一、yolov5s.yaml 中各行(参数)所表示的意义
1.1 depth_multiple 和width_multiple 介绍
在yolov5s.yaml 中,depth_multiple 和width_multiple 是非常重要的参数,yolov5相比于yolov4,在模型方面最大的特点是灵活,源于其引入了depth_multiple和width_multiple这两个系数,根据对它们值的大小设定,来得到yolov5 不同大小模型:
yolov5s:
depth_multiple: 0.33
width_multiple: 0.50
yolov5m:
depth_multiple: 0.67
width_multiple: 0.75
yolov5l:
depth_multiple: 1.0
width_multiple: 1.0
depth_multiple表示channel的缩放系数,就是将配置里面的backbone和head部分有关通道的设置,全部乘以该系数即可;
而width_multiple表示BottleneckCSP模块的层缩放系数,将所有的BottleneckCSP模块的number系数乘上该参数就可以最终的层个数;
可以发现通过这两个参数就可以实现不同大小不同复杂度的模型设计,因此yolov5比yolov4更加灵活;
1.2 yolov5中新增的Focus模块介绍
1.2.1 Focus模块介绍1
提出了一个新模块Focus(其余模块都是yolov4里面提到的),源码如下: 这个其实就是yolov2里面的ReOrg+Conv操作,也是亚像素卷积的反向操作版本,简单来说就是把数据切分为4份,每份数据都是相当于2倍下采样得到的,然后在channel维度进行拼接,最后进行卷积操作; 其最大好处是可以最大程度的减少信息损失而进行下采样操作;
1.2.2 Focus模块介绍2
作者在特征提取的上层结构中采用了四次slice操作组成了Focus层; 对于Focus层,在一个正方形中每 4 个相邻像素,并生成一个具有 4 倍通道数的feature map,类似与对上级图层进行了四次下采样操作,再将结果concat到一起,最主要的功能还是在不降低模型特征提取能力的前提下,对模型进行降参和加速;
1.7.0+cu101 cuda _CudaDeviceProperties(name='Tesla T4', major=7, minor=5, total_memory=15079MB, multi_processor_count=40)
Params FLOPS forward (ms) backward (ms) input output
7040 23.07 62.89 87.79 (16, 3, 640, 640) (16, 64, 320, 320)
7040 23.07 15.52 48.69 (16, 3, 640, 640) (16, 64, 320, 320)
1.7.0+cu101 cuda _CudaDeviceProperties(name='Tesla T4', major=7, minor=5, total_memory=15079MB, multi_processor_count=40)
Params FLOPS forward (ms) backward (ms) input output
7040 23.07 11.61 79.72 (16, 3, 640, 640) (16, 64, 320, 320)
7040 23.07 12.54 42.94 (16, 3, 640, 640) (16, 64, 320, 320)
从上图可以看出,Focus层确实在参数降低的情况下,对模型实现了加速。
但!这个加速是有前提的,必须在GPU的使用下才可以体现这一优势,对于云端部署这种处理方式,GPU不太需要考虑缓存的占用,即取即处理的方式让Focus层在GPU设备上十分work。
对于的芯片,特别是不含GPU、NPU加速的芯片,频繁的slice操作只会让缓存占用严重,加重计算处理的负担。同时,在芯片部署的时候,Focus层的转化对新手极度不友好。
1.3 yolov5s.yaml各参数及对应注释
nc: 20
depth_multiple: 0.33
width_multiple: 0.50
anchors:
- [10,13, 16,30, 33,23]
- [30,61, 62,45, 59,119]
- [116,90, 156,198, 373,326]
backbone:
[[-1, 1, Focus, [64, 3]],
[-1, 1, Conv, [128, 3, 2]],
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]],
[-1, 9, C3, [256]],
[-1, 1, Conv, [512, 3, 2]],
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]],
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, C3, [1024, False]],
]
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]],
[-1, 3, C3, [512, False]],
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]],
[-1, 3, C3, [256, False]],
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]],
[-1, 3, C3, [512, False]],
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]],
[-1, 3, C3, [1024, False]],
[[17, 20, 23], 1, Detect, [nc, anchors]],
]
二、使用netron 可视化yolov5s 的结构
使用netron可视化之前,需注意以下三点:
1、不要直接打开官方给的yolov5s.pt ,其中很多细节都是无用的; 2、不要直接用export.py 将yolov5s.pt 转为onnx 文件,其中很多细节是错的; 3、而若使用tensorboard 之类的工具打开网络结构,一般都很不直观,不方便直观查看网络结构;
使用netron 这个工具,可以直观的看到yolov5s 网络每一层的结构;
但是首先需要通过代码生成适用于netron 可视化的pt文件,直接使用官网的yolov5s.pt 无法看清网络结构;
使用如下代码即可:
import torch
from models.yolo import Model
cfg = "models/yolov5s.yaml"
model = Model(cfg).to("cpu")
x = torch.randn(1, 3, 640, 640).to("cpu")
script_model = torch.jit.trace(model, x)
script_model.save("weights/m.pt")
然后再使用netron 软件或者网站打开m.pt 就可以看到yolov5s 的网络结构;
三、本文章来源
- CSDN满船清梦压星河HK
博客:模型可视化 netron - 知乎深度眸:进击的后浪yolov5深度可视化解析
- 知乎pogg:YOLOv5-Lite:更轻更快易于部署的YOLOv5
|