自己用的GitHub 上 balacap这个版本的。
是什么意思就不说了,网上很多,只说如果修改了min_sizes和max_sizes后,怎么计算anchor_size。
可以直接跑下面的代码得到修改后的数据。‘
import math,os
# just change this min_ratio and max_ratio
min_ratio = 20
max_ratio = 90
step = int(math.floor((max_ratio - min_ratio) / (6 - 2)))
min_sizes = []
max_sizes = []
for ratio in range(min_ratio, max_ratio + 1, step):
min_sizes.append(300.* ratio / 100.)
max_sizes.append(300 * (ratio + step) / 100.)
min_sizes = [300 * int(min_ratio/2) / 100.] + min_sizes
max_sizes = [300 * min_ratio / 100.] + max_sizes
print(min_sizes)
print(max_sizes)
结果:
20-90
PS C:\Users\dbt> & python c:/Users/dbt/Desktop/Untitled-1.py
[30.0, 60.0, 111.0, 162.0, 213.0, 264.0]
[60.0, 111.0, 162.0, 213.0, 264.0, 315.0]
15-90
PS C:\Users\dbt> & python c:/Users/dbt/Desktop/Untitled-1.py
[21.0, 45.0, 99.0, 153.0, 207.0, 261.0]
[45.0, 99.0, 153.0, 207.0, 261.0, 315.0]
和源码中的对比:
# anchor_sizes=[(21., 45.),
# (45., 99.),
# (99., 153.),
# (153., 207.),
# (207., 261.),
# (261., 315.)],
anchor_sizes=[(30., 60.),
(60., 111.),
(111., 162.),
(162., 213.),
(213., 264.),
(264., 315.)],
试试其他的组合:
40-90
PS C:\Users\dbt> & python c:/Users/dbt/Desktop/Untitled-1.py
[60.0, 120.0, 156.0, 192.0, 228.0, 264.0]
[120.0, 156.0, 192.0, 228.0, 264.0, 300.0]
在ssd_vgg_300.py中。
可以根据自己的数据情况进行修改min 和max,并计算 anchor size.
怎么设置合理:
如果数据集中小目标很多,就把min , max 设置的小一点。
如果数据集中大目标很多,就把min ,max 设置的大一点。
另外,anchor_ratios 横纵比也要根据数据集调整,如我的目标很多横的长条,如果用原来的,就很难识别到目标。
anchor_ratios=[[2, .5],
[2, .5, 3, 1./3],
[2, .5, 3, 1./3],
[2, .5, 3, 1./3],
[2, .5],
[2, .5]],
修改为如下,效果好了很多。
anchor_ratios=[[4, 8],
[4, 8, 10, 15],
[4, 8, 10, 15],
[4, 8, 10, 15],
[4, 8],
[4, 8]],
tf.app.flags.DEFINE_float(
'loss_alpha', 1.0, 'Alpha parameter in the loss function.')
tf.app.flags.DEFINE_float(
'negative_ratio', 2.0, 'Negative ratio in the loss function.')
tf.app.flags.DEFINE_float(
'match_threshold', 0.15, 'Matching threshold in the loss function.')
想提高定位精度,增大 loss_alpha。想提高分类精度,减小loss_alpha
根据自己目标识别难易程度调整另外2个参数。
减小match threshold,获得更多的正样本。
调整 negative ratio ,控制训练中实际使用的default box 中负样本/正样本的比例。
单次计算map
python eval_ssd_network.py \ --eval_dir=./logs/ \
--dataset_dir=./tfrecords \ --dataset_name=pascalvoc_2007 \
--dataset_split_name=test \ --model_name=ssd_300_vgg \ --checkpoint_path=./checkpoints/VGG_VOC0712_SSD_300x300_ft_iter_1249.ckpt \ --batch_size=1 \
--wait_for_checkpoints=True \ --batch_size=1 \ --max_num_batches=100
连续计算
python eval_ssd_network.py \ --eval_dir=./logs/ \
--dataset_dir=./tfrecords \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=test \
--model_name=ssd_300_vgg \ --checkpoint_path=./logs \
--batch_size=1 \ --wait_for_checkpoints=True \
--batch_size=1 \ --max_num_batches=100
检测一下命令里面的 空格,因为 命令是根据--进行解析的,空格一定要注意,如果多了就会报错。
网上很多人说用了这个版本训练自己的数据识别效果很差,很大原因是上面的参数没有修改,根据自己的数据集修改后,map会好很多。