VoVNet:实时目标检测的新backbone网络

目前基于深度学习的目标检测模型无不依赖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的方法:
M A C = h w ( c i + c o ) + k 2 c i c o MAC = hw(c_i + c_o) + k^2c_ic_o MAC=hw(ci+co)+k2cico
这里的 k , h , w , c i , c o k, h, w, c_i,c_o k,h,w,ci,co 分别为卷积核大小,特征高和框,以及输入和输出的通道数。卷积层的计算量 B = k 2 h w c i c o B=k^2hwc_ic_o B=k2hwcico,如果固定 B B B的话,那么有:
M A C ≥ 2 h w B k 2 + B h w MAC \geq 2\sqrt{\frac{hwB}{k^2}} + \frac{B}{hw} MAC2k2hwB +hwB
根据均值不等式,可以知道当输入和输出的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 = identity
        self.depthwise = depthwise
        self.isReduced = False
        self.layers = nn.ModuleList()
        in_channel = in_ch
        if self.depthwise and in_channel != stage_ch:
            self.isReduced = True
            self.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 aggregation
        in_channel = in_ch + layer_per_block * stage_ch
        self.concat = nn.Sequential(
            OrderedDict(conv1x1(in_channel, concat_ch, module_name, "concat"))
        )

        self.ese = eSEModule(concat_ch)

    def forward(self, x):

        identity_feat = x

        output = []
        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_feat

        return 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
  • 11
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
【资源说明】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【项目介绍】 该代码基于NanoDet项目进行小裁剪,专门用来实现Python语言、PyTorch 版本的代码,下载直接能使用,支持图片、视频文件、摄像头实时目标检测。** - YOLO、SSD、Fast R-CNN等模型在目标检测方面速度较快和精度较高,但是这些模型比较大,不太适合移植到移动端或嵌入式设备; - 轻量级模型 NanoDet-m,对单阶段检测模型三大模块(Head、Neck、Backbone)进行轻量化,目标加检测速度很快;模型文件大小仅几兆(小于4M)。 - NanoDet 是一种 FCOS 式的单阶段 anchor-free 目标检测模型,它使用 ATSS 进行目标采样,使用 Generalized Focal Loss 损失函数执行分类和边框回归(box regression) 模型性能 Model |Resolution|COCO mAP|Latency(ARM 4xCore)|FLOPS|Params | Model Size(ncnn bin) :--------:|:--------:|:------:|:-----------------:|:---:|:-------:|:-------: NanoDet-m | 320*320 | 20.6 | 10.23ms | 0.72B | 0.95M | 1.8mb NanoDet-m | 416*416 | 21.7 | 16.44ms | 1.2B | 0.95M | 1.8mb YoloV3-Tiny| 416*416 | 16.6 | 37.6ms | 5.62B | 8.86M | 33.7mb YoloV4-Tiny| 416*416 | 21.7 | 32.81ms | 6.96B | 6.06M | 23.0mb 开发环境 ```text Cython termcolor numpy torch>=1.3 torchvision tensorboard pycocotools matplotlib pyaml opencv-python tqdm ``` 运行程序 ```text '''目标检测-图片''' # python detect_main.py image --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path street.png '''目标检测-视频文件''' # python detect_main.py video --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path test.mp4 '''目标检测-摄像头''' # python detect_main.py webcam --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path 0

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值