参考:Windows下SSD训练VOC2007 并就在本人实现的过程中出现的问题进行补充
源码下载:SSD_tensorflow
p.s. 假如你使用 git 命令下载该源码,则该文件名为 SSD-Tensorflow。
假如你直接在Github上 Download ZIP ,则该文件夹名为 SSD-Tensorflow-master 。
所以不用怀疑是否下载错了!
自行下载 pascalvoc_2007 数据集,并将其重命名为 VOC2007 (方便统一)(即修改完后——打开VOC2007文件夹就能看到下列五个文件夹)
将SSD-Tensorflow/checkpoints下的ssd_300_vgg.ckpt.zip解压到当前文件夹下:
修改SSD-Tensorflow/datasets/pascalvoc_to_tfrecords.py中187行
#修改前
def run(dataset_dir, output_dir, name='voc_train', shuffling=False):
#修改后
def run(dataset_dir, output_dir, name='voc_2007_train', shuffling=False):
并在SSD-Tensorflow目录下新建文件夹tfrecords文件夹,并且在SSD-Tensorflow/datasets/pascalvoc_to_tfrecords.py最后添加:
if __name__ == '__main__':
dataset = '你的数据集路径\\'
output = '../tfrecords/'
run(dataset, output)
例:
if __name__ == '__main__':
dataset = 'E:\\Dateset\\VOC2007\\'
output = '../tfrecords/'
run(dataset, output)
运行pascalvoc_to_tfrecords.py, 在SSD-Tensorflow/tfrecords下看到:
即序列化成功。
运行pascalvoc_to_tfrecords.py时,
报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
解决方案:修改pascalvoc_to_tfrecords.py 的第83行
# 修改前
image_data = tf.gfile.FastGFile(filename, 'r').read()
# 修改后
image_data = tf.gfile.FastGFile(filename, 'rb').read()
原因:‘utf-8’ codec can’t decode
修改SSD-Tensorflow/train_ssd_network.py文件,
# 修改前
sync_optimizer=None)
if __name__ == '__main__':
tf.app.run()
# 修改后:
sync_optimizer=None)
def run():
FLAGS.train_dir = './logs/'
FLAGS.dataset_dir = './tfrecords'
FLAGS.dataset_name = 'pascalvoc_2007'
FLAGS.dataset_split_name = 'train'
FLAGS.model_name = 'ssd_300_vgg'
FLAGS.checkpoint_path = './checkpoints/ssd_300_vgg.ckpt'
FLAGS.save_summaries_secs = 60
FLAGS.save_interval_secs = 600
FLAGS.weight_decay = 0.0005
FLAGS.optimizer = 'adam'
FLAGS.learning_rate = 0.001
FLAGS.batch_size = 16
tf.app.run()
if __name__ == '__main__':
# tf.app.run()
run()
这样修改的目的是不用在cmd中输入一堆参数。
p.s. 遇到报错,要向上找到第一个ERROR
Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED
解决方案:在 import tensorflow as tf 之后添加下面两行代码
import tensorflow as tf
config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
sess = tf.Session(config=config)
原因:报错:CUDNN_STATUS_ALLOC_FAILED的解决方案
Default MaxPoolingOp only supports NHWC on device type CPU
原因:tensorflow-gpu环境没配置好
排查两点:
1. 是否配置成功tensorflow-gpu环境.
2. PyCharm的File–Settings–Project Interpreter是否选择了正确的编译环境(例如我的电脑中就有三个不同的编译环境tensorflow、tensorflow-gpu和pytorch。
F tensorflow/core/kernels/conv_ops.cc:459] Check failed: stream->parent()->GetConvolveAlgorithms(&algorithms)
Aborted (core dumped)
解决方法:修改SSD-Tensorflow/train_ssd_network.py文件第368行后面增加:
config.gpu_options.allow_growth = True
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape
解决方法:将 batch_size 改小一些。
作为新手,读完论文之后明白了其算法原理,但是对具体的代码实现是一无所知的,这时候就需要读源码。阅读源码时会发现,源码的代码量不小,且初次接触完整体系的源码,阅读起来的难度很高。再者,直接下载下来的源码一般都无法直接运行,需要修改源码中的配置参数,修改完之后可能还会有各种各样的报错信息,往往会让初学者感到烦躁。
有的人可能想着虽然源码现在无法运行,但是我可以将源码理解之后再来修改配置参数让它可以运行,我刚开始也是这么想的,读了一段时间之后我发现有两个问题:一是你不知道正确的应该是什么样子的,不知道改哪里;二来,不知道对错,读着没信心,也没兴趣,读不下来。所以我想着有条件的话还是将源码实实在在跑出来之后再回头去理解源码,可能会舒服些。