目标检测算法简介

本博客简要介绍基于卷积神经网络的目标检测(object detection)算法,介绍常见的目标检测算法背后的基本思想,并简要回顾基于深度学习算法的发展历史——R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD简介等。

1、滑窗法

滑窗法(Sliding Window)的思路很简单,首先需要一个已经训练好的分类器,然后把图像按照一定间隔和不同的大小分成一个个窗口,在这些窗口上执行分类器,如果得到较高的分数,就认为是检测到了物体。把每个窗口都用分类器执行一遍后,再对得到的分数做一些后处理,如非极大值抑制(NMS)等,最后就得到了物体类别和对应区域。

滑动窗口(从右到左,从上到下)

滑动窗法非常简单,但是效率却极其低下,尤其还要考虑物体的长宽比。

2、PASCAL VOC、mAP和IOU

        PASCAL VOC,全称是Pattern Analysis Statistical Modelling and Computational Learning,Visual Object Classes,是一套用于评估图像分类、检测、分割和人体姿势动作等的数据集,当然更多的是被用作物体检测。PASCAL VOC包含4大类共20个细分类别,分别是人、动物(鸟、猫、牛、狗、马、羊)、交通工具(飞机、自行车、船、大巴、轿车、摩托车、火车)、室内(瓶子、椅子、餐桌、盆栽、沙发、电视/显示器)。

直观上讲,评价一个检测算法的时候,主要看两个标准,即是否正确预测了框内的物体类别;预测的框和人工标注框的重合程度。这两个标准的量化指标分别是mAP(mean Average Precision)和IOU(Intersection Over Union)。

mAP翻译过来是平均精度均值,其中AP是通过P-R曲线衡量模型的一个指标,也可以理解为P-R曲线围起来的面积。mAP是指把每个类别的AP都单独拎出来,然后计算所有类别AP的平均值,代表着对检测到的目标平均净度的一个综合评价。

IOU是用来衡量预测的物体框和真实框的重合程度。重合度的计算方法是用人工标注框和模型预测框重合的面积,除以两个框并集所占的面积,所以叫做交并比。如下图所示:

3、选择性搜索和R-CNN简介

滑窗法相当于对一张图像上的子区域进行类似穷举式的搜索,一般情况下这种低效率搜索的区域里大部分都是没有任何物体的。所以一个很自然的想法就是只对图像中最有可能包含物体的区域进行搜索,进而提升物体检测的效率。在这种思路中,最为熟知的是Selective Search方法。

扫描二维码关注公众号,回复: 4576121 查看本文章

Selective Search的思路是,可能存在物体的区域都应该是有某种相似性的或连续的区域。针对这两个特点,Selective Search采用的是超像素合并的思路,首先用分割算法在图像上产生很多的小区域,也就是最基础的子区域,或者可以看做是超像素。然后根据这些区域之间的相似性进行区域合并,成为大一点的区域。衡量相似性的标准可以是颜色、纹理、大小等。不断迭加这种小区域合并为大区域的过程,最后整张图会合并成为一个区域。其实无论是滑窗还是Selective Search,这种找出可能包含物体的区域的方法,统称为Region Proposal。

 我们不使用暴力方法,而是用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI

可以看到Selective Search和滑窗法相比第一个优点就是高效,因为不在是漫无目的的穷举式搜索。另外,在Selective Search中,一开始的区域是小区域,合并过程中不断产生大区域,所以天然能够包含各种大小不同的疑似物体框。另外计算相似度采用了多样性的指标,提升了找到物体的可靠性。

R-CNN

有了ss高效的寻找到可能包含物体的方框,那么接下来只要接个CNN提取特征,然后做个分类就相当于对物体检测了。这就是R-CNN,当然直接用ss未必准确,还加入了一些改进,如和物体标注框的位置的回归来修正ss提出的原始框。

R-CNN 利用候选区域方法创建了约 2000 个 ROI。这些区域被转换为固定大小的图像,并分别馈送到卷积神经网络中(将原始图像根据ROI切割、reshape再送进NN学习)。该网络架构后面会跟几个全连接层,以实现目标分类并提炼边界框。

使用候选区域、CNN、仿射层来定位目标。以下是 R-CNN 整个系统的流程图:

边界框回归器

候选区域方法有非常高的计算复杂度。为了加速这个过程,我们通常会使用计算量较少的候选区域选择方法构建 ROI,并在后面使用线性回归器(使用全连接层)进一步提炼边界框。使用回归方法将蓝色的原始边界框提炼为红色的

从RCNN到SSD,这应该是最全的一份目标检测算法盘点

4、SPP、ROI Pooling和Fast R-CNN简介

R-CNN虽然比起滑窗法快了许多,但是可用性还是很差,因为一个靠谱的识别任务最起码需要采用ss提供上千个框(R-CNN是2000个)。这上千个区域都需要单独过一遍卷积神经网络进行前向计算,速度自然快不了。

1)SPP和ROI Pooling简介

