2022目标检测综述

目录


0、引言

目标检测领域发展至今已有二十余载,是计算机视觉的一个非常重要的核心方向,它的主要任务目标定位和目标分类。作为计算机视觉的基本问题之一,目标检测构成了许多其它视觉任务的基础,例如实例分割,图像标注和目标跟踪等等;从检测应用的角度看:行人检测、面部检测、文本检测、交通标注与红绿灯检测,遥感目标检测统称为目标检测的五大应用。

在深度学习介入该领域之前,传统的目标检测思路包括区域选择、手动特征提取、分类器分类。由于手动提取特征的方法往往很难满足目标的多样化特征,传统方法始终没能很好的解决目标检测问题。

深度学习兴起之后,神经网络可以从大量数据中自动学出强大的特征提取和拟合能力,因而涌现出很多性能优良的目标检测算法。基于深度学习的目标检测方法大致可分为三类:双阶段目标检测、单阶段目标检测、基于transformer的目标检测。

编者整理了近年来主流的目标检测算法,并对网上资料进行了整理,本文将对目标检测领域的发展做一个系统性的介绍,旨在为读者构建一个完整的知识体系架构,希望帮助自己和大家快速的了解目标检测相关的技术及其未来的发展趋势,有针对性的学习相关目标检测算法。

1、背景

1.1、问题描述

目标检测与分类、分割并称为CV的三大主要任务,他们之间的区别主要如下图所示。从任务的角度来看,目标检测可以看成是分类与分割任务的一座过度桥。这也是目标检测研究的重要性所在原因之一。

目标检测是目标分类的自然延伸,后者目的仅仅是识别图像中的目标。目标检测的目标是检测预定义类别的所有实例,并通过轴对齐框提供其在图像中的粗略定位。检测器应该能够识别对象类的所有实例,并在其周围绘制边界框(bounding box)。这通常被视为监督学习问题。现代对象检测模型可以访问大量的标记图像集以进行训练,并且在各种规范基准上进行评估。

1.2、目标检测的核心问题

从目标的定位角度出发,目标检测需要解决的核心问题主要有3个:

  • 大小的多样性
    同一张图像上可能同时出现多个不同或相同的目标,他们之间的大小差异大
  • 位置的任意性
    目标可以出现在图像的任意位置
  • 形态的差异性
    同一物体目标的形态差异可能很大,目标可能有各种不同的形状

1.3、目标检测中的关键挑战

在过去的十年里,计算机视觉已经取得了很大的进步,但是它仍然有一些重大的挑战需要克服。在实际应用中面临的一些关键挑战有:

从精度角度看:
从高准确度的角度来看,在现实场景中常见的挑战主要有:

  • 类内的差异性
    种类内自身材料、纹理、姿态等带来的多样性干扰,如黄色框图中椅子的制作材料及形态差异很大,但是它们都属于椅子的大类别
  • 外部环境的干扰
    外部环境带来的噪声干扰,比如蓝色框中光照、迷雾、遮挡等带来的识别及回归挑战。
  • 类间的相似性
    类间因纹理、姿态所带来的相似性干扰,比如黄色框图中是不同品种的动物,但是它们之间的差异又很小;这里实际上可以衍生为细粒度识别领域
  • 集群小目标问题
    集群目标检测所面临的数量多,类别多样化的问题,比如行人检测,遥感检测等。

从效率角度看:

目标检测是一个非常接地气的实际应用技术,它通常需要应用在实时处理的场景之中,比如自动驾驶系统。而且它还有可能需要同时处理成千上万的数据。因此,除了考虑高准确度还需要考虑处理时间,占用内存,消耗流量等方面的效率问题。如今的模型需要大量的计算资源来生成准确的检测结果,但在移动或边缘设备上,更为关键的是计算效率。

2、关于损失函数

 传送门:目标检测算法回顾之IOU变体篇章

分类的损失函数:

  • CE loss
  • Focal loss
  • AP loss
  • DR loss

定位的损失函数:

  • smooth L1 loss
  • Balanced L1 loss
  • KL loss
  • IOU loss

2022目标检测综述

3、关于IOU

传送门:目标检测算法回顾之IOU变体篇章

 目标检测中IOU的发展:

  • smooth L1 loss
  • IOU
  • GIOU
  • DIOU
  • CIOU
  • EIOU

2022目标检测综述

2022目标检测综述

4、数据集以及评价指标

4.1、评价指标

目标检测器使用多种指标来评价检测器的性能,如:FPS、precision、recall,以及最常用的mAP。precision由IoU推导出来,后者的定义是预测边框和GT之间的交并比。然后,设定一个IoU阈值来判定检测结果是否正确:如果IoU大于阈值,则该结果分类为True Positive(TP),如果小于阈值,则分类为False Positive(FP)。如果模型没有检测出GT中存在的目标,则这些目标分类为False Negative(FN)。则precision和recall的定义如下:

2022目标检测综述

基于上述定义,average precision(AP)是每一类的平均精度。然后,为了对比不同检测器,将所有类的AP平均,即可得到mAP这个单一指标。

4.2、数据集

1、主流数据集

虽然公开的数据集跟多,但最为流行的经典数据集是COCO和PASCAL VOC。这两个数据集是一般做目标检测通用任务或backbone必须要比较的数据集。下面将概述一些可用的、常用于目标检测任务的数据集。

1) PASCAL VOC 07/12
 Pascal Visual Object Classes(VOC)挑战赛是一个持续了多年的、为了促进视觉感知的比赛。其起始于2005,对四个目标类别进行分类和检测,不过VOC的两个版本主要用作基准测试集。VOC2007有5K个训练图像以及超过12K的标注目标;VOC2012将训练图像增加到11K,并拥有超过27K个标注目标,目标类别也扩展到了20类,同时也增加了语义分割、动作识别的任务。Pascal VOC引入了mAP@0.5IoU作为评价指标,来评估模型性能。图3展示了Pascal VOC数据集中各个类别图像数量的分布情况:

2)ILSVRC
 ImageNet Large Scale Visual Recognition Challenge (ILSVRC),是2010~2017期间的年度挑战赛,如今其已经成为了评估模型性能的基准集。数据集的规模扩展到了包含了1000个类别、超过100万个图像,其中精选了200个类别、超500K个图像被用于目标检测。该目标检测数据集包含了来自ImageNet、Flikr在內的多种数据源。ILSVRC还放宽了IoU的限制,以将小目标检测纳入其中。图4展示了ImageNet数据集中不同类别的图像数量分布情况:

3)MS-COCO
The Microsoft Common Objects in Context(MS-COCO),是目前最具挑战的数据集之一。其包含了自然环境中发现的、四岁儿童可以轻易识别的共91种常见目标。MS-COCO字2015年提出,自此其热度只增不减。其包含了超过200万个实例,且平均每张图像中有3.5个类别、7.7个实例,也包含了多种视角的图像。MS-COCO引入了更为严格的方法来评价检测器,不像VOC和ILSVCR,COCO在IoU从0.5到0.95的范围内没隔0.5计算一次mAP,然后平均这十个mAP,得到AP。除此之外,它还将AP分别用于小型、中型和大型对象,以在不同的尺度上比较性能。图5展示了MS-COCO数据集中不同类别的图像数量的分布情况:

4)Open Image
谷歌的Open Images数据集由920万张图像组成,使用图像级标签、对象边界框和分割掩码等进行标注。它于2017年推出,并已进行6次更新。对于目标检测,Open Images有1600万个包围框,包含190万张图像上的600个类别,这使它成为最大的目标定位数据集。它的创作者格外小心地选择了有趣、复杂和多样的图像,每张图像有8.3个对象类别。对Pascal VOC中引入的AP做了一些更改,比如忽略未注释的类,需要检测类和子类等。其每类的图像数量分布情况如图6所示:

2、两大标注软件

为便于COCO和PASCAL VOC数据集的采集制作,目标检测领域有两款比较常用的数据集标注工具labelme和labelImg。这两大标注工具都有对应的python包,所生成的数据格式为常见的三种数据集格式VOC格式,COCO格式和YOLO格式。

3、三种常用的标签格式

这三种数据格式的区别主要在于标签文件类型和bbox格式。VOC采用的是图像文件与xml标签文件,而COCO采用的是json格式,YOLO采用的是txt文本格式。

2022目标检测综述

5、目标检测发展脉络

5.1、目标检测算法分类

目标检测的发展脉络可以划分为两个周期:传统目标检测算法时期(1998年-2014年)和基于深度学习的目标检测算法时期(2014年-至今)。而基于深度学习的目标检测算法又发展成了四条技术路线:Anchor based方法(一阶段,二阶段)和Anchor free方法,基于Transformer的方法和基于NAS的方法。

2022目标检测综述

从上面模型的发展来看,目标检测算法可以主要可以分为以下五类。其中,传统算法比较依赖于手工特征的设计。对基于Anchor的方法,可以从两个角度来看待其模型的发展,一是训练模式,二是Anchor的形状。从训练模式来看的话,基于anchor的目标检测模型主要可以分为One-stage和Two-stage模型。One-stage模型因为检测速率较快的优点多用于移动端场景,而Two-stage模型因为检测精度较高的优点多用于精装设备场景。从Anchor形态来看,对于不同的物体用更加贴合其自身形态的anchor会更加精确。其中,矩形和多边形多用于遥感和文字检测场景,而椭圆及圆形多用于遥感和医学领域。

5.2、目标检测发展概览

2022目标检测综述

