faster rcnn 的训练标签问题
(本文取自知乎文章,原著量子侠,仅作个人学习收藏使用,文末有参考链接)
关于faster RCNN 的训练标签
知乎上有好多文章,介绍faster RCNN,介绍的都很不错,比如这个知乎专栏
白裳:link
但实际上很少有文章讲这个rpn 层的训练数据是怎么得到的。今天我在这讲一下怎么样得到rpn层的训练数据。
码力强劲的可以去看这个
首先我们得清楚RPN层是什么。RPN层就是Region Proposal Network。
RPN层的输入
VGG16(当然也可以是其他的图像分类模型)的最后的特征层(也就是不包括全连接层的部分)。
输出
-
判断每一个特征图上的点对应的anchor box 是foreground 还是background
-
如果是foreground的话,给出此anchor box 和对应的ground truth box的变化关系(也就是该anchor box经过怎样的移动和伸缩变换可以变成ground truth)
针对RPN层的如此输入和输出,训练数据应该为对于每一个anchor box, 其到底是foreground 还是background。
我第一次看到这里的时候,我有两个疑问。
1.特征图上的每一个点,对应了若干个anchor box,可是最后目标识别的结果的那个框,是框在原图上的呀。这个anchor box到底是在特征图上的,还是在原图上的。
- 因为anchor box是以一定规则选取的,其与ground truth box大概率不会完全重叠。那么什么样的anchor box是foreground,什么样的anchor box是 background
对于第一个问题。答案是anchor box是在原图上的。但是特征图和原图有对应关系。vgg16 的模型中,只有卷积和池化,所以实际上每一个特征图上的点,对应着原图的一个区域。这个区域有一个中心点。anchor box就是以该点为中心的若干矩形框。其实理解到这里,也能够帮助我们弄懂vgg16到底在干什么,或者说vgg16中的这些卷积和池化层到底在干什么。实际上就是在压缩和抽象图像。卷积层和池化层并没有让隔着较远的区域发生任何相互作用。
对于第二个问题。
直观的想法是anchor box 与ground truth重叠的大的,将anchor box标记为foreground,将重叠部分小的标记为background。难点在于重叠部分不大不小的部分。一个方法是给定一个阈值,大于这个阈值的就作为foreground,小于这个阈值的作为background。利用IOU(intersection over union)来判定。但是,有一个问题,因为IOU的值是一个连续的值,而是否是foreground 是一个离散的0,1值。把一个连续值变成了一个离散值会导致神经网络很难学习到这种变换。而将IOU大于0.7的部分作为foreground, 小于0.3的部分作为background。而处于0.3和0.7中间的值不做讨论,这样就能够对标签有明显的区分,也让神经网络更容易学习到这些特征。
实际上,为了处理这一个问题,可以引入一个valid标签来决定这个。一个anchor box的IOU处于0.3和0.7之间,valid标签为0,而如果iou<0.3 or iou>0.7则,valid 为1.
即使经过了这样一些处理,对于同一个foreground 和background的数目还是太多,此时可以进行一些采样,来降低foreground 和background的数目
通过foreground 和background标签的引入,就可以来训练rpn网络了。
rpn网络,简单来说,就选定哪一个区域有是我们想要的区域,也就是foreground.
分类器
在RPN网络之后,就是一个图片分类器。但是由于VGG16已经在前面做了特征提取的工作。所以此处其实只需要全连接层就可以了。此时需要把bounding box对应到特征图上,用bounding box选取特征图上的特征,进行分类。
有一个问题是,此时的特征图一般情况下并不是同样大小的或者说同样长款比的,这里就需要使用空间金字塔池化(spp)或者可以直接进行warp变换。
然后就可以出结果了。这里的训练标记就是当初打的标记,类别标记,so easy.