思路:对整张图像执行一次卷积神经网络的前向计算,到了最后一层的激活响应图的时候,通过某种方式把目标物体所在区域部分的响应图拿过来作为特征给分类器。这样做对画面内所有可能物体的检测就可以共享一次卷积神经网络的前向计算,大大节省时间。第一个在物体检测中实现这个思路的就是当时还在MSRA的Kaiming He提出的SPP,称为空间金字塔池化(Spatial Pyramid Pooling)。

如上图为金字塔池化和ROI池化

假设输入图片中框住的小马和摄影师的两个框是SS选出来的框,那么经过了卷积神经网络,到了最后一层输出的n个通道的响应图时,原图像上也会对应两个区域,这样的区域称为感兴趣区域(ROI)。一般常用的分类器都需要输入固定的维度,所以如果有一种方式可以把ROI信息都转化为固定维度的向量,那么就能把每个ROI都给分类器去计算获得结果,并且在进入分类器之间,只需要运行一次卷积神经网络的前向计算,所有的ROI都共享同样的响应图。

SPP就是这样一个方法,对于每一个ROI,如上图,SPP分层将指定区域划分为不同数目,图中分为3个层次,最底层划分为4x4=16个子区域,中间层2x2=4个,最顶层则直接整个区域进行池化,对于每个通道,每个ROI变成了一个21维的向量,因为有n个通道,所以每个ROI都生成了一个21n维的向量。因为越是底层划分的数目越多,SPP是通过像金字塔一样的结构来获得感兴趣区域不同尺度的信息,所以叫空间金字塔池化。借助SPP,不仅实现了对ROI的分类,而且对于整张图像只需要进行一次卷积神经网络的前向计算,大幅度降低了算法执行时间。

在SPP中,包含信息最多的其实就是最底层,所以另一个思路就是直接把ROI划分成固定大小,并不分层。如把所有ROI区域池化到7x7的大小,再送入分类器,这就是ROI Pooling。

2)Fast R-CNN

R-CNN 需要非常多的候选区域以提升准确度,但其实有很多区域是彼此重叠的,因此 R-CNN 的训练和推断速度非常慢。如果我们有 2000 个候选区域,且每一个都需要独立地馈送到 CNN 中,那么对于不同的 ROI,我们需要重复提取 2000 次特征。(R-CNN很多卷积运算是重复的

  此外,CNN 中的特征图以一种密集的方式表征空间特征,那么我们能直接使用特征图代替原图来检测目标吗?

Fast R-CNN 使用特征提取器(CNN)先提取整个图像的特征,而不是从头开始对每个图像块提取多次。然后,我们可以将创建候选区域的方法直接应用到提取到的特征图上。例如,Fast R-CNN 选择了 VGG16 中的卷积层 conv5 输出的 Feture Map 来生成 ROI,这些关注区域随后会结合对应的特征图以裁剪为特征图块,并用于目标检测任务中。我们使用 ROI 池化将特征图块转换为固定的大小,并馈送到全连接层进行分类和定位。因为 Fast-RCNN 不会重复提取特征,因此它能显著地减少处理时间。

将候选区域直接应用于特征图,并使用 ROI 池化将其转化为固定大小的特征图块

以下是 Fast R-CNN 的流程图:

5、Faster R-CNN

Fast R-CNN 依赖于外部候选区域方法,如选择性搜索。但这些算法在 CPU 上运行且速度很慢。在测试中,Fast R-CNN 需要 2.3 秒来进行预测,其中 2 秒用于生成 2000 个 ROI。

Faster R-CNN 采用与 Fast R-CNN 相同的设计,只是它用内部深层网络代替了候选区域方法。新的候选区域网络(RPN)在生成 ROI 时效率更高,并且以每幅图像 10 毫秒的速度运行。

外部候选区域方法换成了内部深层网络

  • 候选区域网络(RPN)

候选区域网络(RPN)将第一个卷积网络的输出特征图作为输入。它在特征图上滑动一个 3×3 的卷积核,以使用卷积网络(如下所示的 ZF 网络)构建与类别无关的候选区域。其他深度网络(如 VGG 或 ResNet)可用于更全面的特征提取,但这需要以速度为代价。ZF 网络最后会输出 256 个值,它们将馈送到两个独立的全连接层,以预测边界框和两个 objectness 分数,这两个 objectness 分数度量了边界框是否包含目标。我们其实可以使用回归器计算单个 objectness 分数,但为简洁起见,Faster R-CNN 使用只有两个类别的分类器:即带有目标的类别不带有目标的类别

RPN首先对基础网络的最后一层卷积响应图,按照执行一次n*n卷积,输出指定通道数的响应图。这步相当于用滑窗法对响应图进行特征提取,在论文中n的大小为3,也就是3*3的窗口大小。然后对得到的响应图的每个像素分别进入两个全连接层:一个计算该像素对应位置是否有物体的分数,输出是或否的分数,所以有两个输出;另一个计算物体框的二维坐标和大小,所以有4个输出。其中对于每一个n*n卷积输出的响应图像素,都尝试用中心在该像素位置,不同大小和不同长宽比的窗口作为anchor box,回归物体框坐标和大小的网络是在anchor box基础上做offset。所以假设有k个anchor box,则计算是否有物体分数的输出实际有2k个,计算物体框坐标和大小的输出实际有4k个。如下图所示。

6、YOLO和SSD简介

从R-CNN到Faster R-CNN,这一系列的方法始终都是基于Region Proposal的。而不用Region Proposal的方法也有很多研究,其中最具代表性的就是YOLO和SSD。

1)YOLO