2022目标检测综述

6、backbone架构

backbone是目标检测器中的重要组成部分,输入图像的特征就是通过其进行提取的。这里讨论几种经典的backbone架构。

6.1、AlexNet

在 Dropout 和 Relu 被提出之后,2012年 AlexNet 诞生了AlexNet的论文被认为是 CV 界最有影响力的论文之一,截至2019年,已经被引约47000次,其影响力可见一斑。AlexNet 是第一个真正意义上影响了后面 CNN 发展的一个经典网络。

Krizhevsky等提出了AlexNet这种基于卷积神经网络的图像分类器,并赢得了ILSVRC2012年挑战赛的冠军,其达到了比当时最好的模型还要高的性能(超过26%)。AlexNet包括8个可学习的层:5个卷积层、3个全连接层。最后一个全连接层连接到N-Way(N为类别个数)softmax分类器。AlexNet使用了多种卷积核来获取图像特征,也使用了dropout和ReLU分别进行正则化和加速训练。其再次让卷积神经网络进入公众视野,并很快引起了一系列研究热潮。

AlexNet 的突破点主要有:

  • 网络更大更深,LeNet5(具体可以参考动图详细讲解 LeNet-5 网络结构) 有 2 层卷积 + 3 层全连接层,有大概6万个参数,而AlexNet 有 5 层卷积 + 3 层全连接,有6000万个参数和65000个神经元。
  • 使用 ReLU 作为激活函数, LeNet5 用的是 Sigmoid,虽然 ReLU 并不是 Alex 提出来的,但是正是这次机会让 ReLU C位出道,一炮而红。关于激活函数请参考我的另一篇博客 深度神经网络中常用的激活函数的优缺点分析。AlexNet 可以采用更深的网络和使用 ReLU 是息息相关的。
  • 使用 数据增强 和 dropout 来解决过拟合问题。在数据增强部分使用了现在已经家喻户晓的技术,比如 crop,PCA,加高斯噪声等。而 dropout 也被证明是非常有效的防止过拟合的手段。
  • 用最大池化取代平均池化,避免平均池化的模糊化效果, 并且在池化的时候让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
  • 提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

2022目标检测综述

6.2、VGG

VGGNet由 Karen Simonyan 等于2014年在 Very Deep Convolutional Networks for Large-Scale Image Recognition中提出。

当AlexNet及其继任者ZFNet专注于更小的感受野窗口大小来提升准确率时,Simonyan和Zisserman开始研究网络深度的影响。他们提出了VGG,一种使用了更小的卷积核来构造不同深度的网络。由于大感受野可以通过堆叠一系列更小的卷积核来实现,且这样可以大大降低参数量,并能很快收敛。其文章展示了多深的网络(16~19层)可以用于分类和定位,且具备高精度。VGG包含了一系列卷积层+3个全连接,再接一个softmax层。卷积层的个数从8到16不等:首先,最小的11层架构通过随机初始化进行训练,然后用其权重训练更大的网络,以防止梯度不稳定。在单一网络性能类别中,VGG的表现超过了2014年ILSVRC的获奖者GoogleNet,并很快成为了目标分类和检测模型中最常用的backbone。

VGG 的突破点主要有:

  • 在当年的 ImageNet 挑战赛上刷新了成绩,而且是较之前的网络取得了非常大的进步。
  • 将错误率降到10以下,网络的层数也是突破了个位数,达到16-19。
  • 选用比较小的卷积核(3×3),而之前无论 AlexNet 还是 LeNet5 都是采用较大的卷积核,比如 11×11, 7×7。而采用小卷积核的意义主要有两点,一是在取得相同的感受野的情况下,比如两个3×3的感受野和一个5×5的感受野的大小相同,但是计算量却小了很多,关于这点原文中有很详细的解释,建议直接看原文;第二点是两层3×3相比一层5×5可以引入更多的非线性,从而使模型的拟合能力更强,这点作者也通过实验进行了证明。其实这里还有一个优点就是采用小的卷积核更方便优化卷积计算,比如Winograd算法对小核的卷积操作有比较好的优化效果。
  • 使用1×1的卷积核在不影响输入输出的维度情况下,通过ReLU进行非线性处理,提高模型的非线性。当然这个并非 VGGNet 首创,最先在 Network In Network中提出。
  • 证明提高网络的深度能提高精度。

2022目标检测综述

6.3、GoogleNet/Inception

GoogLeNet 由 Christian Szegedy 等于 2014年发表在 Going Deeper with Convolutions上。

尽管分类网络正在朝着更快、更精确的网络迈进,但由于它们是资源密集型的,在现实世界的应用中部署它们仍有很长的路要走。随着网络规模的扩大以获得更好的性能,计算成本呈指数级增长。Szegedy等人认为造成这种情况的主要原因是网络中计算的浪费,更大的模型通常有更多的参数量,并趋向于过拟合。他们提出用局部稀疏连接架构代替全连接架构,以解决这些问题。GoogleNet是一个22层的网络,由多个Inception模块相互堆叠而成。Inception模块是在同一级别上具有多个大小的卷积核的网络。输入的feature map通过这些卷积核之后,连接到下一层。该网络在中间层还具有辅助分类器,以进行正则化和促进梯度传递。GoogLeNet展示了计算块的高效使用可以与其他参数较多的网络相提并论。其在没有外部数据的情况下,仅用ImageNet即可实现93.3%的top-5精度,同时比其他同时代的模型更快。后续几个迭代的版本进一步提高了性能,并进一步证明了精细化稀疏连接架构的应用。

GoogLeNet 取得的突破主要有:

  • 在网络结构上与之前的网络结构有比较大的差异,而且深度也达到了22层。在 GoogLeNet 上开始出现了分支,而不是一条线连到底,这是最直观的差异,也被称作 Inception module,如下图所示。从图中可以看到, 每个 module 中采用了不同 size 的 kernel,然后在将特征图叠加,实际上起到了一个图像金字塔的作用,即 所谓的 multiple resolution。
  • 上图中有很多 1×1 的卷积核,这里的1×1的卷积操作与之前讲到是不一样的,这里利用它来改变 output 的 channel, 具体说这里是减少 channel 数,从而达到减少计算的目的。
  • 用 Global Ave Pool 取代 FC。可以看到,对于 FC ,超参数7x7x1024x1024=51.3M,但是换成 Ave Pool之后,超参数变为0,所以这里可以起到防止过拟合的作用,另外作者发现采用 Ave Pool 之后,top-1的精度提高了大概0.6%。但是需要注意的是,在 GoogLeNet 中并没有完全取代 FC。
  • 采用了辅助分类器。整个模型有三个 output(之前的网络都只有一个 output),这里的多个 output 仅仅在训练的时候用,也就是说测试或者部署的时候仅仅用最后一个输出。在训练的时候,将三个输出的loss进行加权平均,weight=0.3, 通过这种方式可以缓解梯度消失,同时作者也表示有正则化的作用。其实这个思想有点类似于传统机器学习中的投票机制,最终的结果由多个决策器共同投票决定,这个在传统机器学习中往往能提升大概2%的精度。

2022目标检测综述

6.4、ResNet

ResNet 是何凯明于2015年在Deep Residual Learning for Image Recognition提出的。

随着CNNs越来越深,Kaiming He等人表明了网络精度是如何达到饱和并迅速下降的。他们提出了使用残差学习来堆叠卷积层,以减缓精度下降。它是通过在层之间添加跳跃连接来实现的。这种连接是块的输入和输出之间的元素加法,不会给网络增加额外的参数或计算复杂度。一个典型的34层ResNet基本上是一个大的(7×7)卷积核,然后是16个bottleneck模块(一对小的3×3滤波器,在它们之间有恒等的跳跃连接),最后是一个全连接层。bottleneck模块通过堆叠3个卷积层(1×1,3×3,1×3)可以适应更深的网络。Kaiming He等还表明了VGG16的计算复杂度相当于ResNet104和152,且精度更低。在随后的文章中,作者提出了Resnetv2,在block中使用了BN和ReLu,使得更通用且更容易训练。ResNets称为了广泛应用于分类和检测的backbone,且其思想启发了很多其他的网络。

ResNet的关键点:

  • 采用短路连接来缓解由于网络深度过深导致的梯度消失现象。ResNet18、ResNet34采用下图左的连接方式,对于很深的网络(ResNet50、ResNet101、ResNet152)采用下图右的连接方式,主要是降低参数的数目,减少计算量。
  • ResNet大量使用了批量归一层。
  • ResNet 除了开头和结尾有pooling层,中间均采用Conv stride=2的卷积操作代替了pooling。
  • 从ResNet的网络结构中,可以看出shortcut connections有实线和虚线连接之分。实线连接部分(如红框):表示通道相同,计算方式为:H(x)=F(x)+x;虚线连接部分(如红框):表示通道不同,计算方式为:H(x)=F(x)+Wx,其中W是卷积操作,用来调整x维度的。
  • 关于ResNet的改进主要有两种:一种是让ResNet更深(如preResNet);另一种是让ResNet更宽(比如 ResNeXt)。

6.5、ResNeXt

ResNeXt源于论文“Aggregated Residual Transformations for Deep Neural Networks”,是ILSVRC 2016的冠军网络。ResNeXt是ResNet和Inception的结合体,通过调整了网络的宽度(借鉴Inception),增加分支数加宽了网络,有效的提升网络的性能。

