測試就是用voc2007的test set來測試已經訓練好的checkpoint的mAP,github上提供了三個已經訓練好的model的checkpoint
checkpoint 里面已有的300_vgg_ckpt這個文件很有可能就是下圖圈住的模型,因為這兩個文件的大小是一模一樣的
需要做的准備有:
1. 下載voc2007的數據集,然后將test set轉化成tfrecord(在轉化時,源碼只使用了annotations和jpegimages兩個文件夾的內容來制作tfrecords)
2. 下載checkpoint,如voc2007和voc2012訓練集訓練的checkpoint(這個要到github上SSD的主頁去下載,但是好像被牆了,不下載其實也沒關系,因為前面自帶的有一個checkpoint是可以用的)
下載好的voc2007文件test set 結構是這樣的:
調用tf_convert_data.py將test set轉化成tfrecoeds,(注意:這里直接運行會碰到無法讀取圖片,UTF-8無法decode的Erro,解決辦法是打開SSD工程—>datasets—>pascalvoc_to_tfrecords.py 。。。然后更改文件的83行讀取方式為’rb’)
DATASET_DIR=./VOC2007/ #下載的voc數據集總文件夾 OUTPUT_DIR=./tfrecords #用來放生成的tfrecord文件的文件夾 python tf_convert_data.py \ --dataset_name=pascalvoc \ #必須是pascalvoc,代碼里面默認的 --dataset_dir=${DATASET_DIR} \ --output_name=voc_2007_train \ #必須是這個格式的,例如:voc_2012_test --output_dir=${OUTPUT_DIR}
生成測試集tfrecord后,調用eval_ssd_network.py使用剛剛生成好的tfrecords來測試checkpoint的准確率:
DATASET_DIR=/home/wu/voc2007_test_tfrecords/ #保存tfrecords的路徑 EVAL_DIR=/home/wu/ssd_eval_log/ #是自己設置用來保存測試結果的路徑(生成結果后,在該路徑下運行tensorboard可以查看可視化的結果) CHECKPOINT_PATH=/home/wu/Downloads/SSD-Tensorflow-master/checkpoints/VGG_VOC0712_SSD_300x300_iter_120000.ckpt 是下載的checkpoint的路徑(如果未下載可以使用SSD工程本來自帶的checkpoint) python3 ./eval_ssd_network.py \ --eval_dir=${EVAL_DIR} \ --dataset_dir=${DATASET_DIR} \ --dataset_name=pascalvoc_2007 \ #或者pascalvoc_2012,代碼里面有默認的幾個選項 --dataset_split_name=test \ #必須是test --model_name=ssd_300_vgg \ --checkpoint_path=${CHECKPOINT_PATH} \ --batch_size=1 #可根據自己電腦設置
補充:
SSD輸出mAP時出現TypeError: Can not convert a tuple into a Tensor or Operation???
解決方法為在eval_ssd_network.py文件中添加下面一個函數:
1 def flatten(x): 2 result = [] 3 for el in x: 4 if isinstance(el, tuple): 5 result.extend(flatten(el)) 6 else: 7 result.append(el) 8 return result
然后修改兩行代碼:
1 將 eval_op=list(names_to_updates.values()) 2 3 改為 eval_op=flatten(list(names_to_updates.values())) 4 5 注意:共有兩行!