1.目标检测
1.1 概念
目标检测就是除了要对图片中物体正确分类外还要找到物体的具体位置。 人很容易找到物体的位置,这是因为人类可以感知到图片中的不同颜色模块。而对于计算机而言,它们获取的仅仅只是0到255之间的数值,直接找到物体的具体位置对于计算机而言说是很难的。
1.2 原始目标检测的方法
下图是传统目标检测的流程
(1) 选择区域
先定位目标的位置,因为目标会出现在图像中的任意地方,而且目标的大小、长短形状都是不相同的,所以原始的目标检测是利用滑动窗口的方法来对整张图片进行遍历检测的。并且需要根据具体情况来设定各种长宽比例和大小尺寸。原始目标检测采用的是穷举遍历的方式进行的,这包括了目标在图像中可能出现的任意位置,这种检测策略可以让精确度得到保障,但同时产生了很多多余的窗口,这使得之后的提取特征和检测分类的速度和性能都很低,时间复杂性也过高。
(2) 提取特征
因为图像中的目标具有不确定性,目标的形态千奇百怪,光照的变化多种多样,背景各式各样,这些都具有不规则性,要想设计一个具有很好的鲁棒性的特征并非易事,而且特征的优劣直接关系到目标检测和目标分类。在提取特征时,常常使用 SIFT、HOG 作为特征。
(3) 分类器
常用的分类器为 SVM、Adaboost 等。
原始目标检测中,性能不高,是因为有这两个主要的缺点,其中一个是用滑动窗口进行区域选择,这种方法没有指明性,目标检测和分类的时间很长,滑动窗口冗余度高;另外一个是人工设计的特征对于各种场景多样性的变化没有很好的鲁棒性,适用性不高。
1.3 基于候选区域的深度学习目标检测算法
针对原始目标检测中的两个主要的缺点,候选区域(region proposal)提出了有效的处理方法,region proposal 是首先在图像中找出目标应该会出现的区域,但是因为 region proposal 是基于图像的颜色、条纹、分界等要点,可以在提取不太多窗口的时候,保证有着比较高的回归率,这里的不太多的窗口指的是少到只有几千个甚至是几百个,这在很大程度上缩短了后面检测过程中的时间长度,而且采用的候选区域比原始检测方法中的滑动窗口的性能更高。通常原始检测方法中为了缩短检测中的时间长度,只会设置几个常规的滑动窗口,对于长宽变动很大的目标进行分类和检测,这几个常规的滑动窗口不能得到好的遍历性能。region proposal 常常使用的算法有 selective Search 和 edge Boxes 算法。在区域选择之后,接下来是对候选区域进行图片分类操作,目标检测在候选区域上使用 CNN 来对其进行图片分类,它具有良好的性能。2014 年,Ross B.Girshick 采用 regionproposal+CNN 方法取代原始目标检测中的滑动窗口+手工设计的特征提取方法。region proposal+CNN 特征就是我们学习研究的R-CNN,R-CNN 的诞生让目标检测走上巅峰,取得巨大突破,开启科学研究工作者学习目标检测的大门。
(1)R-CNN(CVPR2014TPAMI2015)
(Region-based Convolution Networks for Accurate Object detection and Segmentation)
下图是R-CNN的目标检测流程
基于 region proposal 的 CNN 的目标检
测的过程:
1) 将测试样本图片作为输入;
2) 利用 selective search 候选区域算法在测试图像中选取 region proposal,大约2000 个;
3) 将每一个 region proposal 调整大小到 227*227,输入到 CNN 中(为了保证 CNN 全连接层的输入都是维度相同的),特征提取的是 CNN模型中的 fc7层(fc7层是什么?)的输出;
4) 将每一个 region proposal 获取到的 CNN 的特征作为输入,将输入放到分类器中进行分类,常常采用 SVM 分类器进行分类。
R-CNN 相对于传统目标检测具有很大的优势,在 PASCAL VOC2007 上的检测正确率从原始目标检测的 DPM HSC 的 34.3%快速提高到 66%(m AP)。这一跳跃性的提升,让我们感受到了 region proposal+CNN 的极大优越性。
但与此同时,R-CNN 模型也并行着许多需要解决的问题:
1)R-CNN 训练过程分为:先对网络结构进行略微调整,再对 SVM 分类器进行训练,最后对边界召回器进行训练。这一系列的学习过程太过于复杂,步骤太过于繁琐;
2)训练时间和空间复杂度很高:训练过程的复杂使得训练时间很漫长,需要磁盘的存储也很庞大,比如 5000 张图片就会产生几百 G 的特征材料要存储;
3)分类器模型:采用 SVM 分类,是线性分类模型,在数据不缺的情况下进行标注不具有很好的训练效果;
4)计算冗余:R-CNN 不再是传统目标检测中的窗口遍历,不再进行穷举,但是仍然有2000 个候选区域,每个候选区域都要参与进行 CNN 过程,计算量是很巨大的,同时这 2000次卷积操作,其实就存在着计算冗余;
5)检测过程慢:这一系列问题直接呈现出的就是 R-CNN 目标检测过程速度很慢,使用常规的 GPU 和 VGG16 模型需要 47 秒才能处理一张图片。
(2) SPP-NET (ECCV2014,TPAMI2015)
(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)
SPP-NET 是 MSRA 何恺明等学者研究出来的,他的基本思路是将原始图像上的缩放等操作剔除,转而采用空间金字塔池化层在卷积特征上。SPP-NET 针对 R-CNN 检测速度慢的问题,提出了很好的处理方法。R-CNN 检测速度很慢,检测一张图片需要 47 秒,这是因为 R-CNN检测框架中,在一张图片中提取出 region proposal 之后,需要把每一个 region proposal 当做一张图片参加后面的操作,如提取出 2000 个 region proposal 就要进行 2000 次 CNN 提取特征和SVM 分类器的分类,这实质上就是对一张图片就参加了 2000 次的提取特征和分类的重复过程。
为了提高检测速度,研究学者们提出了 SPP-NET 检测框架。这 2000 个 region proposal作为图片的一部分,我们可以选择对图像进行一次卷积层的特征提取,之后仅仅需要将 region proposal 从原图上的位置直接映射到卷积层的特征图上,这样我们针对一张图片只需要在它的卷积层上做一次特征提取即可,之后再将每一个 region proposal 的卷积层特征直接输入到全连接层上做后面的操作就可以了。其实对于 CNN 来说,最耗费时间的操作是在卷积上的操作,现在对一张图像只进行一次卷积层的特征提取,在很大程度上节省了检测的时间。但还有一个需要解决的问题,就是每一个 region proposal 的大小尺度都是不一样的,而全连接层的输入必须是同一长度的, 因此不能将 region proposal 直接输入到全连接层上。如果把输入图片预先进行缩放处理,强行将图片缩放到同样的尺寸大小,但是这也存在着问题,极有可能有的物体将占满整个图片,而有的物体可能仅仅占据图片的一个小的角落。这原始的处理方法就是采取各种位置的切割,但是这一切割过程就会产生一系列的后果,有的切割会导致物体形状缺损,有的切割过程会导致物体被伸展,伸展之后的物体会严重变形,这些图片因为盲目的切割而失真,无法进行后续的训练和测试。学习 SPP-NET 可以有效的处理这个问题。
下图是SPP-NET的网络结构:
针对输入到 CNN 中的每一张图片,进行卷积流程之后我们就能够获取卷积的特征,比如在 VGG16 中,最后的卷积层是 conv5_3,就能够得到特征图共 512 张。原图中的一个 region proposal 映射到特征图上的区域,就是图中的 window 区域,只需要把这些大小尺度不同的 window 的特征对应得到维度相同的特征,并把它们输入到全连接层上,之后只需要在卷积层上对图片进行一次特征提取,SPP-NET 采用的是空间金字塔的采样方式,把每一个窗口分割为 4×4,2×2,1×1 的块,之后对每一个块是利用 max-pooling进行采样,确保每一个窗口通过 SPP 层之后就能输出一个长短是(4×4+2×2+1×1)×512 维度的向量特征,把这个多维度的向量特征当做全连接层的输入来参加之后的流程。
SPP-NET 目标检测方法的操作步骤如下:
1) 区域选择:在图片中选取 2000 个候选区域,可采用 selective search 选取;
2) 候选区域缩放:SPP-NET 无需做统一的区域归一化处理,而是要统一长宽的最短边的长度,即 min(w,h)=s,s 从{480,576,688,864,1200}中进行选择,具体选择的原理是为了让调整之后的候选区域和 224×224 最相近,则为最优选择;
3) 提取特征:采用 SPP-NET 架构来进行特征提取;
4) 分类和回归:和 R-CNN 是相似的,采用的是 SVM 利用上面的特征训练分类器,同时采用边框回归来进行候选边框的略微调整。
SPP-NET 的使用在很大程度上加快了 R-CNN 的目标检测的速度,提高了 R-CNN 的检测性能,但是这其中依旧存在着很多需要解决的问题。问题之一是,SPP-NET 的训练过程仍然是分成很多阶段的,和 R-CNN 相同的阶段:先对网络结构进行略微调整,再对 SVM 分类器进行训练,最后对边框回归器进行训练。这一系列的训练过程与 R-CNN 相似,依旧太过于复杂,步骤太过于繁琐。另外一个问题是,SPP-NET 采用固定的卷积层来微调网络,且只进行全连接层的微调处理,但是对于一个新的任务,是需要对卷积层进行微调的。
(3)Fast R-CNN(ICCV2015)
Fast R-CNN 框架图如下图所示:
Fast R-CNN 有效地处理了 R-CNN 和 SPP-NET 中存在的 2000 个候选区域的冗余计算的问题,Fast R-CNN 的基本思路是:
1)采用的是精简的 SPP 架构:在卷积层的最后一层后面加了一个 ROI pooling layer 结构,它的操作和 SPP 是类似的,实质上就是 SPP-NET 的缩减精华版,SPP-NET 采用的是不同形状大小的金字塔映射,来对每一个 proposal 进行投射,而 ROI pooling layer 仅要求对 7*7 的特征图进行下采样操作。比如对VGG16 模型 conv5_3 是有 512 个特征图的,那么全部的 region proposal 的全连接层的输入向量就是 7×7×512 维的特征向量。
2)训练和测试无需同步进行:R-CNN 和 SPP-NET 的训练过程分为三个过程,而 Fast R-CNN 是采用 softmax 取代 SVM 分类器,同时采用的是多任务损失函数来做边界召回工作,即分类和回归的过程使用 Multi-task 的方法合并操作的,这样整个训练的过程都是从端到端进行训练的了,将边界召回直接输入到网络层进行操作,不再需要另外加存储空间来储存中间层的特征数据;
3) SVD:采用 SVD 对全连接层的参数矩阵进行分解,将它们分解压缩为两个更小大小的全连接层,这在网络微调的过程中,对其中一些卷积层也进行了微调操作,从而获得更好的检测性能。
Fast R-CNN 的重要操作过程如下:
1)提取特征:将一整张图片作为输入,采用 CNN 来得获取图像的特征层;
2)候选区域:从原始图片中获取到候选区域,常常采用 selective search 等方式来进行提取,并且把这些候选区域映射到卷积最后一层的特征层上;
3)区域统一化处理:对于每一个区域候选结构在特征层上进行 Rol Pooling 学习,可以获取统一大小的特征表示;
4)分类与回归:然后再经过两个全连接层,进行目标识别,这两个全连接层分别采用softmax 多分类模型,再用回归模型来微调进行边框位置和大小。
Fast R-CNN 汲取了 R-CNN 和 SPP-NET 的精华,而且结合多任务损失函数的,它的优势是很明显的,在很大程度上降低了网络的训练和测试的复杂度。Fast R-CNN 在 Pascal VOC2007 的训练数据集上进行学习,并在 VOC2007 测试的结果为 66.9%(m AP),假如在
VOC 2007+2012 训练数据集上进行学习,在 VOC2007 上的测试结果提升到 70%,这充分说明,数据集的增加可以提高目标检测的精确度,提升目标检测的性能。采用 VGG16 模型的每张图片的检测过程仅需要 3 秒左右。经过科研工作者们的比较得出,Fast R-CNN 比 R-CNN的训练速度快 8.8 倍,测试时间缩短为原来的两百分之一,比 SPP-NET 的训练速度快 2.6 倍,测试时间缩短为原来的十分之一。
Fast R-CNN 目标检测的性能提升了很多,但是仍然无法满足实时检测和分类的应用,并没有实现人们真正需要的端到端的训练和测试,这是因为提取 region proposal 采用的是selective search,而 Fast R-CNN 目标检测的时间基本都是用在提取 region proposal 上,提取region proposal 需要 2~3 秒,而特征提取仅仅需要 0.32 秒。
(4) Faster R-CNN(NIPS2015)
(Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks)
基于 Fast R-CNN 的目标检测过程,采用的是 selective search 来进行候选区域的提取,在一张图片上进行目标检测仍然需要 3 秒左右,检测速度依然达不到要求。对此,科研工作者们进行了深入的学习研究,提出了 Faster R-CNN 检测方法。Faster R-CNN 舍弃了之前目标检测使用的 selective search 算法,而直接采用 RPN(Region Proposal Networks)网络来提取候选区域。RPN 将一张大小随意的图片输入到 RPN 结构中,得到的是一系列矩形候选区域,每一个矩形候选区域都对应着一个目标分数和位置信息。RPN 结构如下:
Faster R-CNN 目标检测分类的流程如下:
1)提取特征:如同 Fast R-CNN,将整幅图像作为输入,采用 CNN 来对整幅图像进行操作,得到图像的特征层;
2)候选区域:利用 k 个不相同的矩形框(Anchor Box)在最后的卷积特征层上进行候选区域的提取,k 通常选取 9;
3)分类与回归:采用 object/non-object 来对每一个 Anchor Box 进行目标二分类,并且采用 k 个回归模型来对候选框的大小和位置进行微调,通常选用 9 个回归模型,这 9 个回归模型对应不同的 Anchor Box,最后对目标进行检测与分类。
Faster R-CNN 舍弃了 selective search,采用的是 RPN 网络,这让候选区域框、分类、回归流程共同通用卷积特征。将长期一直分开使用的 region proposal 和 CNN 分类合并在一起了,
这让目标检测采用从端到端的网络来进行检测,使得目标检测在检测速度和检测精准度上都得到大幅提升,目标检测的性能得以进一步提升。
(5) R-FCN
前文描述的 R-CNN,SPP-NET,Fast R-CNN,Faster R-CNN 的目标检测都是基于全卷积网络彼此共同分享以及 ROI 相关的彼此不共同分享的计算的子网络,这两个子网络的 R-FCN算法使用的是位置比较敏感的卷积网络,而舍弃了之前算法所使用的最后的全连接层,目的是让所有的计算都可以共享。
具体分析就是,首先把每一个候选区域分割成 k*k 个网络,我们常常将 k 取值为 3,这样每一个候选区域就被分割成 9 个网络了,可以把这 9 个网络对应描述为:左上 top-left,上中top-center,右上 top-right,左中 center-left,中中 center-center,右中 center-right,左下 bottom-left,下中 bottom-center,右下 bottom-right,这 9 个网络都有对应的编号,但是在做预测的时候会出现 C+1 个输出,C 表示的种类的数目,这 C+1 其中的+1 是因为加了一个类别是背景类别。
R-FCN 算法进行目标检测的步骤如下:
1)候选区域:使用的是 RPN(Region Proposal Network)候选区域网络,同时 RPN 网络结构已经是全卷积的网络;
2)分类和回归:采用的是 RPN 特征共享的性质来进行目标的分类。在进行 bbox 回归的时候,通常将 C 选取为 4。
综上所述,R-CNN,SPP-NET,Fast R-CNN,Faster R-CNN、R-FCN 发展以来,在深度学习的目标检测的基础上,操作步骤越来越简练,检测速度越来越快,检测精确度越来越高。
基于深度学习的目标检测的研究目前依旧非常火爆,受到广大研究学者的追捧,可以说是基于 region proposal 的 R-CNN 目标检测是当下目标检测的重点。
1.4 基于回归方法的深度学习目标检测算法
这一类基于回归方法的深度学习的目标检测算法采用的是目标回归的思路,在用于训练的图片上的不同位置直接进行回归操作,直到回归出图片中这些不同位置分别的目标的边框和回归出这些目标所属于的类别为止。
(1) YOLO(CVPR2016,oral)
(You Only Look Once:Unified,Real-Time Object Detection)
YOLO 含义是只看一次,这意味着将目标判定的目标识别结合起来了,这在很大程度上提高了目标检测的性能,可以达到每秒 45 帧,更快时甚至能够达到每秒 155 帧。
下图为YOLO目标检测过程:
操作步骤如下:
1)第一步:输入一张需要检测的图片,将这张图片分割为 7×7 的网络结构;
2)第二步:对于 7×7 网格中的每一个网络,我们都提供 2 个预测的边框,这两个边框包含了每个边框的目标的置信信息和每一个边框区域在不同类别上的可能性;
3)第三步:将第二步中预测出的 7×7×2 个目标网络的性能进行排列,设定合适的阈值进行筛选,依据设定的阈值将目标所在可能性比较低的网络窗口剔除,留下可能性比较高的网络窗口,同时用 NMS 将冗余窗口去除即可。
YOLO 是基于回归方法的,不需要区域选择操作,替换成了回归操作来完成目标检测和目标分类。YOLO 的网络结构如下图所示:
YOLO 前半部分的网络结构和GoogleNet 的结构模型比较相似,YOLO 网络结构的特点主要在后面两层结构上,是在卷积层操作之后连接了一个全连接层,同时这个全连接层是 4096维度的,然后在这个全连接层之后又连接了一个 7×7×30 维度的向量。 这个 7×7 就是上文中的将图片分割成的 7×7 的网络结构,之后就需要在每一个网络上预测目标可能会出现的两个可能的位置,同时预测这个目标出现的位置在图片目标上的置信信息和类别,也就是说需要预测两个目标在每一个网格中,每一个目标都是有中心点坐标和长宽这 4 个维度的信息,1 个目标的置信信息,还有 20 个目标的类别数,使用 VOC上面的 20 各类别,就会有(4+1)×2+20=30维度,因此后面连接了一个 7×7×30 维度的向量。所以,就可以使用前文的 4096 维度的全连接层在每一个网格上直接回归出目标所需要的置信信息和类别数。
YOLO 算法结构模型是用回归的方法解决了目标检测的问题,简化了目标检测的过程,在很大程度上加快了目标检测的速度实验验证 YOLO 每秒可以检测 45 张图片,同时将图片的全部信息放在每一个网络结构中进行目标窗口的预测,使得错误率大大降低。 与此同时,YOLO 在很大程度上加快目标检测速度的时候,由于舍弃了候选区域的操作,直接采用 7×7的网络结构进行回归操作,使得目标定位并非很精确,这让 YOLO 算法的检测精确度不是很高。
(2)SSD(Single Shot MultiBox Detector)
YOLO 算法中的 7*7 网络结构让目标的定位不是很准确,让检测的精确度不是很高,提出的 SSD 算法结构模型就是将 YOLO 的回归方法和 Faster R-CNN 的 anchor box思想结合起来。下图是SSD的算法框架结构:
SSD 网络结构是分为两个部分的,第一部分是用来进行图像分类的网络,这已经把分类相关的层面去除掉了,第二部分是用于进行检测不同尺度的特征映射层的网络结构。SSD 采用和 YOLO 相同的方法来得到目标所在的位置以及目标的类别,采用的就是 YOLO 算法结构模型所提出的回归思想,但是 SSD 考虑到目标位置所处的位置周围的一些特征信息来参与预测。同时,SSD 运用了 Faster R-CNN 的 anchor box的机制来建立目标位置和其特征之间的关系。在 SSD 算法的框架结构图中,例如图(b)中的特征图片大小就是 8×8,同时采用 3×3 的滑动窗口进行每一个位置的特征提取,之后再将这个提取到的特征进行回归操作得到最终目标的位置信息和归属的类别信息。SSD 与 Faster-R-CNN 的区别在于,这个 anchor 机制是在 feature map 的基础之上的,目的是采用多层的特征信息来达到不同尺度的信息,这个过程是自然进行的,原因在于不同层级的 feature map 的 3×3 的滑动窗口的接受域不同。
SSD 算法结构模型是把 YOLO 的回归方法与 Faster R-CNN 中的 anchor 机制联合起来运用的,并对整个图片的不同位置的不同尺度的区域特征进行回归操作,这样既可以保持 YOLO回归方法的快速检测的优势,又使用 Faster R-CNN 中的 anchor 机制保证窗口预测的准确度。
经过实验检测,SSD 在 VOC 上 m AP 能够达到 72%,同时每秒钟可以检测 58 张图片。与此同时,从 SSD 算法操作的原理来看,Default Box 会事先选择好形状和网格大小,那么会导致提取图片中特定的小目标时的性能会不够好。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:目标检测概念及其经典模型介绍 - Python技术站