目标检测系列——目标检测方法发展综述

引言

目标检测:

目标检测的目标是确定某张给定图像中是否存在给定类别(比如人、车、自行车、狗和猫)的目标实例;如果存在,就返回每个目标实例的空间位置和覆盖范围(比如返回一个边界框)。

目标检测的意义

作为图像理解和计算机视觉的基石,目标检测是解决分割、场景理解、目标追踪、图像描述、事件检测和活动识别等更复杂更高层次的视觉任务的基础。目标检测在人工智能和信息技术的许多领域都有广泛的应用,包括机器人视觉、消费电子产品、安保、自动驾驶、人机交互、基于内容的图像检索、智能视频监控和增强现实。

目标检测的过程:

传统的目标检测方法一般分为三个阶段:首先在给定的图像上选择一些候选区域,然后对这些区域提取特征,最后使用分类器进行分类。

目标检测面临的难点:

  • 高准确度(Loc acc.+Reg acc.)

    • 对类内形变的鲁棒性
      • 同类物体有很多不同的实例(不同纹理/颜色/材质等)
      • 目标实例的多样性(姿态/非刚性形变等)
      • 采样过程的条件和环境的影响(光照/尺度/遮挡/阴影/污迹/角度/背景)
      • 图像噪声(采样过程的噪声/滤波器影响/压缩的噪声等)
    • 高的可区分性
      • 类间的相似性
      • 目标物体类别多样
  • 高效性(时间、内存效率)

    • 实际中目标类别成千上万
    • 需要定位并辨别目标类别
    • 目标的可能定位数量太多
    • 图像/视频数据太多

目标检测发展:
在这里插入图片描述
过去20年的进展:

在这里插入图片描述
整体而言,这些检测器可以分为两大主要类别:

扫描二维码关注公众号,回复: 10431108 查看本文章
  • 两级式(2-stage):区域提议+检测(R-CNN系列),主要倾向于准

  • 单级式(1-stage):无区域提议框架,提议和检测是整体的(SSD,YOLO系列),主要倾向于快

1. R-CNN(2013)

R-CNN是利用卷积神经网络进行“目标检测”的开山之作,其意义深远

R-CNN流的发展过程:

R-CNN -> SPP Net -> Fast R-CNN -> Faster R-CNN -> Mask R-CNN
在这里插入图片描述
实现步骤:
在这里插入图片描述
1)Region Proposal+Crop/Wrap归一化:通过SS方法生成约2000个候选区域,并将候选区域resize成固定大小(227*227)

2)对每个框进行CNN特征提取:对每个候选区域提取卷积特征图,得到4096-d的向量

3)SVM分类+边界回归:将2000个特征向量送入SVM学习N个SVM分类器

  • 每个分类器用来对特定类别分类,预测出候选区域中所含物体属于每个类的概率值。由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本。

  • 通过回归方法得到目标b-box

  • 定位精度:利用IoU来近似表示

  • 思路:假设得到的物体检测框与实际标注的物体边界框存在一个线性变化,则可以通过学习线性变换参数的方法实现位置精修。通过学习线性变换参数,从而得出使得loss函数最小的线性变换。

R-CNN的贡献:

1)使用ImageNet训练好的优质模型,在PASCAL VOC数据集上机芯微调,因为大数据集图像高达几百万,利用卷积网络充分学习了浅层特征,之后在小数据集上微调后进行特征提取,获得了好多特征提取效果。

2)使用b-box regression进行了目标包围框的修正

R-CNN的缺点:

1)SS耗时:每幅图像的SS需要花费2s

2)每个候选区域内的图像都要经过一次AlexNet,为所有的框提取特征大约花费47s,且每个特征都要存储下来,浪费空间。

3)三个模块(SS+特征提取+分类)是分别训练的,导致训练分类器时没有更新网络参数,且对存储空间消耗很大

4)所有的框都暴力归一化到统一大小227*227,造成图像内容损失,引起物体形变,影响精度。

R-CNN的主要特点有以下三点:

