接上一篇 ssd笔记_人工智能-CSDN博客
我这笔记就是流水账,主要写的好的太多,写的差的还是空白,我要填补这个空白
这里面就是稍微说一下对应关系,一个是loc的计算结果,也就是head[0],当然conf的结果size跟loc的size有一种绝对的比例关系,所以就算是一起算出来的
loc的网络结构如下:
(0, Conv2d(512, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
(1, Conv2d(1024, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
(2, Conv2d(512, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
(3, Conv2d(256, 24, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
(4, Conv2d(256, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
(5, Conv2d(256, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)))
loc的输入是 sources ,尺寸是
torch.Size([1, 512, 38, 38])
torch.Size([1, 1024, 19, 19])
torch.Size([1, 512, 10, 10])
torch.Size([1, 256, 5, 5])
torch.Size([1, 256, 3, 3])
torch.Size([1, 256, 1, 1])
而这个各个size是输入为300时,多次下采样得出的size,上篇也提到了
计算到VGG的第22层,前面22层共下采样三次(300/8 = 38)
x (1, 512, 38, 38)
L2Norm之后,s (1, 512, 38, 38)
把s加入到 sources 中
x继续执行完VGG,从23层到最后,又下采样了一次
x(1, 1024, 19, 19)
这也就是VGG计算到最后的尺寸
又添加到 sources 中,这时,sources有两个元素
x执行 extras,extras共8个卷积,每隔一次添加到 sources 中,共添加了四个元素
extras 有两次下采样,又有两次不加 pad 的 3*3卷积的骚操作(每次尺寸变换都会添加到 sources 中),
总之, x的最后size为 (1, 256, 1, 1)
sources 里的尺寸为
torch.Size([1, 512, 38, 38])
torch.Size([1, 1024, 19, 19])
torch.Size([1, 512, 10, 10])
torch.Size([1, 256, 5, 5])
torch.Size([1, 256, 3, 3])
torch.Size([1, 256, 1, 1])
所以sources的前两项是从VGG的22层和最后一层获取到添加进去的,而后面四项是extras计算出来的
而extras用到的参数为
extras = [256, 'S', 512, 128, 'S', 256, 128, 256, 128, 256]
上面的S就是要用步长为2的卷积进行下采样了,而不是S的,就可能是用3*3的卷积,但不加pad进行下采样
sources的结果再经过loc的卷积得出返回值
loc的结果尺寸为
torch.Size([1, 38, 38, 16])
torch.Size([1, 19, 19, 24])
torch.Size([1, 10, 10, 24])
torch.Size([1, 5, 5, 24])
torch.Size([1, 3, 3, 16])
torch.Size([1, 1, 1, 16])
训练时上面第一列的值可能是16,那只是训练时的batchsize,可以不必关注,毕竟test的时候,该值就是1了
——————————————————————————————
anchor的个数是38 * 38 * 4 + 19 * 19 * 6 + 10 * 10 * 6 + 5 * 5 * 6 + 3 * 3 * 4 + 1 * 1 * 4
也就是8372个
上面的数值是来源于config.py文件里的两个配置项,
'feature_maps': [38, 19, 10, 5, 3, 1],
'aspect_ratios': [[2], [2, 3], [2, 3], [2, 3], [2], [2]],
这是PriorBox类里创建anchor用到的
所以,原来如此,feature_map里的值,是从VGG的神经网络的下采样尺寸和extras再次下采样中计算得到的,然后又写为了超参数,而aspect_ratios的内容是anchor比例,而从该参数又得出了参数
mbox = [4, 6, 6, 6, 4, 4] # number of boxes per feature map location
所以这些没有写在一起的参数之间是相互完全制约的,才能严丝合缝的匹配
从anchor的角度来看,自然38*38的格子最多,尺寸最小,而从网络深度来看,自然sources的第一个元素的网络最浅,也就是对应loc的第一个元素的网络最浅,所以也就是事实上的,浅层网络预测小目标,深层网络预测大目标
38*38,宽高都是一 一对应关系