QQ交流群:993965802

本文版权属于GiantPandaCV,未经允许请勿转载

这一次的实验主要借鉴repvgg重参化的思想,将原有的3×3conv替换成Repvgg Block,为原有的YOLO模型涨点。

前言: 之前做了一次shufflenetv2与yolov5的组合,目的是为了适配arm系列芯片,让yolov5在端侧设备上也能达到实时。但在gpu或者npu方面也一直在尝试着实验,对此类实验的目的很明确,要求也不高,主要还是希望yolov5在保持原有精度的同时能够提速。

实验

这一次的模型主要还是借鉴repvgg重参化的思想,将原有的3×3conv替换成repvgg block,在训练过程中,使用的是一个多分支模型,而在部署和推理的时候,用的是多分支转化为单路的模型。

类比repvgg在论文中阐述的观点,这里的baseline选定的是yolov5s,对yolov5s的3×3conv进行重构,分出一条1×1conv的旁支。

在推理时,将旁支融合到3×3的卷积中,此时的模型和原先的yolov5s模型无二致

在次之前,采用的是最直接的方式对yolov5s进行魔改,也就是直接替换backbone的方式,但发现参数量和FLOPs较高,复现精度最接近yolov5s的是repvgg-A1,如下backbone替换为A1的yolov5s:

而后,为了抑制Flops和参数的增加,采取使用repvgg block替换yolov5s的3×3conv的方式。

两者之间相差的Flops比和参数比约为2.75和1.85.

性能

通过消融实验,得出的yolov5s和融合repvgg block的yolov5s性能差异如下:

这里评估的yolov5s在map指标上和官网有所出入,测试两次后均为55.8和35.8,不过这个测试结果和https://github.com/midasklr/yolov5prune 以及Issue #3168 · ultralytics/yolov5大致相同。使用repvgg block重构yolov5s的3×3卷积,在map@0.5和@.5:.95指标上均能至少提升一个点。

训练结束后的repyolov5s需要进行convert,将旁支的1×1conv进行融合,否则在推理时会比原yolov5s慢20%。

使用convert.py对repvgg block进行重参化,主要代码如下,参考https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py:

# --------------------------repvgg refuse---------------------------------def reparam conv(self):  # fuse model Conv2d() + BatchNorm2d() layers""":param rbr_dense: 3×3卷积模块:param rbr_1x1: 1×1旁支inception:param _pad_1x1_to_3x3_tensor: 对1×1的inception进行扩充:return:"""print('Reparam and Fusing Block... ')for m in self.model.modules():# print(m)if type(m) is RepVGGBlock:if hasattr(m, 'rbr_1x1'):# print(m)kernel, bias = m.get_equivalent_kernel_bias()conv_reparam = nn.Conv2d(in_channels=m.rbr_dense.conv.in_channels,out_channels=m.rbr_dense.conv.out_channels,kernel_size=m.rbr_dense.conv.kernel_size,stride=m.rbr_dense.conv.stride,padding=m.rbr_dense.conv.padding, dilation=m.rbr_dense.conv.dilation,groups=m.rbr_dense.conv.groups, bias=True)conv_reparam.weight.data = kernelconv_reparam.bias.data = biasfor para in self.parameters():para.detach_()m.rbr_dense = conv_reparam# m.__delattr__('rbr_dense')m.__delattr__('rbr_1x1')m.deploy = Truem.forward = m.fusevggforward  # update forwardcontinue# print(m)if type(m) is Conv and hasattr(m, 'bn'):# print(m)m.conv = fuse_conv_and_bn(m.conv, m.bn)  # update convdelattr(m, 'bn')  # remove batchnormm.forward = m.fuseforward  # update forwardself.info()return self

我们可以通过调用onnx模型对convert前后的模型进行可视化:

推理

map指标只是参考的一部分,还有一部分是关于reparam和fuse后的yolov5s会不会因为repvgg block的植入而变慢。在理论上,reparam后的repvgg block等价于3×3卷积,不过该卷积因为融合比普通3×3卷积更加紧凑。

在测试三次coco val2017数据集后(5000张并进行单张推理),得出repyolov5s的单张推测时间为14/14/14(ms)、yolov5s为16/16/16(ms),这里和白神讨论了一下,白神认为两者极度接近的推理时间可能存在着测试误差,无任何说服性。

不过可以肯定的是convert后的yolov5s推理速度不会因为repvgg block植入而变慢。为了避免偶然性和测算误差,这里使用了500/5000/64115/118287张图片进行了推理测试:

测试后的结果如下:

测试

检测效果应该也是大家关心的一个指标,使用以上两个模型,保证其他参数均一致,对图片进行检测,效果如下:

总结

使用repvgg block对yolov5s进行改进,通过消融实验,总结出以下几点:

  • 融合repvgg block的yolov5s在大小尺度目标上均能涨点; 使用融合repvgg
  • block和leakyrelu的yolov5s比原yolov5s在map上降低了0.5个百分点,但是速度可以提升15%(主要是替换了Silu函数起的作用);
  • 如果不做convert,个人感觉这个融合实验毫无意义,旁生的支路会严重影响模型的运行速度;
  • C3 Block和Repvgg Block在cpu上使用性价比低,在gpu和npu上使用才能带来最大增益
  • 使用重参化的yolov5是有代价的,代价损耗均在训练方面,会多占用显卡大约5-10%的显存,训练时间也会增多
  • 可以考虑使用repvgg block对yolov3-spp和yolov4的3×3卷积进行重构

