目录
0、引言
目标检测领域发展至今已有二十余载,是计算机视觉的一个非常重要的核心方向,它的主要任务目标定位和目标分类。作为计算机视觉的基本问题之一,目标检测构成了许多其它视觉任务的基础,例如实例分割,图像标注和目标跟踪等等;从检测应用的角度看:行人检测、面部检测、文本检测、交通标注与红绿灯检测,遥感目标检测统称为目标检测的五大应用。
在深度学习介入该领域之前,传统的目标检测思路包括区域选择、手动特征提取、分类器分类。由于手动提取特征的方法往往很难满足目标的多样化特征,传统方法始终没能很好的解决目标检测问题。
深度学习兴起之后,神经网络可以从大量数据中自动学出强大的特征提取和拟合能力,因而涌现出很多性能优良的目标检测算法。基于深度学习的目标检测方法大致可分为三类:双阶段目标检测、单阶段目标检测、基于transformer的目标检测。
编者整理了近年来主流的目标检测算法,并对网上资料进行了整理,本文将对目标检测领域的发展做一个系统性的介绍,旨在为读者构建一个完整的知识体系架构,希望帮助自己和大家快速的了解目标检测相关的技术及其未来的发展趋势,有针对性的学习相关目标检测算法。
1、背景
1.1、问题描述
目标检测与分类、分割并称为CV的三大主要任务,他们之间的区别主要如下图所示。从任务的角度来看,目标检测可以看成是分类与分割任务的一座过度桥。这也是目标检测研究的重要性所在原因之一。
目标检测是目标分类的自然延伸,后者目的仅仅是识别图像中的目标。目标检测的目标是检测预定义类别的所有实例,并通过轴对齐框提供其在图像中的粗略定位。检测器应该能够识别对象类的所有实例,并在其周围绘制边界框(bounding box)。这通常被视为监督学习问题。现代对象检测模型可以访问大量的标记图像集以进行训练,并且在各种规范基准上进行评估。
1.2、目标检测的核心问题
从目标的定位角度出发,目标检测需要解决的核心问题主要有3个:
- 大小的多样性
同一张图像上可能同时出现多个不同或相同的目标,他们之间的大小差异大 - 位置的任意性
目标可以出现在图像的任意位置 - 形态的差异性
同一物体目标的形态差异可能很大,目标可能有各种不同的形状
1.3、目标检测中的关键挑战
在过去的十年里,计算机视觉已经取得了很大的进步,但是它仍然有一些重大的挑战需要克服。在实际应用中面临的一些关键挑战有:
从精度角度看:
从高准确度的角度来看,在现实场景中常见的挑战主要有:
- 类内的差异性
种类内自身材料、纹理、姿态等带来的多样性干扰,如黄色框图中椅子的制作材料及形态差异很大,但是它们都属于椅子的大类别 - 外部环境的干扰
外部环境带来的噪声干扰,比如蓝色框中光照、迷雾、遮挡等带来的识别及回归挑战。 - 类间的相似性
类间因纹理、姿态所带来的相似性干扰,比如黄色框图中是不同品种的动物,但是它们之间的差异又很小;这里实际上可以衍生为细粒度识别领域 - 集群小目标问题
集群目标检测所面临的数量多,类别多样化的问题,比如行人检测,遥感检测等。
从效率角度看:
目标检测是一个非常接地气的实际应用技术,它通常需要应用在实时处理的场景之中,比如自动驾驶系统。而且它还有可能需要同时处理成千上万的数据。因此,除了考虑高准确度还需要考虑处理时间,占用内存,消耗流量等方面的效率问题。如今的模型需要大量的计算资源来生成准确的检测结果,但在移动或边缘设备上,更为关键的是计算效率。
2、关于损失函数
传送门:目标检测算法回顾之IOU变体篇章
分类的损失函数:
3、关于IOU
传送门:目标检测算法回顾之IOU变体篇章
目标检测中IOU的发展:
- smooth L1 loss
- IOU
- GIOU
- DIOU
- CIOU
- EIOU
4、数据集以及评价指标
4.1、评价指标
目标检测器使用多种指标来评价检测器的性能,如:FPS、precision、recall,以及最常用的mAP。precision由IoU推导出来,后者的定义是预测边框和GT之间的交并比。然后,设定一个IoU阈值来判定检测结果是否正确:如果IoU大于阈值,则该结果分类为True Positive(TP),如果小于阈值,则分类为False Positive(FP)。如果模型没有检测出GT中存在的目标,则这些目标分类为False Negative(FN)。则precision和recall的定义如下:
基于上述定义,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文本格式。
5、目标检测发展脉络
5.1、目标检测算法分类
目标检测的发展脉络可以划分为两个周期:传统目标检测算法时期(1998年-2014年)和基于深度学习的目标检测算法时期(2014年-至今)。而基于深度学习的目标检测算法又发展成了四条技术路线:Anchor based方法(一阶段,二阶段)和Anchor free方法,基于Transformer的方法和基于NAS的方法。
从上面模型的发展来看,目标检测算法可以主要可以分为以下五类。其中,传统算法比较依赖于手工特征的设计。对基于Anchor的方法,可以从两个角度来看待其模型的发展,一是训练模式,二是Anchor的形状。从训练模式来看的话,基于anchor的目标检测模型主要可以分为One-stage和Two-stage模型。One-stage模型因为检测速率较快的优点多用于移动端场景,而Two-stage模型因为检测精度较高的优点多用于精装设备场景。从Anchor形态来看,对于不同的物体用更加贴合其自身形态的anchor会更加精确。其中,矩形和多边形多用于遥感和文字检测场景,而椭圆及圆形多用于遥感和医学领域。
5.2、目标检测发展概览
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层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
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。
- 选用比较小的卷积核(3x3),而之前无论 AlexNet 还是 LeNet5 都是采用较大的卷积核,比如 11x11, 7x7。而采用小卷积核的意义主要有两点,一是在取得相同的感受野的情况下,比如两个3x3的感受野和一个5x5的感受野的大小相同,但是计算量却小了很多,关于这点原文中有很详细的解释,建议直接看原文;第二点是两层3x3相比一层5x5可以引入更多的非线性,从而使模型的拟合能力更强,这点作者也通过实验进行了证明。其实这里还有一个优点就是采用小的卷积核更方便优化卷积计算,比如Winograd算法对小核的卷积操作有比较好的优化效果。
- 使用1x1的卷积核在不影响输入输出的维度情况下,通过ReLU进行非线性处理,提高模型的非线性。当然这个并非 VGGNet 首创,最先在 Network In Network中提出。
- 证明提高网络的深度能提高精度。
6.3、GoogleNet/Inception
GoogLeNet 由 Christian Szegedy 等于 2014年发表在 Going Deeper with Convolutions上。
尽管分类网络正在朝着更快、更精确的网络迈进,但由于它们是资源密集型的,在现实世界的应用中部署它们仍有很长的路要走。随着网络规模的扩大以获得更好的性能,计算成本呈指数级增长。Szegedy等人认为造成这种情况的主要原因是网络中计算的浪费,更大的模型通常有更多的参数量,并趋向于过拟合。他们提出用局部稀疏连接架构代替全连接架构,以解决这些问题。GoogleNet是一个22层