环境:win10+tensorflow1.10+cpu
- 运行ssd_tensorflow官方demo
- 解压ssd_300_vgg.ckpt.zip 到checkpoint文件夹下(注意一定是checkpoint文件夹下,不能在checkpoint下还有子文件夹!!)
- 测试demo(这里我和别的博客步骤不一样,是因为按照通常的步骤来,会在from nets import ssd_vgg_300, ssd_common, np_methods
from preprocessing import ssd_vgg_preprocessing
from notebooks import visualization这里报错找不到ssd_vgg_300之类的,也不知道什么原因)
- 把原本在notebooks文件下ssd_notebook.ipynb拷贝到SSD-Tensorflow-master目录下
- 在SSD-Tensorflow-master目录下输入cmd,按Enter键进入。
- 输入 jupyter notebook,随后会弹出的一个浏览器界面(没有就自己复制去浏览器输入跳转)
浏览器弹出的界面
- 在这个页面下找到ssd_notebook.ipynb并打开
修改这几个地方!!!!!!!
(这里image_names[-6]表示测试文件夹中的倒数第几张图片,可以自己改变)
- 运行测试例子
等待结果出现
(图来自网络,自己忘记保存了)
- 利用ssd_tensorflow训练自己的数据集
- 准备数据:从voc 2012数据集中提取出来的四个类(具体可以看我的另一篇博客:从voc2012中提取需要的类的图片和xml)
注:如果是自己制作的数据集,文件夹格式也应该和voc一样!!
Annotions:存放图片信息的xml;
JPEGImages:存放着图片
ImageSets:里面的文件夹main存放着训练集,验证集,测试集划分的信息(从voc提取需要的类或者是自己的数据之后,需要划分生成这四个文本,详细代码请看另一篇博客:python划分训练,测试,验证集)如果是voc2012,voc2007数据集,本来就有的~
2. 修改datasets文件夹中pascalvoc_common.py文件,将训练类修改别成自己的。
3.将图像数据转换为tfrecods格式,修改datasets文件夹中的pascalvoc_to_tfrecords.py文件,然后更改文件的83行读取方式为’rb‘,如果你的文件不是.jpg格式,也可以修改图片的类型。
- 运行tf_convert_data.py文件(DATASET_DIR是自己数据集的路径,OUTPUT_DIR是自己设置的保存tfrecords的路径,其他选项保持默认如截图
命令:
Window系统下:
- 运行成功的话,会看到自己设置的保存tfrecords的路径出现这些文件
- 训练模型train_ssd_network.py文件中修改
(1)修改最大训练步数
(2)由于我是cpu运行,我还改了这里(如果是gpu训练,可以不用改)
(3)修改训练的类别数
(4)可以改变初始学习率,batch size,多久保存一下模型,看自己
- 修改nets/ssd_vgg_300.py(因为使用此网络结构) ,修改97 和98行的类别
- 修改eval_ssd_network.py
- 修改datasets/pascalvoc_2007.py 根据自己的训练数据修改整个文件
(1)
(2)
(3)
(4)
-
通过加载预训练好的vgg16模型,训练网络
链接:https://pan.baidu.com/s/1diWbdJdjVbB3AWN99406nA 密码:ge3x(来自参考博主)
- 运行train_ssd_network.py
命令:(# (1)通过加载预训练好的vgg16模型,对数据集进行训练) 从vgg开始训练其中某些层的参数
python train_ssd_network.py -train_dir=D:\ssd_tensorflow\SSD-Tensorflow-master\logs -dataset_dir=D:\ssd_tensorflow\SSD-Tensorflow-master\tfrecords -dataset_name=pascalvoc_2007 -dataset_split_name=test -model_name=ssd_300_vgg -checkpoint_path=D:\ssd_tensorflow\SSD-Tensorflow-master\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=4
train_dir:#训练生成模型的存放路径
dataset_dir:#数据存放路径
dataset_name:#数据名的前缀
dataset_split_name:
model_name: 加载的模型的名字
checkpoint_path: 所加载模型的路径
checkpoint_model_scope:所加载模型里面的作用域名
checkpoint_exclude_scopes:指定哪些层的参数不需要从vgg16模型里面加载进来
trainable_scopes:指定哪些层的参数是需要训练的,未指定的参数保持不变,若注释掉此命令,所有的参数均需要训练
save_summaries_secs:多久保存一下日志
save_interval_secs:多久保存一下模型
weight_decay:正则化的权值衰减的系数
optimizer:选取的最优化函数
learning_rate:学习率
learning_rate_decay_factor:学习率的衰减因子
batch_size:每一批次处理的图片数量
(2)从自己预训练好的模型开始训练(依然可以指定要训练哪些层)
(当你的模型通过vgg训练的模型收敛到大概o.5mAP的时候,可以进行这一步的fine-tune)
# 通过加载预训练好的vgg16模型,对“voc07trainval+voc2012”进行训练
# 通过checkpoint_exclude_scopes指定哪些层的参数不需要从vgg16模型里面加载进来
# 通过trainable_scopes指定哪些层的参数是需要训练的,未指定的参数保持不变
DATASET_DIR=/home/doctorimage/kindlehe/common/dataset/VOC0712/
TRAIN_DIR=.././log_files/log_finetune/train_voc0712_20170816_1654_VGG16/
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 \ #所加载模型里面的作用域名
--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 \ #每60s保存一下日志
--save_interval_secs=600 \ #每600s保存一下模型
--weight_decay=0.0005 \ #正则化的权值衰减的系数
--optimizer=adam \ #选取的最优化函数
--learning_rate=0.001 \ #学习率
--learning_rate_decay_factor=0.94 \ #学习率的衰减因子
--batch_size=24 \
--gpu_memory_fraction=0.9 #指定占用gpu内存的百分比
(3)从头开始训练自己的模型
# 注释掉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