现有的提高模型精度的传统方法是增加模型的深度或宽度。然而,增加任何一种都会导致模型的复杂性和参数的数量增加,而增益迅速减少。 Xie等人提出了ResNeXt架构,它比现有的其他模型更简单、更高效。ResNeXt的灵感来自于VGG/ResNet中相似块的堆叠,以及Inception模块中的“分离-转换-合并”方式。它本质上是一个ResNet,其中每个ResNet块被一个类似于Inception的ResNeXt模块替换,inception的复杂、定制的转换模块被ResNeXt块中的拓扑结构相同的模块所取代,使得网络更容易扩展和泛化。Xie等人还强调,可以将基数(ResNeXt块中的拓扑路径)与深度和宽度一起视为第三维,以提高模型的精度。ResNeXt优雅而简洁。与类似的深度ResNet体系结构相比,它获得了更高的精度,同时拥有更少的超参数。它也是ILSVRC 2016年挑战赛的第一名。

2022目标检测综述  

6.6、CSPNet

现有的神经网络已经在计算机视觉任务中取得了令人难以置信的结果;然而,它们依赖于过多的计算资源。Wang等人认为通过减少网络中重复的梯度信息可以减少大量的推理计算。他们提出了CSPNet[25],它为网络内的梯度流创建不同的路径。CSPNet将底层的feature map分为两部分:其中一部分送入卷积网络块(例如,DenseNet中的Dense和Transition块或ResNeXt中的Res(X)块),而另一部分在后期与第一部分的输出相结合。这减少了参数的数量,提高了计算单元的利用率,并减少了内存占用。它很容易实现,而且足够通用,可以应用于其他架构,如ResNet, ResNeXt, DenseNet, Scaled-YOLOv4等。在这些网络中应用CSPNet可将计算量减少了10%~20%,而准确性保持不变或有所提高。该方法也大大降低了内存开销和计算瓶颈。它被用于许多先进的检测器模型,同时也被用于移动设备和边缘设备。

CSPNet关键点:

  • 增强CNN的学习能力:作者希望可以增强CNN的学习能力,这样即便轻量化了,也可以保持住准确性。CSPNet 可以轻松地加在 ResNet, ResNeXt, DenseNet 之中,计算量普遍会降低10%到20%,但准确率都超过了本来的算法。
  • 去掉算力较高的计算瓶颈结构:计算瓶颈算力消耗过高,会导致推理时间过长,或者部分运算单元会闲置。作者将计算量均匀地摊在每一层上,这样就可有效地提升每个计算单元的利用率,降低不必要的资源消耗。CSPNet 将 PeleeNet的计算瓶颈的计算量几乎降低了一半。在MS COCO数据集上,它将基于YOLOv3的模型的计算瓶颈的算力消耗降低了80%。
  • 降低内存占用:为了降低内存使用率,在特征金字塔生成过程中,作者采用了 cross-channel pooling 来压缩特征图。CSPNet 将 PeleeNet 在特征金字塔生成过程中所消耗的内存降低了75%。

2022目标检测综述

6.7、EfficientNet

Tan等人系统研究了网络尺度及其对模型性能的影响。他们总结了改变网络参数如深度、宽度和分辨率是如何影响其准确性的。单独缩放任何参数都会带来相关的成本。增加网络的深度可以帮助捕获更丰富和更复杂的特征,但由于消失梯度问题,它们难以训练。同样地,缩放网络宽度会使捕获细粒度特征更容易,但难以获得高层次的特征。从增加图像分辨率(如深度和宽度)中获得的收益随着模型比例的增加而饱和。Tan等人提出使用一个复合系数,可以均匀地缩放所有三个维度。每个模型参数都有一个相关的常数,它是通过固定系数为1并在baseline网络上执行网格搜索来找到的。基线架构的灵感来自于他们之前的工作(MnasNet),它是通过对搜索目标进行神经架构搜索而开发的,同时优化了精度和计算。EfficientNet是一个简单而高效的架构。它在精度和速度上都优于现有的模型,而且体积要小得多。通过极大地提高效率,它有可能开启一个efficient networks的新时代。

2022目标检测综述

7、目标检测器

在本篇综述中,我们将检测器分为两类:两阶段检测器、一阶段检测器。同时,我们也简单回顾了传统的检测方法。如果一个网络,有一个单独的模块用于生成region proposals(区域候选框),那么该网络就称为两阶段检测器。这种模型试着在第一阶段找到一定数量的目标proposals,然后在第二阶段对各个proposals进行定位及分类。由于具有连个阶段,这些网络通常在生成proposals的阶段耗时较长,且结构复杂、缺乏全局信息。一阶段检测器通过密集采样直接对语义目标进行分类和定位,它们使用预定义的不同比例和长宽比的boxes/points来定位目标,其在实时性以及更简单的设计方面超越了两阶段检测器。

7.1、传统检测方法

1) Viola-Jones

Viola-Jones检测器于2001年提出,主要用于人脸检测,是一个精确而强大的探测器。它结合了类似Haar特征、积分图像、Adaboost和级联分类器等多种技术。第一步是通过在输入图像上滑动窗口搜索haar类特征,并使用积分图像进行计算。然后,它使用一个训练有素的Adaboost找到每个haar特征的分类器,并将它们级联。Viola-Jones算法仍然用于小型设备,因为它非常高效和快速。

2)HOG

Dalal 和Triggs于2005年提出了Histogram of Oriented Gradients (HOG)特征描述器,用于目标检测的特征提取。与其他探测器相比,HOG是一个改进版,它提取梯度及其边缘方向来创建一个特征表。图像被划分为网格,然后使用特征表为网格中的每个单元创建直方图。为感兴趣的区域生成HOG特征,并将其输入线性SVM分类器进行检测。其提出是作为行人检测检测器的,不过它可以被训练来检测各种其他类。

3)DPM

Deformable Parts Model (DPM)由Felzenszwalb等人引入,是2009年Pascal VOC挑战赛的冠军。它利用目标的个别“部分”进行检测,准确率高于HOG。它遵循分而治之的哲学;在推理期间,对象的各个部分被单独检测,它们的一个可能的排列被标记为检测结果。例如,人体可以被认为是头、胳膊、腿和躯干等部分的集合。一个模型将被指定捕捉整个图像中的一个部分,并对所有这些部分重复这个过程。然后,另一个模型移除那些不可能的组合,以生成最终检测。基于DPM的模型是深度学习时代之前最成功的算法之一。

7.2、两阶段检测器

双阶段目标检测算法先根据图像提取候选框,然后基于候选区域做二次修正得到检测点结果,检测精度较高,但检测速度较慢。

这类算法的开山之作是RCNN[3],随后Fast RCNN[4]、Faster RCNN[5]依次对其进行了改进。

由于优秀的性能,Faster RCNN至今仍然是目标检测领域很有竞争力的算法。随后,FPN[6]、Mask RCNN[7]等算法又针对Faster RCNN的不足提出了改进,这进一步丰富了Faster RCNN的组件,提升了它的性能。在这里插入图片描述

1)R-CNN

Region-based Convolutional Neural Network (R-CNN),是R-CNN系列的第一篇文章,其证明了CNNs可以极大地提高性能。R-CNN使用一个类别不可知的region proposals CNNs模块将检测转化为分类和定位问题。减去均值后的输入图像,首先通过区域提议模块,生成2000个候选对象。这个模块使用选择性搜索(SS)找到图像中有较高概率属于一个对象的部分。然后,这些候选项被warped并通过CNN网络传播,CNN为每个proposals提取4096维的特征向量。Girshick等人使用AlexNet作为检测器的backbone。然后,特征向量被送入训练好的、指定类别的SVM获取置信度得分。接着,使用非极大值抑制(NMS)基于IoU和类别对得分区域进行过滤。一旦类别被确认,算法就会使用训练好的边界框回归器来预测其边框,也即预测四个参数:xyhw。

R-CNN有着一个复杂的多阶段训练过程:第一阶段,使用大量分类数据集预训练CNN;第二阶段,是使用特定域的图像(减均值、warped的proposals)针对检测进行微调,并把CNN模型的分类层替换为N+1-way的分类器(N为类别数);最后,为每一类训练一个线性SVM以及边框回归器。

R-CNN在目标检测领域引起了一个新的浪潮,不过它很慢(每张图像47秒),且时空复杂度都很高。它有复杂的训练过程,即使在一些计算是共享的情况下,也要花几天时间在小数据集上训练。

2022目标检测综述

2)SPP-Net

He等人提出使用空间金字塔池化(SPP)层来处理任意尺寸、任意长宽比的图片。他们意识到,仅全连接层需要固定大小的输入。SPP-net在region proposal module之前,只是平移了CNN的卷积层,增加了pooling层,使得网络不依赖于size/aspect ratio,减少了计算量。生成候选窗口的算法仍是选择性搜索(SS)。feature maps是通过ZF-5网络的卷积层从输入图像提取的。然后,候选窗口被映射到特征映射上,这些特征映射随后被金字塔池化层的空间bins转换为固定长度的表示。最后将得到的向量送入全连接层,然后使用SVM分类器预测类别和得分。类似于R-CNN,SPP-Net也有一个边框回归的后处理层来改善定位精度。其同样使用多阶段训练过程,除了微调以外,其他步骤只在全连接层上进行。

SPP-Net在相似精度的前提下,比R-CNN快很多,它还可以处理任意尺寸、比例的图像,因此,也避免了由于输入形变导致的目标变形。然而,由于其架构类似于R-CNN,它也有R-CNN的缺点,像多阶段训练,昂贵的计算和训练时间。

