首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文道尽R-CNN系列目标检测

和德国海归一起学习人工智能吧

言有三

毕业于中国科学院,计算机视觉方向从业者,有三工作室,有三AI学院等创始人

Yolo

计算机视觉爱好者,大连理工大学大四在读,保研至武汉大学

作者 | 言有三、Yolo

编辑 | 言有三、Yolo

目标检测任务关注的是图片中特定目标物体的位置。一个检测任务包含两个子任务,其一是输出这一目标的类别信息,属于分类任务。其二是输出目标的具体位置信息,属于定位任务

分类的结果是一个类别标签,对于单分类任务而言,它就是一个数,对于多分类任务,就是一个向量。定位任务的输出是一个位置,用矩形框表示,包含矩形框左上角或中间位置的x,y坐标和矩形框的宽度高度。

与计算机视觉领域里大部分的算法一样,目标检测也经历了从传统的人工设计特征和浅层分类器的思路,到大数据时代使用深度神经网络进行特征学习的思路这一过程。

本文主要是为了介绍R-CNN、fast R-CNN、faster R-CNN系列。

01

目标检测基础

不管用传统方法,还是用深度学习方法来完成目标检测任务,系统一定会遵循以下3个步骤。第一个是检测窗口的选择,第二个是图像特征的提取,第三个是分类器的设计。

1.1 候选框提取

在传统方法中,当我们要在不同的距离下检测不同大小的目标时,最简单也最直观的方法就是用图像金字塔+各种尺度比例的框+暴力搜索法:从左到右、从上到下滑动窗口,然后利用分类方法对目标框进行识别。

这种利用窗口滑动来确定候选框的方法可以实现我们的预期目标,但是我们不难想到,这种方法在使用过程中会产生大量的无效窗口,浪费了很多计算资源,而且无法得到精确的位置。

1.2 特征提取

在选定候选区域之后,我们需要提取图像的特征来进行表达,传统的有监督的方法和以CNN为代表的无监督特征学习方法都可以派上用场。常见的传统特征有Haar特征、LBP、HOG等。这些特征都是研究人员通过长时间的学术研究和实际项目验证得来的,虽然在比较简单的任务中可以取得很好的结果,但是设计成本很高,而且面对复杂任务时鲁棒性远远不够。

1.3 分类器

最后是分类器,常常被使用的分类器包含Adaboost,SVM,Decision Tree等。在很多时候单一的分类器可能并不能满足我们的要求,如今使用深度学习来完成各项任务,尤其是参加各类比赛的时候,一定会使用不同的模型不同的输入进行Ensemble。比如我们常见的使用不同的裁剪子区域进行预测,或者使用不同的基准模型进行预测,最后取平均概率等。

传统目标检测方法以保罗·维奥拉和迈克尔·琼斯于2001年提出的维奥拉-琼斯目标检测框架为代表,这是第一篇基于Haar特征和Adaboost分类器的检测方法,也是首个实现实时检测的框架,论文在2011年的CVPR会议上被评为龙格-希金斯奖。

这个算法包含以下几个重要部分:

利用Haar特征描述人脸的共有属性。

建立了被称为积分图像的特征,可以快速获取几种不同的矩形特征。

利用Adaboost 算法进行训练,通过弱分类器的组合实现速度较快精度也不错的检测方案。

大家可以好好了解一下,尤其是积分图和adaboost的思想,这个方法也是opencv中的cvHaarDetectObjects()算法。

02

R-CNN系列算法

传统方法由于滑窗效率低下,特征不够鲁棒等原因限制了目标检测的发展,导致其一直无法在工业界进行大规模落地。基于深度学习的方案致力于解决这几个问题,力求能让这个领域实现进一步发展。

根据检测阶段的不同,我们可以将深度学习方法分为one-stage检测算法和two-stage检测算法两种。对于two-stage检测方法来说,它先生成了可能包含物体的候选区域Region Proposal,然后在对这个候选区域做进一步的分类和校准,得到最终的检测结果,代表方法有R-CNN系列方法。而单阶段检测算法直接给出最终的检测结果,没有经过生成候选区域的步骤,典型代表为YOLO和SSD。

我们今天主要介绍的是R-CNN系列的有关算法。

