这段时间做了一些关于目标检测的工作,把近期写和摘录的东西整理一下贴在这里,可能会有些零碎。

什么是目标检测(Object Detection)

目标检测是计算机视觉领域的传统任务。与较为单纯的图像识别问题不同,目标检测任务不仅要在给定的图像上识别出存在的物体,给出物体的所属类别,还需要将该物体的位置通过bounding box给出。在众多的计算机视觉任务中,目标检测处于一个非常重要与基础的地位,许多的工作都需要在目标检测的基础上进行展开。

目标检测任务对人来说是一个非常自然的过程,人脑可以在极短的时间内对给定的图像进行目标检测,给出相应物体的位置和分类,甚至还能从语义级进行精细的分割和描述。而与人不同,计算机中的图片的保存格式究根结底是一串由0和1组成的二进制数据。从更高层次来看,被呈现在显示器中的图片组成为一个个的像素点,每个像素点由数个0-255的数组组成。人脑尚且是个黑盒,如何处理计算机中的图片数据就成了一个巨大的问题。因为没有直接方法可以通过图像数据拿到图像中存在物体的高层次语义,也无法直接定位物体出现在图像的位置,因为图像是千变万化的,目标可能出现在图像的任何地方,出现的形态也有着很多的可能,背景也可能千差万别。所以对于计算机来说,目标检测直觉上是一个比较困难的问题。

传统的目标检测算法

传统的目标检测方法一般分为三个阶段:首先使用一些算法,如Selective Search算法[1],在给定的图像上进行区域选择,将那些潜在可能存在目标的区域选择出来。

然后对这些选择得到的区域进行特征提取。如在传统方法中,人脸检测常用Harr特征,而行人与普通目标检测常用HOG特征[6]等。但由于目标的形态、颜色、光照情况、背景的多样性,设计出相关鲁棒的特征是比较困难的。

最后使用提取的特征对所选定的区域进行分类,因此特征的提取情况直接影响到最终检测结果的好坏。常用的分类器有支持向量机等。

传统目标检测中,DPM(多尺度形变部件模型)表现的较为优秀。该方法将物体当作多个部件的组合体,如人脸由五官所组成,利用部件间的关系来描述物体[2]。因为符合许多非刚体特征,该方法在多个数据集上表现较好,连续夺得过VOC2007-2009年间的目标检测冠军。

值得一提的是Selective Search算法,因为该算法在后续基于深度方法的目标检测问题上也被广泛采用过用于初步区域选择,但因为复杂度太高,最终被被全网络的方法所取代。

Selective Search算法的输入为许多小region,其思路为计算所有region的两两相似度,选择相似度最高的一组进行合并,将合并后的region继续进行以上操作,直到整个图像合并成为一个region,由此得到了一个层次关系。对每个region分别进行打分,最后选择top k得分进行输出作为可能存在物体的区域,打分策略详见论文。

Selective Search算法的输入region由Graph-Based Image Segmentation方法给出。

Graph-Based Image Segmentation

1.计算所有像素不相似度(RGB距离、亮度距离等)
2.由小到大排序所有边
3.按顺序合并所有边连接顶点不属于同区域且不相似度不大于两区域内不相似度
4.更新阈值及类编号
5.重复直到遍历所有顶点

具体步骤如下:

初始化一个相似集合为空集: S=∅
计算所有相邻区域之间的相似度(相似度函数之后会重点分析),放入集合 S 中,集合 S 保存的其实是一个区域对以及它们之间的相似度。
找出 S 中相似度最高的区域对,将它们合并,并从 S 中删除与它们相关的所有相似度和区域对。重新计算这个新区域与周围区域的相似度,放入集合 S 中,并将这个新合并的区域放入集合 R 中。重复这个步骤直到 S 为空。
从 R 中找出所有区域的 bounding box(即包围该区域的最小矩形框),这些 box 就是物体可能的区域。
优先合并以下四种区域:

  • 颜色(颜色直方图)相近的
  • 纹理(梯度直方图)相近的
  • 合并后总面积小的
  • 合并后,总面积在其BBOX中所占比例大的

基于深度的方法