SPP-Net关键点:

  • 直接一整张图输入CNN网络,提取整个图片的特征,然后再根据region proposal的位置来在整个feature map上截取出对应的feature就好啦,这样就避免了重复性用CNN对每个region proposal单独提取特征。
  • 第二点就是在原来的CNN网络的conv5层后加入了SPP layer,这样就可以不需要warp region proposal了,因为SPP layer可以接受不同size的输入,并可以得到相同尺寸的输出。

2022目标检测综述

3)Fast R-CNN

R-CNN和SPP-Net的一个主要缺点是需要多阶段分别训练。Fast-RCNN通过创建一个单一的端到端可训练的系统来解决这个问题。网络将一幅图像被送入一些列卷积层,同时目标的proposals也映射到获取的feature maps上。Girshick利用ROI-Pooling层替代了SPP-net中的金字塔结构的Pooling,其后接上两个全连接层,然后分了N+1类的softmax层和一个同样具有一个全连接的边框回归层。该模型还将边框回归器的损失函数从L2改为smooth L1以提高性能,同时引入多任务损失来训练网络。

作者还使用了先进的改进的预训练模型作为backbone。采用随机梯度下降法(SGD)和mini-batch为2对该网络进行单步训练,这有助于网络更快地收敛,因为反向传播在两个图像的roi之间共享计算。

Fast R-CNN主要是作为速度的改进而引入的(是R-CNN的146倍),而准确性的提高则是次要的。

2022目标检测综述

4)Faster R-CNN

尽管Fast R-CNN逐渐接近实时目标检测,但它的区域建议生成仍然慢了一个数量级(每幅图像2秒相比于每幅图像0.2秒)。Ren等人提出了一个完全卷积网络作为区域建议网络(RPN),该网络接受任意输入图像并输出一组候选窗口。每个这样的窗口都有一个相关的对象评分,它决定了一个对象出现的可能性。RPN引入了Anchor的概念,它使用多个不同长宽比的边界框,并在它们之上回归来定位对象。输入的图像首先经过CNN得到一组feature maps。它们被转发到RPN, RPN生成边界框及其分类。被选择的proposals随后映射回前面CNN层所提取的feature maps上,并最终送入全连接层,来进行分类和边框回归。Faster R-CNN实际上就是使用RPN所谓region proposals模块的Fast R-CNN。

训练Faster R-CNN更为复杂,因为两个模型之间存在执行不同的任务的共享层。首先,RPN在ImageNet数据集上进行预训练,在PASCAL VOC数据集上进行微调。然后,使用第一步的RPN得到的region proposals来训练一个Fast R-CNN。到此为止,网络还没有共享卷积层。现在,我们固定了检测器的卷积层,并微调了RPN。最后,Fast R-CNN从更新后的RPN进行微调。

2022目标检测综述

5)FPN

在提升小目标检测效果时,在多个级别上使用图像金字塔来获取特征金字塔(特征化的图像金字塔)是一种常用的手段。虽然它提高了检测器的平均精度,但推理时间的增加也是很多的。Lin等人提出了该特征金字塔网络(FPN),它采用自上而下的横向连接架构,在不同的尺度上构建高层次的语义特征。FPN有两条路径,一条是由卷积神经网络(ConvNet)在多个尺度上计算特征层次的自底向上路径,另一条是自上而下的路径,它将粗特征图从较高层次上采样为高分辨率特征。这些路径通过1×1卷积运算进行横向连接,以增强特征中的语义信息。这里采用FPN作为Faster R-CNN的RPN,以ResNet-101为backbone。

FPN可以在所有尺度上提供高级语义,降低了检测的错误率。它成为了未来检测模型的标准构建块,提高了整体的准确性。它也促进了洽谈改进的网络,如PANet、NAS-FPN、EfficientNet等网络的发展。

6)R-FCN

Dai等人提出基于区域的全卷积神经网络(R-FCN),共享了网络中几乎所有的计算,不像之前的两阶段检测器那样每个proposals都使用了资源密集型技术。他们反对使用完全连接的层,而是使用了卷积层。然而,卷积网络的深层是平移不变的,这使得它们在定位任务中不起作用。作者建议使用位置敏感评分图来补救。这些敏感的评分maps编码了相关的空间信息,并稍后汇集,以确定准确的定位。R-FCN通过将ROI分为k*k个网格,并计算每个cell的得分,然后这些得分求均值,用于预测目标类别。R-FCN检测器是四个卷积网络的组合:输入图像首先经过ResNet-101来获取feature maps;中间输出(Conv4)送入RPN以确定ROI proposals,最后的输出进一步送入一个卷积层进行处理,并送入分类器和回归器。分类层通过结合生成的位置敏感map和RoI proposals来生成预测,而回归网络输出边框的细节。R-FCN采用与Faster-RCNN类似的4步训练方式,同时使用组合交叉熵和边框回归损失。同时,在训练过程中也使用了在线难例挖掘(OHEM)。

Dai等人提出了一种新的方法来解决卷积神经网络中的平移不变性问题。R-FCN将Faster R-CNN和FCN结合起来,实现快速、更准确的检测器。尽管它的准确率没有提高多少,但它比同类产品的速度快2.5-20倍。

7)MaskR-CNN

Mask R-CNN在Faster R-CNN基础上进行了扩展,通过增加一个分支来并行进行像素级目标实例分割。该分支是一个应用于RoI上的全连接网络,对每个像素进行分割,整体代价很小。它使用类似于Faster R-CNN的架构进行目标proposals提取,不过增加了一个与分类、回归head并行的mask head。一个主要的区别是使用了RoIAlign层,而不是RoIPool层,以避免由于空间量化造成的像素级错位。为了更好的准确性和速度,作者选择了带有特征金字塔网络(FPN)的ResNeXt-101作为其主干。原先Faster R-CNN中的损失函数更新为了mask loss,就像FPN中那样,它使用了5个anchor、3种长宽比。Mask R-CNN的整体训练与faster R-CNN相似。

Mask R-CNN的性能比现有的SOTA一阶段模型架构更好,增加了一个额外的实例分割功能,但增加的开销很小。该算法训练简单、灵活,在关键点检测、人体姿态估计等应用中具有很好的通用性。然而,它仍然低于实时性能(>30 fps)。

2022目标检测综述

8)DetectoRS

许多当代的两阶段探测器采用的是多看多想的机制,即先计算对象proposals,然后提取特征来检测对象。DetectoRS在网络的宏观和微观层面都使用了该机制。在宏观层面,其提出了递归特征金字塔(RFP),这是由多个特征金字塔(FPN)堆叠而成、且带有从FPN的自顶向下层级到自底向上层之间的额外反馈连接。FPN的输出经过空洞空间金字塔池化层(ASPP)处理,然后送入下一个FPN层。然后,通过一个融合模块创建一个注意力map,将不同模块的FPN的输出联合起来。在微观层面,Qiao等人提出了可切换的Atrous卷积(SAC),以调节卷积的扩张率。利用具有5×5滤波器和1×1卷积的平均池化层作为交换函数来决定atrous卷积[55]的速率,帮助backbone动态检测各种尺度的目标。他们还把SAC放在两个全局上下文模块之间,因为这有助于实现更稳定的切换。递归特征金字塔和可切换Atrous两种技术的结合卷积产生检测器。作者将上述带有混合任务级联(HTC)的技术作为baseline,并和ResNext-101骨干结合起来。

DetectoRS结合了多个系统,以提高探测器的性能,并设置了最先进的两级探测器。其RFP和SAC模块具有很好的通用性,可用于其它检测模型。但是,由于它只能处理数据,不适合实时检测(每秒4帧)。

7.3、一阶段检测器

2022目标检测综述

1)YOLO

两阶段检测器将检测视为一个分类问题:需要一个模块枚举一些由网络分类为前景或背景的候选框。然而,YOLO将检测问题进行了重构,视其为一个回归问题,直接预测图像像素作为目标及其边界框属性。在YOLO中,输入图像被划分为S*S的网格,目标中心点所在的cell负责该目标的检测。一个网格cell预测多个边框,每个预测数组包括五个元素:边框的中心点(x, y)、边框的宽高w/h、置信度得分。

YOLO的灵感来自于用于图像分类的GoogLeNet模型,该模型使用了更小的卷积网络的级联模块。其在ImageNet数据上进行预训练,直到模型达到较高的精度,然后通过添加随机初始化卷积和全连通层对模型进行修正。训练时,每个网络的cell只预测一个类,印着这样可以更好的收敛,不过在推理时,可以预测多个类。采用了多任务损失,即所有预测部件的组合损失,对模型进行优化。非最大抑制(NMS)删除特定类的多重检测。

YOLO在精度和速度上都远远超过了它的当代单级实时模型。然而,它也有明显的缺点。对小的或聚类对象的定位精度和每个单元的对象数量限制是其主要缺点。这些问题在YOLO的后续版本中得到了修复。

2022目标检测综述

2)SSD

Single Shot MultiBox Detector (SSD)是第一个与同时代的两级探测器如Faster R-CNN的准确性相匹配同时还能保持实时速度的一阶段检测器。SSD是在VGG-16上构建的,带有额外的辅助结构以提高性能。这些辅助卷积层添加到模型的末端,在尺寸上逐渐减小。当图像特征不太粗糙时,SSD会在前面的层中检测到较小的物体,而更深的层负责默认尺寸的框和宽高比。

