fast+rpn=faster rcnn
之前已经用过RPN,因为重心一直在修改我自己的网络结构上,这次重新涉及到此部分的优化重新审视了一下RPN,记录一下。
如果把RPN看作一个黑盒子的话,最关心的问题是,输入和输出。RPN输入的是一张图片,输出输出一系列的矩形object proposals。RPN其实就像个“内嵌的”的网络似的,这也正是“两阶段物体检测”的体现之处,进行了初步、首阶段的学习。
(RPN相当于是一个小的、粗糙的目标检测cnn模型,只不过它不具体识别/分类,它的识别/分类是:是前景还是背景;定位是:根据anchor使得检测的框靠近gt_box(回归:做怎样的逼近才能使得anchor逼近gt-boxes)。这时候结果不是很准确,只能大致确定框的位置,后面fast rcnn会进一步精确。这个RPN实际上就是一个attention机制,这也是两阶段法比一阶段法(YOLO等)准确的原因)
训练步骤:
1.将图片输入到VGG或resnet等的可共享的卷积层中,得到最后可共享的卷积层特征图FM(feature map)。
2.将FM送入RPN。(先3*3filter滑窗生成新的FM(intermediate layer),再送入两个1*1conv)
2.1在滑动窗口的每个像素点根据感受野都对应的原图上的一片区域,这片区域对目标的覆盖力、形状多样性可能没有那么好,故根据此区域的中心点(锚点),在原图设置9/15个矩形窗口(eg:3种长宽比*3种尺度),即锚框、anchor。至于这里为什么要在原图上,是因为最后求出来的锚框要跟原图的标定框最小梯度下降。
2.2将卷积的结果和锚点分别输入到两个小的1*1的网络中reg(回归,求目标框的位置)和cls(分类,确定该框中是不是目标)
3.训练集标记好了每个框的位置,和reg输出的框的位置比较,用梯度下降来训练网络。
4.得到的proposals将会根据strides被部署在一幅尺寸为w×h的特征图上(映射),注意这个时候映射出的是一块区域了,因为原来是的根据感受野中心点扩的9个框,回归后某个、某几个框映射过去是一个区域。比如:
# anchors 尺寸 3种尺寸大小,3种比例。故一个锚点生成9个anchors
scales = [2,4,8]#根据这个生成9种尺寸,但面积都为4,16,64
# scales = [32,64,128,256,512]
ratios = [0.5, 1.0, 2.0]
注意:anchors是在原图上的。在FM上对点做信息抽取时候,相当于抽取该点在原图上对应的一堆anchors的信息(分类和回归信息)。FM一个点对应原图的感受野,围绕感受野中心做的一堆anchors的信息。也就是说特征图中的每个位置都与具有预定义的尺度和纵横比的k个anchors相关联。
图片节选自https://www.bilibili.com/video/av21846607/?p=6(视频不建议看,建议看这个系列:https://www.bilibili.com/video/av29987414)
ROI Pooling : anchor 到