我无法理解SSD的默认盒子实现。原文的公式如下。
w_k=s_k√a_k
, h_k=s_k/√a_k
但很多SSD的实现似乎与上面的公式不同。例如 ssd.pytorch;
mean = []
for k, f in enumerate(self.feature_maps):
for i, j in product(range(f), repeat=2):
f_k = self.image_size / self.steps[k]
# unit center x,y
cx = (j + 0.5) / f_k
cy = (i + 0.5) / f_k
# aspect_ratio: 1
# rel size: min_size
s_k = self.min_sizes[k]/self.image_size
mean += [cx, cy, s_k, s_k]
# aspect_ratio: 1
# rel size: sqrt(s_k * s_(k+1))
s_k_prime = sqrt(s_k * (self.max_sizes[k]/self.image_size))
mean += [cx, cy, s_k_prime, s_k_prime]
# rest of aspect ratios
for ar in self.aspect_ratios[k]:
mean += [cx, cy, s_k*sqrt(ar), s_k/sqrt(ar)]
mean += [cx, cy, s_k/sqrt(ar), s_k*sqrt(ar)]
# back to torch land
output = torch.Tensor(mean).view(-1, 4)
其他 ssd_keras 是。
# define prior boxes shapes
box_widths = []
box_heights = []
for ar in self.aspect_ratios:
if ar == 1 and len(box_widths) == 0:
box_widths.append(self.min_size)
box_heights.append(self.min_size)
elif ar == 1 and len(box_widths) > 0:
box_widths.append(np.sqrt(self.min_size * self.max_size))
box_heights.append(np.sqrt(self.min_size * self.max_size))
elif ar != 1:
box_widths.append(self.min_size * np.sqrt(ar))
box_heights.append(self.min_size / np.sqrt(ar))
box_widths = 0.5 * np.array(box_widths)
box_heights = 0.5 * np.array(box_heights)
问题
什么是 s_k = self.min_sizes[k]/self.image_size
? 是什么?self.min_size * self.max_size
? 我在原论文中找不到公式。
我在 github 的文章中找到了答案。发出
更新。
min_sizes/img_size
和 max_sizes/img_size
卑鄙 s_k
和 s_k+1
分别是。此外,还。conv4_3
适用 s_k=0.1
而不是方程(4)。因此,所有的特征图都不能应用方程(4)。所以我认为所有的比例尺都被定义为 min_sizes
和 max_sizes
事先。