在训练期间,SSD对每个GT box和具有最好jaccard 重叠度的box相匹配,然后类似Multibox训练相应的网络。同时,也使用了困难负样本挖掘以及大量的数据增强。类似与DPM,SSD也利用了利用定位和置信度损失的加权和来训练模型。最终输出通过非最大抑制获得。

尽管SSD比YOLO和faster R-CNN等最先进的网络更快更准确,但它在探测小物体方面有困难。这个问题后来通过使用更好的主干架构(如ResNet)和其他小补丁解决了。

2022目标检测综述

3) YOLOv2 与YOLO9000

YOLOv2是对YOLO的改进,在速度和准确性之间提供了一个简单的权衡;而YOLO9000模型可以实时预测9000个对象类。这两者将YOLO中的backbone从GoogleNet替换为DarkNet-19。它结合了许多令人印象深刻的技术,如BN提高收敛性,联合训练分类和检测系统用于提高检测类别数,移除全连接以提高检测速度,使用聚类得到的anchor来改善recall并提供先验知识。Redmon等人也利用WordNet将分级结构的分类和检测数据集结合起来。即使当下词没有被正确分类,这个WordTree也可以用来预测一个更高的条件概率的上下词,从而提高了整体的性能。

YOLOv2在选择模型的速度和精度方面提供了更好的灵活性,新的架构具有更少的参数。正如文章的标题所暗示的那样“better, faster and stronger”。

4)RetinaNet

鉴于单级和两级探测器的精度差异,Lin等人认为单级探测器滞后的原因是“极端的前景-背景类不平衡”。他们提出了一个改造的交叉熵损失,称为Focal Loss作为解决不平衡的手段,通过其中的参数来降低简单样本对loss的贡献度。作者通过一个简单的单级探测器(RetinaNet)证明了它的有效性,通过对输入图像的位置、比例和纵横比进行密集采样来预测目标。该算法使用由特征金字塔网络(FPN)扩充的ResNet作为骨干网络,两个相似的子网络分别进行分类和回归。FPN的每一层都被传递到子网中,使其能够检测出不同规模的目标。分类子网预测每个位置的对象得分,而边框回归子网将每个锚点的偏移量回归到GT。两个子网都是小的FCN,并在各个网络之间共享参数。与之前大多网络不同,作者使用了一个与类别无关的边界框回归变器,发现它们等效。

RetinaNet训练简单,收敛快速,且容易实现。它在精度和运行时间方面都优于两级探测器。RetinaNet还通过引入新的损失函数来推进目标探测器优化的方法。

5)YOLOv3

与以前的YOLO版本相比,YOLOv3进行了“增量改进”。Redmon 等人用一个更大的Darknet-53网络代替了原来的特征提取器。他们还整合了各种技术,如数据增强、多尺度训练、批标准化等;分类器层的Softmax被逻辑分类器取代。

尽管YOLOv3比YOLOv2快,但它与之前的版本相比没有任何突破性的变化,它的精度甚至还不如一年前的SOTA检测器。

6)CenterNet

Zhou等人采用了一种非常不同的方法:将对象建模为点,而不是传统的边界框表示。CenterNet将对象预测为包围框中心的单个点。输入图像通过FCN生成heatmap,heatmap的峰值对应被检测物体的中心。它使用ImageNet预训练的Hourglass-101作为特征提取网络,有3个head:点目标中心点的heatmap头、目标尺寸wh头、目标中心点偏移头。在训练时,三个头的多任务损失被反向传播到特征提取器中。在推理过程中,利用偏移头的输出来确定对象点,最终生成一个方框。由于预测是点,而不是结果,这里不需要使用非最大抑制(NMS)进行后处理。

CenterNet乜有利用这些年来目标检测的常用套路,而是提出了一个新颖的视角。它比之前的方法更准确,推理时间更短。它具有较高的精度,可用于三维目标检测、关键点估计、姿态、实例分割、方向检测等多种任务。不过在做不同任务时,需要不同的骨干架构,因为一般架构与其他探测器工作良好,性能较差,反之亦然。

关于CenterNet的更多介绍,可以参考:CenterNet(Objects as Points):极简Anchor-free目标检测框架、CenterNet 后处理过程及源码解析。

7)EfficientDet

EfficientDet构建了具有更高精度和效率的可扩展检测器的思想,引入了有效的多尺度特征、BiFPN和模型缩放。BiFPN是一种具有可学习权值的双向特征金字塔网络,用于不同尺度下输入特征的交叉连接,它在NAS-FPN的基础上,通过删除一个输入节点,增加一个额外的横向连接,改进了需要大量训练和复杂网络的NAS-FPN,这消除了低效节点,增强了高级特征融合。与现有的探测器不同的是,它可以根据更大、更深的骨干网络或堆叠FPN层进行放大,EfficientDet引入了一个复合系数,可用于“联合放大骨干网络、BiFPN网络、类/盒网络和分辨率的所有维度”。EfficientDet利用EfficientNet作为backbone,该backbone是一种具有多个BiFPN的堆叠的特征提取网络,最终BiFPN层的每个输出被发送到类和边框预测网络。该模型使用SGD优化器和同步BN进行训练,并使用swish激活,而不是标准的ReLU激活,后者可区分,效率更高,性能更好。

EfficientDet比以前的检测器具有更好的效率和准确性,同时体积更小,计算成本更低。它易于扩展,可以很好地应用于其他任务,并且是当前单阶段对象检测的SOTA模型。

8)YOLOv4

YOLOv4结合了许多有效的idea,设计了一种可以在现有系统中工作快速且容易训练的目标检测器。它利用“bag of freebies”方法,只增加训练时间,而不影响推理时间。YOLOv4利用数据增强技术,正则化方法,类标签平滑,CIoU-loss , Cross mini-Batch Normalization (CmBN),自我对抗训练,余弦退火学习率调度等技巧来提高训练。网络中还加入了只影响推理时间的方法,称为“Bag of Specials”,包括Mish激活[、Cross-stage partial connections (CSP)、SPP-Block、PAN路径聚合块、多输入加权残差连接(MiWRC)等,还使用了遗传算法进行超参搜索。其使用在ImageNet上预训练的CSPNetDarkNet-53作为backbone,以SPP和PAN块作为neck,以YOLOv3的head为head。

目前大多数检测算法都需要多个gpu来训练模型,但YOLOv4可以在单个gpu上轻松训练。它的速度是EfficientDet的两倍,却具有类似的性能,达到了SOTA。

9)Swin Transformer

Transformer从一开始就在自然语言处理(NLP)领域产生了深远的影响。它在语言模型中的应用,如BERT(Bidirectional Encoder Representation from Transformers),GPT(Generative Pre-trained Transformer),T5(Text-To-Text Transfer Transformer)等,推动了这一领域的技术进步。transformer[75]使用注意模型来建立序列元素之间的依赖关系,并且可以比其他顺序架构关注更长的上下文。在自然语言处理中的成功引起了人们对其在计算机视觉中的应用的兴趣。而cnn一直是CV的支柱,不过其有一些固有的缺点,如缺乏全局上下文的重要性,固定的训练后权重等。

Swin Transformer旨在为计算机视觉任务提供基于Transformer的backbone,它将输入图像分割成多个不重叠的patch,并将其转换为token。然后将大量Swin Transformer块应用于4个阶段的patch,每个后续阶段减少patch的数量,以保持分层表示。Swin Transformer块由局部多头自注意(MSA)模块组成,在连续块中基于交替移位的patch窗口。在局部自注意中,计算复杂度与图像大小成线性关系,而移动窗口可以实现跨窗口连接。作者还显示了移动的Windows如何在开销很小的情况下提高检测精度。

Transformers提供了一个不同于CNN的范式,不过其在CV领域的应用仍处于初级阶段,它在这些任务中取代卷积的潜力是非常大的。 Swin Transformer在MS-COCO上达到了新的SOTA,不过其参数量相比CNN模型更高。

更多关于Swin Transformer的内容,可以参考:Swin Transformer: 使用滑动窗口的分层视觉transformer。

7.4、基于Anchor Freed的目标检测算法

前面我们讲的都是anchor-based方法,那么anchor-based methods总的特征就是在同一像素点上生成多个不同大小和比例的候选框(one-stage模型通常采用滑窗等(聚类)方式生成,而two-stage模型更多的是采用RPN来生成),并对其进行筛选,然后再进行分类和回归。一定程度上它能够解决目标尺度不一和遮挡的问题,提高检测精度。

anchor的好处:

  • 网络可直接在anchor上进行分类及回归任务。(有更高的分辨率,提取到的特征更加丰富)
  • 加入先验知识,使模型更加稳定和鲁棒。(由于加入了人为先验分布,同时在训练的时候prediction(尤其是regression)的值域变化范围实际上是比较小的,这就使得anchor-based的网络更加容易训练也更加稳定)。
  • 可以提高召回率,尤其是对小目标检测。
  • 一定程度上解决了物体遮挡和尺度不一致的问题。

anchor的局限:

  • 依赖过多的手动设计!
  • 训练和预测过程过于低效!(产生预选框所需要的耗时和算力大大增大)
  • 正负样本不均衡问题!

anchor-free 与anchor-based的区别:

  • anchor-based的方法是通过anchor和对应的编码信息来表示物体的。(需要在图像的特征图中每个位置预先设置一定数量的anchor,然后对每个anchor进行分类和回归)
  • anchor-free的方法主要是通过多个关键点(角点)或者通过中心点与对应得边界信息来表示物体的。(不需要预先设定anchor,直接对图像进行目标检测)
  • 两者之间的区别在于是否使用anchor来生成候选框proposal,也可以说,两者之间的区别在于解空间的不同。

