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,在flip为true条件下自动计算出另外的一个宽高比为0.5
clip = False //此参数是保证超过尺寸的框能缩减到规定范围内,例如特征图的尺寸为[300,300],得到的box的xmax和ymax均为330,clip为true的话会将其修正为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代码类似。