关于作者:@李家丞
同济大学数学系本科在读,现为格灵深瞳算法部实习生。
作者个人主页:李家丞|个人主页|关于我
导言:目标检测的任务表述
如何从图像中解析出可供计算机理解的信息,是机器视觉的中心问题。深度学习模型由于其强大的表示能力,加之数据量的积累和计算力的进步,成为机器视觉的热点研究方向。
那么,如何理解一张图片?根据后续任务的需要,有三个主要的层次。
图像理解的三个层次
一是分类(Classification),即是将图像结构化为某一类别的信息,用事先确定好的类别 (string) 或实例 ID 来描述图片。这一任务是最简单、最基础的图像理解任务,也是深度学习模型最先取得突破和实现大规模应用的任务。其中,ImageNet 是最权威的评测集,每年的 ILSVRC 催生了大量的优秀深度网络结构,为其他任务提供了基础。在应用领域,人脸、场景的识别等都可以归为分类任务。
二是检测(Detection)。分类任务关心整体,给出的是整张图片的内容描述,而检测则关注特定的物体目标,要求同时获得这一目标的类别信息和位置信息。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因而,检测模型的输出是一个列表,列表的每一项使用一个数据组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。
三是分割(Segmentation)。分割包括语义分割(semantic segmentation)和实例分割(instance segmentation),前者是对前背景分离的拓展,要求分离开具有不同语义的图像部分,而后者是检测任务的拓展,要求描述出目标的轮廓(相比检测框更为精细)。分割是对图像的像素级描述,它赋予每个像素类别(实例)意义,适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。
本系列文章关注的领域是目标检测,即图像理解的中层次。
两阶段模型因其对图片的两阶段处理得名,也称为基于区域(Region-based)的方法,我们选取 R-CNN 系列工作作为这一类型的代表。
Rich feature hierarchies for accurate object detection and semantic segmentation
论文链接:
https://arxiv.org/abs/1311.2524
本文的两大贡献:
1)CNN 可用于基于区域的定位和分割物体;
2)监督训练样本数紧缺时,在额外的数据上预训练的模型经过 fine-tuning 可以取得很好的效果。
第一个贡献影响了之后几乎所有 2-stage 方法,而第二个贡献中用分类任务(Imagenet)中训练好的模型作为基网络,在检测问题上 fine-tuning 的做法也在之后的工作中一直沿用。
传统的计算机视觉方法常用精心设计的手工特征 (如 SIFT, HOG) 描述图像,而深度学习的方法则倡导习得特征,从图像分类任务的经验来看,CNN 网络自动习得的特征取得的效果已经超出了手工设计的特征。本篇在局部区域应用卷积网络,以发挥卷积网络学习高质量特征的能力。
R-CNN 网络结构
R-CNN 将检测抽象为两个过程,一是基于图片提出若干可能包含物体的区域(即图片的局部裁剪,被称为 Region Proposal),文中使用的是 Selective Search 算法;二是在提出的这些区域上运行当时表现最好的分类网络(AlexNet),得到每个区域内物体的类别。
另外,文章中的两个做法值得注意。
IoU 的计算
一是数据的准备。输入 CNN 前,我们需要根据 Ground Truth 对提出的 Region Proposal 进行标记,这里使用的指标是 IoU(Intersection over Union,交并比)。IoU 计算了两个区域之交的面积跟它们之并的比,描述了两个区域的重合程度。
文章中特别提到,IoU 阈值的选择对结果影响显著,这里要谈两个 threshold,一个用来识别正样本(如跟 ground truth 的 IoU 大于 0.5),另一个用来标记负样本(即背景类,如 IoU 小于 0.1),而介于两者之间的则为难例(Hard Negatives),若标为正类,则包含了过多的背景信息,反之又包含了要检测物体的特征,因而这些 Proposal 便被忽略掉。
另一点是位置坐标的回归(Bounding-Box Regression),这一过程是 Region Proposal 向 Ground Truth 调整,实现时加入了 log/exp 变换来使损失保持在合理的量级上,可以看做一种标准化(Normalization) 操作。
R-CNN 的想法直接明了,即将检测任务转化为区域上的分类任务,是深度学习方法在检测任务上的试水。模型本身存在的问题也很多,如需要训练三个不同的模型(proposal, classification, regression)、重复计算过多导致的性能问题等。尽管如此,这篇论文的很多做法仍然广泛地影响着检测任务上的深度模型革命,后续的很多工作也都是针对改进这一工作而展开,此篇可以称得上 "The First Paper"。
Fast R-CNN
论文链接:
https://arxiv.org/abs/1504.08083
文章指出 R-CNN 耗时的原因是 CNN 是在每一个 Proposal 上单独进行的,没有共享计算,便提出将基础网络在图片整体上运行完毕后,再传入 R-CNN 子网络,共享了大部分计算,故有 Fast 之名。
Fast R-CNN 网络结构
上图是 Fast R-CNN 的架构。图片经过 feature extractor 得到 feature map, 同时在原图上运行 Selective Search 算法并将 RoI(Region of Interset,实为坐标组,可与 Region Proposal 混用)映射到到 feature map 上,再对每个 RoI 进行 RoI Pooling 操作便得到等长的 feature vector,将这些得到的 feature vector 进行正负样本的整理(保持一定的正负样本比例),分 batch 传入并行的 R-CNN 子网络,同时进行分类和回归,并将两者的损失统一起来。
RoI Pooling 图示,来源:https://blog.deepsense.ai/region-of-interest-pooling-explained/
RoI Pooling 是对输入 R-CNN 子网络的数据进行准备的关键操作。我们得到的区域常常有不同的大小,在映射到 feature map 上之后,会得到不同大小的特征张量。RoI Pooling 先将 RoI 等分成目标个数的网格,再在每个网格上进行 max pooling,就得到等长的 RoI feature vector。
文章最后的讨论也有一定的借鉴意义:
multi-loss traing 相比单独训练 classification 确有提升
multi-scale 相比 single-scale 精度略有提升,但带来的时间开销更大。一定程度上说明 CNN 结构可以内在地学习尺度不变性
在更多的数据 (VOC) 上训练后,精度是有进一步提升的
Softmax 分类器比 "one vs rest" 型的 SVM 表现略好,引入了类间的竞争
更多的 Proposal 并不一定带来精度的提升
Fast R-CNN 的这一结构正是检测任务主流 2-stage 方法所采用的元结构的雏形。
文章将 Proposal, Feature Extractor, Object Classification&Localization 统一在一个整体的结构中,并通过共享卷积计算提高特征利用效率,是最有贡献的地方。
Faster R-CNN: Towards Real Time Object Detection with Region Proposal Networks
论文链接:
https://arxiv.org/abs/1506.01497
Faster R-CNN 是 2-stage 方法的奠基性工作,提出的 RPN 网络取代 Selective Search 算法使得检测任务可以由神经网络端到端地完成。粗略的讲,Faster R-CNN = RPN + Fast R-CNN,跟 RCNN 共享卷积计算的特性使得 RPN 引入的计算量很小,使得 Faster R-CNN 可以在单个 GPU 上以 5fps 的速度运行,而在精度方面达到 SOTA(State of the Art,当前最佳)。
本文的主要贡献是提出 Regional Proposal Networks,替代之前的 SS 算法。RPN 网络将 Proposal 这一任务建模为二分类(是否为物体)的问题。
Faster R-CNN 网络结构
第一步是在一个滑动窗口上生成不同大小和长宽比例的 anchor box(如上图右边部分),取定 IoU 的阈值,按 Ground Truth 标定这些 anchor box 的正负。于是,传入 RPN 网络的样本数据被整理为 anchor box(坐标)和每个 anchor box 是否有物体(二分类标签)。
RPN 网络将每个样本映射为一个概率值和四个坐标值,概率值反应这个 anchor box 有物体的概率,四个坐标值用于回归定义物体的位置。最后将二分类和坐标回归的损失统一起来,作为 RPN 网络的目标训练。
由 RPN 得到 Region Proposal 在根据概率值筛选后经过类似的标记过程,被传入 R-CNN 子网络,进行多分类和坐标回归,同样用多任务损失将二者的损失联合。
Faster R-CNN 的成功之处在于用 RPN 网络完成了检测任务的 "深度化"。使用滑动窗口生成 anchor box 的思想也在后来的工作中越来越多地被采用(YOLO v2 等)。这项工作奠定了 "RPN+RCNN" 的两阶段方法元结构,影响了大部分后续工作。
单阶段模型没有中间的区域检出过程,直接从图片获得预测结果,也被成为 Region-free 方法。
You Only Look Once: Unified, Real-Time Object Detection
论文链接:
https://arxiv.org/abs/1506.02640
YOLO 是单阶段方法的开山之作。它将检测任务表述成一个统一的、端到端的回归问题,并且以只处理一次图片同时得到位置和分类而得名。
YOLO 的主要优点:
快。
全局处理使得背景错误相对少,相比基于局部(区域)的方法, 如 Fast RCNN。
泛化性能好,在艺术作品上做检测时,YOLO 表现比 Fast R-CNN 好。
YOLO 网络结构
YOLO 的工作流程如下:
1. 准备数据:将图片缩放,划分为等分的网格,每个网格按跟 Ground Truth 的 IoU 分配到所要预测的样本。
2. 卷积网络:由 GoogLeNet 更改而来,每个网格对每个类别预测一个条件概率值,并在网格基础上生成 B 个 box,每个 box 预测五个回归值,四个表征位置,第五个表征这个 box 含有物体(注意不是某一类物体)的概率和位置的准确程度(由 IoU 表示)。测试时,分数如下计算:
等式左边第一项由网格预测,后两项由每个 box 预测,以条件概率的方式得到每个 box 含有不同类别物体的分数。 因而,卷积网络共输出的预测值个数为 S×S×(B×5+C),其中 S 为网格数,B 为每个网格生成 box 个数,C 为类别数。
3. 后处理:使用 NMS(Non-Maximum Suppression,非极大抑制)过滤得到最后的预测框
YOLO 的损失函数分解,来源:https://zhuanlan.zhihu.com/p/24916786
损失函数被分为三部分:坐标误差、物体误差、类别误差。为了平衡类别不均衡和大小物体等带来的影响,损失函数中添加了权重并将长宽取根号。
YOLO 提出了单阶段的新思路,相比两阶段方法,其速度优势明显,实时的特性令人印象深刻。但 YOLO 本身也存在一些问题,如划分网格较为粗糙,每个网格生成的 box 个数等限制了对小尺度物体和相近物体的检测。
SSD: Single Shot Multibox Detector
论文链接:
https://arxiv.org/abs/1512.02325
SSD 网络结构
SSD 相比 YOLO 有以下突出的特点:
多尺度的 feature map:基于 VGG 的不同卷积段,输出 feature map 到回归器中。这一点试图提升小物体的检测精度。
更多的 anchor box,每个网格点生成不同大小和长宽比例的 box,并将类别预测概率基于 box 预测(YOLO 是在网格上),得到的输出值个数为 (C+4)×k×m×n,其中 C 为类别数,k 为 box 个数,m×n 为 feature map 的大小。
SSD 是单阶段模型早期的集大成者,达到跟接近两阶段模型精度的同时,拥有比两阶段模型快一个数量级的速度。后续的单阶段模型工作大多基于 SSD 改进展开。
最后,我们对检测模型的基本特征做一个简单的归纳。
两阶段检测模型 Pipeline,来源:https://tryolabs.com/blog/2018/01/18/faster-r-cnn-down-the-rabbit-hole-of-modern-object-detection/
检测模型整体上由基础网络(Backbone Network)和检测头部(Detection Head)构成。前者作为特征提取器,给出图像不同大小、不同抽象层次的表示;后者则依据这些表示和监督信息学习类别和位置关联。检测头部负责的类别预测和位置回归两个任务常常是并行进行的,构成多任务的损失进行联合训练。
检测模型头部并行的分支,来源同上
相比单阶段,两阶段检测模型通常含有一个串行的头部结构,即完成前背景分类和回归后,把中间结果作为 RCNN 头部的输入再进行一次多分类和位置回归。这种设计带来了一些优点:
对检测任务的解构,先进行前背景的分类,再进行物体的分类,这种解构使得监督信息在不同阶段对网络参数的学习进行指导
RPN 网络为 RCNN 网络提供良好的先验,并有机会整理样本的比例,减轻 RCNN 网络的学习负担
这种设计的缺点也很明显:中间结果常常带来空间开销,而串行的方式也使得推断速度无法跟单阶段相比;级联的位置回归则会导致 RCNN 部分的重复计算(如两个 RoI 有重叠)。
另一方面,单阶段模型只有一次类别预测和位置回归,卷积运算的共享程度更高,拥有更快的速度和更小的内存占用。读者将会在接下来的文章中看到,两种类型的模型也在互相吸收彼此的优点,这也使得两者的界限更为模糊。
目标检测模型本源上可以用统计推断的框架描述,我们关注其犯第一类错误和第二类错误的概率,通常用准确率和召回率来描述。准确率描述了模型有多准,即在预测为正例的结果中,有多少是真正例;召回率则描述了模型有多全,即在为真的样本中,有多少被我们的模型预测为正例。不同的任务,对两类错误有不同的偏好,常常在某一类错误不多于一定阈值的情况下,努力减少另一类错误。在检测中,mAP(mean Average Precision)作为一个统一的指标将这两种错误兼顾考虑。
具体地,对于每张图片,检测模型输出多个预测框(常常远超真实框的个数),我们使用 IoU(Intersection Over Union,交并比)来标记预测框是否为预测正确。标记完成后,随着预测框的增多,召回率总会提升,在不同的召回率水平下对准确率做平均,即得到 AP,最后再对所有类别按其所占比例做平均,即得到 mAP。
在较早的 Pascal VOC 数据集上,常采用固定的一个 IoU 阈值(如 0.5, 0.75)来计算 mAP,现阶段较为权威的 MS COCO 数据集上,对不同的 IoU 阈值(0.5-0.95,0.05 为步长)分别计算 AP,再综合平均,并且给出了不同大小物体分别的 AP 表现,对定位准确的模型给予奖励并全面地展现不同大小物体上检测算法的性能,更为科学合理。
在实践中,我们不仅关注检测模型的精度,还关注其运行的速度,常常用 FPS(Frame Per Second,每秒帧率)来表示检测模型能够在指定硬件上每秒处理图片的张数。通常来讲,在单块 GPU 上,两阶段方法的 FPS 一般在个位数,而单阶段方法可以达到数十。现在检测模型运行的平台并不统一,实践中也不能部署较为昂贵的 GPU 进行推断。事实上,很多文章并没有严谨讨论其提出模型的速度表现(加了较多的 trick 以使精度达到 SOTA),另外,考虑到目前移动端专用芯片的发展速度和研究进展,速度方面的指标可能较难形成统一的参考标准,需要谨慎看待文章中汇报的测试结果。
自 2005 年起每年举办一次比赛,最开始只有 4 类,到 2007 年扩充为 20 个类,共有两个常用的版本:2007 和 2012。学术界常用 5k 的 trainval2007 和 16k 的 trainval2012 作为训练集(07+12),test2007 作为测试集,用 10k 的 trainval2007+test2007 和和 16k 的 trainval2012 作为训练集(07++12),test2012 作为测试集,分别汇报结果。
Pascal VOC 对早期检测工作起到了重要的推动作用,目前提升的空间相对有限,权威评测集的交接棒也逐渐传给了下面要介绍的 COCO。
检测任务在 COCO 数据集上的进展
COCO 数据集收集了大量包含常见物体的日常场景图片,并提供像素级的实例标注以更精确地评估检测和分割算法的效果,致力于推动场景理解的研究进展。依托这一数据集,每年举办一次比赛,现已涵盖检测、分割、关键点识别、注释等机器视觉的中心任务,是继 ImageNet Chanllenge 以来最有影响力的学术竞赛之一。
iconic 与 non-iconic 图片对比
相比 ImageNet,COCO 更加偏好目标与其场景共同出现的图片,即 non-iconic images。这样的图片能够反映视觉上的语义,更符合图像理解的任务要求。而相对的 iconic images 则更适合浅语义的图像分类等任务。
COCO 的检测任务共含有 80 个类,在 2014 年发布的数据规模分 train/val/test 分别为 80k/40k/40k,学术界较为通用的划分是使用 train 和 35k 的 val 子集作为训练集(trainval35k),使用剩余的 val 作为测试集(minival),同时向官方的 evaluation server 提交结果(test-dev)。除此之外,COCO 官方也保留一部分 test 数据作为比赛的评测集。
COCO 数据集分布
在分布方面,COCO 的每个类含有更多实例,分布也较为均衡(上图 a),每张图片包含更多类和更多的实例(上图 b 和 c,均为直方图,每张图片平均分别含 3.3 个类和 7.7 个实例),相比 Pascal VOC,COCO 还含有更多的小物体(下图,横轴是物体占图片的比例)。
COCO 数据集物体大小分布
如本文第一节所述,COCO 提供的评测标准更为精细化,提供的 API 不仅包含了可视化、评测数据的功能,还有对模型的错误来源分析脚本,能够更清晰地展现算法的不足之处。COCO 所建立的这些标准也逐渐被学术界认可,成为通用的评测标准。您可以在这里找到目前检测任务的 LeaderBoard。
错误来源分解,详见 http://cocodataset.org/#detections-eval
Cityscapes 数据示例
Cityscapes 数据集专注于现代城市道路场景的理解,提供了 30 个类的像素级标注,是自动驾驶方向较为权威的评测集。
本节介绍常见的提升检测模型性能的技巧,它们常作为 trick 在比赛中应用。其实,这样的名称有失公允,部分工作反映了作者对检测模型有启发意义的观察,有些具有成为检测模型标准组件的潜力(如果在早期的工作中即被应用则可能成为通用做法)。读者将它们都看作学术界对解决这一问题的努力即可。对研究者,诚实地报告所引用的其他工作并添加有说服力的消融实验(ablation expriments)以支撑自己工作的原创性和贡献之处,则是值得倡导的行为。
数据增强是增加深度模型鲁棒性和泛化性能的常用手段,随机翻转、随机裁剪、添加噪声等也被引入到检测任务的训练中来,其信念是通过数据的一般性来迫使模型学习到诸如对称不变性、旋转不变性等更一般的表示。通常需要注意标注的相应变换,并且会大幅增加训练的时间。个人认为数据(监督信息)的适时传入可能是更有潜力的方向。
输入图片的尺寸对检测模型的性能影响相当明显,事实上,多尺度是提升精度最明显的技巧之一。在基础网络部分常常会生成比原图小数十倍的特征图,导致小物体的特征描述不容易被检测网络捕捉。通过输入更大、更多尺寸的图片进行训练,能够在一定程度上提高检测模型对物体大小的鲁棒性,仅在测试阶段引入多尺度,也可享受大尺寸和多尺寸带来的增益。
multi-scale training/testing 最早见于 [1],训练时,预先定义几个固定的尺度,每个 epoch 随机选择一个尺度进行训练。测试时,生成几个不同尺度的 feature map,对每个 Region Proposal,在不同的 feature map 上也有不同的尺度,我们选择最接近某一固定尺寸(即检测头部的输入尺寸)的 Region Proposal 作为后续的输入。在 [2] 中,选择单一尺度的方式被 Maxout(element-wise max,逐元素取最大)取代:随机选两个相邻尺度,经过 Pooling 后使用 Maxout 进行合并,如下图所示。
使用 Maxout 合并 feature vector
近期的工作如 FPN 等已经尝试在不同尺度的特征图上进行检测,但多尺度训练 / 测试仍作为一种提升性能的有效技巧被应用在 MS COCO 等比赛中。
这一技巧在 ResNet 的工作 [3] 中提出,做法是把整张图片作为一个 RoI,对其进行 RoI Pooling 并将得到的 feature vector 拼接于每个 RoI 的 feature vector 上,作为一种辅助信息传入之后的 R-CNN 子网络。目前,也有把相邻尺度上的 RoI 互相作为 context 共同传入的做法。
微调法和投票法由工作 [4] 提出,前者也被称为 Iterative Localization。微调法最初是在 SS 算法得到的 Region Proposal 基础上用检测头部进行多次迭代得到一系列 box,在 ResNet 的工作中,作者将输入 R-CNN 子网络的 Region Proposal 和 R-CNN 子网络得到的预测框共同进行 NMS(见下面小节)后处理,最后,把跟 NMS 筛选所得预测框的 IoU 超过一定阈值的预测框进行按其分数加权的平均,得到最后的预测结果。投票法可以理解为以顶尖筛选出一流,再用一流的结果进行加权投票决策。
OHEM(Online Hard negative Example Mining,在线难例挖掘) 见于 [5]。两阶段检测模型中,提出的 RoI Proposal 在输入 R-CNN 子网络前,我们有机会对正负样本(背景类和前景类)的比例进行调整。通常,背景类的 RoI Proposal 个数要远远多于前景类,Fast R-CNN 的处理方式是随机对两种样本进行上采样和下采样,以使每一 batch 的正负样本比例保持在 1:3,这一做法缓解了类别比例不均衡的问题,是两阶段方法相比单阶段方法具有优势的地方,也被后来的大多数工作沿用。
OHEM 图解
但在 OHEM 的工作中,作者提出用 R-CNN 子网络对 RoI Proposal 预测的分数来决定每个 batch 选用的样本,这样,输入 R-CNN 子网络的 RoI Proposal 总为其表现不好的样本,提高了监督学习的效率。实际操作中,维护两个完全相同的 R-CNN 子网络,其中一个只进行前向传播来为 RoI Proposal 的选择提供指导,另一个则为正常的 R-CNN,参与损失的计算并更新权重,并且将权重复制到前者以使两个分支权重同步。
OHEM 以额外的 R-CNN 子网络的开销来改善 RoI Proposal 的质量,更有效地利用数据的监督信息,成为两阶段模型提升性能的常用部件之一。
NMS 后处理图示
NMS(Non-Maximum Suppression,非极大抑制)是检测模型的标准后处理操作,用于去除重合度(IoU)较高的预测框,只保留预测分数最高的预测框作为检测输出。Soft NMS 由 [6] 提出。在传统的 NMS 中,跟最高预测分数预测框重合度超出一定阈值的预测框会被直接舍弃,作者认为这样不利于相邻物体的检测。提出的改进方法是根据 IoU 将预测框的预测分数进行惩罚,最后再按分数过滤。配合 Deformable Convnets(将在之后的文章介绍),Soft NMS 在 MS COCO 上取得了当时最佳的表现。算法改进如下:
Soft-NMS 算法改进
上图中的 f 即为软化函数,通常取线性或高斯函数,后者效果稍好一些。当然,在享受这一增益的同时,Soft-NMS 也引入了一些超参,对不同的数据集需要试探以确定最佳配置。
RoIAlign 是 Mask R-CNN([7])的工作中提出的,针对的问题是 RoI 在进行 Pooling 时有不同程度的取整,这影响了实例分割中 mask 损失的计算。文章采用双线性插值的方法将 RoI 的表示精细化,并带来了较为明显的性能提升。这一技巧也被后来的一些工作(如 light-head R-CNN)沿用。
除去上面所列的技巧外,还有一些做法也值得注意:
更好的先验(YOLOv2):使用聚类方法统计数据中 box 标注的大小和长宽比,以更好的设置 anchor box 的生成配置
更好的 pre-train 模型:检测模型的基础网络通常使用 ImageNet(通常是 ImageNet-1k)上训练好的模型进行初始化,使用更大的数据集(ImageNet-5k)预训练基础网络对精度的提升亦有帮助
超参数的调整:部分工作也发现如 NMS 中 IoU 阈值的调整(从 0.3 到 0.5)也有利于精度的提升,但这一方面尚无最佳配置参照
最后,集成(Ensemble)作为通用的手段也被应用在比赛中。
本篇文章里,我们介绍了检测模型常用的标准评测数据集和训练模型的技巧,上述内容在溯源和表述方面的不实之处也请读者评论指出。从下一篇开始,我们将介绍检测领域较新的趋势,请持续关注。