一文搞懂目标检测

一、计算机视觉四大任务

  • 分类任务(Classification):需要解决图片内容“是什么”的问题,即判断图片包含什么类别。
  • 定位(Location):需要解决图片内的目标“在哪里”的问题,即定位出图片内的目标的位置。
  • 检测(Detection):需要解决图片内容“是什么,在哪里”的问题,即定位出目标的的位置以及判断目标的类别。
  • 分割(Segmentation):分为实例的分割和场景分割,解决“每一个像素属于哪个目标物或场景”的问题。

二、目标检测

**目标检测: **是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小。

过去的十多年来看,自然图像的目标检测算法都是基于传统手工特征的时期,自2013年起至今,为基于深度学习的目标检测时期。下图为目标检测基于深度学习技术的发展历程,下面将分别对这些算法和其中采用的技术进行介绍。

1.相关概念

(1)交并比IOU

如下图绿色框是人工标注的ground truth,红色框是目标检测算法最终给出的结果bounding box,显然绿色框对于飞机这个物体检测的更加准确,IOU正是表达这种bounding box和ground truth的差异的指标。

IOU定义了两个目标检测面积的重叠度,当算法给出的框和人工标注的框差异很小时,或者说重叠度(IOU)很大时,可以说算法产生的bounding box(简写bbox)就很准确。如下图所示,矩形框A、B的一个重合度IOU计算公式为:IOU=(A∩B)/(A∪B)

:如果以下概念看不懂,可以直接看RCNN部分,然后再返回查看。

(2)非极大值抑制NMS

目标检测算法一般会给出目标很多的粗略结果,我们需要通过非极大值抑制方法,把其他冗余的结果经进行排除,消除多余的框,找到最佳的bbox。如下图所示,红色框表示含有多个目标区域,通过非极大值抑制,将其他冗余目标区域删除,得到绿色的目标区域。

具体过程如下:
假设根据分类器的得到的分类概率大小为: A<B<C<D<E<F

  • 从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
  • 假设B、D与F的重叠度超过阈值,即说明B、D、F目标区域都很相似,A、C、E是其他的目标区域,那么就扔掉B、D;并标记第一个矩形框F,即仅仅留下概率最大的。
  • 从剩下的矩形框A、C、E中(其他目标区域),选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
    就这样一直重复,找到所有被保留下来的矩形框,由于我们设置了交并比,每个保存的矩形框仅仅代表一个目标,即如果图片里面有两个目标,则最后仅仅保存两个bbox

(3)边界回归(Bounding-box regression )

根据前面的概念可知,每个目标最后会有一个Bounding-box,如下图红色框目标所示,绿色框为人工标注的最佳目标区域。但是由前面介绍的IOU指标可知,这里算法给出的红色框可以认为是检测失败的,因为它和绿色的ground truth的 IOU值小于了0.5(目测……),也就是说重叠度不够,目标检测不准确。此时就需要对这个红色框进行微调。使得经过微调后的窗口跟Ground Truth 更接近 ,即边界框回归。

如下图所示,红色的框 P 代表原始的目标区域,绿色的框 G代表人工标注的最佳区域,边界框回归的目标是:寻找一种关系使得输入原始的窗口 P 经过映射得到一个跟真实窗口 G 更接近的回归窗口G^,由于这个过程涉及很多公式推导,所以此处不详细阐述。

2.R-CNN

RCNN(Regions with CNN features)是将CNN卷积神经网络应用到目标检测问题上的一个里程碑,借助CNN良好的特征提取和分类性能,通过Region Proposal方法实现目标检测问题的转化。
算法可以分为4个步骤:

(1)候选区域选择

Region Proposal是一类传统的区域提取方法,可以看作不同宽高的滑动窗口,通过窗口滑动获得潜在的目标图像,一般候选区为为2千个即可。

(2)CNN特征提取