传统的目标检测存在一些问题,如区域检测的时间复杂度很高,且很难针对性的进行目标的搜寻。另一方面,手工设计的特征对于物体的多样性变化、复杂物体等的鲁棒性并不强,且随着检测任务的推广,设计特征变得越来越复杂。

近年来,随着计算机硬件进步,深度学习方法得到了极大发展。针对目标检测问题,特别是上文中提到的几个传统方法中存在的问题,深度学习均有着很好的表现。

整体来看,基于深度方法的目标检测算法可以分为两类,一类是将目标检测问题转化为分类问题来解决;另一类是将目标检测问题转化为回归问题来解决。

基于分类的方法

基于分类的方法比较有代表性的工作是Ross B. Girshick与2014年提出的R-CNN[3],该方法首次将卷积神经网络应用在目标检测领域,并通过 Fast R-CNN[4]、Faster R-CNN[5]这一系列后续工作,将目标识别任务从仅用CNN做特征提取,发展成为使用CNN进行特征提取、Softmax进行分类(Fast R-CNN),最后发展为使用神经网络直接完成从区域检测、特征提取、分类的所有工作并实现了End to End的训练,因为引入用于目标检测的RPN网络相较于Selective Search算法的优异性能表现,Faster R-CNN方法基本实现了接近实时的目标检测。

R-CNN:

R-CNN模型使用Selective Search算法对输入图像进行候选区域的划分,对候选区域使用在大型数据集(如ImageNet ILSVC 2012)上预训练过的CNN模型进行特征提取,得到feature map;将该feature map送入SVM分类器进行分类工作,同时训练一个回归网络对候选区域的bounding box进行精修,让其更加贴合ground truth。

该模型在PASCAL VOC 2012 数据集上进行微调后,相对于联合语义分割器[8]和DPM检测器的SegDPM方法[7],使用同样Selective Search的UVA系统取得了巨大的进步。特别是对比于使用了Selective Search作为区域推荐算法的UVA系统,R-CNN模型在VOC 2012数据集上取得了53.7%的mAP,而使用densely sampled SIFT, Extended OpponentSIFT, RGBSIFT 等descriptor,SVM分类器的UVA系统的mAP
仅为35.1%。

R-CNN在ILSVRC2013数据集上依然取得了良好的结果,在ILSVRC2013比赛中,实现了31.4%的mAP,大幅领先于第二位OverFeat方法的24.3%[10]。

Fast R-CNN:

尽管R-CNN在检测性能上大幅度领先于传统方法,但是仍然存在着训练和检测耗时较长,流程繁琐等问题。针对以上问题,Ross等人在2015年推出了R-CNN的改进框架Fast R-CNN。

Fast R-CNN仍然使用Selective Search提取候选区域,但抛弃了原有的单独提取特征步骤,而是将输入图像使用预训练网络提取为feature map,将候选区域直接映射为feature map上的相应区域。引入K. He等提出的SSPnets的一种特例region of interest(RoI)layer将不同大小和比例的feature map上的区域统一映射为相同维度的特征向量,并抛弃SVM直接采用Softmax进行分类。

因为避免了大量重复的特征提取步骤,在论文测试条件下,Fast R-CNN模型相比于R-CNN的训练时间从84小时缩减为9.5小时,单张图片的检测时间快了146倍。同时在VOC 2012上取得了65.7%的mAP,高于R-CNN的53.7%,但在VOC 2010上的66.1%mAP略低于SegDeepM[12]的67.2%。

Faster R-CNN

尽管Fast R-CNN在训练与检测速度上大幅领先于R-CNN,但是在实际的应用场景中,Fast R-CNN仍然无法满足对检测的实时性需求。在这种需求的推动下。Faster R-CNN应运而生。

Ross等[5]在对存在的系列方法进行分析后,发现区域推荐算法,如使用的最多的Selective Search算法,占据了大量的CPU时间,影响了算法的整体性能;于是他们提出了Region Proposal Networks(RPNs),将区域推荐也整合进了网络,实现了端到端的纯网络实现。

在共享卷积层的情况下,RPN的测试时开销小到可以忽略不计(10ms/图),远远领先于传统的区域推荐算法。同时全网络实现的结构能够在GPU中完成整个计算,大大提升了速度,节约了数据传递开销。

