我们准备好自己的数据
1,在VOC2007下面做好数据集
我的数据集就是这样的
用自己数据训练ssd(二)
Annotation中保存是标签文件,主要是我们自己做好的xml文件
用自己数据训练ssd(二)
ImageSet中保存的是Main,Main中华保存的是两个文件,这两个文件可以用的
用自己数据训练ssd(二)
JPEGImage中保存的是原始的数据图片
用自己数据训练ssd(二)
1 首先制作tfrecord文件
写一个脚本文件
(怎样写一个脚本文件呢)
用自己数据训练ssd(二)
这里如果不给权限,就执行不了
hello.sh

#!/bin/sh
echo hello word
DATASET_DIR=./VOC2007/
OUTPUT_DIR=./tfrecords#这个是自己手动创建的
python tf_convert_data.py \
    --dataset_name=pascalvoc \
    --dataset_dir=${DATASET_DIR} \
    --output_name=voc_2007_train \
    --output_dir=${OUTPUT_DIR}

修改一些文件
两个
voc格式的数据集制作好以后,我们需要把数据集转换成tfrecords,这样程序才能跑,首先,我们需要修改一下源码,datasets\pascalvoc_common.py,操作也非常简单,你把你的类别填上就行了,其他的都不用管,看我的示例,我把原来的16类弄成了2类:

VOC_LABELS = {
    'none': (0, 'Background'),
    'person':(1,'Person'),
}

2)SSD-Tensorflow-master/datasets/pascalvoc_to_tfrecords.py文件中,82行,格式改为相对应的‘.jpg’或‘.jpeg’,83行‘r’改为‘rb’。

用自己数据训练ssd(二)

这样就行了。
接着跳转到SSD-tensorflow目录下,进行tfrecords操作,执行
.hello.sh
这样就产生了tfrecord数据在这个文件夹下面

训练

写一个训练的脚本文件,train.sh

DATASET_DIR=./tfrecords
TRAIN_DIR=./log/
CHECKPOINT_PATH=./checkpoints/ssd_300_vgg.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} \
    --save_summaries_secs=60 \
    --save_interval_secs=600 \
    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --batch_size=6 \
    --gpu_memory_fraction=0.9 \#如果不写,GPU默认申请全部的,如果得不到全部的,他就不执行。
    --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
  

这样写是有原因的,最后一句是选择一些层改变权值,有些不需要改变的
下面需要修改的文件如下,因为我是两类,所以我需要修改很多地方将class-num改为2
包括很多地方的设置
用自己数据训练ssd(二)
参照这两篇博客进行修改
SSD-tensorflow 训练自己的数据并显示训练结果 - liuyan20062010的专栏 - CSDN博客 https://blog.csdn.net/liuyan20062010/article/details/78905517
SSD-tensorflow 训练自己的数据并显示训练结果 - liuyan20062010的专栏 - CSDN博客 https://blog.csdn.net/liuyan20062010/article/details/78905517
最后的那个train.也有两种选择,上面的我就直接使用了SSD,我么也可以从VGG16开始训练,进行fine-tuning
或者就直接自己从分类网络开始训练,从VGG16开始训练
从从头训练自己的模型

# 注释掉CHECKPOINT_PATH,不提供初始化模型,让模型自己随机初始化权重,从头训练
# 删除checkpoint_exclude_scopes和trainable_scopes,因为是从头开始训练
# CHECKPOINT_PATH=./log_files/log_finetune/train_voc0712_20170712_1741_VGG16/model.ckpt-253287
 
python3 ../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 \   #所加载模型里面的作用域名
    --save_summaries_secs=60 \  #每60s保存一下日志
    --save_interval_secs=600 \  #每600s保存一下模型
    --weight_decay=0.0005 \     #正则化的权值衰减的系数
    --optimizer=adam \          #选取的最优化函数
    --learning_rate=0.00001 \   #学习率
    --learning_rate_decay_factor=0.94 \ #学习率的衰减因子
    --batch_size=32

里面遇到很多的问题
1,就是GPU内存不够的问题
使用nvidia-smi查看使用情况,可以kill -9 PID
2,提示说Bbox标记在图像的外面去了,这个解决方法我也不是很清楚
我出现这个问题就是因为我自己的voc数据集出错了
接下来就是我的我改了一下制作tfrecord文件的程序
如下
用自己数据训练ssd(二)
具体问题可以参考这个文献
训练 SSD-Tensorflow 遇到的若干问题 - 叶罅 - 博客园 https://www.cnblogs.com/blog4ljy/p/9320487.html
还有问题我忘记了,我想到的时候再去补充吧

相关文章: