Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks
代码语言:javascript复制论文发表:2015 论文链接:https://arxiv.org/abs/1506.01497 论文代码:https://github.com/rbgirshick/py-faster-rcnn
@article{ren2015faster,
title={Faster r-cnn: Towards real-time object detection with region proposal networks},
author={Ren, Shaoqing and He, Kaiming and Girshick, Ross and Sun, Jian},
journal={Advances in neural information processing systems},
volume={28},
pages={91--99},
year={2015}
}
归纳总结
标签 | 目的 | 方法 | 总结 |
---|---|---|---|
#Anchor #两阶段 | - | RPN | 首次提出RPN和Anchor |
主要工作
Faster R-CNN是在R-CNN和Fast R-CNN的基础上提出的一种两阶段目标检测算法,其主要包括:
- 特征提取网络(Backbone)
- RPN(Region Proposal Networks)
- RoI Pooling(Region of Interesting Pooling)
- 分类回归(Classification and Regression)
论文中的结构图如下:
自己画的训练流程图如下:
网上找的训练流程图如下:
图片来自WZMIAOMIAO/deep-learning-for-image-processing (github.com)
对于Backbone生成的特征图,首先输入到RPN结构中,用于生成Proposal。RPN,即区域推荐网络,对于目标检测任务而言,不仅需要对目标分类还需要对目标定位,因此Faster RCNN模型提出了Anchor机制,其中的做法是,在特征图的每个像素位置预设一组多尺度的先验框,即Anchor(作者使用了3种尺寸(128,256,512),3种比例(1:1,1:2,2:1)的Anchor,共9种):
如果输入一张800×600的图片,经过Backbone后被下采样16倍,那么这个特征图的尺寸为frac{800}{16}×frac{600}{16}=1900个像素,那么这个特征图上需要设置1900×9=17100个Anchor。但这一步得到的Anchor肯定不可能全部当作候选区域,因此在预设了Anchor之后,为了筛选有意义的proposal,还设置了一个3×3的卷积层后接两个1×1的卷积层来预测该区域是否包含目标(cls)以及偏移量预测(reg),如果包含目标则需要根据预测的偏移量对该Anchor进行微调。
这两个1×1的卷积层的输出维度分别为2k和4k,其中k为每个位置的Anchor数量,2代表包含目标和不包含目标的概率,4代表对目标框坐标值(x,y,w,h)的偏移量预测:
可以根据上述公式,计算出候选区域的坐标。并且当我们得到了该区域包含目标的概率之后,我们就可以进行一个简单的筛选,按照包含目标可能性排序,只保留前2000个作为候选区域,并且对于超出图片边界的边框还需要进行一个裁剪处理。
尽管我们筛选出了2000个候选区域,但我们在计算Loss的时候并不是拿这2000个候选区域来计算,这里Faster RCNN定义了正负样本的概念,首先我们需要将特征图上的Anchor映射回原始图像,因为我们的Ground-Truth是在原始图像上标注的,RPN需要根据这个来进行学习,其次还需要了解IoU这个概念,IoU可以用来计算两个框之间的重合度,其值为两个框的交集与并集的比值。
那么我们就可以定义候选区域和ground-truth的IoU值大于0.7的为正样本,小于0.3的为负样本,其他的都不用于计算损失,然后从中分别随机抽取128个正负样本。RPN的损失函数如下:
RoI Pooling的作用是将 RPN 输出的大小不等的候选框缩放到统一的尺寸。具体做法是,假设需要固定候选区域为7×7大小,那么就可以将其划分为7×7个块,然后对每个块进行最大值池化,最后输出的大小就是所需要的。
这样,将所有的候选区域统一大小后,将其展平为49×1大小,通道数为256的向量,输入到两个全连接层隐藏层,最后再分别接两个输出大小为类别数以及类别数×4的全连接层。来实现对候选区域包含目标所属类别概率以及对该目标框的偏移量的预测。分类回归的损失函数和之前RPN的损失函数类似,只是分类损失不再是二分类交叉熵而是多分类交叉熵。预测框的坐标计算也和之前RPN部分的一样。
而在得到了预测目标框和类别概率之后,还需要进一步筛选,因为之前保留了2000个候选区域,而实际场景中目标数量根本达不到那么多,因此我们使用了NMS算法对重叠目标框进行去重。NMS算法的流程如下图所示:
首先对同一个类别所有的目标框进行排序,(这里默认之前预测的分类概率最大的类别为目标所属类别),然后从大到小依次选择一个目标框和其他剩余目标框计算IoU值,如果IoU值大于设定的阈值如0.5,就代表重叠,此时舍去得分小的目标框,否则就保留,然后依次比较之后,就能实现对重叠目标的去重处理。
论文里的实验结果:
参考文献
一文读懂Faster RCNN - 知乎 (zhihu.com)