在介绍R-CNN之前,先来了解一种目标检测算法的思路。
最初的目标检测采用的思路是滑动窗口,比较暴力的从左到右和上到下的扫描图片。
设定好检测框(Bounding box)的大小,扫描图片后生成子图片。这样就变成了分类的问题了。但是,图片中的物体大小是不一样的,这也意味着每个检测框的大小也不一样。所以就要提前设定M个检测窗口,每个窗口滑动提取N张图片,总共M*N张图片。
每张图片通过转换压缩变形等手段固定成大小一样的图像,然后输入CNN分类器提取特征。
●那这种方法是怎么进行数据训练的呢?
准备所需要的训练数据集,每张图片被扫描后生成的子图片和图片的位置如下图:
比如我们要检测的目标是车,手动标注和准备训练数据集。x为训练的数据,y为标签。是车标记为1,不是车标记为0。
●Overfeat总结
这种方法就好像暴力穷举,需要消耗大量的计算力和时间。除此之外,大小不一样的检测框也可能导致效果不准确。
但是,它提供了一种目标检测的思路。
R-CNN使用的不是上面说到的暴力扫描的方式,而是一种候选区域法(region proposal),它以深度学习神经网络为基础的物体检测模型,在性能上有很大的提升。
下面是完整的R-CNN的结构图:
先来列出整体的算法运行流程,具体的下面再做详细理解
算法运行流程:
●找出图片中可能存在目标的侯选区域(region proposal)
●进行图片大小调整为了适应AlexNet网络的输入图像的大小227×227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成2000×4096维矩阵
●将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,则有20个SVM),获得2000×20维矩阵
●分别对2000×20维矩阵中每一列即每一类进行非极大值抑制(NMS:non-maximum suppression)剔除重叠建议框,得到该列即该类中得分最高的一些建议框
●修正Bounding box,对bbox做回归微调.
这里涉及到很多区域选择算法,其中最出色的是选择性搜索(selective search)。它的工作原理是将图片中的每一个像素作为一组,然后计算每个像素的纹理,将相近的的组合起来形成更大的像素组,然后继续合并各个像素组。下图中展示了像素组是如何扩大的,蓝色矩形代表了真实图片各像素组合并中所有可能的目标对象。
selective search选取的检测框大小都不一样,但是进入CNN提取候选区的特征向量需要固定的格式输入。因此,就需要对候选区域做尺寸的修改。
R-CNN网络结构中的第三层,Warp region。控制候选区的大小,因为这是根据Alexnet结构为基础,即大小要求为227*227.
●Crop:截取原图片一个固定大小的碎片
●Warp:缩放图片
尽管再优秀的算法,也不可能在不失真的情况下传入到CNN中。但是会尽可能的让图片发生更小的变形。
●各向异性缩放:直接缩放到指定大小,但是会造成一定的图片失真
●各向同性缩放:在原图上裁取候选区域填充在边界。
上图中,第一行的图片是异性缩放的方式,第二行是同性缩放,相比之下,后者图像的变形或者说是失真没那么严重。
经过前面两步的候选区域提取的子图,进入卷积神经网络进行特征提取,并且将特征数据存于磁盘中
将提取好的特征数据存于磁盘中是为了后续步骤的使用。而这些存储的特征才是真正要进行训练的数据。
一张图片中的候选区域大约2000个,而R-CNN中的CNN输出是4096大小的特征向量。所以总的特征向量就是2000*4096.
R-CNN中会有20个不同类别的SVM分类对2000个候选区域的特征向量进行分类。所以就有20*2000这样的一个得分矩阵。见图:
每个分类器都会对2000个候选区域进行分类判断,如上图中判断是否为猫,如果是,得分矩阵中的值记为1,并且给一个分数,这个分数也可以说是该特征为猫的概率分数。如果不是则理解为是背景,记为0。
这一步目的是筛选CNN网络最后预测的候选区域,因为共有2000个候选区域,检测一个目标不可能同时显示这么多候选区域。如图:
图中CNN最后推荐有五个候选区域,上面标注的分数就是上一步得分矩阵的分数。
NMS的方式是选取分数最大的候选区域,然后其余候选区域与它进行交并比IoU计算,也就是两个候选区域相交部分与两候选区域总面积之比。这里还会设置一个阈值,比如阈值为0.5。如果IoU>=0.5。那么分数小的候选区域会被删除。因为IoU的值越接近1,说明两候选区域越接近重合。也就是说两候选区域预测的是同一个目标,只有分数大的会被保留。
经过上述步骤得出最后的一个候选区域不一定就是正确的,即使它的得分再好。
所以R-CNN的最后一步会进行微调。就是以最后一个候选区域的特征值,与目标值(grounding truth)建立回归方程计算。这里不展开讨论回归方程计算,简单的理解为候选区域参考真实标注的目标来进行偏移。以下图为例:
A为最后的候选区域,G为真实标注的目标区域。经过建立回归方程的计算得出G’。使最后的候选区域更接近真实目标,从而提高预测的准确率。
以上就是R-CNN的整个运作流程。那么它是怎么进行训练的呢?
训练过程包括:正负样本准备+预训练+微调网络+训练SVM+训练边框回归器
●正负样本准备
正样本:与真实目标进行IoU运算,值大于或等于0.5的候选区域。
负样本:负样本则是小于0.5的候选区域。
一般正负样本的比例为正样本1:3负样本。
●预训练
一般在开发中,不会用自己初始化的CNN网络模型,那样的准确率是不太高的。因为CNN的参数有很多,需要大量的数据参与训练。一般是在训练好的CNN模型基础上进行微调,例如使用Alexnet。
●微调
微调就是拿训练好的CNN模型,把刚自己准备好的样本进行尺寸变换,再继续训练,得出新的模型。类似迁移学习
●训练SVM
上述的预训练+微调只是训练好了全连接层。还要对SVM分类器进行训练,有20个SVM分类器就意味着要进行20个类别的训练。刚准备的正负样本就是用来训练分类器的。
●训练边框回归器
这是最后一步用于修改候选区域的回归器,参与这一步训练的数据很少。因为这一步是以真实目标值(grounding truth)为参考的,只有真实目标值和IoU大于一定阈值的候选区域数据才会参与训练。
●训练阶段多:步骤繁琐: 微调网络+训练SVM+训练边框回归器。
●占用磁盘空间大:上面提到的特征存于磁盘中,每个图片会有2000个候选区域
●训练耗时
●处理速度慢
以上就是R-CNN的所有内容,或有遗漏,欢迎指正。
篇幅过长,感谢阅读!
END