RPN带来的性能提升也是惊人的,在测试中,使用VGG16作为特征提取网络的RPN+FastR-CNN结构能够实现5fps的检测速度;而SS+FastR-CNN的速度仅为0.5fps。若将VGG替换为ZF[13],检测性能更是可以达到17fps,接近于实时检测的需求。

基于回归的方法

之前基于分类的目标检测算法采用的方案的思路大体上可以分为两步:首先在图像上检测出许多不同尺寸的bounding box,再通过相应的分类器对bounding box内的区域进行评估,确定是否存在某类物体。

而基于回归的方法不同,该类方法把目标检测问题当作回归问题进行处理,所以不需要显式地对其进行划分和分类,而是使用网络直接对输入图像进行处理,输出检测出目标的分类、位置和置信度。
基于回归的目标检测代表性方法有YOLO[14]和基于YOLO发展出来的SSD[15]。

YOLO

YOLO将输入图像划分为SxS个网格,如果一个物体中心落在某网格内,则该网格负责检测该物体。训练和测试时,每个网格预测B个bounding boxes,其中包括该bounding box的坐标和对应分类的置信度。

YOLO的网络结构受到了GoogLeNet[18]的启发,采用了24个卷积层,2个全连接层,预训练阶段使用前20层进行预训练,如图所示:

在VOC 2007和VOC 2012数据集上YOLO在45FPS的检测速率下实现了63.4%的mAP,而其网络精简版Fast YOLO则实现了高达155FPS,mAP仍有52.7%,这一结果远远领先于Sadeghi等人先前提出的实时目标检测系统DPM[16],后者在30FPS速率下的mAP仅为26.1%。

SSD:

YOLO模型虽然速度很快,但是存在着一些缺陷;如每个网格仅能预测一个目标,相邻目标容易产生漏检;对于物体的尺度较为敏感,对尺度变化较大的物体泛化能力差;对小目标检测效果不佳等[15]。

故SSD综合了YOLO和Faster R-CNN的anchor box思路,不再使用统一固定大小的cell,而是在不同层的feature map cell上划分出不同长宽比的default box,不同层的feature map上具有不同的感受野,这样能够有效兼顾不同尺度的目标。

这样的改进带来的效果是惊人的,SSD512模型在VOC与COCO[17]混合数据集上的表现高达80.0%mAP,相比Faster R-CNN的75.9%高出了4.1%。而在另一项VOC 2007的对比中,SSD512比Faster R-CNN高出了3.6%的mAP的同时,实现了22fps的检测速率,而Faster R-CNN仅有7fps。

R-CNN相关的一些零碎

这段时间主要细读的是R-CNN这一方法的发展历程,从R-CNN到Fast R-CNN到Faster R-CNN再到Mask R-CNN。这一方法的演进有着清晰的脉络,实现出来的效果也是非常棒的,几乎都是当时的state of the art,漂亮的解决了从目标检测到Segmentation的系列工作。

说一下思路的演进:
首先R-CNN引入CNN对SS算法得到的候选区域进行特征提取,提取得到的特征向量训练SVM进行分类。
R-CNN速度慢的主要瓶颈在于特征的重复提取,于是Fast R-CNN引入了RoI Layer,对于一张图片仅仅需要提取一次特征,将不同的区域按照CNN的比例放缩关系映射至特征图上,使用RoI layer将不同形状和大小的特征区域统一变换为相同的特征向量,再送入Softmax直接进行分类。

但是Fast R-CNN还是不够快,瓶颈在于复杂度高的SS算法上,在Faster R-CNN中,引入了RPN网络实现了全网络的算法实现。RPN使用滑动窗口机制,使用给定的滑动窗口在最高层feature map上进行一次滑动(本质上是一个卷积层),使用anchor机制生成覆盖原图的多长宽比的Region Proposal。

Anchor机制如下图,使用每个滑动窗口的中心点作为anchor,通过卷积关系将anchor映射回原图,使用给定好的比例和图像的大小标定anchor box。论文中,3x3的滑动窗口对应的每个特征区域同时预测输入图像3种尺度(128,256,512),3种长宽比(1:1,1:2,2:1)的Region Proposal。