将候选区域的目标图像进行归一化,作为CNN的标准输入。通过CNN卷积和池化等操作,得到固定维度的输出特征向量。原始论文中的CNN采用在 ImageNet 上已经训练好的模型,然后在 PASCAL VOC 数据集上进行迁移学习fine-tune(迁移学习的一种方法)。因为 ImageNet 的图像高达几百万张,利用卷积神经网络充分学习浅层的特征,然后在小规模数据集做规模化训练,从而可以达到好的效果。
R-CNN 抽取了一个 4096 维的特征向量,采用的是 Alexnet,需要注意的是 Alextnet 的输入图像大小是 227x227。而产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227*227 的尺寸,边界区域需要进行填充(padding)。

(3)分类与边界回归

该过程包括两个步骤:

  • 一是对CNN模型的输出特征向量进行分类,如利用 SVM 分类器进行类别的识别,产生分类分数(候选区域的概率值)。候选区域有 2000 个,所以很多会进行重叠。所以需要针对每个类,通过计算 IoU 指标,采取非极大值抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。
  • 二是通过边界回归(bounding-box regression) 得到精确的目标区域,如上述概念边界回归,由于实际目标产生的区域并不准确,所以通过一个线性的回归模型,对完成分类的目标进行精确的定位。

如下图为R-CNN总的流程图:

R-CNN存在三个明显的问题:

  • 多个候选区域对应的图像需要预先提取,占用较大的磁盘空间;

  • 针对传统CNN需要固定尺寸的输入图像,归一化产生物体截断或拉伸,会导致输入CNN的信息丢失;

  • 每一个ProposalRegion都需要进入CNN网络计算,上千个Region存在大量的范围重叠,重复的特征提取带来巨大的计算浪费。

3.SPP-Net

如上R-CNN存在三个明显的缺点,因此会产生这样的疑问:为什么要对每一个候选区域独立计算,而不是提取整体特征,仅在分类之前做一次区域截取呢?SPP-Net就解决了这个问题。如下图为SPP-Net总的流程图:

(1)候选区域处理

在候选区域的处理过程中,首先用CNN提取整体图片的特征,仅在分类之前做一次候选区域截取。

(2)特征图提取

在上述得到整体的特征之后,如何得到候选区域的特征图呢,对卷积层可视化发现:输入图片的某个位置的特征反应在特征图上也是在相同位置。基于这一事实,对候选区域的特征提取只需要在特征图上的相应位置提取就可以了。

(3)提取特征向量

在通过上述方法得到候选区域的特征图之后,为了适应不同尺寸的特征图,定义一种可伸缩的池化层SPP:空间金字塔池化SPP(SpatialPyramid Pooling ),在最后的卷积层和全连接层之间加入SPP层,不管输入分辨率是多大,都可以划分为固定维数的特征向量。
SPP原理:
在conv5层得到的特征图是256层,每层都做一次spatial pyramid pooling。先把每个特征图分割成多个不同尺寸的网格,比如网格分别为4x4、2x2、1x1,即长宽划分为4x4=16、2x2=4、1x1=1的网格。然后每个网格做max pooling,这样256层特征图就形成了16x256,4x256,1x256维特征,他们连起来就形成了一个固定长度的特征向量,再将这个向量输入到后面的全连接层。如下图所示。

(4)分类与边界回归

在检测的后面模块,仍然和R-CNN一样,利用 SVM 分类器进行类别的识别,产生分类分数(候选区域的概率值),采取非极大值抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。再通过边界回归得到精确的目标区域。

综上:
在SPP-Net中,图片只需要经过一次CNN,候选区域特征直接从整张图片特征图上提取。其中SPP层并不是关键,在后面的Fast-RCNN改进中该特征已经被舍弃。而最关键的是SPP的位置,它放在所有的卷积层之后,有效解决了卷积层的重复计算问题,这是论文的核心贡献。
SPP-Net在R-CNN的基础上做了实质性的改进:

  • 取消了图像归一化过程,解决图像变形导致的信息丢失以及存储问题;
  • 采用空间金字塔池化SPP(SpatialPyramid Pooling )替换了全连接层之前的最后一个池化层(pool5)

尽管SPP-Net贡献很大,仍然存在很多问题:

1)和R-CNN一样,训练过程仍然是隔离的,提取候选框——>计算CNN特征——> SVM分类——> Bounding Box回归独立训练,大量的中间结果需要转存,无法整体训练参数;
2)在整个过程中,Proposal Region仍然很耗时。

