本文代码全部由大神Bubbliiiing的开源代码,使用pytorch版本的,并从各种地方寻找资料,主要是Bubbliiiing大兄弟的!
主要说的是VGG的前半部分
https://blog.csdn.net/qq_43656233/article/details/107588402
接上篇文章最后的输出结果是19×19×1024,Bubbliiiing大神直接的把网络变化写进了注释里。
def add_extras(i, batch_norm=False):
# Extra layers added to VGG for feature scaling
layers = []
in_channels = i
# Block 6
# 19,19,1024 -> 10,10,512
layers += [nn.Conv2d(in_channels, 256, kernel_size=1, stride=1)]
layers += [nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1)]
# Block 7
# 10,10,512 -> 5,5,256
layers += [nn.Conv2d(512, 128, kernel_size=1, stride=1)]
layers += [nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1)]
# Block 8
# 5,5,256 -> 3,3,256
layers += [nn.Conv2d(256, 128, kernel_size=1, stride=1)]
layers += [nn.Conv2d(128, 256, kernel_size=3, stride=1)]
# Block 9
# 3,3,256 -> 1,1,256
layers += [nn.Conv2d(256, 128, kernel_size=1, stride=1)]
layers += [nn.Conv2d(128, 256, kernel_size=3, stride=1)]
return layers
现在可以上这一张图了:
从输入的是300×300×3,到最后的1×1×256,就是上面的SDD网络的第一行。
这个题目是大神取的,不是我取的。
这里对上面的每一步的卷积结果进行提取,并对这6个结果进行新的卷积,以预测不同大小的各种状况。
最新的两次卷积分别是:对每一步的结果特征层,首先进行一个num_priors x 4的卷积,再进行一次num_priors x num_classes的卷积。其中num_priors分别是4 6 6 6 4 4,对应着每一阶段的网络拥有的先验框。
这样每一步的网络就可以得到如下表:(表依旧是大神的)
这里38×38×512为例,图像被分为38×38的小格子,每一个小格子拥有4个先验框去预测所有的物体种类,对这一层进行卷积,4×4=16,所以由原先的38×38×512变为38×38×16。
第二次卷积,VOC数据集共有20个分类,但这里乘了21,我还没明白过来是为什么,但好像就需要这么做。。。
特征从38×38×16变为38×38×84(84=4×21) 。
后面的6个特征曾进行相同的操作,即完成了特征提取网络的搭建。
mbox = [4, 6, 6, 6, 4, 4] # 对应6个先验框
def get_ssd(phase,num_classes):
vgg, extra_layers = add_vgg(3), add_extras(1024)
loc_layers = []
conf_layers = []
vgg_source = [21, -2]
for k, v in enumerate(vgg_source):
loc_layers += [nn.Conv2d(vgg[v].out_channels,
mbox[k] * 4, kernel_size=3, padding=1)]
conf_layers += [nn.Conv2d(vgg[v].out_channels,
mbox[k] * num_classes, kernel_size=3, padding=1)]
for k, v in enumerate(extra_layers[1::2], 2):
loc_layers += [nn.Conv2d(v.out_channels, mbox[k]
* 4, kernel_size=3, padding=1)]
conf_layers += [nn.Conv2d(v.out_channels, mbox[k]
* num_classes, kernel_size=3, padding=1)]
SSD_MODEL = SSD(phase, vgg, extra_layers, (loc_layers, conf_layers), num_classes)
return SSD_MODEL