参考连接:
https://zhuanlan.zhihu.com/p/33544892
https://zhuanlan.zhihu.com/p/31427288
知乎说的还是不错的、
SSD作为one-stage 和 two-stage结合的方法
先post上SSD的流程图:
代码的实现部分:核心还是数据流:
我们跟着一张图如何走的形态,走下去看看每一步都会发生什么。同时也通过该代码学习下如何用pytorch搭建自己的网络。
开头的nn.module,torch.nn是专门为神经网络设计的模块化接口。nn构建于autograd之上,可以用来定义和运行神经网络。nn.Module是nn中十分重要的类,包含网络各层的定义及forward方法。
代码总体结构
代码的总体结构:先定义了multibox的方法,将vgg和add_extras 放入到multibox中进行处理得到新的vgg基本网络和新的额外的网络同时生成处理置信度和处理位置逻辑回顾的网络。最后一起放入到大的网络中,将刚刚生成这些网络,进行融合,并且加入了前向传播。最后是在其他部分直接调用了build_sad的方法。
base = {
'300': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'C', 512, 512, 512, 'M',
512, 512, 512],
'512': [],
}
extras = {
'300': [256, 'S', 512, 128, 'S', 256, 128, 256, 128, 256],
'512': [],
}
mbox = {
'300': [4, 6, 6, 6, 4, 4], # number of boxes per feature map location
'512': [],
}
def build_ssd(phase, size=300, num_classes=21):
if phase != "test" and phase != "train":
print("ERROR: Phase: " + phase + " not recognized")
return
if size != 300:
print("ERROR: You specified size " + repr(size) + ". However, " +
"currently only SSD300 (size=300) is supported!")
return
base_, extras_, head_ = multibox(vgg(base[str(size)], 3),
add_extras(extras[str(size)], 1024),
mbox[str(size)], num_classes)
#融合到了multibox中给出对应的vgg,extral_layer,还有生成处理置信度和处理位置逻辑回顾的网络。最后将这些放到了SSD的总体网络中。我们这里使用了SSD300 所以size是300
return SSD(phase, size, base_, extras_, head_, num_classes)
mutilbox部分(VGG分析,extra_layer分析)
所以我们先看看multibox,这里会生成一系列我们需要的结构:可以看到输入部分有vgg和extra_layers 还有其他的参数。我们会结合extral_layer和vgg来看看.从VGG的搭建来看和上图的模型是符合的。Conv4-3后讲全连接层替换成了33和11的卷积网络,其中conv6加了dilation=6.
来自知乎的解释: