2014年加州大学伯克利分校的Ross B. Girshick提出R-CNN算法,其在效果上超越同期的Yann Lecun提出的端到端方法OverFeat算法,其算法结构也成为后续two stage的经典结构。
R-CNN算法利用选择性搜索(Selective Search)算法评测相邻图像子块的特征相似度,通过对合并后的相似图像区域打分,选择出感兴趣区域的候选框作为样本输入到卷积神经网络结构内部,由网络学习候选框和标定框组成的正负样本特征,形成对应的特征向量,再由支持向量机设计分类器对特征向量分类,最后对候选框以及标定框完成边框回归操作达到目标检测的定位目的。
算法流程:
- 输入一张照片
- 采用启发式搜索算法selective search,在一张图片上提取出1k~2k个候选区域(proposal region)
- 对每一个候选区域进行裁剪拉伸,使得变形之后的每一个候选区域wraped region的大小相同(如227*227)
- 分别将每一个wraped region送入CNN中进行特征提取,得到对应的特征向量(一张input图片得到1k~2k个特征向量)
- 将特征向量送入SVM中进行目标识别。注意,若感兴趣的物体类别有10个,则需训练10个SVM,每个SVM都会得到一个该wraped region属于该类的概率值
- 采用回归算法bounding box regression对候选区域的边框进行调整,使得物体定位更准确。
模型创新点:
- 将大型CNN应用于目标检测领域,开创了two-stage的目标检测模型
- 当labeld数据集不够的时候,可以先用在大型数据集上训练的模型,然后在特定数据集上进行微调,可以大幅提高模型性能
模型缺点
- 重复计算 R-CNN虽然不再是穷举,但通过Proposal(Selective Search)的方案依然有两千个左右的候选框,这些候选框都需要单独经过backbone网络提取特征,计算量依然很大,候选框之间会有重叠,因此有不少其实是重复计算。
- 训练测试不简洁。候选区域提取、特征提取、分类、回归都是分开操作,中间数据还需要单独保存。
- 速度慢。前面的缺点最终导致R-CNN出奇的慢,GPU上处理一张图片需要十几秒,CPU上则需要更长时间。
- 输入的图片Patch必须强制缩放成固定大小(原文采用227×227),会造成物体形变,导致检测性能下降。