SPP-Net与R-CNN对比图:

3.Fast-RCNN

Fast-RCNN的主要亮点有:Fast RCNN将借助多任务损失函数,将物体识别和位置修正合成到一个网络中,不再对网络进行分步训练,不需要大量内存来存储训练过程中特征的数据;用RoI层代替SPP层,可以使用BP算法更高效的训练更新整个网络,整体流程如下图:

上图中,原始图片经过多层卷积与池化后,得到整图的feature map。而由selective search产生的大量RoI(regions of interest,上图仅显示一个)经过**映射(projection)**可以得到其在feature map上的映射区域(ROIs,灰色部分),这些ROIs被池化层ROI Pooling为一个固定大小的feature map,feature map被全连接层拉伸成一个特征向量。对于每一个RoIs,经过FC层后得到的特征向量feature vector,然后一个进行全连接之后用来做softmax回归,用来对RoI区域做物体识别,另一个经过全连接之后用来做b-box regression做区域修正定位。
RoI池化层原理:
RoI池化层使用最大池化将任何有效的RoI内的特征转换成具有H×W(例如,7×7)的固定空间范围的小特征图(即转化为7×7=49个小特征图),然后对每个小特征图执行最大池化,并将输出合并到相应的输出网格单元中。假设要均匀分成2x2的网格时,但是feture map的座标值均为整数值,不可避免存在一个就近取整的量化,如下图所示,导致有时无法实现均匀分割。其中H和W是层的超参数。每个RoI由指定其左上角(r,c)及其高度和宽度(h,w)的四元组(r,c,h,w)定义(该池化层是有超参数)。RoI层相对于SPP池化层, 其只有一个金字塔层。
在这里插入图片描述

Fast-RCNN主要贡献在于对R-CNN进行加速,在以下方面得到改进:

1)借鉴SPP思路,提出简化版的ROI池化层(注意,没用金字塔),同时加入了候选框映射功能,使得网络能够反向传播,解决了SPP的整体网络训练问题;

2)多任务Loss层

  • Softmax Loss代替了SVM,证明了softmax比SVM更好的效果;

  • Smooth L1 Loss取代Bouding box回归。

将分类和边框回归进行合并(又一个开创性的思路),通过多任务Loss层进一步整合深度网络,统一了训练过程,从而提高了算法准确度。

3)全连接层通过SVD加速

4)结合上面的改进,模型训练时可对所有层进行更新,除了速度提升外(训练速度是SPP的3倍,测试速度10倍),得到了更好的检测效果。

接下来分别展开1)和2):

前面已经了解过可伸缩的池化层,那么在训练中参数如何通过ROI Pooling层传导的?根据链式求导法则,对于yiy_i = max(xix_i) 传统的max pooling的映射公式:

其中δ\delta为判别函数,为1时表示选中为最大值,0表示被丢弃,误差不需要回传,即对应权值不需要更新。如下图所示,对于输入 xix_i 的扩展公式表示为如下公式:

(i,r,j) 表示 xix_i 在第 r 个框的第 j 个节点是否被选中为最大值(对应下图 y0,8 和 y1,0),xix_i 参数在前向传导时受后面梯度误差之和的影响。(下图为ROI池化大小为3x3)

多任务Loss层(全连接层)是第二个核心思路,如上图所示,其中cls_score用于判断分类,bbox_reg计算边框回归,label为训练样本标记。

其中LclsL_{cls}为分类误差:

pxp_x 为对应Softmax分类概率,plp_l 即为label所对应概率(正确分类的概率),plp_l = 1时,计算结果Loss为0, 越小,Loss值越大(0.01对应Loss为2)。

LregL_{reg}为边框回归误差:

即在正确分类的情况下,回归框与Label框之间的误差(Smooth L1), 对应描述边框的4个参数(上下左右or平移缩放),g对应单个参数的差异,|x|>1 时,变换为线性以降低离群噪声:

LtotalL_{total}为加权目标函数(背景不考虑回归Loss):

