【问题标题】:How to prepare image data stored in a zip file for training in Tensorflow 2?如何准备存储在 zip 文件中的图像数据以在 Tensorflow 2 中进行训练?
【发布时间】:2019-10-23 18:12:06
【问题描述】:

我有大量图像需要为使用 Tensorflow 2 / Keras 的卷积神经网络进行深度学习做准备。一批 61 幅图像存储在一个 zip 文件中,并带有它们各自的“掩码”(它们只是图像的分段版本)。例如,zip 文件Batch-0-of-163.zip 包含:

'image-1.png', 'mask-1.png', 'image-2.png', 'mask-2.png' ... 'image-61.png', 'mask-61.png'

有没有办法在 Tensorflow 2 中创建 tensorflow.data.Dataset,当 GPU 需要输入到我的 CNN 时,它会生成图像和掩码数据?我想使用一个数据集,这样我就可以利用提供的批处理/预取功能。

【问题讨论】:

  • 这还有问题吗?
  • 是的,正要放弃并重组文件。非常好的解决方案,谢谢!

标签: python zip tensorflow-datasets tensorflow2.0


【解决方案1】:

我解决问题的方法包括以下步骤:

  • 创建一个包含每个文件路径的 Dataset 对象
  • 在数据集的每个元素上映射一个 python 函数以解压缩、加载数据并删除解压缩的文件夹(我假设您不再需要解压缩)
  • 返回 tensorflow 代码进行进一步处理

下面是代码的示例:

 from scipy import misc
 import os

 # ----------------------------
 # Parsing function with standard python:

 def zip_data_parser(zip_fname):
     os.system('unzip {0}'.format(zip_fname)) # unzip
     folder_name = zip_fname.rsplit('.zip')[0]

     # load data:
     x_stack = []
     y_stack = []
     for i in range(n_images):
         x_stack.append(misc.imread(folder_name + '/image-{0}.png'.format(i)))
         y_stack.append(misc.imread(folder_name + '/mask-{0}.png'.format(i)))
     x = np.array(x_stack)
     y = np.array(y_stack)

     os.system('rm -rf {0}'.format(folder_name)) # remove unzipped folder
     return x, y 

 # ----------------------------
 # Dataset pipeline:

 all_zip_paths = ['file1.zip', 'file2.zip', 'file3.zip'] # list of paths for each zip file
 train_data = tf.constant(all_zip_paths)
 train_data = tf.data.Dataset.from_tensor_slices(train_data)

 train_data = train_data.map(
            lambda filename: tf.py_func(  # Parse the record into tensors
                zip_data_parser,
                [filename],
                [tf.float32, tf.float32]), num_parallel_calls=num_threads)

 # un-batch first, then batch the data again to have dimension [batch_size, N, M, C]
 train_data = train_data.apply(tf.data.experimental.unbatch())
 train_data = train_data.batch(b_size, drop_remainder=True)

当然,您可能需要先将 x 和 y 转换为 np.float32,然后再将它们从 zip_data_parser 返回到 Dataset 对象。在我的示例中,我还假设掩码已经是 one-hot 编码。

【讨论】:

  • 谢谢!真的很喜欢你提供的方法。在将 python 代码与张量混合时遇到困难,您的示例帮助我解决了这个问题!
  • 乐于助人 ;)
猜你喜欢
  • 2021-08-08
  • 2017-02-18
  • 2015-12-16
  • 2020-04-05
  • 2020-03-16
  • 2013-07-25
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多