FasterRCNN源码解析(七)——RPN(下)损失计算部分
主要有以下两个步骤
- 利用我们标注的gtboxes与生成的anchors进行匹配生成我们的正负样本
- 利用正负样本计算 PRNloss
文章目录
一、self.assign_targets_to_anchors(anchors, targets)
计算每个anchors最匹配的gt,并将anchors进行分类,前景,背景以及废弃的anchors
其返回值为:
labels
: 标记anchors归属类别(1, 0, -1分别对应正样本,背景,废弃的样本)
注意,在RPN中只有前景和背景,所有正样本的类别都是1,0代表背景
matched_gt_boxes
:与anchors匹配的gt
其主要步骤有:
遍历每张图像的anchors和targets
-
获取每张图像的真实位置信息即boxes值
-
计算anchors与真实bbox的iou信息,输出shape为 1 ∗ 261888 1*261888 1∗261888,其中1代表在该张图片中有1一个真实标签
-
计算每个anchors与gt匹配iou最大的索引(如果iou<0.3索引置为-1,0.3<iou<0.7索引为-2)返回的是tensor,其数值就是-1 代表负样本,-2代表将要淘汰的样本,大于等于0的代表正样本,预测正确样本的标签值(详见第1节)
-
获取每一个anchor索匹配的对应的gt boxes坐标(将对应-1和-2的anchors匹配为索引为0的gt boxes坐标)并添加到
matched_gt_boxes
中 -
得到正样本,负样本,以及要丢弃的anchors所对应的蒙版,分别将labels_per_image所对应的位置置为1,0.0,-1,并添加到
labels
中 -
最后返回我们的
matched_gt_boxes
和labels
如何计算每个anchors与gt匹配iou最大的索引
通过det_utils.py索引中的Macher
类进行计算
- 记录每个anchors与所有gt匹配的最大iou值 及其 最大值所对应的索引(这里的索引以及下面的索引值都是对真实标签的索引值,有三个真实标签,索引值只有0,1,2)
- 计算iou小于low_threshold的索引
- 计算iou在low_threshold与high_threshold之间的索引值
- iou小于low_threshold的matches索引置为-1
- iou在[low_threshold, high_threshold]之间的matches索引置为-2
- 把iou值最大的也设为 正样本
二、self.box_coder.encode(matched_gt_boxes, anchors)
这里所返回的是anchor对应的gtboxes的回归参数regression_targets
,数据结构与proposal
相同
结合anchors以及对应的gt,计算regression参数
- 提取anchors的左上角坐标,右下角坐标
- 提取每个anchors所对应的gtboxes的左上角坐标,右下角坐标
- 计算anchor以及对应的gtboxes的宽度和高度
- 计算anchors以及对应的gtboxes的中心坐标
- 根据上图公式计算anchor对应的gtboxes的回归参数
以上操作是为了方便处理,将每张图像的anchor个数拼接在了一起,之后再分开