mmrotate代码解读之RotatedAnchorHead—get_anchors()函数

get_anchors()函数功能:

为每张图像根据其特征图的大小生成锚点,并为每个锚点生成一个判断是否有效的布尔值(valid flag)。valid flag用于标记哪些锚点是在图像填充区域之外

参数:
featmap_sizes: 特征图的尺寸列表,每个元素都是一个二元组,表示特征图的高度和宽度。
img_metas:包含图像元数据的字典列表,例如图像的填充尺寸(pad_shape)。
device:指定生成的锚点张量应该存放在哪个设备上,例如’cuda’或’cpu’。
返回值:
anchor_list:每张图像的锚点列表,每个元素是一个张量,包含了该图像所有锚点的坐标。 valid_flag_list:标记对应锚点是否有效

步骤:
生成锚点:首先,使用anchor_generator的grid_priors方法为一组特征图尺寸生成多尺度的锚点。因为所有图像的特征图大小相同,所以这一步只需要执行一次。

复制锚点:接着,将这组多层次锚点复制给每张图像即batchsize张图片,组成anchor_list。

计算有效标志:落在填充区域的锚点被标记为无效,从而在后续的处理中被忽略。

代码详解:

def get_anchors(self, featmap_sizes, img_metas, device='cuda'):
    """Get anchors according to feature map sizes.
    Args:
        featmap_sizes (list[tuple]): Multi-level feature map sizes.
        img_metas (list[dict]): Image meta info.
        device (torch.device | str): Device for returned tensors

    Returns:
        tuple (list[Tensor]):

            - anchor_list (list[Tensor]): Anchors of each image.
            - valid_flag_list (list[Tensor]): Valid flags of each image.
    """
    # 计算图像的数量
    num_imgs = len(img_metas)

    # 由于所有图像的特征图大小相同,我们只需要计算一次锚点
    multi_level_anchors = self.anchor_generator.grid_priors(
        featmap_sizes, device=device)
    # 为每张图像复制相同的锚点
    anchor_list = [multi_level_anchors for _ in range(num_imgs)]

    # 对每张图像,计算多尺度锚点是否有效
    valid_flag_list = []
    for img_id, img_meta in enumerate(img_metas):
        # 根据图像的填充尺寸计算是否是有效猫点
        multi_level_flags = self.anchor_generator.valid_flags(
            featmap_sizes, img_meta['pad_shape'], device)
        valid_flag_list.append(multi_level_flags)

    return anchor_list, valid_flag_list

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值