如何从png图像创建TFRecords文件

时间:2016-09-13 00:06:46

标签: database tensorflow deep-learning convolution tensorflow-serving

我一周前刚开始使用TensorFlow,我有一些基本问题。

主要的一点是,我没有找到创建包含所有数据的TFRecords的方法。我知道这个过程是必要的,以便用几百万个32x32像素的图像来训练我自己的网络。

我发现很多教程和很多文档引用了" input_pipeline"但这些教程都没有清楚地解释如何使用我自己的图像创建自己的数据库。

我有几个主要文件夹和一些子文件夹,每个约300,000个png图像,其中标签位于图像名称中(0或1 - 二进制分类)。

获取这些图像的方法是通过(glob)行:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<!-- YOU CAN USE UNLIMITED .SLIDER -->
<div class="slider">

  <div class="cont"></div>

  <ul>
    <li style="background-image:url(http://placehold.it/800x400/0bf);">
      <div>This is slide 1</div>
      <div class="to-cont"><h2>Slide 1</h2> 1orem ipsum...</div>
    </li>
    <li style="background-image:url(http://placehold.it/800x400/fb0);">
      <div>This is some slide 2</div>
      <div class="to-cont"><h2>Slide 2</h2> 2orem ipsum...</div>
    </li>
    <li style="background-image:url(http://placehold.it/800x400/bf0);">
      <div>Slide 3</div>
      <div class="to-cont"><h2>Slide 3</h2> 3orem ipsum...</div>
    </li>
    <!-- AS MANY LI AS YOU WANT -->
  </ul>

</div>

所以我的问题是:

如何创建包含这些图片及其标签的TFRecords文件?

我真的很感谢你的帮助!我已经坚持了这个问题差不多两天了,我发现只有关于MNIT和ImageNet的确切答案。

谢谢!

1 个答案:

答案 0 :(得分:2)

数以百万计的32x32图像?听起来和CIFAR完全一样。查看TensorFlow Models,他们有一个脚本可以下载CIFAR10并将其转换为TFRecords:download_and_convert_data.py。如果您的数据不是CIFAR,请检查代码,它可能会对您有所帮助。

加载CIFAR10的代码如下所示:

with tf.Graph().as_default():
    image_placeholder = tf.placeholder(dtype=tf.uint8)
    encoded_image = tf.image.encode_png(image_placeholder)

    with tf.Session('') as sess:
        for j in range(num_images):
            [...] # load image and label from disk
            image = [...]
            label = [...]

            png_string = sess.run(encoded_image,
                                  feed_dict={image_placeholder: image})

            example = dataset_utils.image_to_tfexample(
                png_string, 'png', _IMAGE_SIZE, _IMAGE_SIZE, label)
            tfrecord_writer.write(example.SerializeToString())
            [...]

image_to_tfexample()函数如下所示:

def image_to_tfexample(image_data, image_format, height, width, class_id):
    return tf.train.Example(features=tf.train.Features(feature={
        'image/encoded': bytes_feature(image_data),
        'image/format': bytes_feature(image_format),
        'image/class/label': int64_feature(class_id),
        'image/height': int64_feature(height),
        'image/width': int64_feature(width),
    }))

int_64_feature()函数看起来像那样(bytes_feature()函数类似):

def int64_feature(values):
    if not isinstance(values, (tuple, list)):
        values = [values]
    return tf.train.Feature(int64_list=tf.train.Int64List(value=values))

修改

更多细节:

  • TFRecordWriter就像这样创建(这也会创建文件):

    with tf.python_io.TFRecordWriter(training_filename) as tfrecord_writer:
        [...] # use the tfrecord_writer
    
  • documentation for tf.image.encode_png()表示图片的形状应为[height, width, channels],其中channels = 1为灰度,channels = 2为灰度+ alpha,3为RGB颜色, {* 1}}用于RGB颜色+ alpha(RGBA)。