目前基于深度学习的目标检测模型无不依赖CNN分类网络来作为特征提取器,如SSD采用VGG,YOLO采用DarkNet,Faster R-CNN采用ResNet,我们一般称这些网络为目标检测模型的backbone。ResNet是目标检测模型最常用的backbone,DenseNet其实比ResNet提取特征能力更强,而且其参数更少,计算量(FLOPs)也更少,用于目标检测虽然效果好,但是速度较慢,这主要是因为DenseNet中密集连接所导致的高内存访问成本和能耗。VoVNet就是为了解决DenseNet这一问题,基于VoVNet的目标检测模型性能超越基于DenseNet的模型,速度也更快,相比ResNet也是性能更好。

高效网络设计要素

在设计轻量级网络时,FLOPs和模型参数是主要考虑因素,但是减少模型大小和FLOPs不等同于减少推理时间和降低能耗。比如ShuffleNetv2与MobileNetv2在相同的FLOPs下,前者在GPU上速度更快。所以除了FLOPs和模型大小外,还需要考虑其他因素对能耗和模型推理速度的影响。这里考虑两个重要的因素:内存访问成本(Memory Access Cost,MAC)和GPU计算效率。 (1)内存访问成本 对于CNN网路来说,内存访问比计算对能耗贡献还大,如果网络中间特征比较大,甚至在同等模型大小下内存访问成本会增加,所以要充分考虑CNN层的MAC。在ShuffleNetV2论文中给出计算卷积层MAC的方法:

这里的 分别为卷积核大小,特征高和框,以及输入和输出的通道数。卷积层的计算量,如果固定的话,那么有:

根据均值不等式,可以知道当输入和输出的channel数相同时MAC才取下界,此时的设计是最高效的。

(2)GPU计算效率

GPU计算的优势在于并行计算机制,这意味着当要计算的tensor较大时会充分发挥GPU的计算能力。如果将一个较大的卷积层拆分成几个小的卷积层,尽管效果是相同的,但是却是GPU计算低效的。所以如果功效一样,尽量采用较少的层。比如MobileNet中采用深度可分离卷积(depthwise conv+1x1 conv)虽然降低了FLOPs,但是因为额外的1x1卷积而不利于GPU运算效率。相比FLOPs,我们更应该关注的指标是FlOPs per Second,即用总的FLOPs除以总的GPU推理时间,这个指标越高说明GPU利用越高效。

OSA(One-Shot Aggregation)模块

对于DenseNet来说,其核心模块就是Dense Block,如下图1a所示,这种密集连接会聚合前面所有的layer,这导致每个layer的输入channel数线性增长。受限于FLOPs和模型参数,每层layer的输出channel数是固定大小,这带来的问题就是输入和输出channel数不一致,如前面所述,此时的MAC不是最优的。另外,由于输入channel数较大,DenseNet采用了1x1卷积层先压缩特征,这个额外层的引入对GPU高效计算不利。所以,虽然DenseNet的FLOPs和模型参数都不大,但是推理却并不高效,当输入较大时往往需要更多的显存和推理时间。

图1 DenseNet与VoVnet模块对比

DenseNet的一大问题就是密集连接太重了,而且每个layer都会聚合前面层的特征,其实造成的是特征冗余,而且从模型weights的L1范数会发现中间层对最后的分类层贡献较少,这不难理解,因为后面的特征其实已经学习到了这些中间层的核心信息。这种信息冗余反而是可以优化的方向,据此这里提出了OSA(One-Shot Aggregation)模块,如图1b所示,简单来说,就是只在最后一次性聚合前面所有的layer。这一改动将会解决DenseNet前面所述的问题,因为每个layer的输入channel数是固定的,这里可以让输出channel数和输入一致而取得最小的MAC,而且也不再需要1x1卷积层来压缩特征,所以OSA模块是GPU计算高效的。那么OSA模块效果如何,论文中拿DenseNet-40来做对比,Dense Block层数是12,OSA模块也设计为12层,但是保持和Dense Block类似的参数大小和计算量,此时OSA模块的输出将更大。最终发现在CIFAR-10数据集上acc仅比DenseNet下降了1.2%。但是如果将OSA模块的层数降至5,而提升layer的通道数为43,会发现与DenseNet-40模型效果相当。这说明DenseNet中很多中间特征可能是冗余的。尽管OSA模块性能没有提升,但是MAC低且计算更高效,这对于目标检测非常重要,因为检测模型一般的输入都是较大的。

VoVNet

