概述
文章目录
- 数据在RPN的传输路线
- 我们经过RPNHead后
- 我们经过anchor生成器之后
- 求得一个batch中有多少图片
- 计算每个预测特征层上对应的anchors数量
- 调整内部tensor格式以及shape
- 将预测的bbox regression参数应用到anchors上得到最终预测bbox坐标
- 筛除小boxes框,nms处理,根据预测概率获取前post_nms_top_n个目标
- 计算每个anchors最匹配的gt,并将anchors进行分类,前景,背景以及废弃的anchors
- 结合anchors以及对应的gt,计算regression参数
- 传入预测的目标分数,预测的坐标偏移量,真实的标签,以及回归参数计算loss
数据在RPN的传输路线
即RegionProposalNetwork
类中的forward函数
通过在开头所传入的三个数据images,features,targets
我们经过RPNHead后
# RPN uses all feature maps that are available
# features是所有预测特征层组成的OrderedDict
features = list(features.values())
# 计算每个预测特征层上的预测目标概率和bboxes regression参数
# objectness和pred_bbox_deltas都是list
objectness, pred_bbox_deltas = self.head(features) # objectness预测特征层的个数
我们会在每个预测特征层上生成 k个预测的目标概率以及4k个bboxes regression参数,其中k代表的是 anchor boxes的数量(这里之所以会显示3,是因为res50+FPN的backbone是在不同的预测特征层都要生成不同尺度的anchor的,5个预测特征层,每层3个anchor, 而mobilenet只有一个预测特征层,所以一层上共有15个anchor)
我们经过anchor生成器之后
# 生成一个batch图像的所有anchors信息,list(tensor)元素个数等于batch_size
anchors = self.anchor_generator(images, features)
求得一个batch中有多少图片
# batch_size
num_images = len(anchors)
计算每个预测特征层上对应的anchors数量
# 计算每个预测特征层上的对应的anchors数量
num_anchors_per_level_shape_tensors = [o[0].shape for o in objectness]
num_anchors_per_level = [s[0] * s[1] * s[2] for s in num_anchors_per_level_shape_tensors]
# 每个预测特征层的shape进行相乘 就会得到每个预测特征层的anchors
调整内部tensor格式以及shape
将RPNHead输出的 预测分数以及边界框回归参数 的格式以及shape进行调整
对box_cla和box_regression两个list中的每个预测特征层的预测信息的tensor排列顺序以及shape进行调整 -> [N, -1, C]
# 调整内部tensor格式以及shape
objectness, pred_bbox_deltas = concat_box_prediction_layers(objectness,
pred_bbox_deltas)
由
转换为( [N, -1, C] 变为 [-1, 1 ] 将batch维度以及 anchors数目的维度展平到了一起)
将预测的bbox regression参数应用到anchors上得到最终预测bbox坐标
# 将预测的bbox regression参数应用到anchors上得到最终预测bbox坐标
proposals = self.box_coder.decode(pred_bbox_deltas.detach(), anchors)
proposals = proposals.view(num_images, -1, 4)
输出的proposals的格式为
523776
∗
1
∗
4
523776*1*4
523776∗1∗4
再转换为
2
∗
261888
∗
4
2*261888*4
2∗261888∗4
筛除小boxes框,nms处理,根据预测概率获取前post_nms_top_n个目标
boxes, scores = self.filter_proposals(proposals, objectness, images.image_sizes, num_anchors_per_level)
输入的参数有:
proposals
: 预测的bbox坐标
objectness
: 预测的目标概率
image_shapes
: batch中每张图片的size信息
num_anchors_per_level
: 每个预测特征层上预测anchors的数目
计算每个anchors最匹配的gt,并将anchors进行分类,前景,背景以及废弃的anchors
losses = {}
if self.training:
assert targets is not None
# 计算每个anchors最匹配的gt,并将anchors进行分类,前景,背景以及废弃的anchors
labels, matched_gt_boxes = self.assign_targets_to_anchors(anchors, targets)
结合anchors以及对应的gt,计算regression参数
regression_targets = self.box_coder.encode(matched_gt_boxes, anchors)
loss_objectness, loss_rpn_box_reg = self.compute_loss(
objectness, pred_bbox_deltas, labels, regression_targets
)
# objectness 预测的目标分数
# pred_bbox_deltas 预测的坐标偏移量
# labels 真实的标签
# regression_targets 每个anchors所对应的gtboxes相对于anchors的回归参数
losses = {
"loss_objectness": loss_objectness,
"loss_rpn_box_reg": loss_rpn_box_reg
}
传入预测的目标分数,预测的坐标偏移量,真实的标签,以及回归参数计算loss
def compute_loss(self, objectness, pred_bbox_deltas, labels, regression_targets):
# type: (Tensor, Tensor, List[Tensor], List[Tensor]) -> Tuple[Tensor, Tensor]
"""
计算RPN损失,包括类别损失(前景与背景),bbox regression损失
Arguments:
objectness (Tensor):预测的前景概率
pred_bbox_deltas (Tensor):预测的bbox regression
labels (List[Tensor]):真实的标签 1, 0, -1(batch中每一张图片的labels对应List的一个元素中)
regression_targets (List[Tensor]):真实的bbox regression
Returns:
objectness_loss (Tensor) : 类别损失
box_loss (Tensor):边界框回归损失
"""
最后
以上就是称心钢笔为你收集整理的FasterRCNN源码解析——数据在RPN的传输路线数据在RPN的传输路线的全部内容,希望文章能够帮你解决FasterRCNN源码解析——数据在RPN的传输路线数据在RPN的传输路线所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复