论文地址:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
代码地址:GitHub
背景
R-CNN 三部曲之完结篇,在上一篇物体检测需要 Selective Search 获取 proposal,然后神经网络分类基础上,将获取 proposal 和 detection 合并为同一个神经网络,算法更加 graceful 并且速度和准确度都有提升。
方法
可以理解为将提取 proposal 的步骤也抽象为了一种 R-CNN。conv 层最后一层每个像素为中心,提取不同尺寸,不同比例的 proposal(RPN),之后计算是否属于前景,并且求得 bounding box regression(是不是很像 Fast R-CNN 干的事情?)。在这之后再使用 Fast R-CNN 中的 RoI Layer,进而对 proposal 分类。过程图:
图片来源1
RPN
对于最后一层卷积层产生的 feature map,使用 3x3 的全连接层(类似卷积),每个点就会产生与 conv 层相同 feature 维度的一个向量。后面又接了 ReLU,这样每个点的 feature 就有了。
下面再说说对每个点提取 proposal,作者提出 anchor 的概念,咱就暂且叫他“茴”吧2,每个点不同尺寸,不同比例提取 k 个 proposal 。此处不明白,k 个 proposal 的 feature 有什么不同,每个 proposal 会对应产生是否是前景/背景值,以及位置回归值。很奇怪作者未做任何提及,难道是在每个 anchor box 里面 pooling 了一把?
图片来源3
Loss Function
与 Fast R-CNN 非常相似,
等号右面第一项是前背景分类的目标函数,第二项是 bounding box regression 的目标函数。最小化两者之和,关于等式定义,首先说系数。作者想要前后两项的比重基本上是1:1,所以不管系数有何意义,咱都可以认为系数为 1 即可。
第一项 pi 表示每个茴的
第二项可以参考前一篇 Fast R-CNN,具体值如下:
图片来源 4
训练方法
使用 batch 进行训练,每个 batch 大小约为 256 个茴,正负样本 1:1。
如何确定正负样本?正样本标定规则:
- 如果茴与 ground truth 有最大 IoU,标记为正样本;
- 如果茴与 ground truth 的 IoU > 0.7,标记为正样本。
事实上,采用第 2 个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的茴与 groud truth 的 IoU 不大于 0.7,可以采用第一种规则生成。
负样本标定规则:如果茴与 ground truth 的 IoU < 0.3,标记为负样本。剩下的既不是正样本也不是负样本,不用于最终训练。
训练网络时,卷积层使用前面模型 (ZF/VGG net) 初始化参数,后面随机初始化。使用 VOC 数据集训练。
整个网络训练方式
由于获取 proposal 和 detection 两个网络共用卷积层,采用交替训练方式。具体方式:
- 先训练 RPN 网络,conv 层使用 Imagenet 数据集 pre-trained 参数初始化,训练全部网络层;
- 再训练 R-CNN 网络,conv 层使用 Imagenet 数据集 pre-trained 参数初始化,训练全部网络层。每幅图片的 proposal 从上步得到,此时这两个网络是全部分离的;
- 使用上步中的参数初始化网络,只 fine-tune 特有层,不修改 conv 层;
- 保持 conv 层不变,fine-tune 特有层,不修改 conv 层。
测试图片时,最后还需要加入非最大值抑制,减少不必要的重叠 proposal。
实验部分
准确度提升:
时间缩短:
后记
感觉有点怪怪的,行文方法和前两篇有些差异,没有达到我预想到的高度。下篇 YOLO。
- 使用Faster-Rcnn进行目标检测 ↩
- 鲁迅,《孔乙己》,《呐喊》,1919年4月《新青年》第六卷第四号 ↩
- Faster R-CNN学习笔记 ↩
- 深度学习检测方法梳理 ↩