SSD_Tensorflow 训练 VOC2007(Windows下)

参考:Windows下SSD训练VOC2007 并就在本人实现的过程中出现的问题进行补充

1. 环境

  • Windows10
  • Python == 3.6
  • cuda == 10.0
  • tensorflow-gpu == 1.13.1
  • IDE == Pycharm
    p.s. 我与原文中cuda和tensorflow-gpu版本不同,所以只要你的python == tensorflow-gpu == cuda(和cuDNN)的版本对应即可。

2. 代码

源码下载:SSD_tensorflow
p.s. 假如你使用 git 命令下载该源码,则该文件名为 SSD-Tensorflow
假如你直接在Github上 Download ZIP ,则该文件夹名为 SSD-Tensorflow-master
所以不用怀疑是否下载错了!

3. 数据集

自行下载 pascalvoc_2007 数据集,并将其重命名为 VOC2007 (方便统一)(即修改完后——打开VOC2007文件夹就能看到下列五个文件夹)
SSD_Tensorflow 训练 VOC2007(Windows下)_第1张图片

  • Annotations:所有数据信息(训练,测试,交叉验证)以.xml文件存储
  • ImageSets:main文件下有这四个文件
    -train.txt、trainval.txt、val.txt、test.txt分别表示:
    训练文件的文件名,训练和交叉验证的文件名,交叉验证的文件名,测试文件的文件名
  • JPEGImage:存放所有的图片数据
  • SegmentationObject:对象分割
  • SegmentationClass:对象分割(按类别细分)

4. 解压模型

将SSD-Tensorflow/checkpoints下的ssd_300_vgg.ckpt.zip解压到当前文件夹下:
SSD_300_VGG

5. 修改源码

5.1 将数据和标签文件序列化为tfrecord

  • 补充阅读:为什么要转换为tfrecord格式?(TFRecord - TensorFlow 官方推荐的数据格式)

修改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下看到:
SSD_Tensorflow 训练 VOC2007(Windows下)_第2张图片
即序列化成功。

**补充一个序列化中遇到的问题

运行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

5.2 训练

修改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

1)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的解决方案

2)Default MaxPoolingOp only supports NHWC on device type CPU

原因:tensorflow-gpu环境没配置好
排查两点:
   1. 是否配置成功tensorflow-gpu环境.
   2. PyCharm的File–Settings–Project Interpreter是否选择了正确的编译环境(例如我的电脑中就有三个不同的编译环境tensorflow、tensorflow-gpu和pytorch。

3) 以下报错是原博列出的,我没碰到过
1.
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
2.
ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape

解决方法:将 batch_size 改小一些。

6. 训练过程

SSD_Tensorflow 训练 VOC2007(Windows下)_第3张图片

结语

   作为新手,读完论文之后明白了其算法原理,但是对具体的代码实现是一无所知的,这时候就需要读源码。阅读源码时会发现,源码的代码量不小,且初次接触完整体系的源码,阅读起来的难度很高。再者,直接下载下来的源码一般都无法直接运行,需要修改源码中的配置参数,修改完之后可能还会有各种各样的报错信息,往往会让初学者感到烦躁。
   有的人可能想着虽然源码现在无法运行,但是我可以将源码理解之后再来修改配置参数让它可以运行,我刚开始也是这么想的,读了一段时间之后我发现有两个问题:一是你不知道正确的应该是什么样子的,不知道改哪里;二来,不知道对错,读着没信心,也没兴趣,读不下来。所以我想着有条件的话还是将源码实实在在跑出来之后再回头去理解源码,可能会舒服些。

你可能感兴趣的:(深度学习)