VoVNet由OSA模块构成,主要有三种不同的配置,如下表所示。VoVNet首先是一个由3个3x3卷积层构成的stem block,然后4个阶段的OSA模块,每个stage的最后会采用一个stride为2的3x3 max pooling层进行降采样,模型最终的output stride是32。与其他网络类似,每次降采样后都会提升特征的channel数。VoVNet-27-slim是一个轻量级模型,而VoVNet-39/57在stage4和stage5包含更多的OSA模块,所以模型更大。

表1 VoVNet架构

VoVNet在检测模型上的效果

VoVNet可以作为检测模型的backbone,论文中共对比了3个检测模型:DSOD,RefineDet和Mask R-CNN。前两个是one stage检测模型,而Mask R-CNN是two stage实例分割模型(三个模型都是train from scratch,而不是用了ImageNet预训练模型)。首先是DSOD,这个模型原先的backbone是DenseNet,现在替换为VoVNet,VOC数据集上对比效果如下表所示:

表2 DSOD检测模型效果对比

可以看到相比DenseNet,基于VoVNet的检测模型推理速度提升了一倍,而且效果更好,这说明VoVNet比DenseNet更高效。

另外是Mask R-CNN的结果如下表所示,可以看到VoVNet比ResNet效果更好,且推理时间稍低一些。这说明VoVNet充分继承了DenseNet的优势,但是计算更高效。

表3 Mask R-CNN模型效果对比

VoVNetV2

VoVNet只是继承了DenseNet的优点,但是可以走的更远,这就是CenerMask这篇论文所提出的改进版本VoVNetV2。简单来说,VoVNetV2引入了ResNet的残差连接和SENet的SE模块:

图2 VoVNetV2中的改进OSA模块

从图2b可以看到,改进的OSA模块直接将输入加到输出上,增加短路连接,使得VoVNet可以训练更深的网络,论文中是VoVNet-99。从图2c可以看到,改进的另外一个点是在最后的特征层上加上了sSE模块来进一步增强特征,原始的SE模块包含两个FC层,其中中间的FC层主要是为降维,这在一定程度上会造成信息丢失。而sSE模块是去掉了这个中间FC层。VoVNetV2相比VoVNet增加了少许的计算量,但是模型性能有提升:

表4 CenterMask模型效果对比

VoVNetV2的PyTorch实现

论文作者开源了VoVNet的实现代码,是基于PyTorch的,OSA模块的实现如下:

class _OSA_module(nn.Module):def __init__(self, in_ch, stage_ch, concat_ch, layer_per_block, module_name, SE=False, identity=False, depthwise=False):super(_OSA_module, self).__init__()self.identity = identityself.depthwise = depthwiseself.isReduced = Falseself.layers = nn.ModuleList()in_channel = in_chif self.depthwise and in_channel != stage_ch:self.isReduced = Trueself.conv_reduction = nn.Sequential(OrderedDict(conv1x1(in_channel, stage_ch, "{}_reduction".format(module_name), "0")))            for i in range(layer_per_block):if self.depthwise:self.layers.append(nn.Sequential(OrderedDict(dw_conv3x3(stage_ch, stage_ch, module_name, i))))else:self.layers.append(nn.Sequential(OrderedDict(conv3x3(in_channel, stage_ch, module_name, i))))in_channel = stage_ch# feature aggregationin_channel = in_ch + layer_per_block * stage_chself.concat = nn.Sequential(OrderedDict(conv1x1(in_channel, concat_ch, module_name, "concat")))self.ese = eSEModule(concat_ch)def forward(self, x):identity_feat = xoutput = []output.append(x)if self.depthwise and self.isReduced:x = self.conv_reduction(x)for layer in self.layers:x = layer(x)output.append(x)x = torch.cat(output, dim=1)xt = self.concat(x)xt = self.ese(xt)if self.identity:xt = xt + identity_featreturn xt

这里的OSA模块包含了sSE模块以及残差模块,另外支持depthwise卷积,OSA模块是VoVNet的核心,最终的VoVNet的实现可以见vovnet-detectron2

参考

  1. An Energy and GPU-Computation Efficient Backbone Network for Real-Time Object Detection
  2. CenterMask : Real-Time Anchor-Free Instance Segmentation
  3. vovnet-detectron2

发布于 2020-05-10

