关于Fast-RCNN的个人理解
背景
在上一篇博文中我讲述了关于RCNN的理解,而这一篇则是RCNN的进阶版,主要是为了解决RCNN存在的一些缺点(计算速度十分缓慢)。
思想
作者发现在RCNN中,在一开始从图像中提取特征进行了很多次的重复计算,因此作者不再是先使用SS算法得到候选区域,再统一缩放到相同尺寸(RCNN中默认为227 * 227),进而将每一个候选区域送入到网络中。改进的方法则是先将整张图像送入到网络中得到一个特征图,然后依据SS算法得到候选区域后,再将它们映射到特征图上,得到对应的特征向量,进而再推算类别概率与box预测,节省了大量的重复计算的时间。
模型结构
模型的算法流程如下图所示,首先将整张图像送到网络中提取特征,得到整张图像对应的特征图,然后再再将候选区域映射到特征图上得到对应的特征向量。经过上一个步骤我们将会得到尺度不一的多个候选区域映射得到的特征向量(长度不一是因为:候选区域的尺寸是随机产生的),接着作者将这些长度不一的特征向量划分成相同数量的区域(默认是7 * 7=49个),然后再在这49个区域上使用最大池化,这样我们就可以将每一个候选区域对应的特征图缩放到相同的尺寸了。后先接上一个全连接层融合信息,最后分别再接上两个全连接层(并联的状态),一个全连接层接上Softmax函数,预测N+1(N代表所要预测的类别个数,1代表背景概率)个类别概率,另一个则是预测N+1个类别概率对应的预测box的相关变量(有中心点、宽高缩放比例,总共四个变量),也就是说box回归器将会输出4 * (N+1)。
以下整个算法流程:
训练阶段
在介绍完算法流程之后,接下来就需要作者是如何训练模型的,采用的是什么损失函数,以及如何标定正负样本。
-
标定正负样本
我们先来回忆一下RCNN中是如何标定正负样本的,将所有的候选区域(大约2000个)与GT计算IOU,如果计算的结果超过设定的阈值(默认为0.3),则标为正样本。而在该文章中,首先从2000个候选区域随机选择64个,之后将这64个候选区域与GT计算IOU,如果计算结果超过设定的阈值(默认为0.5),则标为正样本(参与类别损失、box损失),而在剩余的box中,如果与所有的GT计算的IOU的最大值在【0.1~0.5】范围内,则标为负样本(仅参与类别损失),其余的不参与任何损失的计算。也就是在本文中,并不是将所有的候选区域计算损失,仅仅只是选择了一小部分。 -
损失函数
模型训练的损失包含正负样本的类别损失以及正样本的box(对应类别的)损失。以下为论文中所采用的损失公式。
这里解释一下各个变量的含义:首先 t u t^u tu代表的被标为正样本的框对应真是类别 u u u的预测值,因为我之前说过box预测的输出是关于每一个候选区域对应每一个类别的四个box预测变量,而我们只需要选取其中对应真实类别的box预测值参与损失的计算。此外,对于真实GT对应的变量与RCNN中一样,依据以下公式得到:
如对上述公式不太理解的,请阅读上一篇对RCNN中对此公式的解读。
测试阶段
与RCNN类似,只不过在选取box的变量时,需要注意选取的是预测类别对应的box变量。
总结
如理解存在纰漏,敬请指正,谢谢!