理解anchor box究竟是如何生成的

1.相关参数设定
  • 在经过特征提取网络之后得到的特征图w和h大小均会变成原图w和h的n分之一,即特征图上的1个点会对应原图中n×n大小的区域。例如,VGG16网络中有4个池化层,经过4次降采样,所以n=base_size=2^4=16。
  • 假设anchor box的不同ratios分别为[1:1,1:2,2:1]
  • 假设anchor box的scale设为8(可设为多个,下文以8为例)
2.代码

这里以mmdetection中anchor_generator.py的代码为例进行解释base_anchors是怎么生成的

    def gen_base_anchors(self):
        w = self.base_size   # 16
        h = self.base_size   # 16
        if self.ctr is None:
            x_ctr = 0.5 * (w - 1)  # 7.5
            y_ctr = 0.5 * (h - 1)  # 7.5
        else:
            x_ctr, y_ctr = self.ctr

        h_ratios = torch.sqrt(self.ratios) 
        w_ratios = 1 / h_ratios
        if self.scale_major:
            ws = (w * w_ratios[:, None] * self.scales[None, :]).view(-1) 
            hs = (h * h_ratios[:, None] * self.scales[None, :]).view(-1)
        else: 
            ws = (w * self.scales[:, None] * w_ratios[None, :]).view(-1)
            hs = (h * self.scales[:, None] * h_ratios[None, :]).view(-1)
        # yapf: disable
        base_anchors = torch.stack(
            [
                x_ctr - 0.5 * (ws - 1), y_ctr - 0.5 * (hs - 1),
                x_ctr + 0.5 * (ws - 1), y_ctr + 0.5 * (hs - 1)
            ],
            dim=-1).round()
        # yapf: enable
        return base_anchors
3.分析
  • 为什么要对ratios开平方来获得h_ratios?
    这是为了在面积不变的条件下,得到所设定ratio的anchor box。w_ratios = 1 / h_ratios即为保证面积不变。
  • 当ratio为1:1时,h_ratios=w_ratios=1,ws=hs=16×1×8=128,∴base_anchor=[-56,-56,71,71]
  • 当ratio为1:2时,h_ratios=1/根号2,w_ratios=根号2,ws≈181,hs≈90.5,∴base_anchor≈[-83,-37,98,52]
  • 以此类推,当存在多个scale时也是同理。

以上为个人理解,如有不正之处还请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值