论文疑惑
1、anchor_sizes 设定了 21、45、99、153、207、261、315几个anchor尺寸,这些尺寸定义在输入图像300*300上。例如,对于anchor_size=21的default box,其对应的特征图尺寸为38*38,那么对于特征图38*38上的任意一个像素来说,像素值是由原图上的3*3 经过卷积后得到,因此将原图的3*3区域看做特征图该像素的感受野,那么对整个feature map来说,感受野是整个输入图像。那么,anchor_size即为原图对应感受野的尺寸,feature map上一个像素相当于原图中的300/38=7.89 个像素,anchor_size = 21,相当于输入图像上尺寸为21/7.89 = 2.66 的区域。
2、在每一个feature map上,default boxes的anchor_size固定,只通过改变先验框的长宽比anchor_ratio,即可生成不同的先验框。在较大的图像上,适合检测较小的物体,较小的图像上检测大物体,因此采用较小的anchor_size作为前面的feature map,后面的feature map采用较大的anchor_size。
为什么用加法?ssd_multibox_layer中的代码:num_anchors = len(sizes) + len(ratios),这其实是针对每个extra feature layer而言,default boxes 的个数由纵横比的个数决定,举例来说,对于archor_ratio={1, 2, 3,1/2, 1/3},根据原文可知,除了列表中提供的五个纵横比以外,还包括有一个纵横比等于1的box,只不过相对于当前层对应的archor_size来说,这个box的尺寸会发生变化,其值等于当前层对应的archor_size与下层archor_size乘积的平方根,增加这一default box的目的是为了添加一个较大的先验框。
代码疑惑
from collections import namedtuple
SSDParams = namedtuple('SSDParameters', ['img_shape',
'num_classes',
'no_annotation_label',
'feat_layers',
'feat_shapes',
'anchor_size_bounds',
'anchor_sizes',
'anchor_ratios',
'anchor_steps',
'anchor_offset',
'normalizations',
'prior_scaling'
])
namedtuple 是用来创建一个自定义的tuple对象(数据类型),它既具备tuple元素的个数,也可以用属性而不是索引来引用tuple的某个元素。例如,SSDParameters.img_shape就可以访问img_shape的值。