参考:1)目标检测SSD+Tensorflow 训练自己的数据集 - zcc_TPJH - CSDN博客 https://blog.csdn.net/weixin_39881922/article/details/80569803
2)SSD-Tensorflow训练总结 - 你的朋友不及格,你很难过;你的朋友考了第一,你更难过。 - CSDN博客 https://blog.csdn.net/w5688414/article/details/78395177
代码链接:GitHub - balancap/SSD-Tensorflow: Single Shot MultiBox Detector in TensorFlow https://github.com/balancap/SSD-Tensorflow
下载下来将先ssd_300_vgg.ckpt.zip解压到当前目录下同时还需要下载vgg_16预训练模型。
在运行tf_convert_data.py之前需要传参数,主要是指定相关文件路径,可以直接在py文件中改,也可以在LINUX系统下通过touch xxx.sh命令新建一个xxx.sh文件然后将路径或者其他参数复制进去,再运行sh文件就可以啦。我直接新建了一个tf_convert_data.sh文件,输入以下参数:
DATASET_DIR=./tfrecords #在SSD-Tensorflow-master目录下新建一个tfrecords文件用来保存转换格式后的数据集
OUTPUT_DIR=./voc2007 #用于训练模型的数据集路径
python ./tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_train \
--output_dir=${OUTPUT_DIR}
报错:Dataset directory: ./voc2007/ Output directory: ./tfrecords >> Converting image 1/9963Traceback (most recent call last): File "./tf_convert_data.py", line 59, in tf.app.run() UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
修改:将datasets/pascalvoc_to_tfrecords.py文件83行中的读取方式由
image_data = tf.gfile.FastGFile(filename, 'r').read()
改为image_data = tf.gfile.FastGFile(filename, 'rb').read()
(由于刚开始接触,这其中经历了很多曲折,出错了不知道哪里改,或者不知道哪里出错了。总之改错的时候根据错误提示信息来改就好啦)
然后运行通过./tf_convert_data.sh运行(没有权限的可以先通过chmod u+x tf_convert_data.sh命令添加权限),转换成功。
接下来开始训练的过程:
先新建sh文件传参数:DATASET_DIR=./tfrecords/
TRAIN_DIR=./train_model/
CHECKPOINT_PATH=./checkpoints/vgg_16.ckpt
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 \ #所加载模型里面的作用域名
--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=32 \
这其中出现了很多问题,sh文件中找不到命令,还有HTTPError这个主要是因为datasets文件夹下的imagenet.py中86行给出的base_url网址找不到的原因,经过同学帮忙将网址换成了models/research/inception/inception/data at master · tensorflow/models · GitHub https://github.com/tensorflow/models/tree/master/research/inception/inception/data,这个网址可以访问。然后运行又出现了ASSERTERROR assert==1000/21842但我细细看了,感觉imagenet_metadata.txt/imagenet_lsvrc_2015_synsets.txt这两个文件的参数确实是这么多呀,实在不知道怎么改,怎么改也没用。。我还是先把sh文件里找不到路径找不到命令的错误改了叭。。。但奇怪的是一直找不到路径,但我自己用ls命令又查得到这些文件。Fine
参考了ssd_tensorflow训练自己的模型填坑记 - SAME999ABC的博客 - CSDN博客 https://blog.csdn.net/SAME999ABC/article/details/82558980直接在train_ssd_network中改了参数,其中,我还把160,161行的
checkpoint_path的默认路径改成了我自己的./checkpoints/vgg_16.ckpt。然后运行的时候出现了InvalidArgumentError:Default MaxPoolingop only supports NHWC on device ty。出现这个问题的原因是我是用CPU版的tensorflow来训练代码的,支持的是NHWC格式,GPU版的支持NCHW格式。于是将27行的
DATA_FORMAT = 'NCHW'
改成了
DATA_FORMAT = 'NHWC'然后就可以开始训练了,刚开始的loss值有一百多,接着出现了loss为nan的情况,程序开始报错。
参考http://blog.sina.com.cn/s/blog_6ca0f5eb0102wr4j.html#cmt_5A0D972D-72F73880-BE365276-926-938
我将学习率调低了,再运行出现tensorflow.python.framework.errors_impl.NotFoundError Restoring from checkpoint failed Tensor name ssd_300_vgg/block10/conv1x1/biases not found in checkpoint错误。出现这个问题的原因大概是因为训练时用的是上一次训练过程中保存的模型,保存在
/tmp/tfmodel/文件夹下而我修改了161行中
checkpoint_path
的路径,找到问题后我又将161的路径改为了None默认路径,同时将学习率调低到0.0001,batch_size由原来的32改为了16。目前正在训练,还没有出现nan的情况,就是loss值有点大......如果有路过看到的大神求提供改进意见啊