大家好,又见面了,我是你们的朋友全栈君。
目录
先放两张图,上面是原文中对RPN的原理说明;下图是k个anchor boxes(k=9)的生成。
原文中rcnn部分的截图
anchor boxes示意图, 转自这里
一. anchor boxes基本概念与作用:
- 特征图上的一个点可以映射回输入图上的一个区域,以特征图的点为中心预先设定k个boxes,这些boxes就称为在这个点上生成的k个anchor boxes(所有anchor boxes的中心点坐标是一样的)。
- 一个m*n的特征图就有m*n*k个anchor boxes
- RPN网络的目的是在这些anchor boxes上去回归拟合target boxes, 然后选出置信度高的boxes称为proposals,将proposals输给后面的网络。模型回归的目标是真实boxes与anchor boxes之间坐标的偏置。将偏置和anchor boxes的坐标带入预先设定的公式中,就得到了最终预测的boxes坐标。
(个人原创,转载请注明出处:faster-rcnn中,对RPN的理解_人生虚空-CSDN博客_rpn的作用,谢谢!)
二. 详细过程
假设输入一张图片,经过前面骨干网络的一系列的卷积或者池化之后之后,得到一个尺寸m*n的特征图(暂且不说通道),对应将原图划分为m*n个区域,原图的每个区域由这个特征图上的一个像素点坐标表示。通过anchor机制,可以在每个像素点所对应原图区域生成k个可能存在目标的候选框(称为anchor box)。RPN就是用来判断每个像素点对应的k个区域是不是包含目标,如果包含(那么先根据输出的坐标偏置修正box位置)则输给后面的RCNN做进一步判断。(意思就是要从m*n*9个候选框中做筛选,提取proposals)
RPN的卷积核尺寸是3*3,用来对m*n的特征图上的以每个像素点为中心的3*3区域进一步提取特征(像素点在3*3的中心,如果像素点处于边缘则做padding)。anchor+RPN的作用就类似于 fast rcnn 的selective search 生成proposals 的作用。
RPN的结构:
RPN的结构: 3*3的卷积层(输出通道数为256) + relu + 两个平行的1*1的卷积层(clc layer 和 reg layer)
1.第一个卷积层将m*n*c的输入通过256个 3 x 3 大小的卷积核转为m*n*256的feature map,即每个像素点得到了256维的特征
2.cls layer和reg layer是用 1 x 1的卷积核。二者作用分别是在上一步提取的256维特征上, 对每个点的anchor boxes做分类和回归。对于reg layer需要输出4个坐标偏置,那么其卷积核shape就是1*1*256*4k,对于一个点1*1*256的输入,输出shape是1*1*4k;将其用在所有点的256维特征上(即m*n*256),那么输出就是m*n*4k;同理cls layer输出就是m*n*2k(2表示两类,前景和背景),得到原特征图m*n*k个anchor boxes的前背景概率.
卷积核应用在输入的各个通道上时,同一个通道的卷积核学习参数相同,不同通道的卷积核要学习的参数是不同的。比如输入m*n*256特征图, 采用1*1的卷积核, 输出m*n*2k,那么要学习的参数一共有256*2k个.
RPN损失计算
m*n的特征图传给RPN后输出m*n*256, 每个像素点得到了256d特征, 这个特征是被像素点上的k个anchor boxes所共享的. 输给clc layer和reg layer后,只要一次前向,就同时输出这k个区域的前景、背景概率(1个区域2个scores,所以是2k个scores),以及每个bounding box相对于预设anchor box的位置偏置(1个区域要预测4个值,所以是要预测4k个值。)
这里要明白,前面,
RPN的clc layer输出的是要预测的k个bounding box是否包含目标的概率,
RPN的reg layer输出的是要预测的k个的bounding box位置偏置=k个bounding box的位置 – k个anchor box的位置(k个anchor box的位置是一开始就设置好的). (这里的减号抽象地表示位置偏置……)
具体的说:
clc layer输出k个预测区域中每个区域的2个参数,即预测为前景的概率pa和pb,损失用softmax loss(cross entropy loss)(本来还以为是sigmoid,这样的话只预测pa就可以了?)。需要的监督信息是Y=0,1,表示这个区域是否ground truth
reg layer输出预测区域的4个参数:tx,ty,tw,th,用smooth L1 loss(用parameterized coordinates, 参看原文)。需要的监督信息是anchor box的区域坐标{xa,ya,wa,ha}(这个是根据前面为每个像素点生成k个anchor box时就可以计算好的) 和 ground truth的区域坐标{x*,y*,w*,h*}
使用以下损失:
下面的Lreg()就是bounding box回归损失。ti就是要预测的每个anchor box的位置偏置,t*是ground truth的box位置相对于anchor box的位置偏置。通过以下变换获得:
得到tx,ty,tw,th后,就可以计算出xywh,就得到了真正预测的k个box的位置。(通过回归ground truth相对于前面预测的anchor box的位置的偏置来得到,换句话说,前面的anchor box位置都是预设的,那么这里是要让这些anchor box逼近包含目标的真实位置(也可以理解为借助anchor box取寻找目标框))
计算损失时,我们需要确定k个区域中的各个区域是不是有效的,是前景还是背景。有效的区域才计算损失。需要的监督信息:Y,{xa,ya,wa,ha}(k个),{x*,y*,w*,h*}(1个)是根据文章中的样本产生规则得到的:
对于这k个区域
1 分配正标签给满足以下规则的区域
1.1 与某个ground truth(GT)的IoU最大的区域(即对于每个GT,找出IOU最大的anchor就是了)
1.2 与任意GT的IoU大于0.7的区域(即,先对于每个anchor,找出与所有GT的IOU最大值,如果大于0.7,该anchor就是了)
(使用规则2基本可以找到足够正样本,但对于所有区域与GT的IoU都不大于0.7,可以用规则1)
(一个GT可能分配正标签给多个anchor,具体怎么分配?)
2 分配负标签给与所有GT的IoU都小于0.3的区域。(即1.2中,与所有GT的IOU最大值小于0.3,该anchor就是了)
非正非负的区域不算损失,对训练没有作用
RPN只对有标签的区域计算loss。
三. RPN之后
参与训练RPN的区域都有参与最后rcnn的训练,只是只有RPN预测为前景的区域 在rcnn才有计算回归损失
在使用faster rcnn的时候(测试阶段),RPN预测为前景的区域才是proposal(对于骨干网络输出的m*n大小的特征图,RPN依然为上面的每个像素点计算k个anchor boxes的cls和reg, 假如这k个boxes的cls都判定为前景, 那么这k个boxes都会被作为proposals送给后面的ROI Pooling, 只不过后面有做NMS, 肯定会删掉大部分重合的anchor boxes),然后按照softmax score从大到小排序选出前2000个区域,在用NMS进一步筛选出300个区域,然后输给后面的rcnn(包括ROI Pooling, 备注: 经过ROI Pooling后的输出尺寸是固定大小的, 比如7×7)进行预测
(注意此时rcnn的预测类别不包括背景,已经RPN输出的已经默认是前景了. 即RCNN的cls是做目标分类(比如COCO数据集80类,有朋友指出这里有误,刚看了源码,最后一层确预测81类,应该是有把背景作为一类,谢谢指正!), reg是做位置修正)
附:代码中anchor的具体计算可以参考这里和这里,可以说很详细了。
热点回复:
1. RPN中, 一个位置对应的这k个anchor共享特征. RPN输出之后, 经过筛选存留下来的anchor boxes(这时应该称为proposals)就根据boxes位置去前面的原图特征图上crop, 得到各个proposals的特征图, 经过roi pooling后, 这些特征的尺寸维度就都一样了
2. RPN的目标是得到前景的box位置, 作为proposals输出. 后面使用的时候, 根据这个box位置在前面的输入图特征图上进行crop, 然后做roi pooling. rpn和roi pooling的联系只是这个box位置
3.可以直接把RPN第一层理解为一个普通的 卷积层,kernel_size=3, stride=1, padding=’same’,n_filter=256。如果特征图尺寸是n*m,那么经过RPN第一层后的输出的shape就是n*m*256,特征图上每个点的特征向量的shape就是1*1*256,就是256维的特征了。
(个人原创,转载请注明出处:faster-rcnn中,对RPN的理解_人生虚空-CSDN博客_rpn的作用,谢谢!)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152283.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...