目标检测是很多计算机视觉任务的基础,不论我们需要实现图像与文字的交互还是需要识别精细类别,它都提供了可靠的信息。本文对目标检测进行了整体回顾,第一部分介绍基于候选区域的目标检测器,通常也称为Two-stage算法,包括RCNN,Fast R-CNN、Faster R-CNN 和 R-FPN等。第二部分则重点讨论了包括YOLO、SSD在内的端对端的目标检测器,也称One-stage,它们都是目前最为优秀的方法。
two-stage检测算法,其将检测问题划分为两个阶段,首先产生候选区域(region proposals),然后对候选区域分类(一般还需要对位置精修),two-stage算法在准确度上有优势。
首先,为了评估定位精度,需要计算IoU(Intersection over Union,介于0到1之间),其表示预测框与真实框(ground-truth box)之间的重叠程度。IoU越高,预测框的位置越准确。
对于二分类,AP(Average Precision),对于目标检测,首先要单独计算各个类别的AP值,这是评估检测效果的重要指标。N个样本中有M个正例,那么我们会得到M个recall值(1/M, 2/M, …, M/M),对于每个recall值r,该recall阈值时top-n所对应的最大precision,然后对这M个precision值取平均即得到最后的AP值。
取各个类别的AP的平均值,就得到一个综合指标mAP(Mean Average Precision),mAP指标可以避免某些类
别比较极端化而弱化其它类别的性能这个问题。 C为类的数目
区域选择方法:
法一:用候选区域方法ROI(region proposal method)创建目标检测的感兴趣区域,也就是我们常见的用候选框遍历图片产生。
法二:选择性搜索(selective search,SS)
R-CNN 利用候选区域方法创建了约 2000 个 ROI。这些区域被转换为固定大小的图像,并分别馈送到卷积神经网络中。然后得到的特征向量被送入一个多类别SVM分类器中,预测出候选区域中所含物体的属于每个类的概率值。每个类别训练一个SVM分类器,从特征向量中推断其属于该类别的概率大小。为了提升定位准确性,R-CNN最后又训练了一个边界框回归模型。该网络架构后面会跟几个全连接层,以实现目标分类并提炼边界框。R-CNN是非常直观的,就是把检测问题转化为了分类问题,并且采用了CNN模型进行分类,但是效果却很好。流程图如下:
边界框回归器
候选区域方法有非常高的计算复杂度。为了加速这个过程,我们通常会使用计算量较少的候选区域选择方法构建 ROI,并在后面使用线性回归器(使用全连接层)进一步提炼边界框。蓝色的原始边界框提炼为红色的
因为R-CNN 需要非常多的候选区域来提升准确度,但其实有很多区域是彼此重叠的,因此 R-CNN 的训练和推断速度非常慢。如果我们有 2000 个候选区域,且每一个都需要独立地馈送到 CNN 中,那么对于不同的 ROI,我们需要重复提取 2000 次特征。这造成了运算时间大大的浪费。
实现流程图如下:
Fast R-CNN 使用特征提取器(CNN)先提取整个图像的特征,而不是从头开始对每个图像块提取多次。然后,我们可以将创建候选区域的方法直接应用到提取到的特征图上。例如,Fast R-CNN 选择了 VGG16 中的卷积层 conv5 来生成 ROI,这些关注区域随后会结合对应的特征图以裁剪为特征图块,并用于目标检测任务中。其根据候选区域按比例从CNN特征图中找到对应的特征区域,然后将其分割成几个子区域(根据要输出的特征图的大小),然后在每个子区域应用max pooling,从而得到固定大小的特征图,这个过程是可导的。我们使用 ROI 池化将特征图块转换为固定的大小,并馈送到全连接层进行分类和定位。因为 Fast-RCNN 不会重复提取特征。
综上,计算量巨大的ROI不断经过CNN卷积进行特征提取过程地循环取消了,因此速度得到显著提升。Fast R-CNN 的训练速度是 R-CNN 的 10 倍,推断速度是后者的 150 倍。因此它能显著地减少处理时间。
同时,Fast R-CNN 最重要的一点就是包含特征提取器、分类器和边界框回归器在内的整个网络能通过多任务损失函数进行端到端的训练,这种多任务损失即结合了分类损失和定位损失的方法,大大提升了模型准确度。
它的流程图为:
可以从图中可以看出,Faster-Rcnn与之前几种网络所不同的是,它采用了一种新的候选区域提取方法,RPN网络,这是它的最大特色。
Fast R-CNN采用选择性搜索(ss), 需要 2.3 秒来进行预测,其中 2 秒用于生成 2000 个 ROI。Faster R-CNN 采用与 Fast R-CNN 相同的设计,只是它用新的候选区域网络代替了候选区域方法。新的候选区域网络(RPN)在生成 ROI 时效率更高,并且以每幅图像 10 毫秒的速度运行。
它的实现如下图所示:
对于RPN网络,先采用一个CNN模型(一般称为特征提取器)接收整张图片并提取特征图。然后在这个特征图上采用一个N×N(图中是3×3)的滑动窗口,对于每个滑窗位置都映射一个低维度的特征。然后这个特征分别送入两个全连接层,一个用于分类预测,另外一个用于回归。对于每个窗口位置一般设置k个不同大小或比例的先验框(anchors, default bounding boxes),提出anchors也是其一大特点,这意味着每个位置预测k个候选区域(region proposals),也就是图中的k个anchors。对于分类层,其输出大小是2k,仅区分背景与物体。表示各个候选区域包含物体或者是背景的概率值,而回归层输出4k,输出其候选区域的坐标信息。
例如下图所示:
上图展示了一个 8×8 的特征图,有一个 3×3 的卷积核执行运算,它最后输出 8×8×3 个 ROI(其中 k=3)。下图(右)展示了单个位置的 3 个候选区域。
RPN网络是可以单独训练的,并且单独训练出来的RPN模型给出很多候选区。由于先验框数量庞大,RPN预测的候选区域很多是重叠的,要先进行NMS(non-maximum suppression,IoU阈值设为0.7)操作来减少候选区域的数量,然后按照置信度降序排列,选择top-N个region proposals来用于训练Fast R-CNN模型。RPN的作用就是代替了Selective search的作用,但是速度更快,因此Faster R-CNN无论是训练还是预测都可以加速。
总的来说:Faster R-CNN : Faster R-CNN = RPN + Fast R-CNN
全卷积网络,就是全部是卷积层,而没有全连接层(fc),具体是怎么实现的呢,我们接下来介绍。
论文作者首先对位置敏感性进行了讨论:
目标检测的第1部分通常使用的都是像VGG、GoogleNet、ResNet之类的基础分类网络,这些网络的计算都是所有RoIs共享的,在一张图片上面进行测试的时候只需要进行一次前向计算即可。而对于第2部分的RoI-wise subnetwork,它却不是所有RoIs共享的,主要的原因是因为这一部分的作用是“对每个RoI进行分类和回归”,所以不能进行共享计算。那么问题就处在这里,首先第1部分的网络具有“位置不敏感性”,而如果我们将一个分类网络比如ResNet的所有卷积层都放置在第1部分用来提取特征,而第2部分则只剩下全连接层,这样的目标检测网络是位置不敏感的,所以其检测精度会较低,而且这样做也会浪费掉分类网络强大的分类能力(does not match the network's superior classification accuracy)。而将RoI Pooling层不再放置在ResNet网络的最后一层卷积层之后而是放置在了“卷积层之间”,会牺牲测试速度。
R-FCN,把ROI-pooling层放到了前面的卷积层,然后后面的卷积层不共享计算,这样一可以避免过多的信息损失,二可以用后来的卷积层学习位置信息。
从图中可以看到,R-CNN的ROI区域全部进行了深度卷积网络计算,Faster R-CNN的ROI只进行了10层的计算,而R-FCN的ROI都不进行。R-FCN 就是通过减少每个 ROI 所需的计算量实现加速。上图可以看出基于区域的特征图获取与 ROI 是独立的,可以在每个 ROI 之外单独计算。剩下的工作就比较简单了,因此 R-FCN 的速度比 Faster R-CNN 快。
R-FCN提出了一种特殊的ROI pooling从下图中就可以看出,它将ROI区域分为3*3块,分别对每一小块进行评分计算,判断其分类状况。R-FCN的前半部分为一个RPN网络。
其不需要候选区域阶段,直接产生物体的类别概率和位置坐标值
Faster R-CNN的方法目前是主流的目标检测方法,但是速度上并不能满足实时的要求。YOLO(You Only Look Once)一类的方法慢慢显现出其重要性,这类方法使用了回归的思想,即给定输入图像,直接在图像的多个位置上回归出这个位置的目标边框以及目标类别。
YOLO将物体检测作为一个回归问题进行求解,输入图像经过一次inference,便能得到图像中所有物体的位置和其所属类别及相应的置信概率。而rcnn/fast rcnn/faster rcnn将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。YOLO 的速度非常快,比 R-CNN 快 1000 倍,比 Fast R-CNN 快 100 倍。
它的实现流程为:
1、将图像resize到448 * 448作为神经网络的输入
2、运行神经网络,得到一些bounding box坐标、box中包含物体的置信度和class probabilities
3、进行非极大值抑制,筛选Boxes
实现流程图为:
YOLO检测网络包括24个卷积层和2个全连接层,实际上这7*7就是划分的网格数,现在要在每个网格上预测目标两个可能的位置以及这个位置的目标置信度和类别,也就是每个网格预测两个目标,每个目标的信息有4维坐标信息(中心点坐标+长宽),1个是目标的置信度,还有类别数20(VOC上20个类别),总共就是(4+1)*2+20 = 30维的向量。而且由于每个网络预测目标窗口时使用的是全图信息,使得false positive比例大幅降低(充分的上下文信息)。但是YOLO也存在问题:没有了Region Proposal机制,只使用7*7的网格回归会使得目标不能非常精准的定位,这也导致了YOLO的检测精度并不是很高。
YOLO 对相互靠的很近的物体,还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
同一类物体出现的新的不常见的长宽比和其他情况时,泛化能力偏弱。
由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
YOLO使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。那是不是可以结合Region Proposal的思想实现精准一些的定位?SSD结合YOLO的回归思想以及Faster R-CNN的anchor机制做到了这点。使用Faster R-CNN的anchor机制。
总的来说:
在之前的Faster-RCNN中,特征向量都是从最后一层的Feature Maps上得到的,对于这种单一的特征层而言,感受野是十分有限的,没有完全利用好前面几级的特征网络。在SSD中,作者从CONV4_3开始,利用多级Feature Maps的组合作为分类和回归的依据,达到了论文中提到的多尺度的效果。SSD使用低层feature map检测小目标,使用高层feature map检测大目标,这也应该是SSD的突出贡献了,它的流程图为:
从图中可以看出,SSD将VGG16的FC6和FC7层转化为卷积层,如图,去掉所有的Dropout层和FC8层;浅层卷积层对边缘更加感兴趣,可以获得一些细节信息,而深层网络对由浅层特征构成的复杂特征更感兴趣,可以获得一些语义信息,对于检测任务而言,一幅图像中的目标有复杂的有简单的,对于简单的patch我们利用浅层网络的特征就可以将其检测出来,对于复杂的patch我们利用深层网络的特征就可以将其检测出来,因此,如果我们同时在不同的feature map上面进行目标检测,理论上面应该会获得更好的检测效果。
每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。在yolo v1中,只在最后一个卷积层上做目标位置和类别的训练和预测,这是SSD相对于yolo能提高准确率的一个关键所在。SSD在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。