R-CNN 论文笔记
R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation
摘要
过去的 state of art 模型基本都是集成模型,集成低阶特征和高阶特征。本文作者提出了R-CNN,大大提高了性能。该算法主要有两个特点:(1):使用了CNN来提取特征;(2):使用了预训练模型。因为使用了CNN从 proposal 提取特征,所以模型就被称为 R-CNN:Regions with CNN features。
作者将 R-CNN 与 OverFeat 进行了对比,OverFeat 使用了基于 CNN 的 sliding-window detector。R-CNN 比 OverFeat 性能高很多(数据集使用的是:200类的 ILSVRX2013 detection 数据集)。
代码见:http://www.cs.berkeley.edu/˜rbg/rcnn
总结:
R-CNN 方法主要分为三个阶段:
- 使用 selective search 来得到与类别无关的 region proposals
- 使用 CNN 从每个 region proposal 提取特征
- 使用 SVM 来处理上一步提取的特征(使用SVM,主要)
最后使用 NMS 来产生最后的bbox
优点:
- 使用 CNN 来处理 region proposal,准确率得到了提高
缺点:
- selective search比较慢
- 采用了多个阶段,训练起来比较麻烦
- 需要在每一个 region proposal 上使用 CNN 来提取特征,这是最耗时间的地方
1. 简介
R-CNN 首次将 CNN 用于目标检测。相比使用 HOG 等特征,使用 CNN 能够大大提高物体检测的性能。为了在目标检测中使用 CNN,主要有两个问题:(1):怎么使用 CNN 来定位目标;(2):怎么用少量的带标记的检测数据来训练一个大容量的模型。(现在数据量的问题已经不是问题)
与识别任务不同,检测任务需要去检测图片中的物体的位置。检测位置有两种常用方法:(1):回归;(2):滑动窗。滑动窗使用CNN时,为了保持高分辨率,这些CNN一般只有两层conv和pool。作者也对滑动窗进行了实验,但作者使用的CNN 有 5层 conv,从而有很大的感受野。
作者进行目标识别的框架是“recognition using regions”,这种框架已经被成功的用于了目标检测、场景分割。在本文,我们对比了 R-CNN 和 OverFeat(使用 滑动窗CNN)。R-CNN 的性能远超 OverFeat。
作者在文中使用了预训练的模型来缓解目标检测标记数据较少的情况。
模型失效分析对于提高模型的性能非常重要。作者基于 Hoiem 等人的 detection analysis tool 对模型进行了分析。通过分析,我们说明了:一个简单的 bounding-box 回归方法能够大大减少错误的定位,因为这种错误是主要的错误模式。
因为使用了 R-CNN,所以将其扩展到场景分割任务很简单,通过简单修改,作者在场景分割任务上也取得了非常好的结果。
2. 使用 R-CNN 进行目标检测
作者的目标检测系统包含三个模块:
- 第一个模块生成与类别无关的 region proposals
- 第二个模块使用 CNN 从每个 region 中提出一个固定长度的特征
- 第三个模块使用 SVM 来处理上一步提取的特征
2.1. 模块设计
Region proposals
使用 selective search 来生成 region proposals。
特征提取
使用 CNN 从每一个 region proposal 提取一个 4096 维的特征。这里需要将每个 region proposal 变换到 227x227 的大小。
2.2 Test-time detection
在测试时,使用 selective search(fast mode)从测试图片中提取出大概 2000 个region proposal。然后对每个region proposal进行特征提取。然后,使用 SVM 对提取的特征进行分类。对每个region proposal 给出各类的概率,保留 IoU 大于某一阈值(这个阈值通过超参数搜索得到)的bbox,则使用 NMS 选出最终的bbox。
运行时间分析
两个特性使得检测非常高效:(与传统方法相比)
- 所有的 CNN 参数是在所有类别上共享的
- 由 CNN 计算的特征向量相比于其它方法是低维的
特征矩阵一般是 2000x4096 维,SVM 权重矩阵是 4096xN,这里 N 是类别的数量。
2.3 训练
Supervised pre-training
作者首先在 ILSVRC2012 分类数据集上预训练CNN,取得了比 AlexNet 低 2.2 个百分点的错误率。
Domain-specific fine-tuning
加一个新的类别:背景。如果region proposal和真正的ground truth box的 IoU 大于0.5,则将该region proposal 考虑为物体,否则就假设其为背景。训练时的mini-batch 为128(32个含目标 region proposal,96个背景 region proposal)。
Object category classifiers
将 IoU 小于0.3(这个数字是网格搜索得到的)的 region proposal作为背景。这个阈值设为0.5,可以将mAP降低5个点,阈值设置为0,mAP上升4个点。
特征提取完毕后,对于每一类训练一个 SVM。因为训练数据太大(存不到内存中),所以作者采用standard hard negative mining 方法,这种方法收敛快,并且实践中只有在简单地处理过所有图像之后mAP才会停止增加。
standard hard negative mining method:首先是negative,即负样本,其次是hard,说明是困难样本,也就是说在对负样本分类时候,loss比较大(label与prediction相差较大)的那些样本,也可以说是容易将负样本看成正样本的那些样本,例如roi里没有物体,全是背景,这时候分类器很容易正确分类成背景,这个就叫easy negative;如果roi里有二分之一个物体,标签仍是负样本,这时候分类器就容易把他看成正样本,这时候就是had negative。hard negative mining就是多找一些hard negative加入负样本集,进行训练,这样会比easy negative组成的负样本集效果更好。主要体现在虚警率更低一些(也就是false positive少)
2.4 在PASCAL VOC 2010-12数据集上的实验结果
在PASCAL VOC 2010-12数据集上的结果:
2.5 2.5. 在ILSVRC2013 detection数据集上的实验结果
在 ILSVRC 2013 detection数据集上的结果:
3. 可视化、消融实验、模型的错误率
3.1. 可视化学习到的特征
ZFNet 使用反卷积可视化卷积网络。
本文中作者直接可视化了网络的第5个max-pooling层(也是卷积部分的最后一层)。作者通过直接可视化activation查看网络学习到了什么?
通过上图,我们可以看到网络高层的feature map包含了位置特征。
3.2. 消融实验
通过消融实验来研究各层对检测性能的影响。
消融实验,不进行微调
表2的1~3行说明了,fc7的泛化性比fc6差。这意味着29%(大约1680万的参数)是没有多大用的,是可以被去除的,mAP是不会下降的。更惊奇的是:去除 f7 和 f6 甚至可以产生比 pool 5 特征产生更好的结果(参数只有6%)。卷积网络的表示能力大多数来自于它的卷积层,而不是 fc 层。
消融实验,经过微调
经过在新数据集上进行微调后,mAP增加了8.0%,mAP达到了54.2%。并且提高主要发生在 fc6 和 fc7,这说明,pool 5从 ImageNet 学习到的特征是泛化的。主要的性能提升来自于conv上面的非线性分类器。
3.4 检测误差分析
作者使用了 Hoiem 等人的 杰出的检测误差分析工具,来揭示微调到底改变了什么,并和DPM对比了错误类型。见图 5 和 6
分析了各种错误的量
分析各层对错误的影响
3.5 bbox回归
我们训练一个线性回归模型在pool5特征上为selective region proposal预测一个新检测窗口。(we train a linear regression model to predict a new detection window given the pool5 features for a selective search region proposal.)。这可以将mAP提高3~4%
本文基本是按照原论文的思路来写的,推荐一个将 R-CNN 讲的很简单的博客:https://blog.****.net/hjimce/article/details/50187029