2022目标检测综述

和anchor-base进行比较,anchor-free最大的优势就在于其检测器的检测速度,因为不需要预设anchor,只需要对不同尺度的特征图的目标中心点和宽高进行回归,极大的减少了耗时和需要的算力。其缺点则是在于它的精度并不能达到anchor-base方法的SOTA。近两年还提出了一些结合anchor-base和anchor-free的检测器。

7.5、基于Transformer的目标检测算法

Transformer的确是近年来比较火的一个专题。最开始它是应用在NLP领域。从研究的数据来看,近几年来在CV、语音视频、多模态等领域的研究发表非常地迅猛。其中,在CV领域上的Transformer一般统称为Vision Transformer, 简称Vit。

目前基于Transformer的目标检测算法主要以DETR和ViT等系列为主展开,其中以DETR扩展的Transformer检测模型主要是在object query(加入先验知识)、attention机制(稀疏化,关注有意义的区域)及label assignment(OTA等)机制,以及特征匹配与分配机制等的改进与扩展。

2022目标检测综述

1)DETR

DETR的全称是DEtection TRansformer,是Facebook提出的基于Transformer的端到端目标检测网络,发表于ECCV2020。

Transformer自2017年被提出以来,迅速得到了广泛应用,不仅仅在NLP领域基本成为了一个统一的范式, 也被应用到一些视觉的领域,比如图像分类、目标检测、行为识别等,在部分功能上取代了CNN,大有一种统一NLP和CV的趋势。作为Transformer用在目标检测领域的开山之作,DETR是CV领域学习Transformer绕不过的一道坎。前人栽树后人乘凉,学习一些经典的思路和代码对自己的提升也是巨大的。

DETR的思路和传统的目标检测的本质思路有相似之处,但表现方式很不一样。传统的方法比如Anchor-based方法本质上是对预定义的密集anchors进行类别的分类和边框系数的回归。DETR则是将目标检测视为一个集合预测问题(集合和anchors的作用类似)。由于Transformer本质上是一个序列转换的作用,因此,可以将DETR视为一个从图像序列到一个集合序列的转换过程。该集合实际上就是一个可学习的位置编码。

DETR 的网络结构分为三个部分:

  • 第一部分是一个传统 CNN ,用于提取图片高纬特征;
  • 第二部分是一个Transformer 结构,Encoder 和 Decoder 来提取 Bounding Box;
  • 最后使用 Bipartite matching loss 来训练网络。

首先把一张3通道图片输入backbone为CNN的网络中,提取图片特征,然后结合位置信息,输入到transformer模型的编码器和解码器中,得到transformer的检测结果,每个结果就是一个box,其中每个box表示一个元组,包含物体的类别和检测框位置。

2022目标检测综述

2)YOLOS

YOLOS 结合了 DETR 的编码器-解码器颈部和 ViT 的仅编码器主干,来重新设计仅编码器的检测器。

YOLOS背景:

  1. 以CNN作为backbone的transformer检测系列:如DTER系列都使用随机初始化Transformer对CNN特征进行编码和解码,这并未揭示预训练Transformer在目标检测中的可迁移性。
  2. ViT可以将transformer直接作为backbone以纯序列到序列的角度来进行图像分类。要知道的是,ViT与CNN不同,它是对远程依赖关系和全局上下文信息进行建模,而不是对局部和区域级别的关系进行建模。此外,ViT缺乏像CNN那样的分层结构(multi-scale)来处理视觉实体规模的变化。那么ViT能做目标检测backbone吗?
  3. 先前以ViT作为backbone的transformer检测系列:ViT-FRCNN是第一个使用预训练的ViT作为R-CNN目标检测器的主干。然而,这种设计无法摆脱对卷积神经网络(CNN)和强2D归纳偏差的依赖,因为ViT-FRCNN将ViT的输出序列重新解释为2D空间特征图,并依赖于区域池化操作(即RoIPool或RoIAlign)以及基于区域的CNN架构来解码ViT特征以实现目标级感知。

YOLOS框架:

  1. YOLOS 删除了用于图像分类的 [CLS] 标记,并将一百个随机初始化的检测 [DET] 标记添加到用于对象检测的输入补丁嵌入序列中。
  2. ViT 中使用的图像分类损失被替换为二分匹配损失,以执行类似于 DETR 的对象检测。这可以避免将ViT的输出序列重新解释为2D特征图,并防止在标签分配期间手动注入启发式和对象2D空间结构的先验知识。

2022目标检测综述

YOLOS的出发点并不是为了更佳的性能,而是为了精确的揭示ViT在目标检测方面的迁移能力。仅需要对ViT进行非常小的修改,这种架构即可成功的迁移到极具挑战性的COCO目标检测基准上并取得42boxAP指标。YOLOS的这种最小调改精确地揭示了Transformer的灵活性与泛化性能

3)Swin Transformer

原论文地址: https://arxiv.org/abs/2103.14030
官方开源代码地址:https://github.com/microsoft/Swin-Transformer

Pytorch实现代码: http://pytorch_classification/swin_transformer

Swin Transformer是2021年微软研究院发表在ICCV上的一篇文章,并且已经获得ICCV 2021 best paper的荣誉称号。

Transformer 在 CV 领域掀起了一股热潮,从图像分类的 ViT, 到目标检测的 DETR,再到图像分割的SETR 以及 3D 人体姿态的 METRO。虽然这些针对不同任务设计的 Transformer 的确把 CNN 的活儿给干了,但其原生Self-Attention 的计算复杂度问题一直没有得到解决,Self-Attention 需要对输入的所有N个 token 计算 n^{2}大小的相互关系矩阵,考虑到视觉信息本来就就是二维(图像)甚至三维(视频),分辨率稍微高一点这计算量就很难低得下来。Swin Transformer 想要解决的就是这个计算复杂度的问题

关于Swin Transformer和Vision Transformer不同点:

2022目标检测综述

  • Swin Transformer使用了类似卷积神经网络中的层次化构建方法(Hierarchical feature maps),比如特征图尺寸中有对图像下采样4倍的,8倍的以及16倍的,这样的backbone有助于在此基础上构建目标检测,实例分割等任务。而在之前的Vision Transformer中是一开始就直接下采样16倍,后面的特征图也是维持这个下采样率不变。
  • 在Swin Transformer中使用了Windows Multi-Head Self-Attention(W-MSA)的概念,比如在下图的4倍下采样和8倍下采样中,将特征图划分成了多个不相交的区域(Window),并且Multi-Head Self-Attention只在每个窗口(Window)内进行。相对于Vision Transformer中直接对整个(Global)特征图进行Multi-Head Self-Attention,这样做的目的是能够减少计算量的,尤其是在浅层特征图很大的时候。这样做虽然减少了计算量但也会隔绝不同窗口之间的信息传递,所以在论文中作者又提出了 Shifted Windows Multi-Head Self-Attention(SW-MSA)的概念,通过此方法能够让信息在相邻的窗口中进行传递。

关于Swin Transformer(Swin-T)网络的架构基本流程如下:

2022目标检测综述

  • 首先将图片输入到Patch Partition模块中进行分块,即每4×4相邻的像素为一个Patch,然后在channel方向展平(flatten)。假设输入的是RGB三通道图片,那么每个patch就有4×4=16个像素,然后每个像素有R、G、B三个值所以展平后是16×3=48,所以通过Patch Partition后图像shape由 [H, W, 3]变成了 [H/4, W/4, 48]。然后在通过Linear Embeding层对每个像素的channel数据做线性变换,由48变成C,即图像shape再由 [H/4, W/4, 48]变成了 [H/4, W/4, C]。其实在源码中Patch Partition和Linear Embeding就是直接通过一个卷积层实现的,和之前Vision Transformer中讲的 Embedding层结构一模一样。
  • 然后就是通过四个Stage构建不同大小的特征图,除了Stage1中先通过一个Linear Embeding层外,剩下三个stage都是先通过一个Patch Merging层进行下采样(后面会细讲)。然后都是重复堆叠Swin Transformer Block注意这里的Block其实有两种结构,如图(b)中所示,这两种结构的不同之处仅在于一个使用了W-MSA结构,一个使用了SW-MSA结构。而且这两个结构是成对使用的,先使用一个W-MSA结构再使用一个SW-MSA结构。所以你会发现堆叠Swin Transformer Block的次数都是偶数(因为成对使用)。
  • 最后对于分类网络,后面还会接上一个Layer Norm层、全局池化层以及全连接层得到最终输出。图中没有画,但源码中是这样做的。

总的来说,在 Transformer 的热潮席卷 CV 领域之时,Swin Transformer 选对了需要解决的问题,计算复杂度问题对于 Transformer 结构在 CV 上的应用而言十分关键,而解决的方法合理符合直觉,最后的性能也十分理想,使其成为不可忽视SOTA方法。

4)VitDet

前面讲的one-stage模型和anchor-free模型精度的替身都需要依赖多尺度的特征提取来提高检测的精度。所以FPN在目前检测任务算是标配。FPN 的动机就是将早期高分辨率的特征和后期更强的特征结合起来。这在 FPN 中是通过自上而下(top-down)和横向连接来实现的。如果主干网络不是分层网络,那么 FPN 动机的基础就会消失,因为主干网络中的所有特征图都具有相同的分辨率。

