YOLOV5源码解读-export.py网络结构、配置文件

摘要:
yolov5的默认模型文件格式为“.pt”。使用上述可视化工具时,您需要使用yolov5提供的代码将模型转换为“.ttorchscript.pt”格式,然后就可以完全可视化网络结构。最后,在网络的最后一层,三个卷积输出三个尺度特征图,输出维度为na*,na=3,表示三个先前帧,nc=80,表示80个类别,然后是1×1。卷积和步幅。

YOLOV5源码解读-export.py网络结构、配置文件第1张

 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已经在下图红色数字标注

YOLOV5源码解读-export.py网络结构、配置文件第2张

 reference:https://blog.csdn.net/mary_0830/article/details/107124459

免责声明:文章转载自《YOLOV5源码解读-export.py网络结构、配置文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mongoRepository mongoTemplateWindowBlinds基础使用教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

修改Java标准库源码

以下是摘抄,实际操作没有测试 先前我曾提到,原本想借由“改动Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Class object(而是由class loader负责生成),因此“在ctor中打印出某种信息”的企图也就失去了意义。 这里我要谈点题外话:如何修改Java标准库...

jdk/java版本与Android源码编译中的错误

错误一:javap未指向有效的java版本 Traceback (most recent call last): File "../../base/android/jni_generator/jni_generator.py", line 1065, in <module> sys.exit(main(sys.argv)) Fi...

从微信SDK看ProtoBuffer文件的生成

前言 Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。它支持多种语言,比如C++,Java,C#,Python,JavaScript等等。目前它的最新版本是3.0.0。与...

源码分析:若依用户 user_id查询返回除了用户表,为何还带有部门dept和角色role表呢

 通过认真分析SysUser.java 部份源码如下, private SysDept dept; 以下是toString(){ .append("dept", getDept()) .append("roles", getRoles()) } package com.ruoyi.common.core.domain.entity; imp...

【spring】spring源码阅读之xml读取、bean注入(BeanFactory)

前言   此源码其实是在4月中旬就看了,而且当初也写了一份word文档,但不打算直接把word发上来。还是跟着以前的笔记、跟踪代码边看边写吧。   其实当初看源码的理由很简单,1、才进新公司,比较有空闲。2、面试老是问spring的问题,我理论又不好,所以想看下。   但现在,我重新看的目的其实不在于其实现原理,而是想学习和写出好的编码风格。(当初大概花了...

理解Android编译命令(转)

一、引言 关于Android Build系统,这个话题很早就打算整理下,迟迟没有下笔,决定跟大家分享下。先看下面几条指令,相信编译过Android源码的人都再熟悉不过的。 source setenv.sh lunch make -j12 记得最初刚接触Android时,同事告诉我用上面的指令就可以编译Android源码,指令虽短但过几天就记不全或者忘记...