目标检测算法理解:从R-CNN到Mask R-CNN

因为工作了以后时间比较琐碎,所以更多的时候使用onenote记录知识点,但是对于一些算法层面的东西,个人的理解毕竟是有局限的。我一直做的都是图像分类方向,最近开始接触了目标检测,也看了一些大牛的论文,虽然网上已经有很多相关的算法讲解,但是每个人对同一个问题的理解都不太一样,本文主要结合自己的理解做一下记录,也欢迎大家批评指正~

在讲解object detection算法之前,我们需要明白图像处理领域的几个任务的区别,比如image classification、semantic segmention、instance segmention。image classification是对整个图像做识别,判断其属于哪一类,比如名人识别。object detection是检测图像中有什么,如果有的话会框出所有该对象所在的子区域,值得一提的是,这里的对象可以是多类,比如一副图中同时包含猫、狗、鸭等对象,一个目标检测算法可以分别找到所有这些对象。semantic segmention是不考虑图像中的目标实体,将每个像素划分到不同的类别。instance segmention不仅要检测出对象,还要对对象按照其真实边缘进行精确的分割。

R-CNN

R-CNN的全称是Region-Based Convolutional Networks,它是一种比较符合常规思路的目标检测算法。从字面意思就可以看出,卷积网络的输入是图像的某个子区域,而不是整个图像。传统的SIFT和HOG浅层特征并不能很好地表征图像中的模式,作者采用了深层CNN网络来提取图像中的判别信息。下面按照模型定义->模型训练->模型测试->postprocessing的思路讲解这个算法。

R-CNN网络结构

R-CNN网络结构主要包含两大部分,CNN网络和SVM分类算法,前者用于提特征,将单个候选区域转换成一维的特征向量,后者包含了多个svm分类器,分类器的个数与目标的类别数相同,具体的网络结构如下,

数据准备和模型训练

object detection任务也属于有监督学习算法,每一个图像对应着标签,这里的标签包括图片中对象的bounding box和该box中对象的类别。对于每一幅图像,文章采用了selective search策略提取出2000个候选区域,这里不妨把候选区域称作子图像块。整个模型的训练是分阶段进行的,先训练前面的CNN网络,再训练后面的SVM分类器,下面分开介绍这两个阶段。
  对于CNN网络来说,在训练该模型时,它的标签包含了两类图像块,positive样本和negative样本,positive指IoU值大于0.5的图像块,negative指Iou值小于0.5的图像块(IoU的全称是intersection-over-union,表示图像块和对应的bounding box之间的交集区域面积与并集区域面积的比值,显然,当图像块和bounding box重叠时,IoU取最大值1)。因为CNN网络的输入图像尺寸是固定的,所以为了更够正常地输入到网络中,需要先将这些图像块缩放到规定的尺寸。
  通常,与image classification任务不同,目标检测的训练图像数量通常都相对较少,所以训练CNN网络的时候,并不能从头开始训练,而是基于已经训练好的的CNN网络,对其输出层参数进行微调,这种思想也可以看作是“迁移学习”。这里顺便回答一下为什么不直接用CNN网络的提取出的特征,而是要进行finetune阶段呢?因为一些经典的CNN网络结构,比如Alexnet和Resnet等模型,它们都是基于Imagenet数据集进行训练的,也就是说它们在挖掘imagenet数据集中的模式的效果比较好,但是不同数据集的分布是有差异的,原生的Alexnet网络并不能很好地提取出新的目标检测数据集中的规律。
  对于SVMs来说,因为SVM在训练样本数比较少时也有很好的分类效果,所以它对训练样本的构造比较“挑剔”,只有当子图像块将整个bounding box框住的时候才会被作为positive样本,只有当子图像块的Iou值小于0.3才会被作为negative样本。其他的子图像块全部忽略。显然,这些子图像块可能包含了不同的目标,比如有的包含飞机,有的包含人物,还有的包含电视监视器,那么就相当于是一个多分类问题, 而SVM实现多分类是通过将其分解成多个二分类问题解决的。比如在训练第一个二分类模型,判断是否为飞机时,可以选择包含飞机的图像块作为正例,其它的图像块作为反例。
  到这里,还需要解释两个问题,一是为什么CNN网络和SVM的训练样例的选择标准会不同呢?二是为什么作者不直接使用CNN的分类器输出作为预测标签,而要额外引入SVM呢?对于第一个问题,因为在训练CNN网络时,为了避免网络模型over fitting,需要使用更多的训练样本,于是就必然要用到可信度较低的positive样本(Iou值介于0.5和1之间)。对于第二个问题,因为CNN网络的训练样本鱼龙混杂,所以并不能实现精确定位出目标区域,所以仅作为特征提取,而额外采用SVM来判别图像块的类别。

