如何准备存储在 zip 文件中的图像数据以在 Tensorflow 2 中进行训练?
How to prepare image data stored in a zip file for training in Tensorflow 2?
我有大量图像需要为使用 Tensorflow 2 / Keras 的卷积神经网络进行深度学习做准备。一批 61 张图像及其各自的 'masks'(它们只是图像的分段版本)存储在一个 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?我想使用数据集,以便可以利用提供的 batching/prefetching 功能。
我解决问题的方法包括以下步骤:
- 创建一个包含每个文件路径的数据集对象
- 在数据集的每个元素上映射一个 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 对象。我还假设在我的示例中掩码已经被单热编码。
我有大量图像需要为使用 Tensorflow 2 / Keras 的卷积神经网络进行深度学习做准备。一批 61 张图像及其各自的 'masks'(它们只是图像的分段版本)存储在一个 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?我想使用数据集,以便可以利用提供的 batching/prefetching 功能。
我解决问题的方法包括以下步骤:
- 创建一个包含每个文件路径的数据集对象
- 在数据集的每个元素上映射一个 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 对象。我还假设在我的示例中掩码已经被单热编码。