从上图可以看出,RPN的滑动窗口机制天然地可以被一个卷积核为3x3的卷积层表示。然后分别送入两个全连接层进行分类,得到2k个分类结果,分别对应每个anchor box可能为前景与背景的概率。4k个回归结果,是anchor box相对于ground-truth bounding box坐标的偏移量。

接着,对所有的anchor box计算其与真实位置标签的IoU,即anchor box与真实标签所交面积与所并面积之比,即重叠度。按照以下规则对anchor box进行标记:
1. 将与每个真实标记框(ground-truth bounding box)重叠最大的anchor box标记为正样本,这是为了保证每个ground-truth bounding box至少对应一个正例。
2. 再把每个和ground-truth bounding box的IoU值超过0.7的anchor box标记为正例。
3. 与所有ground-truth bounding box的IoU均不超过0.3的标记为负例,其余anchor box丢弃,跨越图片边界的也丢弃。
完成标记工作后,所得到的正负例就可用作训练集对RPN进行训练了。

一些相关工作

为了应付一门课程作业做的人体小目标检测,使用了Faster R-CNN框架,Clone自yhenon/keras-frcnn。该实现使用的是Keras,非常方便快捷的库,推荐。

具体的改动与训练思路为:将论文中默认的anchor size:[128, 256, 512],修改为[64, 128, 256, 512]。因为考虑到小目标本身占图片面积较小,默认anchor size不能很好的覆盖相应的尺寸,故使用了一个更小的参数。另一方面,训练采用VOC 2012数据集,仅使用了Person这一标签的样本。

在NVIDIA P40上跑了大概20h,不得不吐槽的是Tensorflow比Caffe在速度上还是慢了不少,但最终训练出来的效果还是比较令人满意:


作为对比,这是Faster R-CNN作者提供的基于Caffe的原预训练模型检测效果:

References

[1] Van de Sande, Koen EA, et al. “Segmentation as selective search for object recognition.” Computer Vision (ICCV), 2011 IEEE International Conference on. IEEE, 2011.
[2] Felzenszwalb, Pedro, David McAllester, and Deva Ramanan. “A discriminatively trained, multiscale, deformable part model.” Computer Vision and Pattern Recognition, 2008. CVPR 2008. IEEE Conference on. IEEE, 2008.
[3] Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2014.
[4] Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE international conference on computer vision. 2015.
[5] Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in neural information processing systems. 2015.
[6] N. Dalal and B. Triggs. Histograms of oriented gradients for human detection. In CVPR, 2005.
[7] S. Fidler, R. Mottaghi, A. Yuille, and R. Urtasun. Bottom-up segmentation for top-down detection. In CVPR, 2013.
[8] J. Carreira, R. Caseiro, J. Batista, and C. Sminchisescu. Semantic segmentation with second-order pooling. In ECCV, 2012.
[9] J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selective search for object recognition. IJCV, 2013.
[10] P. Sermanet, D. Eigen, X. Zhang, M. Mathieu, R. Fergus, and Y. LeCun. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks. In ICLR, 2014.
[11] K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV, 2014.
[12] Y. Zhu, R. Urtasun, R. Salakhutdinov, and S. Fidler. segDeepM: Exploiting segmentation and context in deep neural networks for object detection. In CVPR, 2015.
[13] M. D. Zeiler and R. Fergus, “Visualizing and understanding convolutional neural networks,” in European Conference on Computer Vision (ECCV), 2014.
[14] Redmon, J., Divvala, S., Girshick, R., Farhadi, A.: You only look once: Unified, real-time object detection. In: CVPR. (2016)
[15] Liu, Wei, et al. “Ssd: Single shot multibox detector.” European conference on computer vision. Springer, Cham, 2016.
[16] M. A. Sadeghi and D. Forsyth. 30hz object detection with dpm v5. In Computer Vision–ECCV 2014, pages 65–79. Springer, 2014.
[17] COCO: Common Objects in Context. http://mscoco.org/dataset/ #detections-leaderboard (2016) [Online; accessed 25-July-2016].
[18] C. Szegedy, W. Liu, Y. Jia, P. Sermanet, S. Reed,D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich. Going deeper with convolutions. CoRR, abs/1409.4842, 2014.