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时也是同理。
以上为个人理解,如有不正之处还请指出。
本文深入解析了目标检测中AnchorBox的生成过程,重点讲解了如何通过不同ratios和scale设置,利用特征图尺寸与原图的关系,生成base_anchors。通过具体示例,如VGG16网络中anchorbox的生成,帮助读者理解参数设定及其背后的数学原理。
7457

被折叠的 条评论
为什么被折叠?



