R-CNN -> Fast R-CNN -> Faster R-CNN
R-CNN是利用深度学习进行目标检测的开山之作。
RCNN算法流程可分为4个步骤:
利用Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含可能的物体。
比如下方这张图,对这张图使用Selective Search算法,就可以得到一些矩形框,这些矩形框当中就可能包含了所需要检测的目标。
将2000候选区域缩放到227 X 227pixel,接着将候选区域输入事先训练好的AlexNet CNN网络获取4096维的特征得到2000 X 4096维矩阵。
在将候选框输入到CNN网络之前,首先要进行处理,缩放到227 X 227的大小,之后放到图像分类网络(CNN)得到特征向量。
将2000 X 4096维特征与20个SVM(SVM分类器是一个二分类的分类器)组成的权值矩阵4096 X 20相乘,获得2000 X 20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000 X 20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。
以其中一个特征向量为例,将这个向量(其实是一个行向量)分别输入到SVM分类器中,得到分数。
最左边是2000 X 4096的特征矩阵,每一行就是一个候选框通过CNN网络得到的一个特征向量(2000个候选框,所以有2000行);中间的就是SVM权值矩阵,每一列对应着一个类别的权值向量(这里有20个类别),最右边是概率矩阵。
非极大值抑制剔除重叠建议框如何实施?
交并比(IoU):A与B的交集除以A与B的并集
对NMS处理后剩余的建议框进一步筛选(保留那些与我们真实标注的目标边界框)。接着分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
依旧针对CNN输出的特征向量进行预测。
如图,黄色框口P表示建议框Region Proposal,绿色窗口G表示实际框Ground Truth,红色窗口G^表示Region Proposal进行回归后的预测窗口,可以用最小二乘法解决的线性回归问题。
R-CNN存在的问题:
同样使用VGG16作为网络的backbone,与R-CNN相比训练时间快9倍,测试推理时间快213倍,准确率从62%提升至66%。
Fast R-CNN算法流程可分为3个步骤:
R-CNN中依次将候选框区域输入到卷积神经网络得到特征,假设有2000个候选框,就要2000次正向传播,存在大量冗余;Fast R-CNN将整张图象送入网络。
关于数据采样,并不是去使用SS算法提供的所有的候选区域(SS算法得到2000个候选框),而是使用其中的一小部分。
训练数据的采样还分为正样本和负样本,正样本就是候选框中确实存在的所需检测目标的样本,负样本可以理解为背景,即里面没有所需检测目标。将训练数据分为正样本和负样本的原因是为了平衡?如果样本全部都是正样本的话,网络会认为候选区域是所需要检测的目标。(就比如说我现在要弄一个猫狗的分类器,但我的样本全是猫的,这样就不太合理)
在原论文中,对于每张图片,是在2000个候选框当中采取64个候选区,这64个候选区当中的一部分是正样本,一部分是负样本。正样本的定义方式是:只要候选框与真实目标边界框的IoU值大于0.5就认定为正样本。
将一个图像直接输入到CNN网络中,得到它的特征图,根据它的映射关系,找到每一个候选区域的特征矩阵,将这些矩阵通过Rol Pooling层统一缩放到相同的尺寸。之后进行展平处理,通过两个全连接层得到Roi feature vector,再并联两个全连接层(一个用于目标概率的预测,一个用于边界框回归参数的预测)。
下图是目标概率预测分类器,对应虚线框所框选的部分。这个概率是经过softmax处理之后的,所以它是满足概率分布的,即和为1。
下图是边界框回归器,对应虚线框所框选的部分,也是一个全连接层。
Fast R-CNN的损失如何计算?
分类损失为什么等于-logPu?如下图,Oi*只有再正确的索引位置是等于1的,其他位置上都是等于0的,0乘以任何数都等于0,所以可以将0的位置全部省去,最后只剩下一项,即真实标签索引的那一项。假设真实标签的one-hot编码是:[0,0,...,1,...,0] ,预测的softmax概率为[0.1,0.3,...,0.4,...,0.1],那么Loss = -Log(0.4)
艾弗森括号: 可以理解为一个计算公式,当u>=1的时候,这一项等于1,其他情况等于0。
怎么理解艾弗森括号?u代表的就是目标的真实标签,u>=1就说明候选区域确实属于所需检测的某一类别当中,对应着正样本,采取边界框回归损失。当u不满足>=1,对应当前候选区域是负样本,背景,没有边界框回归损失这一项。
Fast R-CNN的速度瓶颈在SS算法上。
Faster R-CNN使用VGG16作为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。
Faster R-CNN算法流程可分为3个步骤:
用RPN(Region Proposal Network)代替SS算法。
特征图上使用一个滑动窗口,在feature map上进行滑动,每滑动到一个位置上,就生成一个一维向量。在这个向量的基础上,再通过两个全连接层分别输出我们的目标概率以及边界框回归参数。
2K scores是针对每一个anchor生成两个概率,一个是为背景的概率,一个是为前景的概率,所以K个anchor就会生成2K个scores。
针对每一个anchor生成4个边界框回归参数,所以是4K coordinates。
256是因为以ZF网络作为backbone时所生成的特征图的深度是等于256的,如果使用的是VGG16的话,就应该是512。所以一维向量元素的个数是根据我们所使用的backbone它的输出特征矩阵的深度来确定。
什么是anchor?对于特征图上的每一个3 X 3的滑动窗口,首先计算它的中心点(也就是特征图上的这个中心点在原图上对应的一个位置。怎么找这个位置?首先将原图的宽度除以特征图的宽度,取整得到一个步距,X坐标就等于步距乘以特征图上这一点的X坐标;同理它的Y坐标通过将原图的高度除以特征图的高度,取整得到一个步距,再乘上特征图上这一点的Y坐标得到),再以这个点为中心去计算出K和anchor box(这里的anchor box都是给定的大小及长宽比例)
2K scores和4K coordinates究竟是怎么影响的呢?假设cls是所生成的2K scores(两个两个为一组,因为每一个对应的是一个anchor为背景或前景的概率),reg是生成的4K coordinates(四个四个为一组)
为什么要给出这么多不同比例以及不同尺寸的anchor呢?因为我们所需检测的目标的大小肯定是不一样的,而且每个目标它的长度比也是不一样的,所以需要一系列的anchor来预测目标的一个位置。
论文中给出的一些数据:
也就是说实际上我们在每个地方都会生成九个anchor。
虽然感受野不完全比预测尺度大(171小于256和512),但不代表着不能预测相应边界框的样式。通过经验的话,看到一个物体的一部分,其实是能够大概猜出这个目标完整的一个位置的区域的。
同样在训练数据的采样中也包含正样本和负样本。
正样本是如何定义的?
负样本的定义是针对某一anchor它与所有ground-truth的IoU都小于0.3。
损失同样包括两部分,一个是分类损失,一个是边界框回归损失。
多分类的交叉熵损失。
二分类的交叉熵损失。
边界框回归损失