模型测试

在模型测试阶段,输入的是单幅图像,然后采用selective search方法生成2000个候选区域,对于每一个候选区域,先使用CNN网络模型提取其一维特征向量,然后使用SVMs输出该特征向量属于不同类别的scores,预测出该特征向量对应的类别标签。当所有2000个候选区域均打分完成时,对于每一个类别,使用贪婪的non-maximum supression算法舍弃掉某些区域,关于这个算法,原文中是这么说的"rejects a region if it has an intersection-over-union
(IoU) overlap with a higher scoring selected region larger than a learned threshold"。可以这么理解,比如当前类别有五个图像块,编号分别为A、B、C、D、E,先将这些图像块按照score由高到低排列,假设排序后为B、A、D、E、C,先保留得分最高的图像块(或者称作候选区域),也即B,然后分别计算A、D、E、C与B之间的IoU值,如果IoU值大于设定的threshold,就舍弃该图像块,比如A和B之间的IoU值为0.9,大于设定的threshold=0.7,那么就舍弃图像块A,现在就剩下D、E、C需要取舍了,思路同上,也是要先保留三者中Iou最大的图像块,对于每一类都这样进行下去,就可以得到图像中所有类别的对象的子区域。

postprocessing

在上一步得到所有候选区域中可信度较高的图像块后,我们通常的想法是到这里已经处理完了,但作者在文章最后阐述了Bounding-Box Regression。具体来说,它是用于对图像块的位置进行微调用的,使其更加接近真实的boundingbox,记P=( P x P_{x} Px, P y P_{y} Py, P w P_{w} Pw, P h P_{h} Ph)表示当前候选的图像块,G=( G x G_{x} Gx, G y G_{y} Gy, G w G_{w} Gw, G h G_{h} Gh)表示真实的boundingbox位置,在训练该回归模型的时候,分别使用线性回归模型对G中的四个参数建模,该模型的输入是输入图像块在第5个pooling层的特征表示,通过定义带二范数约束的均方误差损失函数,可以求解出回归模型的参数。回归模型的优化过程比较简单,在这里就不详细展开讲了,具体的可以参见原文中的7.3部分。

Fast R-CNN

在2015年,作者提出了新的目标检测模型Fast R-CNN,它是R-CNN的改进版本。那么,为什么要对R-CNN算法进行改进呢,因为它存在如下3大缺点:
  (1)训练过程是多阶段的,先后分别训练了ConvNet、SVM和bounding-box regressors;
  (2)训练过程耗时较长且需要较大的存储空间;
  (3)在测试阶段进行目标检测很慢,因为要分别对每一个候选区域进行前向传播。

Fast R-CNN网络结构

Fast R-CNN使用了单阶段的多任务网络模型进行目标检测,该模型的输入为整个图像和图像中的所有目标区域。从信号流的前像传播的角度来看,从输入到输出经过了下面几个阶段:
  (1)该网络先采用了多个卷积和池化操作提取出高阶抽象特征,将输入图像转换成了一个conv feature map。然后,因为该feature map和输入图像的尺寸不一样,需要将输入图像中的目标区域投影到该feature map上去;
  (2)为了使所有投影后的图像块能和后面的fully connected layer神经元数目保持一致,需要将这些大小不一的图像块变换到相同尺寸,这里便用到了RoI pooling layer,具体来说,比如一个大小为 h ∗ w h*w hw的图像块,可以把它划分成 H ∗ W H*W HW的网格,然后对每个小格子中的所有像素进行max-pooling操作,那么不管投影后的图像块的大小如何,经过RoI pooling层后都会被转化为相同的尺寸了;
  (3)池化后的二维特征经过多个全连接层,转化为一维的特征向量,即RoI feature vector;
  (4)基于上面得到的feature vector,引出两个分支,分别为softmax分类器和bbox regressor。softmax分类器用于输出候选窗属于K个类别对象的概率,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值