【网络结构设计】5、VoVNet | 专为实时目标检测设计

在这里插入图片描述


论文: An Energy and GPU-Computation Efficient Backbone Network for Real-Time Object Detection

出处:CVPR 2019 Workshop

贡献:

  • 讨论了 MAC 和 GPU 计算的效率,并研究了如何设计更高效的结构
  • 抛出了 DenseNet 网络结构中的问题,包括低效的、冗余的操作等
  • 提出了 One-shot Aggregation(OSA),将中间的特征一次性聚合(在最后一层聚合一次),如图 1b 所示,能够在保留 concat 优势的同时优化 MAC(中间层输入输出通道相同) 和 GPU 计算效率(无需 1x1 卷积)
  • 基于 OSA 模块,构建了 VoVNet,一个 backbone 网络结构,并且将该 backbone 用于 DSOD、RefineDet、Mask R-CNN 等方法中,取得了比 DenseNet、ResNet 等方法更好的效率和准确率的平衡

在这里插入图片描述

DenseBlock 中的每一层的输入都是前面所有层 feature map 的叠加。而图 1(b)只有最后一层的输入是前面所有层 feature map 的叠加。

一、背景

DenseNet 提出以来,在分类任务上获得了很好的效果,经过实验验证,其不但效果较好,且参数量和 FLOPs 也 ResNet 更低。

ResNet 和 DenseNet 的不同在于特征聚合的方式:

  • ResNet 是将特征相加来聚合的
  • DenseNet 是将特征 concat 来聚合的

这两种聚合方式有一些不同:

  • 当特征和浅层特征图相加的时候,会被弱化
  • 而使用 concat 的话,特征会得到较好的保留
  • 而检测网络需要利用目标的多分辨率特征,所以使用 concat 能更好的保留和利用这些特征

此外,DenseNet 的参数量和 FLOPs 也更低一些,原因在于,除了 FLOPs 之外,还有很多影响模型运行时间的因素:

  • 第一个就是 MAC,内存访问成本,也是存储特征图需要的空间,如图 1a 所示,DenseNet 的前面几层都使用密集连接,连接到后面的层,导致 MAC 随着网络深度的增大以平方的形式增大,导致更多的资源消耗
  • 第二个就是 GPU 并行计算倍限制了,DenseNet 会被瓶颈层的计算限制,一般来说 GPU 的并行计算很有效,但由于输入通道的增大,DenseNet 需要使用 1x1 bottleneck 来降低输入维度和 FLOPs,导致 GPU 运算效率很低

VoVNet 的目标是什么:

将 DenseNet 优化成一个更高效的网络,同时保留其在目标检测任务上的良好效果

二、方法

2.1 高效网络设计的重要因素

1、MAC

Memory Access Cost,内存访问成本,MAC 描述了这个复杂的网络到底需要多少参数才能定义它,即存储该模型所需的存储空间

每个卷积层的 MAC 可以计算如下:

在这里插入图片描述

2、GPU 计算效率

之所以一般要通过降低 FLOPs 的方法来加速的原因是,一般认为每个浮点运算的过程在相同设备上都是相同的。

但在 GPU 上却不是这样,因为 GPU 有并行加速策略,所以 GPU 能同时处理多个浮点运算,这也是高效的一个很大的原因。

GPU 并行计算能力在计算大型 tensor 的时候很能体现出来,当把大的卷积核 split 后,GPU 并行的计算效率会变低,因为并行的部分变少了。

基于此,建立一个 layer 数量较少的网络可能会更好点

所以结论如下:

  • 虽然深度可分离卷积和 1x1 瓶颈层能降低 FLOPs,但会损害 GPU 的计算效率
  • 不同网络结构的 GPU 计算效率是不同的

所以本文提出了一个新的概念:FLOPs per Second:FLOP/s,来衡量对 GPU 能力的利用情况,该值越大,则 GPU 的利用越高效

2.2 重新思考 Dense Connection

