SSD-TensorFlow训练自己的数据集

*博主训练之后发现没有收敛,目前还在查找原因

配置环境

系统: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_classesno_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就可以运行了

参考链接

https://blog.csdn.net/clover_my/article/details/88844697

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值