YOLO全程You Only Look Once,只需一瞥就可以感知出认识的物体,YOLO希望能够达到这种简单高效的检测。执行速度快是YOLO最大的特点,达到非常高效的检测,其背后是YOLO原理和实现上的简单。

YOLO的基本思想是把一幅图片划分为一个s*s的小格子,以每个格子所在位置和对应内容为基础,来预测:

(1)物体框,包含物体框中心相对格子中心的坐标(x,y)和物体框的宽w和高h,每个格子预测B个物体框;

(2)每个物体框是否有物体的置信度,其中当前这个格子中如果包含物体,则置信度的分数为当前预测的物体框和标注物体框的IOU,否则置信度分数为0;

(3)每个格子预测一共C个类别的概率分数,并且这个分数和物体框是不相关的,只是基于这个格子。

综上所述,每个格子需要输出对的信息维度是B*(4+1)+C=B*5+C。在论文中B为2,C是PASCAL VOC的类别数为20,所以每个格子预测的信息维度是2*5+20=30.格子数S为7,所以最后得到的关于物体预测的信息是一个7*7*30的张量。原理示意图如下图所示:

一幅图片首先缩放为一个正方形的图片,论文中是448*448,然后送进一个卷积神经网络,到最后一层卷积响应图的时候,接两层全连接层,输出(并Reshape)是7*7*30,对应前面提到的7*7*30的张量。最后从这7*7*30的张量中提取出来的物体框和类别的预测信息经过NMS,就得到了最终的物体检测结果。和基于Region Proposal方法不同之处在于,YOLO就是一个单纯的卷积神经网络,把物体检测转化成了单纯的回归问题,端到端的味道比R-CNN更加纯正。没有了Region Proposal和对每个ROI的单独计算,再加上利用GPU对计算响应图的并行处理,执行效率得到了极大提升。

YOLO速度提升了,但是精度要比RCNN系列逊色一些,原因是基于格子回归物体框的方式也在一定程度上限制了物体框位置和大小的灵活性。另外7*7的格子并不能将画面划分为足够精细的区域,如在一个格子对应的区域内如果同时出现多个小物体就比较麻烦了。

2)SSD

SSD全称是Single Shot multibox Detector,算是同时借鉴了YOLO和Faster R-CNN思想的方法。可以在达到实时检测速度的水平下,仍然保持很高的检测精度。和YOLO相近的是,SSD也会在卷积神经网络的最后阶段,得到S*S的响应图。然后是和Faster R-CNN相近的地方,SSD会基于每个格子的位置借鉴anchor box的思想生成默认的物体框。

与Faster R-CNN相比,SSD并没有Region Proposal+对ROI分类的两步框架,所以叫Single Shot,其实从这个角度来说YOLO也是一种Single Shot的检测方法。与YOLO相比,SSD的主要改进是从一个分辨率较大的响应图开始,逐渐得到分辨率更低的响应图,每个分辨率下的响应图都作为产生物体类别分数和物体框的格子,这样就得到了不同大小感受野对应的局部图像信息。如图所示。

图中是一幅输入图像经过基础网络后,得到了8*8的响应图,然后经过这组响应图的每个像素位置会产生类似anchor box那样k个默认物体框,其中每个框的大小和位置的修正量对应4个数值,每个框内物体所属类别对应C个数值,所以用一个通道数为(C+4)k的卷积得到预测的框和结果。8*8的响应图进一步卷积可以得到4*4的响应图,这个响应图中的每个像素对应更大的感受野,如图中右下的两个图所示。对于这个4*4的响应图也可以用同样的办法得到(C+4)k通道的卷积响应作为预测结果,注意不同的响应图上,k的取值可以不同。在SSD中k的取值策略也是不同大小和不同长宽比,最常见的配置如图左下角所示,取4个默认物体框,或者让长宽比更夸张一些多取两个,即一共6个。

在SSD论文中,基于VGG16的基础模型在300*300输入分辨率下,得到的conv5是38*38的响应图,每个像素上取k=4,经过进一步降采样分别得到19*19、10*10、和5*5的响应图,对这3个响应图取k=6,最后继续降低采样得到3*3和1*1的响应图,取k=4,则每个类别一共得到38*38*4+(19*19+10*10+5*5)*6+(3*3+1*1)*4=8732个默认物体框。而YOLO默认配置448*448的分辨率,最后7*7的格子上每个格子默认预测2个物体框,每个类别一共是7*7*2=98个物体框。SSD-300比起YOLO输入的分辨率更低,但是感受野的精细程度更高,而且默认物体框的数量高出了快两个量级,结果就是执行速度和精度的双双提升。

训练SSD的思路就是和其他流行方法一样,两种loss,一种用来分类,一种用来定位。

猜你喜欢

转载自blog.csdn.net/qq_37902216/article/details/85000603