1)利用了selective search方法,即先通过实例分割将图像分割为若干小块,然后选择相似度较高的小块,把这些相似小块合并为一个大块,最后整个物体生成一个大的矩形框,通过这种方法大大提高候选区域的筛选速度。

2)用在ImageNet数据集上进行学习的参数对神经网络进行预处理,解决了在目标检测训练过程中标注数据不足的问题。

3)通过线性回归模型对边框进行校准,减少图像中的背景空白,得到更精确的定位。

4)该方法将PASCAL VOC上的检测率从35.1%提升到了53.7%,其意义与AlexNet在2012年取得分类任务的大突破是相当的,对目标检测领域影响深远。

2. SPPnet(空域金字塔池化,2014)

该方法提出的最初原因是为了解决全连接层的输入要求大小统一的问题,SPP层可以和R-CNN结合起来提升网络性能。R-CNN中采用暴力resize的方法将所有的框都归一化为227*227,但这会影响识别精度,于是SPPnet在CNN层与全连接层之间插入了空间金字塔池化层来解决该矛盾。

SPPnet(下)与普通网络(上)对比:
在这里插入图片描述
SPP原理:

假定CNN层得到的特征图大小为a×a(比如13×13,随输入图片大小而变化),设定的金字塔尺度为n×n bins(对于不同大小图片是固定的),那么SPP层采用一种滑动窗口池化,窗口大小win_size=⌈a/n⌉,步长为stride=⌊a/n⌋,采用max pooling,本质上将特征图均分为n×n个子区域,然后对各个子区域max pooling,这样不论输入图片大小,经过SPP层之后得到是固定大小的特征。一般设置多个金字塔级别,文中使用了4×4,2×2和1×1三个尺度。

每个金字塔都得一个特征,将它们连接在一起送入后面的全连接层即可,这样就解决了变大小图片输入的问题了。SPP-net在ImageNet ILSVRC 2014图像分类大赛中夺得了第三名。

在这里插入图片描述
空间金字塔池化过程:
在这里插入图片描述
输入图像 \to 卷积层 \to 三种不同尺度的最大池化( 4 × 4 , 2 × 2 , 1 × 1 4\times 4,2\times 2,1\times 1 \to 三组向量组合成一个固定大小的特征向量

SPPnet和R-CNN的关系:

R-CNN中送入全连接层的特征必须是相同大小的,于是就使用暴力resize方法将其统一大小,会导致出现形变而影响精度。SPP层就很好的利用池化的方法来解决该问题,可以大大减少计算量并提升计算速度,基于SPP的R-CNN在模型准确度上的提升不是很大,但在速度上比原始R-CNN模型快24-102倍,这也正是Fast R-CNN所改进的方向。

SPPnet工作过程:

1)利用SS方法获得区域提议,通过Stride区域映射的方法,在卷积层的后面加入位置信息,便于在卷积特征图中找到每个区域的位置。

2)对整张图进行卷积特征提取,解决了卷积层的重复计算的问题

3)空间金字塔池化,也就是替换最后一个池化层为SPP pooling layer

4)SVM分类

缺点:

1)提取候选框 | 计算CNN特征 | SVM分类 | 回归训练过程都是各自独立的,大量中间结果需要转存,无法整体训练参数

2)无法同时微调卷积层和全连接层,在很大程度上限制了CNN的效果

3)候选区域仍然使用SS方法,很耗时

3. Fast R-CNN(2015)

在这里插入图片描述
Fast R-CNN如其名,在R-CNN的基础上增加了RoI pooling层,并且简化了模型,大幅度提高了检测速度。
在这里插入图片描述
特点:

1)共享卷积特征:借鉴SPP的方法,对输入图像首先进行CNN,之后在从特征图中取出候选区域的内容进行后续过程,加速了检测过程。

2)提出了RoI pooling层,借鉴SPP pooling,但只是用单尺度的max pooling,来获得固定长度的特征图

  • RoI pooling层的Caffe官方实现,RoI pooling层在大部分深度学习框架中是没有官方实现的,需要自己扩展,Tensorflow上的开源实现可以参考deepsense-ai/roi-pooling,但是在TensorFlow中可以基于一种crop+resize+pooling的方式,可以看一下Luminoth上的实现)

  • RoI pooling 过程

