关于SSD中的细节问题
SSD总结报告:https://blog.csdn.net/weixin_38715903/article/details/84878592
参考博客:1.https://blog.csdn.net/xunan003/article/details/79186162
2.https://blog.csdn.net/zbzb1000/article/details/81037852
目录
1.关于prior box的计算问题:
1)简单介绍:
2)对应ssd_pascal.py代码,解读计算过程:
"""
#参数生成先验。
#输入图像的最小尺寸
min_dim = 300 #维度
# conv4_3 ==> 38 x 38
# fc7 ==> 19 x 19
# conv6_2 ==> 10 x 10
# conv7_2 ==> 5 x 5
# conv8_2 ==> 3 x 3
# conv9_2 ==> 1 x 1
"""
"""
#prior_box的来源层,可以更改。(使用的特征层层数)
"""
mbox_source_layers = ['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2']
"""
# in percent %
#对应论文中的Smin和Smax:0.2,0.9:
"""
min_ratio = 20
max_ratio = 90
"""
#math.floor()函数表示:求一个最接近它的整数,它的值小于或等于这个浮点数。
#公式中的(Smax-Smin)/(m-1)
"""
step = int(math.floor((max_ratio - min_ratio) / (len(mbox_source_layers) - 2)))
"""
#m-1=6,即为5个间隔
#取一个间距步长,即在下面for循环给ratio取值时起一个间距作用。可以用一个具体的数值代替,这里等于17。
"""
"""
min_sizes[0]=S1;max_sizes[0]=S2
min_sizes[1]=S2;max_sizes[1]=S3
...
"""
min_sizes = []
max_sizes = []
"""
#从min_ratio至max_ratio+1每隔step=17取一个值赋值给ratio
#(Smax-Smin)/(m-1)*(k-1)=step*(k-1)
#这里相当于step这个值再乘以(k-1)
#ratio=[20,37,54,71,88]
"""
for ratio in xrange(min_ratio, max_ratio + 1, step):
"""
#分别计算每一个尺度下的最大最小值
"""
min_sizes.append(min_dim * ratio / 100.) #[60.0,111.0,162.0,213.0,264.0]
max_sizes.append(min_dim * (ratio + step) / 100.) #[111.0,162.0,213.0,264.0,315.0]
"""
#拼接conv4_3的尺度:
"""
min_sizes = [min_dim * 10 / 100.] + min_sizes #[30.0,60.0,111.0,162.0,213.0,264.0]
max_sizes = [min_dim * 20 / 100.] + max_sizes #[60.0,111.0,162.0,213.0,264.0,315.0]
"""
#这一步要仔细理解,即计算卷积层产生的default_box距离原图的步长,先验框中心点的坐标会乘以step,相当于从feature map位置映射回原图位置,比如conv4_3输出特征图大小为38*38,而输入的图片为300*300,所以38*8约等于300,所以映射步长为8。这是针对300*300的训练图片。
"""
steps = [8, 16, 32, 64, 100, 300]
aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]]
"""
#这里指的是横纵比,六种尺度对应六个产生default_box的卷积层。具体可查看生成的train.prototxt文件一一对应每层的aspect_ratio参数,此参数在caffe.proto中有定义,关于aspect_ratios如何把其内容传递给了aspect_ratio,在model_libs.py文件中有详细定义。
"""
min_size(Sk) | max_size(Sk+1) | |
conv4_3 | 30 | 60 |
fc7 | 60 | 111 |
conv6_2 | 111 | 162 |
conv7_2 | 162 | 213 |
conv8_2 | 213 | 264 |
conv9_2 | 264 | 315 |
3)产生最终default bbox:
- 以feature map上每个点的中点为中心(offset=0.5),生成一些列同心的default box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置)
- 正方形default box最小边长为:,最大边长为:
- 在prototxt设置一个aspect ratio,会生成2个长方形,长宽为: 和
a).接着上述代码:
aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]]
对于:[2]-->如上图产生两个正方形+两个矩形=4个候选框
[2,3]-->产生两个正方形+四个矩形框=6个候选框
.....以此类推
b).将候选框映射回原图,则是将坐标乘以代码中给出的steps就可以惹:
steps = [8, 16, 32, 64, 100, 300]
4)最终的prior bbox:
回归之后的bbox送去计算loss,default box 会生成prior box。
后续通过softmax分类+bounding box regression即可从priox box中预测到目标。
2.关于SSD的输入图像的预处理及数据增强:
1.mirror、mean:
- 镜像,均值
mirror: true#开启镜像
#图像均值
mean_value: 104
mean_value: 117
mean_value: 123
2.resize_param:
- resize图像至固定大小
#resize文件
resize_param {
prob: 1
resize_mode: WARP
height: 300
width: 300
interp_mode: LINEAR
interp_mode: AREA
interp_mode: NEAREST
interp_mode: CUBIC
interp_mode: LANCZOS4
}
3.emit_constraint:
- 给定注释的条件[不明白...]
emit_constraint {
emit_type: CENTER
}
4.distort_param:
distort_param {
brightness_prob: 0.5 #调整亮度的概率
#调整像素的范围
brightness_delta: 32.0 #添加像素值,对原图增加-32至32中的随机像素值
contrast_prob: 0.5 #调整对比度的概率
contrast_lower: 0.5 #随机对比因子的下界
contrast_upper: 1.5 #随机对比因子的上界
hue_prob: 0.5 #调整色调的概率
hue_delta: 18.0 #调整色调通道数量
saturation_prob: 0.5 #调整饱和度的概率
saturation_lower: 0.5 #调整饱和因子的上界
saturation_upper: 1.5 #调整饱和因子的下界
random_order_prob: 0.0 #随机排列图像通道的概率
}
5.expand_param:
expand_param {
prob: 0.5 //expand发生的概率
max_expand_ratio: 4 //expand的扩大倍数
}
- expand是指对图像进行缩小,图像的其余区域补0。
- 目的是在数据处理阶段增加多尺度的信息:大object通过expand方法的处理可以变成小尺度的物体训练。提高ssd对尺度的泛化性。
6.data_param:
- 给data数据
data_param {
source: "/ssd/caffe/data/VOC0712/lmdb/VOC0712_trainval_lmdb"
batch_size: 8
backend: LMDB
}
7.annotated_data_param:
- 以下有7个batch_sampler
- batch_sampler是对图像选取一个满足限制条件的区域(注意这个区域是随机抓取的)。限制条件就是抓取的patch和GT(Ground Truth)的IOU的值。
- 以如下代码为例:
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1.0
min_aspect_ratio: 0.5
max_aspect_ratio: 2.0
}
sample_constraint {
min_jaccard_overlap: 0.9
}
max_sample: 1
max_trials: 50
}
步骤是:先在区间[min_scale,max_sacle]内随机生成一个值,这个值作为patch的高Height,然后再在[min_aspect_ratio,max_aspect_ratio]范围内生成ratio,从而得到patch的Width。(归一化了)
patch的宽和高随机得到了,然后在图像中进行一次patch,要求满足与GT的最小IOU是0.9,也就是IOU>=0.9。如果随机patch满足这个条件,那么张图会被resize到300*300(在SSD300*300中)送进网络训练。如下图。
max_sample为1,即在该batch_sampler条件下,只需要找到一个满足条件的sample_box;
max_trails为50,即在该batch_sampler条件下,会尝试50次上述操作。
annotated_data_param {
batch_sampler {
max_sample: 1
max_trials: 1
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1.0
min_aspect_ratio: 0.5
max_aspect_ratio: 2.0
}
sample_constraint {
min_jaccard_overlap: 0.1
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1.0
min_aspect_ratio: 0.5
max_aspect_ratio: 2.0
}
sample_constraint {
min_jaccard_overlap: 0.3
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1.0
min_aspect_ratio: 0.5
max_aspect_ratio: 2.0
}
sample_constraint {
min_jaccard_overlap: 0.5
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1.0
min_aspect_ratio: 0.5
max_aspect_ratio: 2.0
}
sample_constraint {
min_jaccard_overlap: 0.7
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1.0
min_aspect_ratio: 0.5
max_aspect_ratio: 2.0
}
sample_constraint {
min_jaccard_overlap: 0.9
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1.0
min_aspect_ratio: 0.5
max_aspect_ratio: 2.0
}
sample_constraint {
max_jaccard_overlap: 1.0
}
max_sample: 1
max_trials: 50
}
#类别标签信息
label_map_file: "data/VOC0712/labelmap_voc.prototxt"
}
}