SSD-tensorflow 測試與訓練實踐
測試-evaluation
測試就是用voc2007的test set來測試已經訓練好的checkpoint的mAP,github上提供了三個已經訓練好的model的checkpoint
需要做的準備有:
1. 下載voc2007的資料集,然後將test set轉化成tfrecord(在轉化時,原始碼只使用了annotations和jpegimages兩個資料夾的內容來製作tfrecords)
2. 下載checkpoint,如voc2007和voc2012訓練集訓練的checkpoint(這個要到github上SSD的主頁去下載,但是好像被牆了,不下載其實也沒關係,因為前面自帶的有一個checkpoint是可以用的)
下載好的voc2007檔案test set 結構是這樣的:
然後在SSD的工程下面建立一個shell指令碼,呼叫tf_convert_data.py將test set轉化成tfrecoeds:(注意:這裡直接執行會碰到無法讀取圖片,UTF-8無法decode的Erro,解決辦法是開啟SSD工程—>datasets—>pascalvoc_to_tfrecords.py 。。。然後更改檔案的83行讀取方式為’rb’)
#!/bin/bash
#This is a shell script to convert Pascal VOC datasets(2007 and 2012) into TF-Records only.
#Directory where the original dataset is stored
DATASET_DIR=/home/wu/VOCtest_06-Nov-2007/VOCdevkit/VOC2007/
#Output directory where to store TFRecords files
OUTPUT_DIR=/home/wu/voc2007_test_tfrecords
python3 ./tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_test \
--output_dir
DATASET_DIR是下載的voc2007測試集的路徑,OUTPUT_DIR是自己設定的儲存tfrecords的路徑,其他選項保持預設如截圖
生成測試集的tfrecords後,繼續在SSD工程下面建立一個shell指令碼,呼叫eval_ssd_network.py使用剛剛生成好的tfrecords來測試checkpoint的準確率
#!/bin/bash
# This is the eval script.
DATASET_DIR=/home/wu/voc2007_test_tfrecords/
EVAL_DIR=/home/wu/ssd_eval_log/# Directory where the results are saved to
CHECKPOINT_PATH=/home/wu/Downloads/SSD-Tensorflow-master/checkpoints/VGG_VOC0712_SSD_300x300_iter_120000.ckpt
python3 ./eval_ssd_network.py \
--eval_dir=${EVAL_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=test \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--batch_size=1
DATASET_DIR是剛剛儲存tfrecords的路徑,EVAL_DIR是自己設定用來儲存測試結果的路徑(生成結果後,在該路徑下執行tensorboard可以檢視視覺化的結果),CHECKPOINT_PATH是下載的checkpoint的路徑(如果未下載可以使用SSD工程本來自帶的checkpoint),其他選項保持預設如圖,最後執行指令碼
windows下不用建立指令碼,也可以在相應的路徑下開啟終端,直接使用命令呼叫相應得.py檔案
訓練-training
同上,先將訓練集轉化成tfrecords,然後開啟train_ssd_network.py修改第154行的最大訓練步數,將None改為比如50000。(第一次訓練時,沒發現,用voc2007訓練集掛了十幾個小時還在訓練;查詢原因tf.contrib.slim.learning.training函式中max-step為None時訓練會無限進行。)
#!/bin/bash
DATASET_DIR=./tfrecords ###訓練集轉化成tfrecords儲存的路徑
TRAIN_DIR=./logs/###儲存訓練結果的路徑,包括checkpoint和event,自行指定
CHECKPOINT_PATH=./checkpoints/ssd_300_vgg.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=pascalvoc_2012 \ ###具體指定,可選項pascalvoc2007
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.001 \
--batch_size=32###GTX1070設定32,python會崩潰,改成16問題不大