*博主训练之后发现没有收敛,目前还在查找原因
配置环境
系统:Ubuntu
——————————————各依赖版本————————————————
python=3.6.8
TensorFlow-gpu=1.8 #必须是1.x,不能是2.x
CUDA=9
cudnn=7
=若使用docker容器配置环境,可以使用nvidia官方镜像进行配置,其中包含CUDA和cudnn。使用合适的镜像建立容器后,安装python和TensorFlow即可
=TensorFlow和CUDA、cudnn的版本对应关系查询
下载代码
git clone https://github.com/balancap/SSD-Tensorflow.git
制作VOC2007格式数据集
数据集目录结构
——————————————目录结构————————————————
-VOC2007
--JPEGImages #存放图片
--Annotations #存放xml标签
=制作完数据集后,将VOC2007
文件夹放在项目根目录SSD-Tensorflow
下
修改代码
①修改datasets/pascalvoc_common.py
=第24行:VOC_LABELS
修改为自己数据集的类,例:
VOC_LABELS = {
'none': (0, 'Background'), #这一行不可以删除
'类1': (1, '类1'),
'类2': (2, '类2'),
}
②修改datasets/pascalvoc_to_tfrecords.py
=第67行:修改SAMPLES_PER_FILES
来设置将几张图片转换为1个tfrecord
RANDOM_SEED = 4242
SAMPLES_PER_FILES = 1 #此处为1张图转换为1个tfrecord
=第83行:修改读取方式为’rb‘
filename = directory + DIRECTORY_IMAGES + name + '.jpg'
image_data = tf.gfile.FastGFile(filename, 'rb').read()
生成tfrecord
=在SSD-Tensorflow
下建立tfrecord_
文件夹存放生成的tfrecord
=运行以下命令:
DATASET_DIR=./VOC2007/ #数据集的目录
OUTPUT_DIR=./tfrecords_ #存放tfrecord的目录
python3 tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_train \
--output_dir=${OUTPUT_DIR}
训练模型
下载预训练模型
一些模型的链接
=下载vgg16
wget http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
=在checkpoint
文件夹,解压预训练模型,得到vgg_16.ckpt
修改代码
① 修改train_ssd_network.py
=第135行:num_classes
修改为自己的类数+1
tf.app.flags.DEFINE_integer(
'num_classes', 3, 'Number of classes to use in the dataset.')
=第154行:修改max_number_of_steps
为需要的迭代次数;设置为None时表示无限次数训练
tf.app.flags.DEFINE_integer('max_number_of_steps', 10000,
'The maximum number of training steps.')
② 修改nets/ssd_vgg_300.py
=第94行:修改num_classes
和no_annotation_label
为自己的类数+1
default_params = SSDParams(
img_shape=(512, 512),
num_classes=3,
no_annotation_label=3,
③修改eval_ssd_network.py
=第65行:num_classes
修改为自己类数+1
tf.app.flags.DEFINE_integer(
'num_classes', 3, 'Number of classes to use in the dataset.')
④修改datasets/pascalvoc_2007.py
=第29行:按自己数据集修改以下内容:
# (Images, Objects) statistics on every class.
TRAIN_STATISTICS = {
'none': (0, 0),
'类1': (187, 368), #括号内分别为:该类目标出现的图片数、该类目标总框数
'类2': (186, 186),
'total': (188, 554),
}
TEST_STATISTICS = {
'none': (0, 0),
'类1': (48, 94),
'类2': (47, 47),
'total': (48, 141),
}
SPLITS_TO_SIZES = {
'train': 188,
'test': 48,
}
SPLITS_TO_STATISTICS = {
'train': TRAIN_STATISTICS,
'test': TEST_STATISTICS,
}
NUM_CLASSES = 2 #类数
训练
=使用以下命令训练模型
python3 train_ssd_network.py \
--train_dir=train_model \
--dataset_dir=tfrecords_ \
--dataset_name=pascalvoc_2007 \
--dataset_split_name=train \
--model_name=ssd_300_vgg \
--checkpoint_path=checkpoints/vgg_16.ckpt \
--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=24 \
--gpu_memory_fraction=0.9
报错解决
①坐标越界
Error reported to Coordinator: <class'tensorflow.python.framework.errors_impl.InvalidArgumentError'>, All bounding box coordinates must be in [0.0, 1.0]: 1.0014286
这个错误是因为数据集中有标签框的坐标超过了图像长宽,需要检查数据集
②cudnn和TensorFlow版本不匹配
E tensorflow/stream_executor/cuda/cuda_dnn.cc:378]
Loaded runtime CuDNN library: 7604 (compatibility version 7600) but source was compiled with 7004 (compatibility version 7000).
If using a binary install, upgrade your CuDNN library to match.
If building from sources, make sure the library loaded at runtime matches a compatible version specified during compile configuration
此处错误意思是cudnn版本太高(7.6),而这时使用的TensorFlow1.5匹配的版本是7.0,试了一下把TensorFlow升级成1.8就可以运行了