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
时也是同理。
以上为个人理解,如有不正之处还请指出。