(注:机器视觉中“前景”和“后景”,简单理解:前景是你感兴趣的对象。背景却不是。)

4.Faster-RCNN

因为在Fast R-CNN论文中的测试时间是不包括search selective时间的,而在测试时很大的一部分时间要耗费在候选区域的提取上。Faster R-CNN正是为解决这个问题而提出来的。对于提取候选框最常用的SelectiveSearch方法,提取一副图像大概需要2s的时间,改进的EdgeBoxes算法将效率提高到了0.2s,但是这还不够。

候选框提取不一定要在原图上做,特征图上同样可以,低分辨率特征图意味着更少的计算量,基于这个假设,MSRA的任少卿等人提出RPN(RegionProposal Network),完美解决了这个问题,我们先来看一下网络拓扑。

通过添加额外的RPN分支网络,将候选框提取合并到深度网络中,这正是Faster-RCNN里程碑式的贡献。RPN网络用于推荐候选区域,这个网络是用来代替之前的search selective的。

RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高),提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归,与FastRCNN类似。

目标分类只需要区分候选框内特征为前景或者背景。

边框回归确定更精确的目标位置,基本网络结构如下图所示:

训练过程中,涉及到的候选框选取,选取依据:

1)丢弃跨越边界的anchor;

2)与样本重叠区域大于0.7的anchor标记为前景,重叠区域小于0.3的标定为背景;
0
对于每一个位置,通过两个全连接层(目标分类+边框回归)对每个候选框(anchor)进行判断,并且结合概率值进行舍弃(仅保留约300个anchor),没有显式地提取任何候选窗口,完全使用网络自身完成判断和修正。
从模型训练的角度来看,通过使用共享特征交替训练的方式,达到接近实时的性能,交替训练方式描述为:

1)根据现有网络初始化权值w,训练RPN;

2)用RPN提取训练集上的候选区域,用候选区域训练FastRCNN,更新权值w;

3)重复1、2,直到收敛。

因为Faster-RCNN,这种基于CNN的real-time 的目标检测方法看到了希望,在这个方向上有了进一步的研究思路。至此,我们来看一下RCNN网络的演进,如下图所示:

Faster RCNN的网络结构(基于VGG16):

Faster实现了端到端的检测,并且几乎达到了效果上的最优,速度方向的改进仍有余地,于是YOLO诞生了。

5.YOLO

YOLO来自于“YouOnly Look Once”,你只需要看一次,不需要类似RPN的候选框提取,直接进行整图回归就可以了,简单吧?

算法描述为:

1)将图像划分为固定的网格(比如7*7),如果某个样本Object中心落在对应网格,该网格负责这个Object位置的回归;

2)每个网格预测包含Object位置与置信度信息,这些信息编码为一个向量;

3)网络输出层即为每个Grid的对应结果,由此实现端到端的训练。

YOLO算法的问题有以下几点:

1)7*7的网格回归特征丢失比较严重,缺乏多尺度回归依据;

2)Loss计算方式无法有效平衡(不管是加权或者均差),Loss收敛变差,导致模型不稳定。

Object(目标分类+回归)<=等价于=>背景(目标分类)

导致Loss对目标分类+回归的影响,与背景影响一致,部分残差无法有效回传;

整体上YOLO方法定位不够精确,贡献在于提出给目标检测一个新的思路,让我们看到了目标检测在实际应用中真正的可能性。

这里备注一下,直接回归可以认为最后一层即是对应7*7个网格的特征结果,每一个网格的对应向量代表了要回归的参数(比如pred、cls、xmin、ymin、xmax、ymax),参数的含义在于Loss函数的设计。

6.SSD

由于YOLO本身采用的SingleShot基于最后一个卷积层实现,对目标定位有一定偏差,也容易造成小目标的漏检。

借鉴Faster-RCNN的Anchor机制,SSD(Single Shot MultiBox Detector)在一定程度上解决了这个问题,我们先来看下SSD的结构对比图。

基于多尺度特征的Proposal,SSD达到了效率与效果的平衡,从运算速度上来看,能达到接近实时的表现,从效果上看,要比YOLO更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章