版权声明:转载请注明出处 https://cloud.tencent.com/developer/article/1347419
Introduction
R-CNN提出于2013年11月。
R-CNN不是第一个提出“将检测任务转换为分类任务”,但却是第一个真正实现了该思想的算法:
其本质上主要解决了两大问题:
- 如何location;
- 如何在缺少检测专用数据集的情况下实现检测任务。
R-CNN对此提出了解决方案:
- 对于第一个问题,R-CNN中指出,Detection中最大的难关在于location。之前已经有人将location定义为regression问题了,但是效果并不好。如果要是采用在滑窗中进行location regression,技术难度又大。那咋办呢?别急,R-CNN就给出了解决方法:改成 对region proposal进行location regression 即可。但是直接计算offset不妥,因此设计了 encode/decode机制:
Note:
- 这便是检测算法中encode/decode的鼻祖。到了 Faster R-CNN 中,encode/decode机制被进一步改进,成为了通用的标准设计;YOLOv2也提出了自己的一套encode/decode设计,但是无人问津。
- encode/decode机制的作用:对offset的目标进行 “归一化”,使回归变得简单;
- train阶段只有encode,且在train之前进行encode;
- inference阶段只有decode,且在inference之后进行decode;
- encode输入的是ground_truths和all_anchors,输出的是targets;
- decode输入的是all_anchors和targets,输出的是实际bbox;
- train阶段是不生成实际bbox的,所以全程都是targets(encode后得到的一根根t向量)在跑在计算;
- inference阶段,由于要生成实际的bbox,就将targets和all_anchors(穷举生成的anchor)做一个计算,得出实际的bbox。
- 算法回归的目标 不是offset,而是 encode offset 所得的target。
1. 对于第二个问题,在train阶段,R-CNN先于ILSVRC2012数据集上预训练好,并**直接**在VOC2007或ILSVRC2013数据集上进行fine-tune;在test阶段,使用Selective Search进行RP生成,随后在resize成统一大小的RP上进行测试。该设计把train阶段和test阶段完美地统一了起来,很好地缓解了由于检测专用数据集缺少数据量的问题。
R-CNN思路如下:
- R-CNN首先采用Selective Search来生成RP (每张生成约2k个) ;
- 并很自然地想到了将所有RP resize成统一大小 (227×227):
- 将resize后的RP分别喂入分类网络 (论文中用的是简化版的AlexNet,即去掉了AlexNet倒二的fc层) ;
- 后面接着k+1k+1k+1(前景+背景)个二分类的SVM,等着对卷积网络输出的特征tensor进行分类;
- 对分类结果采用NMS进行一波“去重运动”;
- 把所分tag归属为非背景的所有RP送入kkk(前景)个location regressor,这时候只需要单独对RP区域进行location regression即可。
论文4.2节对于RP (Region Proposal) 的介绍中,最后一句讲到,RP生成环节的设计还有着很大的改进空间。这也为R-CNN的孙辈——Faster R-CNN提出RPN埋下了伏笔。
Innonvation
整套检测思路的设计,使得神经网络进行Detection任务变为了现实 (尽管之前也有了类似的OverFeat)。
检测算法的繁荣兴盛,自R-CNN始。
Result
R-CNN一文既出天下惊。
效果更不要说了,在当年的ILSVRC2013数据集上的mAP测评一骑绝尘:
RBG大神还饶有兴致地深入探究了一下R-CNN在ILSVRC2013上每个细类别的AP值:
在VOC2007上没有最好,只有更好:
R-CNN的一些实图检测效果:
Thinking
尽管R-CNN是划时代的,但是在它身上也能看到很多前人 (OverFeat等) 的智慧。
1(https://arxiv.org/abs/1311.2524)