SSD 的Default box /prior box生成原理

Default box 超参数设定:

mbox_source_layers = ['conv4_3', 'fc7','conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] //多尺寸检测

min_ratio = 20 

max_ratio = 90

step = int(math.floor((max_ratio -min_ratio) / (len(mbox_source_layers) - 2))) //17

min_sizes = []  //none

max_sizes = []  //none

for ratio in xrange(min_ratio, max_ratio +1, step):

 min_sizes.append(min_dim * ratio / 100.)  //[60,111,162,213,264]

 max_sizes.append(min_dim * (ratio + step) / 100.)  //[111,162,213,264,315]

min_sizes = [min_dim * 10 / 100.] +min_sizes  //[30,60,111,162,213,264]

max_sizes = [min_dim * 20 / 100.] +max_sizes  //[60,111,162,213,264,315]

steps = [8, 16, 32, 64, 100, 300]  //当前feature对应原图需要扩充的倍数

aspect_ratios = [[2], [2, 3], [2, 3], [2,3], [2], [2]]  //每层default box对应的宽高比

# L2 normalize conv4_3.

normalizations = [20, -1, -1, -1, -1, -1]   // -1表示不进行正则化,这里只对conv4-3进行了normaliation

# variance解答:https://github.com/weiliu89/caffe/issues/75

除以variance是对预测box和真实box的误差进行放大,从而增加loss,增大梯度,加快收敛。 offse一般都是4个参数的offset(n,c,w,h),设置相应的参数就可以指到下一张图(以四位张量为例)

if code_type == P.PriorBox.CENTER_SIZE: //

 prior_variance = [0.1, 0.1, 0.2, 0.2]

else:

 prior_variance = [0.1]

flip = True  //此参数将宽高比求导数,如给定宽高比为2,在fliptrue条件下自动计算出另外的一个宽高比为0.5

clip = False  //此参数是保证超过尺寸的框能缩减到规定范围内,例如特征图的尺寸为[300,300],得到的boxxmaxymax均为330cliptrue的话会将其修正为300.源码中

 Default box 计算过程:

  假设当前的特征图尺寸为W*H,对于特征图上的每一个像素点(i,j),其对应的defaults box的中心点在原图上的坐标为((i+offset)*step,(j+offset)*step),中心点确定之后根据宽高比aspect_ratios以及min_size确定defaults box的((xmin,ymin),(xmax,ymax)),值得注意的是,如果宽高比为1,defaults box除了包含以min_size为边长的正方形外,还包含边长为 sqrt(min_size_ * max_size_)的正方形,其他的按正常值计算(W,H)对应(sqrt(aspect_ratio)*min_size,min_size/sqrt(aspect_ratio))。

 注意:

1:prototxt一定要提供min_size,并且该值大于0,min_size可选。

2:超参数设置宽高比时不必加入1,caffe源码里直接加入了1,一个宽高比代表其本身和其倒数,举例,第conv_4层的aspect_ratio=[2],对应了[1/2,1,2]三个宽高比。

3:源码里的offset和Faster RCNN 一样,就是把featuremap上的点映射回原图,这里加上0.5也是为了四舍五入,和faster rcnn python代码类似。      


你可能感兴趣的:(神经网络)