发展历程:物体检测的过去、现在和未来
上图简单描述了物体检测的发展历程时间轴。2012年深度学习热潮兴起,接着2013年有学者将深度学习应用到检测领域,开启了传统方法向深度学习的过渡转变。我将2019年之前的发展视为物体检测的过去,2019年至2020年看作检测的现在,2020年以后属于检测的未来。
2013年之前检测方法大多以传统方法为主,特征提取加分类器是那些年检测的重心所在,2013年至2016年是检测的飞速发展阶段,多种神经网络结构的问世大大改变了检测算法的格局。
2020年开始,新方向的引出,使得深度学习研究者燃起了新的希望,那么,在未来多少年内可以真正解决检测问题(How far from solving)呢,是当下众多学者所关心的问题。从工业界领域来看,算法的实用性仍有不足,比如自动驾驶中检测的结果存在不稳定的抖动,遮挡严重的场景下检测效果不佳等。
物体检测算法的评估标准常用AP(Average Precision)作为评价指标,AP会定义precision和recall两个指标。Precision是指检测结果的正确率,recall是指检测的召回率。
每个检测算法都可调整输出与groud truth之间匹配的IoU阈值,减小阈值,可以得到更高的recall,但同时precision也会有所下降,以recall为横轴,precision为纵轴可以画出一条曲线,AP就相当于对这条曲线求积分。
2014年,COCO数据集引入后,在原来的基础上提出新的评价标准mmAP,这个评价标准是先对所有类别的AP取平均得到mAP,然后再求0.5~0.95不同IoU阈值(step为0.05)下的mAP的均值得到最终mmAP。
在深度学习之前,传统方法主要分为特征提取和分类器设计两个阶段。具体操作为用滑动窗(sliding window)遍历整张图像,并对窗内的图像提取特征,再进行分类器检测。
特征提取阶段常用的方法有Haar、HOG、LBP、ACF等算子,常用的分类器有SVM、Boosting、Random Forest等。
传统方法的特征和分类器之间的关联较为微弱,但在深度学习中二者之间的联系更为紧密。一个卷积神经网络本身就具备特征提取能力,同时也具备分类的能力,因此深度学习很好的将特征和分类器整合在一起发挥更大的价值。
传统方法的特征是人工设计的,并且层次较浅,而深度学习网络的特征相对就更深一些,因此相对深度学习方法,传统方法的特征表达能力较为受限。但是,传统方法的一个好处在于层次简单因而方便调试(算法的可解释性较好)。
以下图的行人检测为例,从图像提取HOG特征,再把位置点乘上去,就可以得到很像人形的图片,可解释并且方便研究人员调试。
总结来看,深度学习之前的传统检测方法优缺点如下:
优点 |
缺点 |
1. 在CPU上较为有效; 2. 易于调试,可解释性强; 3. 适用于数据量较少的情况。 |
1. 在大数据集上的表现性能较为局限; 2. 难以利用GPU来进行并行加速。 |
2013年-2014年是基于深度学习的物体检测飞速发展的阶段,主要分成两类:一种是one stage,代表作有Densebox、YOLO、SSD以及RetinaNet等,另一种是two stage,代表作有RCNN系列、RFCN、FPN、MaskRCNN等。
One Stage和Two Stage的不同是,One Stage是给定一张图,直接分类回归,Two Stage是给定一张图,先提出一系列proposal(非背景区域),然后再在proposal上进行分类回归(对非背景区域进行更细化的检测)。
One Stage(单阶段法)
以Densebox算法为例,它的pipeline较为简单,图像经过CNN网络,在最后的feature map上的每个点直接生成一个框,然后进行回归。该方法在目标框有重叠(物体遮挡严重)时,不能正确的区分重叠的ground truth的归属性(算法中不容易进行assign)。
DenseBox的问题在于L2损失对尺度的鲁棒性不佳(UnitBox对此进行改进)、ground truth分配问题(SSD对此进行改进)、定位精度不佳(后续引入Two Stage方法进行优化)、误检测情况较为常见(后续引入Two Stage方法进行优化)。
YOLO算法的输入是一张图片,然后对图片进行网格化的分割,在每个网格中生成一个类别和两个目标框,然后将框的分类和回归统一到一个loss进行学习。Yolo后来又提出v2,v3,v4版本(甚至还出现有些争议的v5版本)。
SSD检测算法也是经典检测算法之一,引入了Anchor概念,在每个点上设置9个anchor,回归时基于每个anchor分别进行回归,并将位置坐标回归问题转化为框的offset回归问题。不仅如此,SSD还在多个不同深度的feature map层次上进行anchor的分类回归,因为较浅的feature map上的anchor更容易关注小物体。
然而,较浅的feature map的语义信息较少,这点在后续的DSSD、RON、RetinaNet中进行了改进,比如在工业界常用的RetinaNet虽然也是多层次特征,但是相比SSD,采用了先下采样再上采样的方法,语义信息也得到了保证。
对one stage方法的总结, one stage方法主要关注三点:
1.anchor的设计;
2.feature信息流的设计(多层次特征融合);
3.loss的设计以及sample(随机采样或者难例挖掘等)的设计。
Two stage精度高但是整体算法很复杂计算量大,因此该类的方法主要是在加速方面进行改进。RCNN算法在当时的检测领域是开创性的工作,当然也存在很多问题,如速度极慢以及没有端到端的优化。之后便相继提出了fast rcnn和faster rcnn,以softmax代替svm分类器,以RPN神经网络代替原始proposal生成网络。
之后,RFCN网络继续对速度进行优化,通过复用计算实现减小计算量的目的。在RFCN之后提出了Deformable Convolutional Networks,在网格上增添了一个可调整大小的offset,可以根据目的自适应的调整感受野,从而使得卷积的信息更为充分。
在Two Stage中还存在一个经典工作——FPN,现在FPN已经是一种非常常用的网络设计方式。后来提出的MaskRCNN,解决了ROIPooling的对齐问题并实现了多任务学习的目标(分类、检测、分割)。
总结来说,two stage方法主要关注两点:速度和性能。
2017年之后物体检测任务越走越难,陷入一个小低谷,已有的解决方法都较为成熟了,但实用性仍然不足。物体检测器的pipeline如下图所示,我们从这个框架的每个细节进行分析介绍。
Backbone 在早期的论文中,基本所有的backbone都是基于分类任务设计的,分类任务相比检测任务对特征的分辨率要求不高,其好处在于感受域很大,但空间上的损失也会很多,这对检测很不友好。
如果为了得到更多stage的高分辨率的feature,可以在网络添加额外的层(DetNet算法,如下图的最后两个16x层),但是这又会出现这些新层的随机初始化的问题。
Head 如何设计一个更好更快的head进行检测。Light head RCNN从head通道上入手,通过减少channel数来提升速度,当然之后还有ThunderNet的继续改进等。
Pretraining 在分类任务上的预训练迁移到检测上会有很多问题,因此引入专门针对检测而设计的数据集——Objects365,该数据集量级为69万张图,V2版本有大约200万张图,每个检测框都会完整地进行标注,这对训练目标检测网络来说较为友好。同时,如果在检测任务上预训练再迁移到检测,还可以把head预训练,这也是通过预训练来提高性能的重要的点。
Scale 以人脸检测为例,人脸的尺度变化非常大。在之前的工作中,我们可以通过像SSD、FPN那种,采用多层feature来融合预测或者直接在图像预处理上进行缩放到不同尺度来训练。SFace算法是对于处理人脸检测任务中尺度变化较为有效的方法,其将anchor-based和anchor-free两种方法结合,前者可以对一些标准尺寸的人脸表现良好,后者可以对一些非标准的人脸进行自适应。
Batchsize 早期的工作如R-CNN、Faster RCNN、RetinaNet、Mask RCNN等都会将batchsize设定的很小,但这也会引出很多问题,比如小batchsize会导致训练时间增加、统计不准确、正负样本不均衡等。于是2018年,有人提出了MegDet算法解决了batchsize较小的问题。
Crowd 以密集场景的行人检测为例,遮挡问题非常严重,如何采用更好的策略解决遮挡下的检测问题也是目标检测领域很有意思的话题。
现在的物体检测方向可以从3个角度描述:
对于upper bound,课中主要介绍了MegDetV2和EfficientDet两篇工作,前者融合检测和分割任务,后者是用NAS搜索网络。
对于few shot,有些类别物体天生数据量少,因此希望用较少的数据量(小样本)得到较好的检测性能。Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector这篇论文提出了一个通用的小样本目标检测模型,不需要重新训练或者fine-tuning就能识别新种类的目标。这类领域有很多相关工作可以参考。