YOLOV5网络结构
YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,且注释更全
github: https://github.com/Laughing-q/yolov5_annotations
YOLOV5网络结构
- 粗略图
- yolov5-1.0~4.0
- yolov5-5.0
- 详细图
- yolov5-3.0
- yolov5-4.0
- yolov5-5.0
github代码地址: ultralytics\yolov5,v5还在开发当中,目前的网络结构如下图,要是网络结构有更新,笔者也会更新结构图。
2020.7.24:
才画出这个图,作者就更新了v2.0版本,改了网络结构。。。。
所以以下的结构图只适用于yolov5_v1.0版本。
之后笔者再更新v2.0版本的结构图。
2020.7.28:
笔者今天仔细看了一下新的结构yaml配置文件,发现其实网络结构没有变(之前笔者只是大概的看了一下github上的commit记录,看到很多删除和添加,就以为改动很大。。。),他只是把下图中neck部分的第一个BottleneckCSP (1024,1024) x3纳入到了backbone里,然后把output中的卷积Conv2d放到了models/yolo.py/Detect()类里计算,如果更新结构图的话也只是把neck最下面的BottleneckCSP块移到SPP块的下面,所以就暂时不更新结构图了,以下结构图依然适用。
v2.0版本yolov5x mAP有提升,但yolov5s mAP却下降了,目前主要的改变是:训练策略的改变,包括余弦退火的公式更新了,以及类别损失cls_loss的系数gain,对数据进行仿射变换(dataset.py数据增强部分)的超参数进行调整,三个output的损失比重balance的调整。
2020.8.15
yolov5更新了v3.0版本
主要做出的变化是,采用了hardswish激活函数替换CONV(下图右下角模块)模块的LeakyReLu,但是注意:BottleneckCSP模块中的LeakyReLu未被替换,采用了CIOU作为损失函数(但这个更新好像是还在v2.0版本过渡的时候已经更新),还更改了一个默认超参数:translate=0.5 → 0.1(数据增强的仿射系数)。
2020.8.16
结构图已更新,将上述2020.7.28提到的的BottleneckCSP模块纳入到backbone中,并更新CONV模块的激活函数hardswish.
2020.12.25
有读者发现网络结构图有些细节画错了,BottleneckCSP处最后应该是CONV模块,SPP模块concat通道应该是(c_in*2),已更新。
2021.01.06
更新yolov5-4.0网络结构,C3结构替换BottleneckCSP。CONV的激活函数换成SiLU,目前发现的其他改变是三个output的损失比重balance的调整balance = [4.0, 1.0, 0.4] → [4.0, 1.0, 0.3]
2021.04.25
更新yolov5-5.0网络结构,增加一层通道数768的特征图 level,spp模块中的池化由[5,9,13]→[3,5,7]。
(直接照着新的yolov5l6.yaml画的,如果有错请指正,谢谢)
下图括号中四个数字代表:(输入通道、输出通道、卷积核大小、步长);
两个数字代表:(输入通道、输出通道);
一个数字代表:(输出通道);
且上采样是采用nearst插值,两倍上采样;
x N表示堆叠此模块N次。
粗略图
yolov5-1.0~4.0
yolov5-5.0
详细图
yolov5-3.0
v2.0和v1.0就是把下图中CONV模块中hardswish换成leakyrelu即可
yolov5-3.0网络结构图
yolov5-4.0
yolov5-4.0网络结构图
yolov5-5.0
yolov5-5.0网络结构图
至于Focus的部分附上代码帮助理解:
def forward(self, x): # x(b,c,w,h) -> y(b,4c,w/2,h/2)return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
注意:backbone最后一个BottleneckCSP(C3)和neck部分开始的BottleneckCSP(C3)模块便不再使用shortcut残差连接,对应下面配置文件里的False(意为shortcut=False)。
附上yolov5l的配置文件:
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple# anchors
anchors:- [116,90, 156,198, 373,326] # P5/32- [30,61, 62,45, 59,119] # P4/16- [10,13, 16,30, 33,23] # P3/8# YOLOv5 backbone
backbone:# [from, number, module, args][[-1, 1, Focus, [64, 3]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, BottleneckCSP, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 9, BottleneckCSP, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, BottleneckCSP, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 1, SPP, [1024, [5, 9, 13]]],]# YOLOv5 head
head:[[-1, 3, BottleneckCSP, [1024, False]], # 9[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, BottleneckCSP, [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, BottleneckCSP, [256, False]],[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]], # 18 (P3/8-small)[-2, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, BottleneckCSP, [512, False]],[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]], # 22 (P4/16-medium)[-2, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, BottleneckCSP, [1024, False]],[-1, 1, nn.Conv2d, [na * (nc + 5), 1, 1]], # 26 (P5/32-large)[[], 1, Detect, [nc, anchors]], # Detect(P5, P4, P3)]
附上v2.0和v3.0版本的配置文件:
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple# anchors
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 backbone
backbone:# [from, number, module, args][[-1, 1, Focus, [64, 3]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, BottleneckCSP, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 9, BottleneckCSP, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, BottleneckCSP, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 1, SPP, [1024, [5, 9, 13]]],[-1, 3, BottleneckCSP, [1024, False]], # 9]# YOLOv5 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, BottleneckCSP, [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, BottleneckCSP, [256, False]], # 17[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, BottleneckCSP, [512, False]], # 20[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, BottleneckCSP, [1024, False]], # 23[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
v4.0
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple# anchors
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 backbone
backbone:# [from, number, module, args][[-1, 1, Focus, [64, 3]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-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[-1, 1, SPP, [1024, [5, 9, 13]]],[-1, 3, C3, [1024, False]], # 9]# YOLOv5 head
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)]
v5.0
# parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple# anchors
anchors:- [ 19,27, 44,40, 38,94 ] # P3/8- [ 96,68, 86,152, 180,137 ] # P4/16- [ 140,301, 303,264, 238,542 ] # P5/32- [ 436,615, 739,380, 925,792 ] # P6/64# YOLOv5 backbone
backbone:# [from, number, module, args][ [ -1, 1, Focus, [ 64, 3 ] ], # 0-P1/2[ -1, 1, Conv, [ 128, 3, 2 ] ], # 1-P2/4[ -1, 3, C3, [ 128 ] ],[ -1, 1, Conv, [ 256, 3, 2 ] ], # 3-P3/8[ -1, 9, C3, [ 256 ] ],[ -1, 1, Conv, [ 512, 3, 2 ] ], # 5-P4/16[ -1, 9, C3, [ 512 ] ],[ -1, 1, Conv, [ 768, 3, 2 ] ], # 7-P5/32[ -1, 3, C3, [ 768 ] ],[ -1, 1, Conv, [ 1024, 3, 2 ] ], # 9-P6/64[ -1, 1, SPP, [ 1024, [ 3, 5, 7 ] ] ],[ -1, 3, C3, [ 1024, False ] ], # 11]# YOLOv5 head
head:[ [ -1, 1, Conv, [ 768, 1, 1 ] ],[ -1, 1, nn.Upsample, [ None, 2, 'nearest' ] ],[ [ -1, 8 ], 1, Concat, [ 1 ] ], # cat backbone P5[ -1, 3, C3, [ 768, False ] ], # 15[ -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 ] ], # 19[ -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 ] ], # 23 (P3/8-small)[ -1, 1, Conv, [ 256, 3, 2 ] ],[ [ -1, 20 ], 1, Concat, [ 1 ] ], # cat head P4[ -1, 3, C3, [ 512, False ] ], # 26 (P4/16-medium)[ -1, 1, Conv, [ 512, 3, 2 ] ],[ [ -1, 16 ], 1, Concat, [ 1 ] ], # cat head P5[ -1, 3, C3, [ 768, False ] ], # 29 (P5/32-large)[ -1, 1, Conv, [ 768, 3, 2 ] ],[ [ -1, 12 ], 1, Concat, [ 1 ] ], # cat head P6[ -1, 3, C3, [ 1024, False ] ], # 32 (P6/64-xlarge)[ [ 23, 26, 29, 32 ], 1, Detect, [ nc, anchors ] ], # Detect(P3, P4, P5, P6)]
YOLOV5网络结构相关推荐
- YOLOV5网络结构各个模块延伸
文章目录 1. 整体网络结构 YOLOV3 YOLOV4 YOLOV5 2. 模块 2.1 SPP (Spatial Pyramid Pooling) 1. 整体网络结构 摘自 https://zhu ...
- pytorch 研究修改YOLOV5网络结构(记录)
pytorch 和 paddle 差不多,但是 pytorch 国际使用,应用范围广.paddle 更加适用与公司应用开发,非常容易上手,便于应用,但是不太适合研究(研究者很少使用). git提供的都 ...
- 干货 | 当 YOLOv5 遇见 OpenVINO,实现自动检测佩戴口罩
YOLOv5网络 YOLOv5代码链接: https://github.com/ultralytics/yolov5 YOLOv5 于2020年6月横空出世!一经推出,便得到CV圈的瞩目,目前在各大目 ...
- 干货|深入浅出YOLOv5
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|机器学习算法工程师 之前已经对Yolov4的相关基础知识做 ...
- 当YOLOv5遇见OpenVINO
1YOLOv5网络 YOLOv5 于2020年6月发布!一经推出,便得到CV圈的瞩目,目前在各大目标检测竞赛.落地实战项目中得到广泛应用. YOLOv5在COCO上的性能表现: YOLOv5代码链接: ...
- 【深度学习】当YOLOv5遇见OpenVINO!
一.YOLOv5网络 YOLOv5代码链接:https://github.com/ultralytics/yolov5 YOLOv5 于2020年6月发布!一经推出,便得到CV圈的瞩目,目前在各大目标 ...
- 吸烟行为检测系统(Python+YOLOv5深度学习模型+清新界面)
摘要:吸烟行为检测软件用于日常场景下吸烟行为监测,快速准确识别和定位吸烟位置.记录并显示检测结果,辅助公共场所吸烟安全报警等.本文详细介绍吸烟行为检测系统,在介绍算法原理的同时,给出Python的实现 ...
- 当YOLOv5遇见OpenVINO!
一.YOLOv5网络 YOLOv5代码链接:https://github.com/ultralytics/yolov5 YOLOv5 于2020年6月发布!一经推出,便得到CV圈的瞩目,目前在各大目标 ...
- 基于YOLOv5的中式快餐店菜品识别系统
基于YOLOv5的中式快餐店菜品识别系统[金鹰物联智慧食堂项目] 摘要 本文基于YOLOv5v6.1提出了一套适用于中式快餐店的菜品识别自助支付系统,综述了食品识别领域的发展现状,简要介绍了YOLOv ...
- (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
目标检测算法之YOLOv5计算预选框.详解anchor计算 单节段目标检测算法中:预选框的设定直接影响最终的检测精度 众所周知,yolov5中采用自适应调整预选框anchor的大小,但万事开头难,配置 ...
最新文章
- mysql查看历史连接数_MySQL如何查看连接数和连接状态
- windows批处理的感叹号和变量延迟扩展
- flex使用FlexPrintJob打印问题
- Celex Update CodeForces - 1358C(打表找规律)
- Mysql5.7.20使用group by查询(select *)时出现错误--修改sql mode
- P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案
- ASP.NET企业开发框架IsLine FrameWork系列之七--AppLogProvider日志框架(上)
- 大数据技术在发展 挑战与机遇并存
- 美妆类短视频如何定位?可以考虑三个方向,吸粉引流指日可待
- Linux批量修改文件名称
- mpu6050 z轴校准_MPU6050校准
- 封装60秒倒计时vue组件
- 计算机目录的制作步骤,怎么用word2003制作目录
- java rgb yuv_RGB,CMY(K),YUV,YIQ,YCbCr顏色的轉換算法(java實現)
- 智力测验题(面试用)
- 最小生成树问题:算法分析 Java 实现
- 日语语法(二):名词
- HC32L130基于Xmodem协议实现IAP串口在线升级
- 适合学生党的蓝牙耳机选哪个?学生党最爱的几款蓝牙耳机
- elementui表格获取mysql数据_vue+element-ui表格封装tag使用slot插槽标签
热门文章
- 【seaborn】sns.set() 绘图风格设置
- 【VirtualBoxUbuntu】VirtualBox中Ubuntu虚拟机磁盘碎片整理并压缩磁盘空间
- [NOI 2010]航空管制
- mysql 联合主键的作用
- 惠普电脑u盘重装系统步骤_惠普笔记本系统重装|惠普笔记本电脑U盘重装系统步骤教程...
- 数字化教学资源平台html,数字化教学资源
- spring boot + Spring Security 入门
- Technorati 2008 年度博客状况报告(第一部分)
- 脑机接口:互联网遥远的疆界
- HTMLCSS精华知识点——基础标签