loss的计算过程主要分为两类:分类loss,回归loss.
loss的计算过程需要知道真值和预测值。所以求取loss的过程就是真值与预测值求取的过程。
真值:给Anchor打标签的过程,就是求真值的过程。
预测值:RPN网络预测出的分类结果,即是前景还是背景
真值:Anchor与其对应的GT之间的offst值
预测值:RPN网络预测出的回归结果,即预测出的偏移量offst
很明显,回归的真值与分类的真值有关系,所有此过程的关键在于第一步,Anchor打标签的过程。
在特征提取网络部分,以VGGNet为例,假设输入图像的维度为3×600×800,由于VGGNet 包含4个Pooling层,下采样率为16,因此输出的feature map的维度为512×37×50。
首先对 feature map进行3×3的卷积操作,得到的每一个点的维度是512维,这 512维的数据对应着原始图片上的很多不同的大小与宽高区域的特征, 这些区域的中心点都相同。如果下采样率为默认的16,则每一个点的坐 标乘以16即可得到对应的原图坐标。
特征图上的每一个像素点对应原图16x16大小区域的中心点,原图上16x16大小区域的中心点即为anchor的中心点。
根据不同面积,不同宽高比可得出9个不同大小的anchor。
因此Anchor的总数为37×50×9=16650个
1. Anchor超出图像边缘部分进行过滤
实现思路:
根据第一个anchor的位置信息在原图上进行偏移,得到所有anchor的位置信息(左上角与右下角位置信息)
获得anchor总数,每一个anchor的位置信息;并将每一个anchor 的标签初始化为-1;
开始计算anchor与GT的IOU值
GT1 | GT2 | GT3 | |
---|---|---|---|
anchor1 | |||
anchor2 | |||
anchor3 |
横向比较:为anchor找到最大IOU值的GT
若最大IOU值小于0.3 ,直接看作负样本,标签为0
若最大IOU值大于0.7,直接看作正样本,标签为1
至于IOU值位于两者之间的数据,对训练没有帮助,直接视为无效数据,标签为-1
纵向比较:为GT找到最大IOU值的anchor,
最大IOU值的anchor直接看作正样本,标签为1(这里可以看作对前面正样本的补充)
2. Anchor 筛选
前面完成了anchor初步筛选,打标签的过程,但是负样本过多,正样本过少,导致正负样本不均衡。影响RPN网络的训练。
RPN默认选取256个Anchor参与损失计算。这里保证正负样本为1;1 .
因此分类loss的真值(即anchor的标签)得到了。
而回归损失的真值就是anchor与对应的GT的偏移量(offst)
ground truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*
anchor box: 中心点位置坐标x_a,y_a和宽高w_a,h_a
所以,偏移量: △x=(x*-x_a)/w_a △y=(y*-y_a)/h_a
△w=log(w*/w_a) △h=log(h*/h_a)
RPN训练设置:
在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个Anchor组成的,其中正负样本的比例为1:1。如果正样本不足128,则多用一些负样本以满足有256个Anchor可以用于训练,反之亦然
RPN 网络分为分类网络分支与回归网络分支
分类是二分类,即前景与背景的分类。由于每个点默认有9个Anchors,并且每个Anchor只预测其属于前景 还是背景,因此通道数为18。随后利用torch.view()函数将特征映射到 2×333×75,这样第一维仅仅是一个Anchor的前景背景得分,并送到 Softmax函数中进行概率计算,得到的特征再变换到18×37×50的维度, 最终输出的是每个Anchor属于前景与背景的概率。
即完成分类loss的预测值的求取过程。
在回归分支中,利用1×1卷积输出36×37×50的特征,第一维的36包 含9个Anchors的预测,每一个Anchor有4个数据,分别代表了每一个 Anchor的中心点横纵坐标及宽高这4个量相对于真值的偏移量。
即完成回归loss的预测值求取过程。
https://www.cnblogs.com/ymjyqsx/p/11379726.html
https://www.cnblogs.com/ai-learning-blogs/p/11748543.html
分类部分:使用交叉熵损失函数
回归部分:使用smoothL1函数
https://cloud.tencent.com/developer/article/1441560
上文筛选256个Anchor是参与RPN训练的过程。
而RPN网络的输出的四个回归值△x,△y,△w,△h。
将网络中得到的回归偏移作用到Anchor上使Anchor更 加贴近于真值,并修剪超出图像尺寸的Proposal,得到最初的建议区 域。
在这之后,按照分类网络输出的得分对Anchor排序,保留前12000 个得分高的Anchors。由于一个物体可能会有多个Anchors重叠对应,因 此再应用非极大值抑制(NMS)将重叠的框去掉,最后在剩余的 Proposal中再次根据RPN的预测得分选择前2000个,作为最终的 Proposal。
原因:
上一步生成的Proposal数量为2000个,其中仍然有很多背景框,真正包含物体的仍占少数,因此完全可以针对Proposal进行再一步筛选,过程与RPN中筛选Anchor的过程类似,利用标签与Proposal 构建IoU矩阵,通过与标签的重合程度选出256个正负样本。
优势:
·筛选出了更贴近真实物体的RoI,使送入到后续网络的物体正、负 样本更均衡,避免了负样本过多,正样本过少的情况。
·减少了送入后续全连接网络的数量,有效减少了计算量。
·筛选Proposal得到RoI的过程中,由于使用了标签来筛选,因此也 为每一个RoI赋予了正、负样本的标签,同时可以在此求得RoI变换到对应标签的偏移量,这样就求得了RCNN部分的真值。
实现过程:
首先计算Proposal与所有的物体标签的IoU矩阵,然后 根据IoU矩阵的值来筛选出符合条件的正负样本。筛选标准如下:
·对于任何一个Proposal,其与所有标签的最大IoU如果大于等于 0.5,则视为正样本。
·对于任何一个Proposal,其与所有标签的最大IoU如果大于等于0且 小于0.5,则视为负样本。
选出的正、负样本数量不一,在此设定正、 负样本的总数为256个,其中正样本的数量为p个。为了控制正、负样本 的比例基本满足1:3,在此正样本数量p不超过64,如果超过了64则从正 样本中随机选取64个。剩余的数量256-p为负样本的数量,如果超过了 256-p则从负样本中随机选取256-p个。
经过上述操作后,选出了最终的256个RoI,并且每一个RoI都赋予 了正样本或者负样本的标签。在此也可以进一步求得每一个RoI的真 值,即属于哪一个类别及对应真值物体的偏移量。
NMS理解
然而,由于RoI是由各种大小宽高不同的Anchors经过偏移修正、筛 选等过程生成的,因此其大小不一且带有浮点数,然而后续相连的全连 接网络要求输入特征大小维度固定,这就需要有一个模块,能够把各种 维度不同的RoI变换到维度相同的特征,以满足后续全连接网络的要 求,于是RoI Pooling就产生了。
Pooling 的过程关键在于生成7x7大小的区域特征。
两次量化:
第一次是生成的ROI大小 经过16倍下采样生成的特征图(向下取整)
假设大小为332×332,332/16=20.75。RoI Pooling的做法是直接将浮点数量化为整数,取整为20×20。
第二次(向下取整)
通过pooling,将20x20 变为7x7.
参考链接
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。