RCNN是利用深度学习进行目标检测的开山之作。
算法流程
一张图像生成1K~2K个候选区域(使用Selective Search方法)。
利用Selective Search算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。
Selective Search算法步骤:
- 使用一种分割手段,将图像分割成小区域(1k~2k)。
- 计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等。
- 将相似度高的区域合并到一起。
- 计算合并区域与临近区域的相似度。
- 重复3、4过程,直到整个图片变成一个区域。
图1-1 SS得到候选框
对每个候选区域,使用深度网络提取特征。
将2000个候选区域resize到227×227pixel,接着将候选区域输入到事先训练好的AlexNet CNN网络,将分类网络的全连接层前一层即展平处理的那一层提取出,获取4096维的特征,最终组合得到2000×4096维矩阵。2000行每一行都是一个候选框的特征向量。
原CNN模型针对ImageNet数据集且不变形的图像来提取特征,现在却是针对VOC数据集且变形的图像来提取特征,所以需要对CNN作特定领域的参数调优,也就是fine-tuning。用的是候选区域进行微调的。
图1-2 将候选框输入深度网络提取特征
特征送入每一类的SVM分类器,判别是否属于该类。
将2000×4096的特征矩阵与20个SVM(SVM是一个二分类的分类器)组成的全值矩阵4096×20相乘,获得2000×20的概率矩阵,每一行代表一个候选框归于每个目标类别的概率。分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠候选框,得到该列即该类中得分最高的一些候选框。
- SVM是一个二分类的分类器,所以多类别需要训练相同类别个数的分类器。 这里分类数为20是因为使用的数据集是PASCAL VOC。2000:2000个候选框。20:PASCAL VOC的类别数。
- 为什么使用SVM分类器而不是softmax最后一层进行分类呢?原因是CNN需要大量的数据,否则容易过拟合,而SVM适用于样本少的数据集,还是因为Small VOC训练量太少了。
图1-3 将候选框输入深度网络提取特征
非极大值抑制(Non-maximum suppression)剔除候选框:2000×20的矩阵,就比如说第一列是2000个候选框为猫猫类的概率。
- 找到得分最高的概率值相应候选框。
- 计算其他候选框与该候选框的IoU值。
- IoU值大于给定阈值的候选框意思是这两个候选框的目标是一样的,剔除较小概率值的相应候选框。最终删除所有IoU值大于给定阈值的候选框。
- 遍历完所有的类别。
注:我看到有些地方讲的是非极大值抑制放在了回归修正之后。
图1-4 非极大值抑制剔除重叠候选框
使用回归器精细修正(BoundingBox-Regression)候选框位置。
对NMS处理后剩余的候选框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的候选框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
在回归过程中,依然使用CNN的输出特征向量m×4096进行预测(m是NMS之后留下的候选框个数)。将(m,4096)矩阵代入(4096,4)的回归矩阵中,最终输出(m,4)的偏移矩阵。 黄色是候选框Region Proposal。候选框、建议框、边界框都是一个东西。
图1-5 最小二乘修正候选框
RCNN存在的问题
- 测试速度慢。一张候选框之间存在大量重叠,提取特征操作冗余。
- 训练速度慢。
- 训练所需空间大。对于SVM和bbox回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘,占空间较大。