2.1 selective search与R-CNN

传统目标检测方法中的区域选择过程用的是穷举法的思路而不是生成候选区域方法,每滑一个窗口检测一次,相邻窗口信息重叠高,检测速度慢,这导致出现非常多的无效区域的判断,一张普通大小的图像可以轻易提出超过1万的候选区域。那有没有办法减小候选区域的数量呢?

J. R. R. Uijlings在2012年提出了selective search方法,这种方法其实是利用了经典的图像分割方法Graphcut,首先对图像做初始分割,然后通过分层分组方法对分割的结果做筛选和归并,最终输出所有可能位置,将候选区域缩小到2000个左右。

具体来说,首先通过将图像进行过分割得到若干等区域组成区域的集合S,这是一个初始化的集合;

然后利用颜色、纹理、尺寸和空间交叠等特征,计算区域集里每个相邻区域的相似度;找出相似度最高的两个区域,将其合并为新集并从区域集合中删除原来的两个子集。重复以上的迭代过程,直到最开始的集合S为空,得到了图像的分割结果,得到候选的区域边界,也就是初始框。

有了这样的大量降低计算量的候选框生成策略后,基于深度学习的早期目标检测框架开始发展起来,比较典型的就是R-CNN算法。

R-CNN即Region-based Convolutional Neural Networks,是一种结合区域提名(Region Proposal)和卷积神经网络(CNN)的目标检测方法。

R-CNN的网络框架如下所示:

在R-CNN框架中使用Selective search将候选区域控制在了2000个左右,然后将对应的框进行缩放操作,送入CNN中进行训练,通过SVM和回归器确定物体的类别并对其进行定位。由于CNN具有非常强大的非线性表征能力,可以对每一个区域进行很好的特征学习,所以性能大大提升。

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

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

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

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

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

不过,selective search方案仍然有计算量过大的问题。

2.2 SPPNet

尽管 RCNN通过减少了候选框减少了计算量,利用了CNN进行学习提升了特征表达能力,但是它仍然有两个重大缺陷。

其一是冗余计算,因为R-CNN的方法是先生成候选区域,再对区域进行卷积,其中候选区域会有一定程度的重叠,因为selective search方法仍然不够好,导致CNN对相同区域进行重复卷积提取特征。而且R-CNN方法将提取后的特征存储下来,然后使用传统的SVM分类器进行分类,导致需要很大的存储空间。

其二是候选区域的尺度缩放问题,因为R-CNN方法将所有区域缩放到同一尺度进行网络训练,而实际selective search选取的目标框有各种尺寸,这可能导致目标的变形,无论是剪裁还是缩放都不能解决这个问题。

SPP-Net主要对第二个缺陷进行改进,其主要思想是去掉了原始图像上的crop/warp等操作,换成了在卷积特征上的空间金字塔池化层(Spatial Pyramid Pooling,SPP)

之所以要对图像进行缩放到固定的尺度,是因为全连接层的存在。全连接层的输入需要固定的大小,所以要使用不同大小的图片,就必须在输入全连接层之前进行统一变换。

但是直接进行裁剪或缩放会使图片信息发生丢失,有时候会因为候选框太小的原因导致只能获得部分目标,使输入神经网络的信息不完整,如下图。

图像裁剪之后再进行缩放操作又会导致物体变形失真,同样影响检测效果。

SPP提出可以通过一个特殊的池化层,Spatial Pyramid Pooling层来解决,它实现了将输入的任意尺度的特征图组合成了特定维度的输出,从而去掉了原始图像上的crop/warp等操作的约束。

Spatial Pyramid Pooling是在卷积特征上的空间金字塔池化层,不管输入的图像是多大,假设最终的单个通道的featuramap尺度为N*N。

利用max pooling操作将其分成1x1,2x2,4x4的3张子图,从而原来任意的N*N的featuremap,都被表示成为21维的固定维度的向量,然后输入全连接层。在实际进行检测任务的时候,就可以根据任务本身来设计这个spp操作。这样就解决了不同输入大小图的问题,避免了缩放变形等操作。

2.3 Fast R-CNN

在RCNN中,对于每一个候选区域都使用CNN进行特征提取,没有共享计算,这其实包含了非常多的冗余操作。那能否像V-J算法中的积分图一样,只需要提取一次特征就能完成操作呢?

