Tensorflow-SSD测试及训练自己的数据集

时间:2021-10-17 17:10:02

一、## 软件 ##
Python + Tensorflow + OpenCV3

二、## 安装测试 ##
1、ssd_notebook.ipynb测试
(1)下载程序包并解压。 源代码GitHub: balancap/SSD-Tensorflow
(2)打开终端,进入目录路径,运行:
jupyter notebook notebooks/ssd_notebook.ipynb

2、py脚本测试
不使用notebook方法,直接在python中实现。
(1)在根目录下新建一个Python脚本文件 ssd_Python.py,将ssd_notebook.ipynb中的代码复制进去,其中将最后几行代码进行更改,将
img = mpimg.imread(path + image_names[-5])
替换为:

for it  in image_names:
img = mpimg.imread(path + it)
i+=1
if i>4: break
rclasses, rscores, rbboxes = process_image(img)
visualization.plt_bboxes(img, rclasses, rscores, rbboxes)

(2)然后在终端直接运行:

Python ssd_Python.py

三、## 训练自己的数据集 ##
1、数据转换
因为SSD不是直接使用的VOC数据集格式,所以要将其转换为特定格式,使用 tf_convert_data.py进行数据转换。在终端输入转换命令:

DATASET_DIR=./VOC2007/test/
OUTPUT_DIR=./tfrecords
python tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_train \
--output_dir=${OUTPUT_DIR}

由于比较懒,我是直接将这些变量代入到程序中,这样就可以直接运行:

python tf_convert_data.py

最后将数据转换为类似这种形式:VOC2007_000.tfrecord的文件。
2、训练
下载网络基本框架:VGG_16
之后运行:

DATASET_DIR=./tfrecords
TRAIN_DIR=./log/
CHECKPOINT_PATH=./checkpoints/vgg_16.ckpt
python train_ssd_network.py \
--train_dir=${TRAIN_DIR} \
--dataset_dir=${DATASET_DIR} \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=${CHECKPOINT_PATH} \
--checkpoint_model_scope=vgg_16 \
--checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
--save_summaries_secs=60 \
--save_interval_secs=600 \
--weight_decay=0.0005 \
--optimizer=adam \
--learning_rate=0.001 \
--learning_rate_decay_factor=0.94 \
--batch_size=32

我还是将其代入到程序中的变量里了,可以直接运行:

python train_ssd_network.py

训练到后期,未得到更好的结果,还可以进行微调训练,参考这里 balancap/SSD-Tensorflow 的 README.md 最后部分。

这其中会遇到各种问题:
(1)在解压文件目录下找到 datasets/pascalvoc_common.py ,根据自己数据集的类别更改 VOC_LABELS 变量。
(2)同样在 datasets文件夹下,仿照pascalvoc_2012.py文件,结合自己的数据集建立自己的类似文件。
(3)如果你的数据及不是jpg格式的,根据出现的错误,将程序中对应位置改为你的图片格式。

最后,训练自己的数据集过程中还是会遇到一些问题,根据错误提示,看看访问的路径,数据格式是否存在问题,进一步解决。

参考:balancap/SSD-Tensorflow