ssd anchor_size 计算方法(附计算代码) 、参数调整建议、map 计算

怎么计算anchor size

自己用的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]

参数建议

anchor size

在ssd_vgg_300.py中。

可以根据自己的数据情况进行修改min 和max,并计算 anchor size.

怎么设置合理:

如果数据集中小目标很多,就把min  , max 设置的小一点。

如果数据集中大目标很多,就把min  ,max 设置的大一点。

anchor ratios

另外,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]],

 train_ssd_network.py中的参数

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 计算

 单次计算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会好很多。

你可能感兴趣的:(ssd,cv)