而对于原始的ViT来说,由于没有下采样,所以无法像CNN那样应用不同分辨率的特征图,而且对高分辨率图像的检测效率也比较低,所以像Swin Transformer, ViT Mask-RCNN就在ViT模型中重新引入了分层的结构设计,逐级下采样。虽然这样子的确取得了成功,但做目标检测就一定需要FPN吗?可不可以消除对主干网络的分层约束,并使用普通主干网络进行目标检测呢?

ViTDet论文就是从这一方向出发,抛弃常见FPN的设计(YOLOF也是如此),利用原始的ViT架构从单尺度特征图构建简单的特征金字塔,即直接用ViT最后一层特征,对它做简单的上采样和下采样,就能重建出一个简单的FPN,而没有必要像CNN那样从不同stage抽取特征。也不需要像标准的FPN那样做top-down,bottom-up的特征融合,真的就简单粗暴的把最后一层的特征图(因为它应该具有最强大的特征)通过一组卷积或反卷积来得到不同尺度的特征图,达到跟FPN一样的性能。具体来说,他们使用的是尺度为 1/16(stride = 16 )的默认 ViT 特征图。

ViTDet选用Mask R-CNN架构作为主要研究对象,这里采用了优化版本,具体的改进主要包括以下几点:

  • RPN采用2个隐含的卷积层(默认是1个);
  • ROI heads的box head由原来的2个全连接层变为4个卷积层+1个全连接层;
  • ROI heads的box head和mask head的卷积层之间均采用LayerNorm(最早的版本是采用BatchNorm,但往往需要SyncBN,而LN则不受batch size的影响)。

2022目标检测综述

由于ViT中的patch之间是没有重叠的(在每个patch,每个窗口内做attention无法得到全局的信息),所以需要通过一些手段让不同的patch之间进行信息交互。ViTDet并没有像Swin那样采用shift操作(跨层移动窗口),而是采用全局注意力和卷积形式来做信息交互。实际上就是四个block在做完window atteion(每个block又会分成cell)之后再在最后一个阶段进行一个global propagation,这样简单的交互就可以把全局信息和局部信息的纳入学习之中,并且大量的减少了模型训练所需的内存和计算量。

8、轻量网络 

近年来,一个新的研究分支已经形成,旨在为物联网中常见的资源受限环境设计小型而高效的网络。这一趋势也渗透到强大的目标检测器的设计中,我们可以看到,虽然大量的目标检测器能够实现很好的准确性和实时推理,但是这些模型大部分需要过多的计算资源,因此不能部署在边缘设备上。

过去,许多不同的方法都显示出令人兴奋的结果。利用高效组件和压缩技术,如剪枝,量化、哈希等提高了深度学习模型的效率。利用训练好的大网络来训练更小的模型,称为蒸馏,也显示了有趣的结果。然而,在本节中,我们将探讨一些在边缘设备上实现高性能的高效神经网络设计的典型例子。列表如下所示:

8.1、SqueezeNet

SqueezeNet 是 Forrest N. Iandola 等人2016年于 SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size 中提出的一种网络模型,从论文标题我们就可以看到,作者仅用 AlexNet 1/50 的参数就取得了与 AlexNet 相当的精度。

cnn领域的最新进展主要集中在提高基准数据集的最新精度上,这导致了模型尺寸及其参数的爆炸式增长。但在2016年,Iandola等人提出了一个更小、更智能的网络,称为SqueezeNet,它在保持性能的同时减少了参数。他们采用了三种主要的设计策略,即使用更小的滤波器,将输入通道的数量减少后作为3×3滤波器的输入,以及在网络中更靠后的位置放置下采样层。前两种策略在保持准确性的同时减少了参数的数量,第三种策略增加了网络的准确性。SqueezeNet的构建块称为fire模块,它由两层组成:squeeze层和expand层,每个层都有一个ReLU激活。squeeze层由多个1*1滤波器组成,expand层由一个1*1、3*3混合滤波器组成,从而限制了输入通道的数量。SqueezeNet架构由8个Fire模块穿插在卷积层中间而组成。受ResNet启发,带有残差块的SqueezeNet也被提出,相比普通模型提高了准确率。作者还对深度压缩进行了实验,相比AlexNet,模型尺寸压缩了510倍。SqueezeNet为提高神经网络体系结构的硬件效率提供了一个很好的候选方案。

SqueezeNet 的主要思想如下:

  • 多用 1×1 的卷积核,而少用 3×3 的卷积核。因为 1×1 的好处是可以在保持 feature map size 的同时减少 channel。
  • 在用 3×3 卷积的时候尽量减少 channel 的数量,从而减少参数量。
  • 延后用 pooling,因为 pooling 会减小 feature map size,延后用 pooling, 这样可以使 size 到后面才减小,而前面的层可以保持一个较大的 size,从而起到提高精度的作用。

2022目标检测综述

8.2、MobileNet

MobileNet(v1)是 Andrew G. Howard 等在2017年于 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 中提出的。

MobileNet摆脱了传统小型模型的方法,如收缩、剪枝、量化或压缩,取而代之的是使用高效的网络架构。该网络使用深度可分离卷积,将传统卷积分解为depthwise卷积和1*1的pointwise卷积。一个标准卷积在所有通道上进行卷积,并一次性合并;而深度可分离卷积对输入的每个通道使用不同的卷积核,然后使用pointwise卷积进行合并。这种特征过滤和组合的分离降低了计算成本和模型规模。MobileNet由28个独立的卷积层组成,每个层随后是批处理标准化和ReLU激活功能。Howard等人还引入了两个模型收缩超参数:宽度倍增器和分辨率倍增器,以进一步提高模型的速度和缩小模型的尺寸。宽度倍增器通过减少输入和输出通道来均匀地操纵网络的宽度,而分辨率倍增器影响输入图像的大小及其在整个网络中的表示。MobileNet达到了一些成熟模型的准确率,但模型尺寸只是其数倍之小。Howard等人还展示了它如何在各种应用中进行推广,比如人脸属性、地理定位和目标检测。然而,它像VGG一样过于简单和线性,因此没有太多的通道来实现梯度流,不过在此模型的后期迭代中也得以解决。

2022目标检测综述

8.3、ShuffleNet

ShuffleNet 是 Xiangyu Zhang(旷视)等人于2017年在 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 中提出来的。ShuffleNet 的核心思想是对卷积进行分组,从而减少计算量,但是由于分组相当于将卷积操作局限在某些固定的输入上,为了解决这个问题采用 shuffle 操作将输入打乱,从而解决这个问题。

这是一种专门为移动设备设计的计算效率极高的神经网络架构。他们认识到,许多高效的网络随着规模的缩小而变得不那么有效,并声称这是由昂贵的1×1卷积造成的。结合信道打乱,他们提出了利用分组卷积来克服其信息流有限的缺点。ShuffleNet主要包括一个标准的卷积,然后是分成三个阶段的ShuffleNet单元。ShuffleNet单元类似于ResNet块,在3×3层使用深度卷积,并将1×1层替换为逐点分组卷积,且在深度卷积层之前有一个通道打乱的操作。ShuffleNet的计算代价可通过两个超参数管理: 组数控制连接稀疏度、缩放因子操纵模型大小。随着组数的增大,错误率会随着每个组的输入通道的减少而饱和,因此可能会降低表示能力。ShuffleNet表现优于当代模且具有相当小的模型尺寸,不过由于ShuffleNet唯一的改进是通道shuffle,因此模型的推理速度没有任何改善。2022目标检测综述

8.4、MobileNetv2

基于MobileNetv1,Sandler等人于2018提出了MobileNetv2——引入了具有线性瓶颈的反向残差这种新颖的模块,从而降低了计算复杂度并提高了精度。该模块将输入的低维表示扩展为高维,通过深度卷积进行过滤,然后将其投影回低维,不像常见的残差块先压缩、再卷积、最后展开。MobileNetv2包含一个卷积层,随后是19个残差bottleneck块,随后是两个卷积层。只有当stride为1时,残差bottleneck块才有shortcut连接。对于更高的步幅,由于尺寸的差异,不使用shortcut。他们还使用ReLU6作为非线性函数,而不是简单的ReLU,以限制计算。针对目标检测,作者使用MobileNetv2作为backbone,设计了一款SDD,称之为SSDLite,声称拥有比原始SSD少8倍的参数,同时实现具有竞争力的精度。它可以很好地泛化到其他数据集,且易于实现,因此受到社区的好评。

8.5、PeleeNet

现有的轻量级深度学习模型严重依赖深度可分离卷积,缺乏有效的实现。Wang等人提出了一种基于传统卷积的新型高效结构,名为PeleeNet,使用了计算守恒技术。PeleeNet的核心是DenseNet,但参考了许多其他模型的灵感。它引入两路dense层、bottleneck中的动态通道个数、过渡层压缩和传统的后激活,以降低计算成本和提高速度。两路dense层有助于获得不同尺度的接受域,使其更容易识别较大的物体。为了减少信息损失,使用了一个stem块。他们还放弃了DenseNet中使用的压缩因子,因为它损害了特征表达式并降低了准确性。PeleeNet包含了一个stem块、四个阶段的修改后的dense和转化层,以及最后的分类层。作者还提出了一种实时目标检测系统,称为Pelee,它是基于PeleeNet和SSD的变种。与移动设备和边缘设备上的当代检测器相比,它的性能是有所提升的,这表明简单的设计选择可以在整体性能上产生巨大的差异。

8.6、ShuffleNetv2

