1. 程式人生 > >SSD-tensorflow 測試與訓練實踐

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’)

  1. #!/bin/bash
  2. #This is a shell script to convert Pascal VOC datasets(2007 and 2012) into TF-Records only.
  3. #Directory where the original dataset is stored
  4. DATASET_DIR=/home/wu/VOCtest_06-Nov-2007/VOCdevkit/VOC2007/
  5. #Output directory where to store TFRecords files
  6. OUTPUT_DIR=/home/wu/voc2007_test_tfrecords
  7. python3 ./tf_convert_data.py \
  8. --dataset_name=pascalvoc \
  9. --dataset_dir=${DATASET_DIR} \
  10. --output_name=voc_2007_test \
  11. --output_dir
    =${OUTPUT_DIR}

DATASET_DIR是下載的voc2007測試集的路徑,OUTPUT_DIR是自己設定的儲存tfrecords的路徑,其他選項保持預設如截圖

生成測試集的tfrecords後,繼續在SSD工程下面建立一個shell指令碼,呼叫eval_ssd_network.py使用剛剛生成好的tfrecords來測試checkpoint的準確率

  1. #!/bin/bash
  2. # This is the eval script.
  3. DATASET_DIR=/home/wu/voc2007_test_tfrecords/
  4. EVAL_DIR=/home/wu/ssd_eval_log/# Directory where the results are saved to
  5. CHECKPOINT_PATH=/home/wu/Downloads/SSD-Tensorflow-master/checkpoints/VGG_VOC0712_SSD_300x300_iter_120000.ckpt
  6. python3 ./eval_ssd_network.py \
  7. --eval_dir=${EVAL_DIR} \
  8. --dataset_dir=${DATASET_DIR} \
  9. --dataset_name=pascalvoc_2007 \
  10. --dataset_split_name=test \
  11. --model_name=ssd_300_vgg \
  12. --checkpoint_path=${CHECKPOINT_PATH} \
  13. --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時訓練會無限進行。)

  1. #!/bin/bash
  2. DATASET_DIR=./tfrecords ###訓練集轉化成tfrecords儲存的路徑
  3. TRAIN_DIR=./logs/###儲存訓練結果的路徑,包括checkpoint和event,自行指定
  4. CHECKPOINT_PATH=./checkpoints/ssd_300_vgg.ckpt
  5. python train_ssd_network.py \
  6. --train_dir=${TRAIN_DIR} \
  7. --dataset_dir=${DATASET_DIR} \
  8. --dataset_name=pascalvoc_2012 \ ###具體指定,可選項pascalvoc2007
  9. --dataset_split_name=train \
  10. --model_name=ssd_300_vgg \
  11. --checkpoint_path=${CHECKPOINT_PATH} \
  12. --save_summaries_secs=60 \
  13. --save_interval_secs=600 \
  14. --weight_decay=0.0005 \
  15. --optimizer=adam \
  16. --learning_rate=0.001 \
  17. --batch_size=32###GTX1070設定32,python會崩潰,改成16問題不大