RepVGG: Making VGG-style ConvNets Great Again-论文链接-代码链接

目录

  • 1、需求解读
  • 2、RepVGG算法简介
  • 3、RepVGG网络架构详解
    • 3.1 推理阶段Op融合细节详解
    • 3.2 不同配置版本的ResVGG网络
  • 4、RepVGG算法实现步骤
  • 5、RepVGG算法效果展示与分析
  • 6、总结与分析
  • 参考资料
  • 注意事项

1、需求解读

  通过总结,你可能会发现计算机视觉中的多种不同任务的网络架构大致都可以分为3个通用的模块,具体包括:通用Backbone网络、任务特定网络和任务头网络,其中通用Backbone网络用来提取一些低级的通用特征,具体包括颜色、形状和纹理等;任务特定网络用来对这些通用的特征进行进一步的加工,将这些特征变换成该任务需要的特征;任务头网路根据不同的任务来输出不同形式的结果,例如分类算法输出类别概率,检测任务输出类别和检测框等。总而言之,分类网络中的Backbone网络是很多高级任务的基准网络,它的性能在很大程度上决定了该网络的部分上限
  在常见的计算机视觉任务中,我们经常会看到ResNet和MobileNet两个网络的身影,大量的实验结果表明:ResNet网络能够提取到鲁邦的特征表示,用户可以根据自己的需要灵活的选择ResNet18、ResNet34和ResNet50等网路架构;MobileNet适合应用在一些低算力的嵌入式设备中,可以在速度和精度之中达到很好的均衡。但是我们很好看到过VGG网络的身影,这几年越来越少!!!主要的原因包含2点:(1)VGG网络的模型更大,不便于模型部署;(2)与ResNet网络相比,VGG网络的性能会有些逊色。
  RepVGG,这个网络就是在VGG的基础上面进行改进,主要的思路包括:(1)在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用 到VGG网络中;(2)模型推理阶段,通过Op融合策略将所有的网络层都转换为Conv3*3,便于网络的部署和加速。 如果你做过模型的部署,你可能会比较清楚,当前很多的模型推理框架中都对Conv3*3卷积做了一些特定的加速操作,如果我们可以将所有卷积层转换成Conv3*3,整个网络在推理阶段还是能获得较大的速度提升!!!

2、RepVGG算法简介

  RepVGG是一个分类网路,该网络是在VGG网络的基础上进行改进,主要的改进点包括:(1)在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用 到VGG网络中;(2)模型推理阶段,通过Op融合策略将所有的网络层都转换为Conv3*3,便于模型的部署与加速。 该论文中的包含的亮点包括:(1)网络训练和网络推理阶段使用不同的网络架构,训练阶段更关注精度,推理阶段更关注速度,这个思路很值得体会,是一种提升模型部署速度的方案!!!

3、RepVGG网络架构详解


  上图展示了部分RepVGG网络,图A表示的是原始的ResNet网络,该网络中包含着Conv1*1的残差结构和Identity的残差结构,正是这些残差结构的存在解决了深层网路中的梯度消失问题,使得网络更加易于收敛。图B表示的是训练阶段的RepVGG网络架构,整个网络的主体结构和ResNet网络类似,两个网络中都包含残差结构。两个网络中的主要差异如下所述:(1)RepVGG网络中的残差块并没有跨层,如图中的绿框所示;(2)整个网络包含2种残差结构,如图中的绿框和红框所示,绿框中的残差结构仅仅包含Conv1*1残差分支;红框中不仅包含Conv1*1的残差结构,而且包含Identity残差结构由于残差结构具有多个分支,就相当于给网络增加了多条梯度流动的路径,训练一个这样的网络,其实类似于训练了多个网络,并将多个网络融合在一个网络中,类似于模型集成的思路,不过这种思路更加简单和高效!!!(3)模型的初始阶段使用了简单的残差结构,随着模型的加深,使用了复杂的残差结构,这样不仅仅能够在网络的深层获得更鲁邦的特征表示,而且可以更好的处理网络深层的梯度消失问题。图C表示的是推理阶段的RepVGG网络,该网络的结构非常简单,整个网络均是由Conv3*3+Relu堆叠而成,易于模型的推理和加速。
  这种架构的主要优势包括:(1)当前大多数推理引擎都对Conv3*3做了特定的加速,假如整个网络中的每一个Conv3*3都能节省3ms,如果一个网络中包含30个卷积层,那么整个网络就可以节省3*30=90ms的时间,这还是初略的估算。(2)当推理阶段使用的网络层类别比较少时,我们愿意花费一些时间来完成这些模块的加速,因为这个工作的通用性很强,不失为一种较好的模型加速方案。(3)对于残差节点而言,需要当所有的残差分支都计算出对应的结果之后,才能获得最终的结果,这些残差分支的中间结果都会保存在设备的内存中,这样会对推理设备的内存具有较大的要求,来回的内存操作会降低整个网络的推理速度。而推理阶段首先在线下将模型转换为单分支结构,在设备推理阶段就能更好的提升设备的内存利用率,从而提升模型的推理速度,更直观的理解请看下图。总而言之,模型推理阶段的网络结构越简单越能起到模型加速的效果。

