我是靠谱客的博主 称心钢笔,最近开发中收集的这篇文章主要介绍FasterRCNN源码解析——数据在RPN的传输路线数据在RPN的传输路线,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 数据在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 52377614
再转换为 2 ∗ 261888 ∗ 4 2*261888*4 22618884
在这里插入图片描述

筛除小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的传输路线所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部