VoVNet:实时目标检测的新backbone网络相关推荐

  1. 理解SSD多盒-实时目标检测

    这幅图片解释了构成直观的解释关于SSD多盒目标检测技术. 自从AlexNet在2012年ILSVRC比赛中对于图像识别任务打败传统计算机视觉方法后给研究界带来风暴.在计算机视觉领域,传统神经网络在图像 ...

  2. VoVNet:实时目标检测 backbone网络

    原文:https://mp.weixin.qq.com/s?__biz=MzUyMjE2MTE0Mw==&mid=2247489263&idx=1&sn=2001632f3ab ...

  3. YOLOv7详解:实时目标检测新标杆 | Chien-Yao Wang团队与Alexey团队倾力打造

    论文地址:https://arxiv.org/abs/2207.02696 代码地址:https://github.com/WongKinYiu/yolov7 权重: https://pan.baid ...

  4. MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《9》

    MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)<1>:论文源地址,克隆MXNet版本的源码,安装环境与测试,以及对下载的源码的每个目录做什么用的,做个解释. MXN ...

  5. 目标检测经典论文——Faster R-CNN论文翻译(纯中文版):Faster R-CNN:通过Region Proposal网络实现实时目标检测

    目标检测经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为纯中文版,中英文对照版请稳步:[Faster R-CNN中英文对照版] Faster R-CNN:通过Region Pr ...

  6. 【目标检测】54、YOLO v7 | 又是 Alexey AB 大神!专为实时目标检测设计

    文章目录 一.背景 二.方法 2.1 结构 2.2 Trainable bag-of-freebies 三.效果 论文:YOLOv7: Trainable bag-of-freebies sets n ...

  7. YOLO_ Real-Time Object Detection 实时目标检测

    YOLO: Real-Time Object Detection 实时目标检测 You only look once(YOLO)是一种先进的实时目标检测系统.在Pascal Titan X上,它以每秒 ...

  8. YOLO-LITE:专门面向CPU的实时目标检测

    点击我爱计算机视觉标星,更快获取CVML新技术 现在的实时目标检测算法,比如YOLO.SSD在GPU上已经可以跑的很快了,比如YOLOv2可以在GPU上跑到224fps,但在便携式笔记本甚至手机终端, ...

  9. 【全文翻译】YOLOv1:统一的实时目标检测

    YOLO:统一的实时目标检测 摘 要 我们提出了YOLO,一种新的目标检测方法.以前的目标检测工作使用分类器来执行检测.相反,我们是将目标检测框架看作是一个从空间上分割边界框和相关的类别概率的回归问题 ...

最新文章

  1. RSA, ACS5.X 集成配置
  2. 物流行业如何选择手持终端
  3. Factorial Trailing Zeroes
  4. python相似图片识别_Python+Opencv识别两张相似图片
  5. mysql 慢sql分析_如何分析Mysql慢SQL
  6. 高通CEO:已向美国申请向华为出售芯片 但尚未有回应
  7. bootstrap php 多行,使用PHP循环将Bootstrap行和正确的列号添加到元素
  8. AI 生态赋能 2018 论坛来袭!转型 AI 看这里!
  9. 各大杀软免费救急光盘合集——这个可以收藏备用了
  10. eclipse版本号 备注
  11. Spring Boot 服务优雅关闭方式汇总, Spring Boot 打包排除指定文件
  12. CSS预处理器和后处理器
  13. 2021年茶艺师(中级)复审考试及茶艺师(中级)模拟考试题
  14. 苹果官方付费升级内存_32GB内存秒变64GB ,vivo官方推出内存升级服务
  15. 使用粒子效果动画组成模型[自定义shader实现]
  16. mysql 联表查询 简书_mysql多表查询
  17. PowerShell 设置文件只读 (设置文件属性)
  18. 每年存1.4万,40年后你有多少钱,算完惊呆了!
  19. 全国计算机等级考试三级数据库技术
  20. 2012蓝桥杯预赛--取球博弈

热门文章

  1. pandas中两个dataframe的交集和差集
  2. Oracle数据库表导出和导入csv文件操作
  3. java hashtable import,Hashtable的一个简单例子
  4. 执行cmd并获得结果_MySQL 服务无法启动 请键入 NET HELPMSG 3523 以获得更多的帮助...
  5. 《因果学习周刊》第7期:因果学习中的离线策略评估
  6. ViT作者、谷歌大脑研究员翟晓华:大规模视觉表征学习
  7. Python 正在从简明转向臃肿,从实用转向媚俗
  8. 理解矩阵的掩码操作 使用opencv锐化图片
  9. Nature:越运动越聪明!躺平小鼠这样做,长出更多脑细胞
  10. ​万字总结83篇文献:深度强化学习之炒作、反思、回归本源