RCNN
定义
RCNN是一种目标检测框架。首个将 CNN 引入目标检测领域的算法模型.
在特征提取阶段使用CNN(AlexNet)其它阶段使用的还是传统目标检测的方法.
背景
最初的 R-CNN 在2013年提出,但速度较慢,因为它需要对每个提议框进行单独的卷积操作。
后续衍生出很多优化版本:Fast R-CNN(2015)、Faster R-CNN(2015)、Mask R-CNN(2017)
架构
R-CNN目标检测主要分为四个大的阶段.
1. 产生候选区域
对于输入的图片,使用Selective Search方法(了解即可),选择出2000个候选区域(每个区域大小不一)
2. 特征提取
使用AlexNet对每一个候选区域提取特征,得到2000 * 4096维的特征向量
AlexNet是一个经典的深度卷积神经网络.在2012年的ImageNet 中获得了第一名。
AlexNet有11层:5个卷积层和3个全连接层,3个池化层.
TODO:有助于对于滤波器的理解
1 | 注1:在进行特征提取之前,需要先对上一步生成的候选区域进行调整,使其变为227*227,这是因为AlexNet输入是固定的,当然,其实卷积操作的输入可以不固定,全连接层的输入大小才是固定的,这也是后面几个模型会改进的。 |
3. 候选区域类别判断
将2000 * 4096维特征向量送入到21个(20个类别+1个背景)SVM分类器中,每一个SVM分类器包含4096个参数,所以可以看成两个矩阵相乘,即
,这样就得到了每一个候选区域是某个类别的概率值。因为一张图片出现有上千个物品的可能性微乎其微,所以必定有大量的候选区域是重叠的,因此需要去除冗余的候选框。作者在此处使用非极大值抑制(NMS)方法来去除冗余候选框,对于每一个类别中IoU大于给定阈值的候选区域。这样就得到了每一个类别得分最高的一些候选区域。
4. 使用回归器对候选框位置调整
对于上一步经过NMS筛选后的候选区域,其精度必定不够,所以需要进行进一步的调整,因为该部分在Faster RCNN中也有用到,所以具体的细节放在后文
RCNN框架
总结
在文章中,作者认为 R-CNN 较之前的算法,能够取得30%的改进是基于以下两点:
- 使用了CNN来提取候选区域的特征
- 使用迁移学习,因为目标检测领域的数据相比图像分类任务要少很多,所以使用在图像分类上训练好的模型,经过 fine-tune 可以很好的运用在目标检测上。
可以理解为:R-CNN是个实验品,首个引入 CNN进行目标检测的算法。 主要是因为 性能差,训练繁琐,效果一般.
R-CNN的不足
- 速度慢,因为需要对selective search算法生成2K个候选区域分别提取特征,而又由于候选区域的重叠问题,所以这中间有着大量的重复计算(这也是后面的改进方向)。
- 训练步骤繁琐,需要先预训练CNN,然后微调CNN,再训练20个SVM,20个回归器,期间还要涉及用NMS去除候选冗余框,(光看着就让人头皮发麻)
Fast R-CNN
R-CNN的改进:在R-CNN和SPPNet的基础上进行改进
- 准确率提升:与R-CNN、SPPNet相比,有着更高的准确率
- 多阶段训练-> 单阶段训练:通过使用多任务损失,将模型训练由多阶段转变为单阶段训练
- 一次性更新,无需分步:训练时可以一次更新网络的所有层,不再需要分步更新参数
- 不再需要硬盘来存储CNN提取的特征数据
流程主要分三步:
- 候选区域生成:使用 Selective Search 方法生成2K个图片候选区域
- 对整张图片进行特征提取得到相应的特征图(大的改进,参考了SPPNet);并将上一步生成的候选区域映射到特征图中
- 使用ROI Pooling将所有的候选区域特征统一缩放到7 * 7大小;然后将这2K个特征向量展平。并连接到全连接层上,得到两个输出结果,一个是K+1类(类别数+背景类)的概率,还有一个是每个类的预测边框。