yolov5s.yaml中各参数作用意义及使用netron工具来可视化yolov5s的结构

一、yolov5s.yaml中各行(参数)所表示的意义

1.1 depth_multiplewidth_multiple介绍

yolov5s.yaml中,depth_multiplewidth_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里面提到的),源码如下:
yolov5s.yaml中各参数作用意义及使用netron工具来可视化yolov5s的结构
这个其实就是yolov2里面的ReOrg+Conv操作,也是亚像素卷积的反向操作版本,简单来说就是把数据切分为4份,每份数据都是相当于2倍下采样得到的,然后在channel维度进行拼接,最后进行卷积操作;
yolov5s.yaml中各参数作用意义及使用netron工具来可视化yolov5s的结构
其最大好处是可以最大程度的减少信息损失而进行下采样操作;

1.2.2 Focus模块介绍2

作者在特征提取的上层结构中采用了四次slice操作组成了Focus层;
yolov5s.yaml中各参数作用意义及使用netron工具来可视化yolov5s的结构
对于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)

yolov5s.yaml中各参数作用意义及使用netron工具来可视化yolov5s的结构
从上图可以看出,Focus层确实在参数降低的情况下,对模型实现了加速。

但!这个加速是有前提的,必须在GPU的使用下才可以体现这一优势,对于云端部署这种处理方式,GPU不太需要考虑缓存的占用,即取即处理的方式让Focus层在GPU设备上十分work。

对于的芯片,特别是不含GPU、NPU加速的芯片,频繁的slice操作只会让缓存占用严重,加重计算处理的负担。同时,在芯片部署的时候,Focus层的转化对新手极度不友好。

1.3 yolov5s.yaml各参数及对应注释

# parameters
nc: 20  # number of classes
depth_multiple: 0.33  # model depth multiple 控制模型的深度(BottleneckCSP个数)
width_multiple: 0.50  # layer channel multiple 控制Conv通道channel个数(卷积核数量)
# depth_multiple表示BottleneckCSP模块的缩放因子,将所有BottleneckCSP模块的Bottleneck乘上该参数得到最终个数。
# width_multiple表示卷积通道的缩放因子,就是将配置里面的backbone和head部分有关Conv通道的设置,全部乘以该系数。
# 通过这两个参数就可以实现不同复杂度的模型设计。

# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8  wh  stride=8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  # from:表示当前模块的输入来自哪一层的输出,和darknet里面一致,-1表示来自上一层的输出;
  # number:表示本模块重复的次数,1表示只有一个,3表示重复3次,9表示重复9次;
  # module: 模块名称;
  # args: 表示输入参数,比如卷积核个数 卷积核大小 步长stride等;
  [[-1, 1, Focus, [64, 3]],  # 0-P1/2  作者提出了一个新模块Focus(其余模块都是yolov4里面提到的)
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4   128个3x3的卷积核 stride=2
   [-1, 3, C3, [128]],  # CSP Bottleneck with 3 convolutions
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8   156个3x3的卷积核
   [-1, 9, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32  1024个3x3的卷积核
   [-1, 1, SPP, [1024, [5, 9, 13]]],
   [-1, 3, C3, [1024, False]],  # 9
  ]

# YOLOv5 head
# 作者没有区分neck模块,所以head部分包含了PANet+Detect部分
# 由于本份配置其实没有分neck模块,故spp也写在了backbone部分。
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)
  ]

二、使用netron可视化yolov5s的结构

使用netron可视化之前,需注意以下三点:

1、不要直接打开官方给的yolov5s.pt,其中很多细节都是无用的;
2、不要直接用export.pyyolov5s.pt转为onnx文件,其中很多细节是错的;
3、而若使用tensorboard之类的工具打开网络结构,一般都很不直观,不方便直观查看网络结构;

使用netron这个工具,可以直观的看到yolov5s网络每一层的结构;

但是首先需要通过代码生成适用于netron可视化的pt文件,直接使用官网的yolov5s.pt无法看清网络结构;

使用如下代码即可:

import torch
from models.yolo import Model

cfg = "models/yolov5s.yaml"
# Create model
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的网络结构;

三、本文章来源

  1. CSDN满船清梦压星河HK
    博客:模型可视化 netron
  2. 知乎深度眸进击的后浪yolov5深度可视化解析
  3. 知乎poggYOLOv5-Lite:更轻更快易于部署的YOLOv5

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年3月29日
下一篇 2023年3月29日

相关推荐