在这里插入图片描述
3)使用softmax进行分类

4)将R-CNN的串行结构改成了并行结构,也就是可以同时进行分类+回归

Fast R-CNN的工作过程:

1)使用SS方法生成一系列的候选区域

2)对整幅图像进行卷积特征提取,将最后一层的池化层替换为RoI pooling层,输出固定长度的特征向量

3)将特征向量输入全连接层,用于多任务学习并计算多任务损失,输出两个分支:

  • softmax loss(log loss):K+1个类别的分类损失函数
  • Regression loss(smooth L1 loss):K+1类的b-box的坐标

4)通过NMS处理获得最终的目标检测和识别结果

论文提出的重要讨论结果:

1)多任务的训练相比独立训练,效果确有提升,但时间开销也更大

2)在更大的数据集上(VOC)训练后,效果确有提升

3)softmax比SVM表现略好,引入了类间竞争

4)更多的候选区域不一定带来更多的精度提升

存在的问题:

依然靠SS来提取候选框,很耗时

4. Faster R-CNN(2016)

针对Fast R-CNN的使用传统方法进行区域提议方法的不足,提出了RPN来直接实现区域提议,使得检测任务可以由神经网络端到端的完成,且RPN和CNN是共享卷积的,计算量很小,Faster R-CNN=Fast R-CNN+RPN,在精度方面也达到了SOTA(State Of The Art)。

在这里插入图片描述

流程:
在这里插入图片描述

网络结构图(基于ZF):

在这里插入图片描述
Faster R-CNN的结构主要分为三个部分:

  • 共享卷积层
  • 候选区域生产网络RPN
  • 对候选区域进行分类的网络

RPN网络:将proposal这一任务建模为二分类问题(是目标物体/不是目标物体)
在这里插入图片描述
RPN本质上是一个树状结构:

  • 树干是一个 3 × 3 3\times3 的卷积层,获得256个不同的特征图

  • 树枝是两个 1 × 1 1\times1 的卷积层

    • 一个解决了前后景的输出(对于每个像素点,输出9个anchor,每个anchor有一个前景分数和一个背景分数,故输出 2 × 9 = 18 2\times 9=18 个值)

    • 另一个解决了边框和anchor的偏移位置输出(对于每个像素点,输出 4 × 9 = 36 4\times 9=36 个值)

RPN工作原理:

RPN依靠一个在共享特征图上的滑动窗口,为每个像素位置生成9种预先设置好长宽比与面积的目标框(anchor),包含三种面积( 128 × 128 , 256 × 256 , 512 × 512 128\times 128,256\times 256,512\times 512 ),每种面积包含三种长宽比(1:1,1:2,2:1),示意图如下:

Alt
假设特征图大小为 40 × 90 40\times90 ,那么RPN生成的初始anchor总数约为20k个( 40 × 60 × 9 40\times60\times9 )。

对于生成的anchor,RPN要做两件事:

  • 首先要判断是前景还是背景,也就是判定这个anchor到底有没有覆盖到目标(使用softmax直接训练,在训练时排除掉超越图像边界的anchor)

  • 其次是为属于前景的anchor进行第一次坐标修正(使用smooth L1 损失进行训练)。

anchor的正样本标定方法:

  • 如果Anchor对应的reference box与GT的 I o U IoU 值最大,标记为正样本
  • 如果Anchor对应的reference box与GT的 I o U > 0.7 IoU>0.7 ,标记为正样本

anchor的负样本标定方法:

  • 如果Anchor对应的reference box与GT的 I o U < 0.3 IoU<0.3 ,标记为负样本
  • 剩下的非正非负,不用于最终训练

训练RPN的loss=cls loss+reg loss