3.1 推理阶段Op融合细节详解


  上图展示了模型推理阶段的重参数化过程,其实就是一个OP融合和OP替换的过程。图A从结构化的角度展示了整个重参数化流程, 图B从模型参数的角度展示了整个重参数化流程。整个重参数化步骤如下所示:

  • 步骤1-首先通过式3将残差块中的卷积层和BN层进行融合,该操作在很多深度学习框架的推理阶段都会执行。图中的灰色框中执行Conv3*3+BN层的融合,图中的黑色矩形框中执行Conv1*1+BN层的融合,图中的黄色矩形框中执行Conv3*3(卷积核设置为全1)+BN层的融合。其中Wi表示转换前的卷积层参数,μi\mu_{i}μi​表示BN层的均值,σi\sigma_{i}σi​表示BN层的方差,γi\gamma_{i}γi​和βi\beta_{i}βi​分别表示BN层的尺度因子和偏移因子,W’和b’分别表示融合之后的卷积的权重和偏置。
  • 步骤2-将融合后的卷积层转换为Conv3*3,即将具体不同卷积核的卷积均转换为具有3*3大小的卷积核的卷积。由于整个残差块中可能包含Conv1*1分支和Identity两种分支,如图中的黑框和黄框所示。对于Conv1*1分支而言,整个转换过程就是利用3*3的卷积核替换1*1的卷积核,具体的细节如图中的紫框所示,即将1*1卷积核中的数值移动到3*3卷积核的中心点即可;对于Identity分支而言,该分支并没有改变输入的特征映射的数值,那么我们可以设置一个3*3的卷积核,将所有的9个位置处的权重值都设置为1,那么它与输入的特征映射相乘之后,保持了原来的数值,具体的细节如图中的褐色框所示。
  • 步骤3-合并残差分支中的Conv3*3。即将所有分支的权重W和偏置B叠加起来,从而获得一个融合之后的Conv3*3网络层。

3.2 不同配置版本的ResVGG网络


  对于基准分类网络而言,一般都会包含多个具有不同配置的网络架构,具有代表性的就是MobileNet和ShuffleNet网络,小模型可以进行轻量化部署,适合应用于一个算力较弱的嵌入式设备中,如rk3399、rk3288和Rapi3等;大模型用来进行服务端部署,适合应用到带有显卡的服务器上面,如GTX1080Ti、GTX2080Ti等,由于该设备的算力比较充足,即使是利用大模型也能获得实时的运行速度
  RepVGG也提供两大类型的网络配置,具体的细节如上表所示,RepVGG-A表示的是一种比较轻量型的网络,整个网络的层数会少一些,当前分类性能也会差一些;RepVGG-B表示的是一种高精度类型的网络,整个网路会更深一些,分类精度更高一些,适用于服务端部署。整个RepVGG网络包含5个Stage,Stage1仅仅包含一个残差块,输出的特征映射大小为112*112,残差块的通道个数取min(64,64a);Stage2包含2个残差块,输出的特征映射大小为56*56,残差块的通道个数为64a个;Stage3包含4个残差块,输出的特征映射大小为28*28,残差块的通道个数为128a个;Stage4包含14个残差块,输出的特征映射大小为14*14,残差块的通道个数为256a个;Stage5包含1个残差块,输出的特征映射大小为7*7,残差块的通道个数为512b个。整个网络通过参数a和参数b来形成不同版本的变种,具体的变种如下表所示,参数a和参数b用来控制残差块的通道个数,参数a用来控制stage1-stage4阶段的通道个数,参数b用来控制stage5阶段的通道个数,一般情况下a < b,主要的原因是Stage5中需要具有更多的通道个数,从而获得一些更鲁邦的特征表示,有利于后续的头网络输出更准确的预测结果。

4、RepVGG算法实现步骤

步骤1-获取并划分训练数据集,并对训练集执行数据增强操作;
步骤2-搭建RepVGG训练网络,训练分类网络,直到网络收敛为止;
步骤3-加载训练好的网络,对该网络执行重参数化操作,具体的细节如上节所述;
步骤4-加载重参数化后的模型,执行模型推理

