从大量图像(*.jpg)和标签(*.mat)制作张量流数据集
make tensorflow dataset from huge number of images(*.jpg) and labels(*.mat)
我有大量带有标签 (.mat) 文件的图像(不能使用 tf.data.Dataset.from_tensor_slices()
),我想使用 tf.data
API 制作一个张量流数据集
正如我在文档中所读,我可以使用 tf.data.TextLineDataset
处理大量数据(我必须有一个包含所有图像地址的 txt 文件,并将 txt 文件的路径发送为 tf.data.TextLineDataset
参数)。
然后,我可以使用 map
方法读取 txt 文件 (tf.read_file
) 解码 jpg 图像 (tf.image.decode_jpeg
) 并对图像进行一些基本转换。
但是,我不能在 map
方法的任何部分使用 scipy.io.loadmat
,因为我没有指示 mat 文件路径的字符串。我只有 tf.Tensor
.
我认为在这种情况下读取所有图像并从中制作 TFRecord 效率不高,因为那时我基本上每件事都做两次。一次,读取整个图像并制作 TFRecord,再一次,读取 TFRecord 制作 tensorflow 数据集。
知道如何解决这个问题吗?
这是我的代码:
dataset = tf.data.TextLineDataset(txt_file).map(read_img_and_mat)
然后:
def read_img_and_mat(path):
image_string = tf.read_file(path)
image_decoded = tf.image.decode_jpeg(image_string, channels=3)
label = ... # get label from mat file
return image_decoded, label
我找到了一种使用 tf.data.from_generator
的方法
我发现的技巧是制作两个单独的数据集(一个用于 mat 文件,一个用于 jpg 文件),然后使用 tf.data.Dataset.zip
组合它们
这是它的工作原理:
mat_dataset = tf.data.Dataset.from_generator(read_mat_file, tf.int64)
def read_mat_file():
while True:
with open('mat_addresses.txt', 'r') as input_:
for line in input_:
# open file and extract info from it as np.array
yield tuple(label) # why tuple? https://github.com/tensorflow/tensorflow/issues/13101
为了获得下一批,只需要做:
iter = mat_dataset.make_one_shot_iterator()
sess.run(iter.get_next())
但是,可以制作 img_dataset
并将其与 mat_dataset
组合,如下所示:
img_dataset = tf.data.TextLineDataset('img_addresses.txt').map(read_img)
def read_img(path):
image_string = tf.read_file(path)
image_decoded = tf.image.decode_jpeg(image_string, channels=3)
return image_decoded
dataset = tf.data.Dataset.zip((mat_dataset, img_dataset))
现在,如前所述获取下一批。
PS。与 feed_dict
相比,我不知道代码的工作效率如何
我有大量带有标签 (.mat) 文件的图像(不能使用 tf.data.Dataset.from_tensor_slices()
),我想使用 tf.data
API 制作一个张量流数据集
正如我在文档中所读,我可以使用 tf.data.TextLineDataset
处理大量数据(我必须有一个包含所有图像地址的 txt 文件,并将 txt 文件的路径发送为 tf.data.TextLineDataset
参数)。
然后,我可以使用 map
方法读取 txt 文件 (tf.read_file
) 解码 jpg 图像 (tf.image.decode_jpeg
) 并对图像进行一些基本转换。
但是,我不能在 map
方法的任何部分使用 scipy.io.loadmat
,因为我没有指示 mat 文件路径的字符串。我只有 tf.Tensor
.
我认为在这种情况下读取所有图像并从中制作 TFRecord 效率不高,因为那时我基本上每件事都做两次。一次,读取整个图像并制作 TFRecord,再一次,读取 TFRecord 制作 tensorflow 数据集。
知道如何解决这个问题吗?
这是我的代码:
dataset = tf.data.TextLineDataset(txt_file).map(read_img_and_mat)
然后:
def read_img_and_mat(path):
image_string = tf.read_file(path)
image_decoded = tf.image.decode_jpeg(image_string, channels=3)
label = ... # get label from mat file
return image_decoded, label
我找到了一种使用 tf.data.from_generator
的方法
我发现的技巧是制作两个单独的数据集(一个用于 mat 文件,一个用于 jpg 文件),然后使用 tf.data.Dataset.zip
这是它的工作原理:
mat_dataset = tf.data.Dataset.from_generator(read_mat_file, tf.int64)
def read_mat_file():
while True:
with open('mat_addresses.txt', 'r') as input_:
for line in input_:
# open file and extract info from it as np.array
yield tuple(label) # why tuple? https://github.com/tensorflow/tensorflow/issues/13101
为了获得下一批,只需要做:
iter = mat_dataset.make_one_shot_iterator()
sess.run(iter.get_next())
但是,可以制作 img_dataset
并将其与 mat_dataset
组合,如下所示:
img_dataset = tf.data.TextLineDataset('img_addresses.txt').map(read_img)
def read_img(path):
image_string = tf.read_file(path)
image_decoded = tf.image.decode_jpeg(image_string, channels=3)
return image_decoded
dataset = tf.data.Dataset.zip((mat_dataset, img_dataset))
现在,如前所述获取下一批。
PS。与 feed_dict