中间层的密集连接会必不可少的导致效率低下,因为随着层数的增加,输入 channel 数量也会线性增加。会有以下的问题:

  • 密集连接会导致 MAC 的增大,当保持计算量不变时,输入输出通道数相同的时候,MAC 最小。而密集连接增加的输入的通道数,输出的通道数是没变的,所以在相同计算量的情况下, DenseNet 的 MAC 很高
  • 密集连接就会需要使用 1x1 瓶颈层,瓶颈层不能很好的利用 GPU 的并行计算能力,使得 GPU 计算效率低。线性增长的输入尺寸是一个很大的问题,随着深度的增加,计算量是平方增长的。DenseNet 使用 1x1 卷积来保证输入 3x3 卷积的输入是不变的。但是,虽然 1x1 卷积能够降低 FLOPs,但会影响 GPU 的并行计算效率。瓶颈层将一个 3x3 卷积层拆分成两个更小的层,就会导致更多的串行计算(1x1+3x3 卷积),会拉低推理速度

既然 DenseNet 效率不高,那具体是如何体现的呢:

基于上述两个问题,VoV 作者认为,DenseNet 是不高效的,为了提升效率,作者首先探究了这些密集连接在训练的时候实际上是怎么聚合这些特征的。DenseNet 文章中提出,可以通过评估各层输入权值的归一化 L1 范数来计算密集连接的连通性。这些值能够表示某个层前面的所有层对该层的影响(归一化后的)程度,如图 2 上面所示(每块代表第 s s s 层和第 l l l层之间这个卷积权值的平均 L 1 L1 L1 范数)

图 2 表示 DenseNet(顶部) 和 VoVNet(中间和底部) 中卷积层的滤波器权重的绝对值的平均值。像素块的颜色表示的是相互连接的网络层 (i, j)的权重的平均 L 1 L1 L1 范数(按特征图数量归一化后的 L 1 L1 L1 范数)的值。OSA Module (x/y) 指的是 OSA 模块由 x 层和 y 个通道组成。