5、RepVGG算法效果展示与分析


  上图展示了ResVGG网络与ResNet网络在相同测试数据集上面的性能指标。评估的性能指标包括Top-1准确率、模型推理速度、模型参数量、FLOPS和Wino卷积的MUL个数。通过观察我们可以得出以下的初步结论:(1)相同测试条件下,最小的模型RepVGG-A0与ResNet-18相比,各项指标都有显著的提升,RepVGG-A0网络不仅具有更少的参数量,更快的推理速度,而且获得了更高的分类精度;(2)与EfficientNet-B0相比,RepVGG-B1g4不仅具有更快的执行速度,而且获得了更高的分类精度,当然该模型也更大一些。(3)与VGG-16网络相比,RepVGG-B2在各个指标上面都有一定的性能提升。


  为了进一步验证RepVGG网络的通用性,作者验证了该Backbone在语义分割任务上面的性能,并和基准Backbon ResNet50和ResNet101进行了性能比较,具体的评估指标包括Mean IoU、Mean pixel acc和Speed。通过观察我们可以得出以下初步的结论:(1)与ResNet-50网络相比,RepVGG-B1g2-fast网络不仅获得较高的精度,而且在速度上也有一些优势;(2)与ResNet-101网络相比,RepVGG-B2-fast网络不均获得了较高的速度,各项指标上也都有所提升。

6、总结与分析

  RepVGG是一个分类网路,该网络是在VGG网络的基础上进行改进,结合了VGG网络和ResNet网络的思路,主要的创新点包括:(1)在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用 到VGG网络中;(2)模型推理阶段,通过Op融合策略将所有的网络层都转换为Conv3*3,便于模型的部署与加速。(3)这是一个通用的提升性能的Tricks,可以利用该Backbone来替换不同任务中的基准Backbone,算法性能会得到一定程度的提升。
  尽管RepVGG网络具有以上的优势,但是该网络中也存在一些问题,具体的问题包括:(1)从训练阶段转推理阶段之前,需要执行模型重参数化操作;(2)在模型重参数化过程中会增加一些额外的计算量;(3)由于每个残差块中引入了多个残差分支,网络的参数量也增加了一些。

参考资料

[1] 原始论文

注意事项

[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注。
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本人业余时间承接各种本科毕设设计和各种项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊,备注“项目”!!!

RepVGG算法详解相关推荐

  1. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  2. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  3. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  4. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  5. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  6. 目标检测 RCNN算法详解

    原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...

  7. Twitter-Snowflake,64位自增ID算法详解

    Twitter-Snowflake,64位自增ID算法详解 from: http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8 ...

  8. 数据结构与算法详解目录

    数据结构与算法详解是一本以实例和实践为主的图书,主要是经典的数据结构与常见算法案例,来自历年考研.软考等考题,有算法思路和完整的代码,最后提供了C语言调试技术的方法. 后续配套微课视频. 第0章  基 ...

  9. [搜索]波特词干(Porter Streamming)提取算法详解(2)

     接[搜索]波特词干(Porter Streamming)提取算法详解(1), http://blog.csdn.net/zhanghaiyang9999/article/details/4162 ...

最新文章

  1. 学习谭浩强老师的《C程序设计》,必配《C程序设计伴侣》!
  2. centos下yum安装mysql5.7_CentOS下yum安装mysql5.7
  3. 【机器学习】数据挖掘实战:金融贷款分类模型和时间序列分析
  4. sata接口测试软件,方便用户,技嘉放出6系列主板SATA接口检测软件
  5. 9.Tornado下的一个简易Blog--2013-05-21
  6. C语言实例 区分旅客国籍
  7. 浅析:浅拷贝 及 深拷贝的传统写法
  8. gcd前缀和-蒜头君的数轴
  9. php resize函数,Php Image Resize图片大小调整的函数代码
  10. 使用Redis+java(模仿数据库)实现对象存取和读取
  11. vue项目 报sockjs.js?9be2:1606 GET http://192.168.43.226:8080/sockjs-node/info?t=1584966826465 net::ERR
  12. sap服务器安全证书,SAP安全登录单
  13. 伟创ac80b变频器故障代码_安川变频器故障代码和安川变频器报警详解
  14. 安装西门子TIA Portal V15.1提示先决条件不足如何处理?
  15. python簇状柱形图_使用Matplotlib绘制堆积条形图
  16. 飞桨PP-HumanSeg本地实时视频推理代码解读
  17. x264参数设置详解(x264 settings)
  18. Python 编程第一讲:IDE推荐
  19. oracle grant all语句,Oracle 生成批量 Grant 语句的 SQL
  20. Linux之V4L2驱动框架

热门文章

  1. java集合作为参数 传递的是_Java:数组和集合类作为参数传递时的差别
  2. java中怎么表示数组中的某个值_简易Java(12):如何高效检查一个数组中是否包含某个值?...
  3. Postgres客户端编码问题
  4. 2013/01/04作业raid+lvm+quota
  5. servlet的执行过程
  6. Spring 2.0技术手册 下载
  7. 从CNNIC的“中国互联网报告”看到希望
  8. php与mysql基础教程第二版_PHP 和 MySQL 基础教程(二)
  9. mysql set 常用参数_mysql常见配置参数
  10. wps数据匹配怎么做_【VK技术分享】数据安全怎么做—静态数据的识别和治理