代码和预训练模型后续会放到本人仓库上:

https://github.com/ppogg/YOLOv5-Lite

YOLOv5-Lite:Repvgg重参化对YOLO工业落地的实验和思考相关推荐

  1. 追求极致:Repvgg重参数化对YOLO工业落地的实验和思考

    本文作者主要借鉴repvgg重参化的思想,将原有的3×3conv替换成Repvgg Block,为原有的YOLO模型涨点. 前言: 之前做了一次shufflenetv2与yolov5的组合,目的是为了 ...

  2. RepVGG网络中重参化网络结构解读【附代码】

    YOLOv7论文中会遇到一个词叫"重参化网络"或者"重参化卷积",YOLOV7则是用到了这种网络结构,里面参考的论文是"RepVGG: Making ...

  3. YOLOv5/v7 引入 RepVGG 重参数化模块

    本篇博文代码出自YOLOv5-lite ,YOLOv5-lite的作者在CSDN的账号是 pogg_ ,大家可以关注一下,这也是一位在开源项目上做了很多工作的博主. RepVGG的原理和融合推导过程可 ...

  4. 剪枝与重参第七课:YOLOv8剪枝

    目录 YOLOv8剪枝 前言 1.Overview 2.Pretrain(option) 3.Constrained Training 4.Prune 4.1 检查BN层的bias 4.2 设置阈值和 ...

  5. 剪枝与重参第二课:修剪方法和稀疏训练

    目录 修剪方法和稀疏训练 前言 1.修剪方法 1.1 经典框架:训练-剪枝-微调 1.2 训练时剪枝(rewind) 1.3 removing剪枝 2.dropout and dropconnect ...

  6. 剪枝与重参第三课:常用剪枝工具

    目录 常用剪枝工具 前言 1.torch.nn.utils.prune 1.1 API简单示例 1.2 拓展之钩子函数 2.pytorch pruning functions 3.custom pru ...

  7. 基于三代测序技术的高产糖化酶黑曲霉工业菌株基因组组装与注释及功能基因比较研究

    第一代测序技术主要是由Sanger等人发明的测序技术,他的发明第一次为人们开启了解读 生命遗传密码 的大门,Sanger本人也因此获得了诺贝尔奖.这种DNA末端终止法测序技术的 原理:主要通过在DNA ...

  8. 全面信创化之下,工业软件国产化之路开始

    全面信创化,对于工业软件意味着什么? 信创产业的发展与国家安全息息相关,对我们科技进步而言,是独立自主的前提. 刚刚结束的大会报告上,"经济高质量发展取得新突破,科技自立自强能力显著提升,构 ...

  9. 改进YOLOv5、YOLOv8系列:29.YOLOv5 结合 极简又强大的RepVGG 重参数化模型结构

    最新创新点改进推荐 -

最新文章

  1. Lidar与IMU标定代码实战:lidar_align
  2. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - C. 三羊献端
  3. Erasing Zeroes CodeForces - 1303A
  4. docker --- 将已有的项目发布到云端
  5. QML 可以多选ComboBox的实现
  6. [Guava源码日报](8)ImmutableCollection
  7. L3-019 代码排版 (30 分)-PAT 团体程序设计天梯赛 GPLT
  8. 2021牛客寒假算法基础集训营6,签到题ACDFGIJ
  9. 【Linux】sed命令用法详解
  10. Linux之RedHat7如何更换yum源
  11. 【三维路径规划】基于matlab A_star算法无人机三维路径规划(起终点障碍物可设置)【含Matlab源码 1321期】
  12. 使用Java调用默认浏览器打开指定网址
  13. html语言代码大全,html常用代码大全 寻找最全的HTML语言代码大全
  14. php houdini,houdini中文翻译.pdf
  15. java实现开根号的运算
  16. win10计算机无法复制文件,Windows10系统无法复制文件到u盘的解决方案
  17. iOS 开发者 2019 面试总结
  18. python发送邮件发件人_在python电子邮件的from字段中添加发件人的名称
  19. 微信WeChat多开
  20. theano环境配置

热门文章

  1. 是我Out了,还是SOA瞎扯蛋?
  2. MySQL8.0数据库审计
  3. 三星手机真假测试软件,三星手机最全攻略!选购,查验真伪、生产日期,系统使用技巧...
  4. 【GitHubDailyShare】ubuntu实时查看硬盘温度的方法,当然越凉快越好
  5. 计算机的数据通信的概念,计算机网络 数据通信基本概念
  6. 怎么使用php制作课程表,易语言画板绘制课程表方法
  7. 2022年起重机司机(限桥式起重机)考试报名及起重机司机(限桥式起重机)免费试题
  8. 锐龙微型计算机,技嘉推出新BRIX Pro微型电脑:锐龙处理器加持
  9. RocketMQ是什么?
  10. java无名粉_迪哥闯世界忠粉测试,你有多了解迪哥呢?