Fast R-CNN借鉴了SPP的思想,解决了这个问题。Fast R-CNN的流程就是,首先以整张图片为输入,利用CNN得到图片的特征层。然后,利用selective search算法得到原始图像空间中的候选框,并将这些候选框投影到特征层。针对特征层上的每个不同大小的候选框,使用RoI池化操作,得到固定维度的特征表示,最后通过两个全连接层,分别用softmax分类以及回归模型进行检测。

与R-CNN的区别之处就在于RoI(Region of Interesting)Pooling层,它是一个简化的SPP层。

一张图经过卷积后,会得到相应的feature map,feature map的每一个像素都可以对应回原始的图像。任何一个候选区域,我们只需要获取它的左上右下两个点对应到feature map中的位置,就能从feature map中取到这个候选区域对应的特征,这就是一个简单的映射,如下图:

令S是stride的大小,也就是从原始分辨率到当前分辨率尺度的降低倍率,则从原图的坐标(x,y)对应到featuremap的坐标(x’,y’),就是

x’=x/S ,y’=y/S

根据图片填充的不同,需要计算相应的偏移值,但是这是一一对应的。此时,任意的图像区域的特征,都可以从特征图中获取,就没有必要使用不同的CNN网络进行特征的提取了。而是实现了一次卷积处处可用,类似于积分图的思想,从而大大降低了计算量。

同时它的训练和测试不再分多步,不再需要额外的硬盘来存储中间层的特征,梯度也能够通过RoI Pooling层直接传播。Fast R-CNN还使用SVD分解全连接层的参数矩阵,压缩为两个规模小很多的全连接层。

2.4 Faster R-CNN

R-CNN,SPPNet,Fast R-CNN都没有解决一个问题,就是selective search方法低效率的滑动窗口选择问题,它仍然生成了大量无效区域,多了造成算力的浪费,少了则导致漏检。

因此,任少卿等人提出了Faster RCNN方法。在Faster RCNN框架中,提出了Region Proposal Networks,简称RPN框架。它实现了利用神经网络自己学习生成候选区域的策略,充分利用了feature maps的价值,在目标检测中彻底去除了selective search方法。

Faster R-CNN是深度学习中的two-stage方法的奠基性工作,提出的RPN网络取代Selective Search算法后使得检测任务可以由神经网络端到端地完成。

粗略的讲,Faster R-CNN = RPN + Fast R-CNN,因为Fast RCNN具有共享卷积计算的特性,所以使得新引入的RPN的计算量很小, Faster R-CNN可以在单个GPU上以5fps的速度运行。

所谓RPN,就是以一张任意大小的图片作为输入,输出一批矩形区域的提名,每一个区域都会对应目标的分数和位置信息。实际就是在最终的卷积特征层上,在每个点利用滑窗生成k个不同的矩形框来提取区域,k一般取为9。

K个不同的矩形框被称为anchor,具有不同尺度和比例。用分类器来判断anchor覆盖的图像是前景还是背景。对于每一个anchor,还需要使用一个回归模型来回归框的精细位置。

Faster R-CNN中RPN的结构如下:

与selective search方法相比,RPN网络将候选区域的选择从图像中移到了feature map中,因为feature map的大小远远小于原始的图像,此时的滑动窗口的计算量呈数量级的降低。并且RPNs和RoI Pooling还共用了基础的网络,更是大大地减少了参数量和预测时间。由于是在特征空间进行候选框生成,可以学到更加高层语义的抽象特征,生成的候选区域的可靠程度也得到了大大提高。

Faster R-CNN的主要步骤如下:

特征提取:与Fast R-CNN相同,Faster R-CNN把整张图片输入神经网络中,利用CNN处理图片得到feature map;

区域提名:在上一步骤得到的feature map上学习proposal的提取;

分类与回归:对每个Anchor Box对应的区域进行二分类,判断这个区域内是否有物体,然后对候选框位置和大小进行微调,分类。

理论上就这么多,理解起来很简单,但是实际实现细节非常多,请大家关注今天的另外一篇文章,《万字长文详解Faster RCNN源代码》。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190927A0MRZ900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券