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

点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

afd6a015b71e0a3986cafa9a7aac82e5.png

作者丨陈TEL

来源丨GiantPandaCV

编辑丨极市平台

导读

 

本文作者主要借鉴repvgg重参化的思想,将原有的3×3conv替换成Repvgg Block,为原有的YOLO模型涨点。

前言: 之前做了一次shufflenetv2与yolov5的组合,目的是为了适配arm系列芯片,让yolov5在端侧设备上也能达到实时。但在gpu或者npu方面也一直在尝试着实验,对此类实验的目的很明确,要求也不高,主要还是希望yolov5在保持原有精度的同时能够提速。这一次的实验主要借鉴repvgg重参化的思想,将原有的3×3conv替换成Repvgg Block,为原有的YOLO模型涨点。

实验

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

534b7c57d1b160e601d383981e40787f.png

图摘自https://arxiv.org/pdf/2101.03697.pdf

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

00655694a3c9b600e911ef5cd051c2b5.png

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

bb8e248c8cfc20444a4d339e6d0de830.png

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

c453870702acd4c5a220247a13820d39.png

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

2034b24a45dffd31fbeb1a95c7437ddf.png

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

性能

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

1a5e604308cbb505a625dd5fd6362980.png

Rep指植入repvgg block模块,Silu和leaky指使用的激活函数

这里评估的yolov5s在map指标上和官网有所出入,测试两次后均为55.8和35.8,不过这个测试结果和GitHub - midasklr/yolov5prune (https://github.com/midasklr/yolov5prune)以及Issue #3168 · ultralytics/yolov5(https://github.com/ultralytics/yolov5/issues/3168)大致相同。使用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 = kernel
                    conv_reparam.bias.data = bias
                    for para in self.parameters():
                        para.detach_()
                    m.rbr_dense = conv_reparam
                    # m.__delattr__('rbr_dense')
                    m.__delattr__('rbr_1x1')
                    m.deploy = True
                    m.forward = m.fusevggforward  # update forward
                continue
                # print(m)
            if type(m) is Conv and hasattr(m, 'bn'):
                # print(m)
                m.conv = fuse_conv_and_bn(m.conv, m.bn)  # update conv
                delattr(m, 'bn')  # remove batchnorm
                m.forward = m.fuseforward  # update forward
        self.info()
        return self

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

29a7eb07fc55a3987a3fc8dcd3ea3847.png

推理

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张图片进行了推理测试:

a7b223d6414c38aa642a4001737517b2.png

左为植入repvgg block的yolov5s,右为原yolov5s

测试后的结果如下:

a6fb21e5737895ac7f9d3e8a3463eca7.png

Rep表示融合的repvgg block,silu和leaky指激活函数,最后一行是不做融合的repyolov5s

测试

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

f756168c7545ea1b766b13cf38837298.png

融合repvgg的yolov5s

306ad5d92d21f4e122f15d6cb0768433.png

原yolov5s

总结

使用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卷积进行重构

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

参考:

【1】https://zhuanlan.zhihu.com/p/344324470

【2】https://github.com/ultralytics/yolov5/discussions/3181

【3】Use activation function · Issue #584 · ultralytics/yolov5

【4】https://github.com/ppogg/YOLOv5-Lite

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「计算机视觉工坊」公众号后台回复:深度学习,即可下载深度学习算法、3D深度学习、深度学习框架、目标检测、GAN等相关内容近30本pdf书籍。

下载2

在「计算机视觉工坊」公众号后台回复:计算机视觉,即可下载计算机视觉相关17本pdf书籍,包含计算机视觉算法、Python视觉实战、Opencv3.0学习等。

下载3

在「计算机视觉工坊」公众号后台回复:SLAM,即可下载独家SLAM相关视频课程,包含视觉SLAM、激光SLAM精品课程。

重磅!计算机视觉工坊-学习交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

23b708579c735e5f948311b7e68b60e2.png

▲长按加微信群或投稿

777b3adccc03cb8ab5d649f8edca23d4.png

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定orb-slam3知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

41608deda639a5baf6abf89bb469f129.png

 圈里有高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  d3a168fd4c53557d3f444893652548ed.gif

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值