代码链接
参考
1、概述
本文提出一种简单而强有力的CNN架构RepVGG,在推理阶段,它具有与VGG类似的架构,而在训练阶段,它则具有多分支架构体系,这种训练-推理解耦的架构设计源自一种称之为“重参数化(re-parameterization)”的技术。
在ImageNet数据集上,RepVGG取得了超过80%的top-1精度,这是plain模型首次达到如此高的精度。在NVIDIA 1080TiGPU上,RepVGG比ResNet50快83%,比ResNet101快101%,同时具有更高的精度;相比EfficientNet与RegNet,RepVGG表现出了更好的精度-速度均衡。
2、需求解读
通过总结,你可能会发现计算机视觉中的多种不同任务的网络架构大致都可以分为3个通用的模块,具体包括:通用Backbone网络、任务特定网络和任务头网络,其中通用Backbone网络用来提取一些低级的通用特征,具体包括颜色、形状和纹理等;任务特定网络用来对这些通用的特征进行进一步的加工,将这些特征变换成该任务需要的特征;任务头网路根据不同的任务来输出不同形式的结果,例如分类算法输出类别概率,检测任务输出类别和检测框等。总而言之,分类网络中的Backbone网络是很多高级任务的基准网络,它的性能在很大程度上决定了该网络的部分上限。
在常见的计算机视觉任务中,我们经常会看到ResNet和MobileNet两个网络的身影,大量的实验结果表明:ResNet网络能够提取到鲁邦的特征表示,用户可以根据自己的需要灵活的选择ResNet18、ResNet34和ResNet50等网路架构;MobileNet适合应用在一些低算力的嵌入式设备中,可以在速度和精度之中达到很好的均衡。但是我们很少看到过VGG网络的身影,这几年越来越少!!!主要的原因包含2点:(1)VGG网络的模型更大,不便于模型部署;(2)与ResNet网络相比,VGG网络的性能会有些逊色。 ??RepVGG,这个网络就是在VGG的基础上面进行改进,主要的思路包括:
- 在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用 到VGG网络中;
- 模型推理阶段,通过Op融合策略将所有的网络层都转换为Conv33,便于网络的部署和加速。
如果你做过模型的部署,你可能会比较清楚,当前很多的模型推理框架中都对Conv33卷积做了一些特定的加速操作,如果我们可以将所有卷积层转换成Conv3*3,整个网络在推理阶段还是能获得较大的速度提升!!!
3、RepVGG算法简介
RepVGG是一个分类网路,该网络是在VGG网络的基础上进行改进,主要的改进点包括: (1)在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用 到VGG网络中; (2)模型推理阶段,通过Op融合策略将所有的网络层都转换为Conv3*3,便于模型的部署与加速。 该论文中的亮点包括:网络训练和网络推理阶段使用不同的网络架构,训练阶段更关注精度,推理阶段更关注速度,这个思路很值得体会,是一种提升模型部署速度的方案!!!
4、RepVGG网络架构详解
上图展示了部分RepVGG网络
- 图A表示的是原始的ResNet网络,该网络中包含着Conv1*1的残差结构和Identity的残差结构,正是这些残差结构的存在解决了深层网路中的梯度消失问题,使得网络更加易于收敛。
- 图B表示的是训练阶段的RepVGG网络架构,整个网络的主体结构和ResNet网络类似,两个网络中都包含残差结构。两个网络中的主要差异如下所述:
- RepVGG网络中的残差块并没有跨层,如图中的绿框所示;
- 整个网络包含2种残差结构,如图中的绿框和红框所示,绿框中的残差结构仅仅包含Conv11残差分支;红框中不仅包含Conv11的残差结构,而且包含Identity残差结构,identity分支可以视作1x1卷积。由于残差结构具有多个分支,就相当于给网络增加了多条梯度流动的路径,训练一个这样的网络,其实类似于训练了多个网络,并将多个网络融合在一个网络中,类似于模型集成的思路,不过这种思路更加简单和高效!!!
- 模型的初始阶段使用了简单的残差结构,随着模型的加深,使用了复杂的残差结构,这样不仅仅能够在网络的深层获得更鲁邦的特征表示,而且可以更好的处理网络深层的梯度消失问题。
- 图C表示的是推理阶段的RepVGG网络,该网络的结构非常简单,整个网络均是由Conv3*3+Relu堆叠而成,易于模型的推理和加速。
这种架构的主要优势包括:
- 当前大多数推理引擎都对Conv33做了特定的加速,假如整个网络中的每一个Conv33都能节省3ms,如果一个网络中包含30个卷积层,那么整个网络就可以节省3*30=90ms的时间,这还是初略的估算。
- 当推理阶段使用的网络层类别比较少时,我们愿意花费一些时间来完成这些模块的加速,因为这个工作的通用性很强,不失为一种较好的模型加速方案。
- 对于残差节点而言,需要当所有的残差分支都计算出对应的结果之后,才能获得最终的结果,这些残差分支的中间结果都会保存在设备的内存中,这样会对推理设备的内存具有较大的要求,来回的内存操作会降低整个网络的推理速度。而推理阶段首先在线下将模型转换为单分支结构,在设备推理阶段就能更好的提升设备的内存利用率,从而提升模型的推理速度,更直观的理解请看下图。总而言之,模型推理阶段的网络结构越简单越能起到模型加速的效果。
5、推理阶段Op融合细节详解
上图展示了模型推理阶段的重参数化过程,其实就是一个OP融合和OP替换的过程。图A从结构化的角度展示了整个重参数化流程, 图B从模型参数的角度展示了整个重参数化流程。整个重参数化步骤如下所示:
- 步骤1-首先将残差块中的卷积层和BN层进行融合,该操作在很多深度学习框架的推理阶段都会执行。图中的灰色框中执行Conv33+BN层的融合,图中的黑色矩形框中执行Conv11+BN层的融合,图中的黄色矩形框中执行Conv3*3(卷积核设置为全1)+BN层的融合。其中Wi表示转换前的卷积层参数,
μ
i
μ_i
μi?表示BN层的均值,
σ
i
σ_i
σi? 表示BN层的方差,
γ
i
γ_i
γi? 和
β
i
β_i
βi?分别表示BN层的尺度因子和偏移因子,W’和b’分别表示融合之后的卷积的权重和偏置。
Conv怎么和BN融合
identity怎么转3x3 Conv
这样的话,Identity就可以由这样的3x3 Conv替代,3x3Conv size为3x3x3x3,
- 步骤2-将融合后的卷积层转换为Conv33,即将具体不同卷积核的卷积均转换为具有33大小的卷积核的卷积。由于整个残差块中可能包含Conv11分支和Identity两种分支,如图中的黑框和黄框所示。对于Conv11分支而言,整个转换过程就是利用33的卷积核替换11的卷积核,具体的细节如图B中j间图所示,即将11卷积核中的数值移动到33卷积核的中心点即可;对于Identity分支而言,该分支并没有改变输入的特征映射的数值,那么我们可以设置一个3*3的卷积核,将所有的9个位置处的权重值都设置为1,那么它与输入的特征映射相乘之后,保持了原来的数值,具体的细节如图B中间第三个图。
- 步骤3-合并残差分支中的Conv33。即将所有分支的权重W和偏置B叠加起来,从而获得一个融合之后的Conv33网络层。
6、不同配置版本的RepVGG
RepVGG也提供两大类型的网络配置,具体的细节如上表所示,RepVGG-A表示的是一种比较轻量型的网络,整个网络的层数会少一些,当前分类性能也会差一些;RepVGG-B表示的是一种高精度类型的网络,整个网路会更深一些,分类精度更高一些,适用于服务端部署。整个RepVGG网络包含5个Stage,Stage1仅仅包含一个残差块,输出的特征映射大小为112112,残差块的通道个数取min(64,64a);Stage2包含2个残差块,输出的特征映射大小为5656,残差块的通道个数为64a个;Stage3包含4个残差块,输出的特征映射大小为2828,残差块的通道个数为128a个;Stage4包含14个残差块,输出的特征映射大小为1414,残差块的通道个数为256a个;Stage5包含1个残差块,输出的特征映射大小为7*7,残差块的通道个数为512b个。整个网络通过参数a和参数b来形成不同版本的变种,具体的变种如下表所示,参数a和参数b用来控制残差块的通道个数,参数a用来控制stage1-stage4阶段的通道个数,参数b用来控制stage5阶段的通道个数,一般情况下a < b,主要的原因是Stage5中需要具有更多的通道个数,从而获得一些更鲁邦的特征表示,有利于后续的头网络输出更准确的预测结果。
7、RepVGG算法实现步骤
- 获取并划分训练数据集,并对训练集执行数据增强操作;
- 搭建RepVGG训练网络,训练分类网络,直到网络收敛为止;
- 加载训练好的网络,对该网络执行重参数化操作,具体的细节如上节所述;
- 加载重参数化后的模型,执行模型推理。
8、RepVGG算法效果展示与分析
上图展示了RepVGG网络与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网络不均获得了较高的速度,各项指标上也都有所提升。
9、总结与分析
RepVGG是一个分类网路,该网络是在VGG网络的基础上进行改进,结合了VGG网络和ResNet网络的思路,主要的创新点包括:(1)在VGG网络的Block块中加入了Identity和残差分支,相当于把ResNet网络中的精华应用 到VGG网络中;(2)模型推理阶段,通过Op融合策略将所有的网络层都转换为Conv3*3,便于模型的部署与加速。(3)这是一个通用的提升性能的Tricks,可以利用该Backbone来替换不同任务中的基准Backbone,算法性能会得到一定程度的提升。 ??尽管RepVGG网络具有以上的优势,但是该网络中也存在一些问题,具体的问题包括:(1)从训练阶段转推理阶段之前,需要执行模型重参数化操作;(2)在模型重参数化过程中会增加一些额外的计算量;(3)由于每个残差块中引入了多个残差分支,网络的参数量也增加了一些。
|