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會好很多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章