连通性(https://zhuanlan.zhihu.com/p/562933002):

两层之间的输入权重的绝对值相差越大,即 L1 越大,那么说明卷积核的权重越不一样,前面层对后面层影响越大(connectivity),即连通性越好(大)。从实用性角度讲,我们肯定希望相互连接的网络层的连通性越大越好(归一化后是 0~1 范围),这样我的密集连接才起作用了嘛。不然,耗费了计算量、牺牲了效率,但是连通性结果又差,那我还有必要设计成密集连接(dense connection)。作者通过图 2 后面的两张图也证明了 DenseBlock 模块中各个层之间的联系大部分都是没用,只有少部分是有用的,即密集连接中大部分网络层的连接是无效的。

在这里插入图片描述

  • 在 Dense block3 中,红色框距离对角线比较近(颜色越亮表示权值越大),这表示中间层的聚合是激活的。但是在分类层中,只有很少一部分的中间层被使用,Dense block1 的 transition layer 对输入特征有很好的聚合,但中间层却没有很好的聚合

  • 基于此,作者假设中间层聚合的效果和最后的层的聚合的效果呈反比,也就是说,中间层特征层对的聚合能力越好,那么最后的feature map的聚合能力就越弱。因此,让中间的 feature maps 的聚合能力弱化或者减少其相关性,会更利于最后 feature map 表达能力的提升。因为可以进一步提出假设,相比于它们造成的损耗而言,中间特征层的 dense connection 并不重要。这意味着,密集的连接使偏后的中间层产生好的特征,这些好的特征和前面层的很类似,所以最后一层不需要同时聚合前半部分的特征和后半部分的特征。

  • 所以,如果只使用能相互互补(或相关性较小)的中间层特征,而非使用所有的中间层特征来生成最后的特征,会避免很多冗余

  • 故此,作者认为,使用所有的中间层来进行密集连接其实带来的收益不多,所以,作者提出了一种新的密集链接方式:只使用每个 block 的最后一层进行特征聚合

2.2 One-shot Aggregation

OSA 模块就是只聚合每个 block 的最后一层特征,也就是在每个 block 的最后一层,对该 block 的前面所有层的特征进行 concat,只进行这一次的聚合。

该模块将中间层的特征聚合到最后一层。如图 1 所示。每个卷积层包含双向连接,一个连接到下一层以产生具有更大感受野的特征,而另一个仅聚合到最终输出特征映射。

在这里插入图片描述

  • 首先,在和 DenseNet-40 的 dense block 参数和计算量相似的基础上,设计 OSA module

  • 先使用层数相同的方式,如图 2 中间一行,随着每个卷积层输入尺度的减小,OSA 的输出比 dense block 的输出更大,OSA 模块的网络得到 93.6% acc,比同量级的 ResNet 效果好,由此可见,只在最后一层进行特征聚合,比使用全部中间层聚合更好

  • OSA 的 transition layer 和 DenseNet 有较大不同,OSA 中,从浅层来的特征对 transition layer 更有效,因为深层特征对 transition layer 没有很大的影响

  • 所以,将 OSA module 降为使用 5 层(共 43 通道),如图 2 最下边一行,得到了 5.44% err,和 DenseNet-40 的 5.24% 很接近,这说明使用大量的中间层的密集连接是低效且没有很大的作用

  • 在检测任务上,使用 5 层 43 通道的 OSA module 可以将 MAC 从 3.7M 降低到 2.5M,这是因为 OSA 的中间层输入输出通道是相同的,是的 MAC 最低,此外,因为检测任务比分类任务使用更大分辨率的特征图,MAC 会更严重的影响耗时和效率

  • 总之,OSA 能够提升 GPU 是计算效率,OSA 中间层的输入输出通道数相同,也不大需要使用 1x1 瓶颈层来降维,所以,OSA 层数更少、更高效

OSA 与 DenseNet 的不同之处总结如下:

  • 每一层的输出并没有按路线(route)到所有后续的中间层,这使得中间层的输入大小是恒定的。这样就提高了 GPU 的计算效率。
  • 另外一个不同之处在于没有了密集连接,因此 MAC 比 DenseNet 小得多
  • 此外,由于 OSA 模块聚集了浅层特征,它包含的层更少。因此,OSA 模块被设计成只有几层,可以在 GPU 中高效计算。

在这里插入图片描述

三、效果

在这里插入图片描述

在这里插入图片描述

One-shot Aggregation(OSA)是一种用于增强网络特征表示能力的模块,通过并行分支和密集连接机制来捕获不同尺度和语义级别的特征信息。下面是OSA模块的详细构建步骤和原理: 1. 输入特征:首先,将输入特征传递到OSA模块。 2. 分支构建:在OSA模块中,通常会构建多个并行的分支,每个分支用于提取不同尺度和语义级别的特征。每个分支通常由一系列的卷积层组成,可以使用不同尺寸的卷积核来捕获不同尺度的特征。 3. 密集连接:在每个分支的输出上应用密集连接机制,将当前分支的输出与之前所有分支的输出进行连接。这种密集连接机制可以促进特征的传递和重用,增强网络在不同尺度和语义级别上的特征表示能力。 4. 特征融合:将所有分支的输出进行特征融合,常见的方式是通过将输出进行加权求和或拼接操作。这样可以将不同尺度和语义级别的特征信息进行融合,以获取更丰富和全面的特征表示。 5. 输出:融合后的特征可以作为OSA模块的输出,传递到下一层进行进一步的处理或任务。 通过并行分支和密集连接机制,OSA模块可以在不同尺度和语义级别上捕获丰富的特征信息,并增强网络的感受野和特征表达能力。这使得网络能够更好地适应不同的视觉任务和场景。 希望这次提供的回答对您有帮助。如果您有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值