从大量的图像(*.jpg)和标签(*.mat)制作张量流数据集



我有大量带有标签(.mat(文件的图像(不能使用tf.data.Dataset.from_tensor_slices()(,我想使用tf.dataAPI从中制作一个张量流数据集。

正如我在文档中读到的那样,我可以将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以制作张量流数据集。

知道我该如何解决这个问题吗?

这是我的代码:

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))

现在,像上面提到的下一批。

附言。我不知道与feed_dict相比,代码的效率如何

最新更新