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

时间:2018-10-24 13:08:06

标签: python tensorflow mat-file

我有大量带有标签(.mat)文件的图像(不能使用tf.data.Dataset.from_tensor_slices()),并且我想使用tf.data API来从中生成张量流数据集。

正如我在文档中所阅读的,我可以使用tf.data.TextLineDataset处理大量数据(我必须拥有一个包含所有图像地址的txt文件,并将txt文件的路径作为{{1 }}参数)。 然后,我可以使用tf.data.TextLineDataset方法读取txt文件(map)解码jpg图像(tf.read_file)并对该图像进行一些基本转换。

但是,我无法在tf.image.decode_jpeg方法的任何部分中使用scipy.io.loadmat,因为我没有指示Mat文件路径的字符串。我只有map

在这种情况下,我认为读取所有图像并制作出TFRecord并不是那么有效,因为那样的话,我基本上每次都会做两次。一次,读取整个图像并创建TFRecord,再一次,读取TFRecord以创建张量流数据集。

有什么办法可以解决这个问题吗?

这是我的代码:

tf.Tensor

然后:

dataset = tf.data.TextLineDataset(txt_file).map(read_img_and_mat)

1 个答案:

答案 0 :(得分:0)

我找到了一种使用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

相比,我不知道代码的工作效率如何