测试-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=${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问题不大