ssd检测不到怎么办 ssd检测( 二 )


conv7_feats = F.relu(self.conv7(out)) # (N, 1024, 19, 19)
# Lower-level feature maps
return conv4_3_feats, conv7_feats
我想强调的是,以下示例是在假设输入图像的大小为 300 x 300 的情况下提供的,如原始论文中所示 。
【ssd检测不到怎么办 ssd检测】可以看出,我们正在使用一个简单且众所周知的 VGG-16 网络来提取 conv4_3 和 conv7 的特征 。此外,我们可以注意到特征维度分别为 (N, 512, 38, 38) 和 (N, 1024, 19, 19) 。我希望这部分足够简单明了,可以继续讨论 Axuliary Convolutions
Auxiliary Convolutionsclass AuxiliaryConvolutions(nn.Module):
def __init__(self):
super(AuxiliaryConvolutions, self).__init__()
#input (N, 1024, 19, 19) that is conv7_feats
# Auxiliary/additional convolutions on top of the VGG base
self.conv8_1 = nn.Conv2d(1024, 256, kernel_size=1, padding=0) # stride = 1, by default
self.conv8_2 = nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1) # dim. reduction because stride > 1
self.conv9_1 = nn.Conv2d(512, 128, kernel_size=1, padding=0)
self.conv9_2 = nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1) # dim. reduction because stride > 1
self.conv10_1 = nn.Conv2d(256, 128, kernel_size=1, padding=0)
self.conv10_2 = nn.Conv2d(128, 256, kernel_size=3, padding=0) # dim. reduction because padding = 0
self.conv11_1 = nn.Conv2d(256, 128, kernel_size=1, padding=0)
self.conv11_2 = nn.Conv2d(128, 256, kernel_size=3, padding=0) # dim. reduction because padding = 0
# Initialize convolutions' parameters
self.init_conv2d()
def init_conv2d(self):
"""
Initialize convolution parameters using xavier initialization.
"""
for c in self.children():
if isinstance(c, nn.Conv2d):
nn.init.xavier_uniform_(c.weight)
nn.init.constant_(c.bias, 0.)
def forward(self, conv7_feats):
"""
Forward propagation.
:param conv7_feats: lower-level conv7 feature map, a tensor of dimensions (N, 1024, 19, 19)
:return: higher-level feature maps (N, 512, 10, 10), (N, 256, 5, 5), (N, 256, 3, 3) and (N, 256, 1, 1)
"""
out = F.relu(self.conv8_1(conv7_feats)) # (N, 256, 19, 19)
out = F.relu(self.conv8_2(out)) # (N, 512, 10, 10)
conv8_2_feats = out # (N, 512, 10, 10)
out = F.relu(self.conv9_1(out)) # (N, 128, 10, 10)
out = F.relu(self.conv9_2(out)) # (N, 256, 5, 5)
conv9_2_feats = out # (N, 256, 5, 5)
out = F.relu(self.conv10_1(out)) # (N, 128, 5, 5)
out = F.relu(self.conv10_2(out)) # (N, 256, 3, 3)
conv10_2_feats = out # (N, 256, 3, 3)
out = F.relu(self.conv11_1(out)) # (N, 128, 3, 3)
conv11_2_feats = F.relu(self.conv11_2(out)) # (N, 256, 1, 1)
# Higher-level feature maps
return conv8_2_feats, conv9_2_feats, conv10_2_feats, conv11_2_feats
Auxiliary Convolutions使我们能够在基础 VGG-16 网络之上获得附加功能 。这些层的大小逐渐减小,并允许在多个尺度上进行检测预测 。因此,我们传入网络的输入是从 VGG-16 网络获得的 conv7 特征 。正如在应用卷积和 ReLU 激活函数时所看到的,我们应该保留中间特征,即 conv8_2、conv9_2、conv10_2 和 conv11_2 。请花点时间查看代码和特征图的尺寸:)
选择默认边界框
这听起来可能很可怕,但不要担心,它仍然很容易掌握 。默认边界框是手动选择的 。每个特征图层都分配了一个比例值 。例如,Conv4_3 以 0.2(有时为 0.1)的最小尺度检测对象,然后线性增加到 conv11_2(从辅助卷积获得)的 0.9 尺度 。此外,我们可以注意到,我们正在考虑每个特征图中每个位置的定义数量的先验框 。对于进行 4 次预测的层,SSD 使用 4 种不同的纵横比,分别为 1、2、0.5 和 sqrt(s_k * s_(k+1)),其中 s_k 是第 k 个特征图的比例值 。一般定义为长宽比为1时计算出的附加比例,然后默认框的宽高计算如下:

推荐阅读