2018年,马宁宁等人在ShuffleNetv2中提出了一套设计高效网络架构的综合指南,他们主张使用速度或延迟等直接指标来衡量计算复杂度,而不是使用FLOPs等间接指标。ShuffleNetv2建立在四个指导原则上:1)输入和输出通道的宽度相等以最小化内存访问成本,2)根据目标平台和任务仔细选择组卷积,3)多路径结构以效率为代价获得更高的精度,4)像add和ReLU这样的元素操作在计算上是不可忽略的。根据上述原则,他们设计了一个新的构建块,通过通道分离层将输入分成两部分,然后是三个卷积层,这些卷积层与残差连接concat起来并通过一个通道shuffle层。对于下采样模型,去掉了通道分离,且残差连接带有深度可分离卷积层。在两个卷积层之间插入这些块的集合就产生了ShuffleNetv2。作者还对更大的模型(50/162层)进行了实验,获得了更高的精度,但FLOPs增加很少。ShuffleNetv2在计算复杂度方面也优于其他SOTA模型。

8.7、MnasNet

随着各种边缘设备对精确、快速和低延迟模型的需求不断增加,设计这样的神经网络比以往任何时候都更具挑战性。在2018年, Tan等人提出了基于自动神经结构搜索(NAS)方法设计的Mnasnet。他们将搜索问题定义为以高精度和低延迟为目标的多目标优化。它还对搜索空间进行因式分解,将CNN划分为独特的块,然后分别搜索这些块中的操作和连接,从而减少了搜索空间。这也允许每个块有一个独特的设计,不像早期的模型堆叠相同的块。作者使用基于rnn的强化学习代理作为控制器和训练器来测量准确性以及移动设备上的延时。每个采样的模型都在一个任务上进行训练,以获得其准确性,并在实际设备上运行以测试延迟,这用来获取软奖励目标和进行控制器更新。该过程一直重复,直到达到最大迭代次数或者得到一个更优的候选项。其由16个不同的块组成,有一些带有残差连接。MnasNet的速度几乎是MobileNetv2的两倍,且准确率更高。然而,与其他基于强化学习的神经结构搜索模型一样,MnasNet的搜索时间需要海量的计算资源。

8.8、MobileNetv3

MobileNetv3的核心与创建MnasNet的方法相同,只是做了一些修改。一种平台感知的自动神经体系结构搜索是通过NetAdapt在一个分解的层次搜索空间中执行的,它在多次迭代中删除了网络中未充分利用的组件。一旦获得架构方案,它就会对通道进行调整,对权重进行初始化,然后对其进行微调,以改进目标指标。该模型被进一步修改,以删除体系结构中一些计算昂贵的层,并获得额外的延迟优化。Howard等人认为,架构中的滤波器通常是彼此的镜像,即使去掉一半的滤波器也能保持准确性,这样可以减少计算量。MobileNetv3使用了一种混合的ReLU和hard swish作为激活核,后者主要在模型后面使用。hard swish和swish没有明显区别,不过前者在保留精度的同时计算成本更低。对于不同的资源使用用例,作者提出了两种模型:MobileNetv3-Large 和 MobileNetv3-Small。 MobileNetv3-Large由15个bottleneck块组成,而 MobileNetv3-Small由11个bottleneck块组成。其构建块也包含了squeeze和excitation层。类似于MobileNetV2,这些模型在SSDLite中充当特征检测器,比早期的模型快35%,同时实现更高的mAP。

8.9、Once-For-All (OFA)

在过去的几年中,神经体系结构搜索(NAS)的体系结构设计已经产生了很多SOTA,但是,由于样本模型训练,它们的计算成本很高。Cai等提出了一种新的解耦模型训练阶段和神经结构搜索阶段的方法。该模型只训练一次,可以根据需求从中提取子网络。OFA (Once-for-all)网络在深度、宽度、核大小和维数这四个重要维度上为子网络的选择提供了灵活性。由于它们嵌套在OFA网络中,干扰训练,因此引入了渐进收缩。首先,将所有参数设为最大值,训练最大的网络。随后,通过逐步减小内核大小、深度和宽度等参数维度,对网络进行微调。对于弹性核,在大核的中心使用小核。当中心被共享时,将使用一个内核转换矩阵来维持性能。为了改变深度,仅用大网络的前几层,后面的层将跳过。弹性宽度则利用了一个通道排序操作,重新分配通道,且在较小的模型中使用最重要的核。OFA在ImageNet中,以80%的top-1准确率达到了SOTA,并因其将GPU训练时间降低了好几个数量级,在低功耗CV挑战赛(LPCVC)中取得第四的成绩。它展示了为各种硬件需求设计轻量级模型的新范式。

9、未来趋势

在过去的十年中,目标检测取得了巨大的进展。该算法在一些垂直领域已经达到了人类水平的精度,但仍有许多令人兴奋的挑战需要解决。在本节中,我们将讨论目标检测领域中的一些开放性问题。

AutoML:采用神经结构自动搜索(NAS)确定目标探测器的特性已经成为一个比较热的研究领域。前面章节已经展示了一些通过NAS设计的检测器,不过其仍处于初级阶段,算法的搜索是一个复杂且资源密集型的过程。

Lightweight detectors: 虽然轻量网络能够达到与成熟分类网络相当的性能,展示了 其巨大潜力,不过在检测精度上,仍然低于50%。随着越来越多的设备上机器学习的应用上市,对小型、高效和同样精确也高的模型的需求将会增加。

Weakly supervised/few shot detection: 大多SOTA目标检测模型都是在数以百万计的标注数据上训练的,这些数据费时费力难以扩展。在弱监督数据(也即:图像级的标注)上进行训练,将大大降低成本。

Domain transfer: 域转移是指在一个独立但相关的目标任务上使用一个在特定源任务的标注图像上训练的模型。它鼓励重用训练过的模型,减少对大型数据集可用性的依赖,以实现高精度。

3D object detection: 3D目标检测是自动驾驶中尤为关键的问题。即使模型已经达到了很高的准确性,但任何低于人类水平性能的应用都将带来安全问题。

Object detection in video: 目标检测器是为独立图像的推理而设计的,这缺乏了多帧图像间的相关性。使用多帧图像间的时空关系进行目标识别是一个开放性问题。

10、总结

凭借着强大的特征提取能力,深度学习帮助目标检测算法取得了长足的发展。

从RCNN开始,相关科研人员不断引入新的机制、新的trick,以提高这类算法的精度。最终,以Faster RCNN为代表的双阶段目标检测算法取得了很高的预测准确率。

相较于Faster RCNN,以YOLO为代表的单阶段目标检测算法在保证较高预测精度的同时取得了很高的计算速度,凭借其优秀的实时性,在工业界取得了广泛应用。

2020年提出的以DETR为代表的视觉Transformer算法将注意力机制引入到目标检测领域。DETR凭借其简洁优雅的结构、超过Faster RCNN的准确率,吸引了越来越多的目标检测从业者开展视觉transformer的研究。

从前面对目标检测算法的回顾来看,我们可以看出目标检测算法实际上从繁到简,从粗到细而发展的。

从部件和训练技巧上来看:

  • 模型在候选区域的选择由anchor-based到anchor-free,实现了由bounding box学习到bounding box调整,再到把bbox转化为基于point/pixel的学习。
  • 模型在后处理的方式由传统nms发展到nms-free的时代。
  • 评价标准的iou也是在一步一步的涵盖更多有关两框之间的相对位置的学习,从一个数据计算过的过程转化网络自适应学习的过程,再到现在iou-free的时代。

从训练阶段来看:

  • 模型由最初传统的复杂流程到以为r-cnn为首的two-stage时代再到one-stage时代,是一个从简的过程,由非端到端再到端到端实现了模型的自主学习,模型速度由慢到快的进化。

从模型与特征来看:

  • 模型的发展可以概括为传统算法到cnn-based再到transformer-based,特征也是由原来的设计到抽象再到有关注的特征上。

尽管在过去的十年中,目标检测已经取得了很大的进步,但最好的检测器在性能上仍远未达到饱和。随着其应用程序在现实世界中的增加,对可部署在移动和嵌入式系统上的轻量级模型的需求将呈指数级增长。人们对这个领域越来越感兴趣,但它仍然是一个公开的挑战。在本文中,我们展示了两阶段、一阶段检测器是如何一步步发展并超越前期研究的。两阶段检测器通常更为准确,不过它们的速度更慢、难以满足类似自动驾驶这样的实时应用。然而,在过去几年里,一阶段检测器的发展改变了这个情况,其可以达到与前者等同的性能,而速度更快。正如图10所示,从目前的发展态势来看,视觉transformer必将进一步推动目标检测的快速进展。Swin Transformer也是迄今为止最精确的检测器。随着目前检测器在精度上出现的正向趋势,我们对更准确、更快的检测器抱有很高的希望。

以上内容仅供学习参考。

附本文主要参考链接(如有侵权,联系必删):

目标检测算法综述 – 知乎 (zhihu.com)

目标检测主流算法详解:从RCNN到DETR – 知乎 (zhihu.com)

2021深度学习目标检测综述_叶舟的博客-CSDN博客_2021目标识别

最新目标检测算法回顾2022笔记_xiaobai_Ry的博客-CSDN博客_目标检测最新进展

深度学习中的经典基础网络结构(backbone)总结_kuweicai的博客-CSDN博客_backbone 网络结构

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年3月4日 下午12:49
下一篇 2023年3月4日 下午12:50

相关推荐