L ( p i , t i ) = 1 N c l s Σ i L c l s ( p i , p i ) + λ 1 N r e g Σ i p i L r e g ( t i , t i ) L({p_i},{t_i})=\frac{1}{N_{cls}}\Sigma_iL_{cls}(p_i,p_i^*)+\lambda \frac{1}{N_{reg}}\Sigma_ip_i^*L_{reg}(t_i,t_i^*)

  • i是小批量中每个锚的索引
  • p i p_i 是锚点 i i 预测为目标的概率,如果锚点为正,那么真实标签 p i p_i^* 为1,如果锚点为负,则为0。
  • t i t_i 表示预测边界框四个参数的坐标向量
  • t i t_i^* 是正锚点的真实边界框向量。
  • 分类损失 L c l s L_{cls} 是两个类别(目标或非目标)上的对数损失
  • 。回归损失使用 L r e g ( t i , t i ) = R ( t i t i ) L_{reg}(t_i,t_i^*)=R(t_i - t_i^*) ,其中 R R 是鲁棒损失函数(L1损失)
  • p i L r e g p_i^*L_{reg} 表示回归损失只在锚点为正( p i = 1 p_i^*=1 )的时候被激活,否则被禁用( p i = 0 p_i^*=0
  • cls和reg层的输出由 p i {p_i} t i t_i 构成。
  • 这两项用 N c l s N_{cls} N r e g N_{reg} 进行标准化,且由一个平衡参数 λ \lambda 进行权衡。

为了边界框的回归,我们依据如下方式进行四个坐标的参数化:

  • t x = ( x x a ) / w a , t y = ( y y a ) / h a t_x=(x-x_a)/w_a, t_y=(y-y_a)/h_a
  • t w = l o g ( w / w a ) , t h = l o g ( h / h a ) t_w=log(w/w_a), t_h=log(h/h_a)
  • t x = ( x x a ) / w a , t y = ( y y a ) / h a t_x^*=(x^*-x_a)/w_a, t_y^*=(y^*-y_a)/h_a
  • t w = l o g ( w / w a ) , t h = l o g ( h / h a ) t_w^*=log(w^*/w_a), t_h^*=log(h^*/h_a)

其中,x,y,w和h分别表示边界框的中心坐标、宽和高。

变量 x x , x a x_a x x^* 分别表示预测框、锚框和真实框,这可以被认为是从锚框到邻近真实边界框的回归。

四步交替优化法,使得学习到RPN和CNN共享特征的统一网络

  • 训练RPN,使用ImageNet预训练模型进行初始化,对区域提议任务进行端到端的微调

    • 随机采样256个anchors,正负比1:1–不够用负样本填充;
    • μ=0,σ=0.01,学习率=0.001 or 0.0001,动量=0.9,衰减系数=0.0005
  • 使用由第一步RPN生成的提议,由Fast R-CNN训练单独的检测网络。该检测网络也由ImageNet的预训练模型进行初始化。此时两个网络不共享卷积层。

  • 使用检测器网络来初始化RPN训练,但是我们修正共享的卷积层,并且只对RPN特有的层进行微调。现在这两个网络共享卷积层。

  • 保持共享卷积层的固定,对Fast R-CNN的独有层进行微调。

注意:

1)训练时忽略超过图像边界的anchor boxes(不收敛且误差难以纠正),测试时剪切跨边界的框。

2)一些RPN proposals相互高度重叠,为了减少冗余,根据cls分数采取非极大值抑制,阈值为0.7,NMS不会影响检测准确性,但会大大减少proposal的数量。在NMS之后使用前N个候选区域进行检测。

5. Mask R-CNN(2017)

R-CNN家族系统对比

从R-CNN,SPP-net,Fast R-CNN到Faster R-CNN,基于深度学习目标检测的流程变得更加精简、精度更高、速度更快,因此基于region proposal的R-CNN系列目标检测方法是当前目标最主要的一个分支。

Faster RCNN这种基于CNN的目标检测方法使得real-time检测成为可能,在这个方向上有老进一步的研究思路。

RCNN网络的演进如下:
在这里插入图片描述

三者的比较:
在这里插入图片描述

发布了152 篇原创文章 · 获赞 716 · 访问量 69万+

猜你喜欢

转载自blog.csdn.net/jiaoyangwm/article/details/89111539