【问题标题】:Download tfds.load dataset as jpgs to local disk将 tfds.load 数据集以 jpg 格式下载到本地磁盘
【发布时间】:2020-07-11 00:08:47
【问题描述】:

我想将完整的猫狗数据集下载到我的电脑上并拥有实际的 jpg 文件。我可以直接从例如下载它。 Microsoft,但是我想使用 tfds.load 数据集函数。

当我尝试时:

(raw_train, raw_validation, raw_test), metadata = tfds.load(
    'cats_vs_dogs',
    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
    with_info=True,
    as_supervised=True,
    data_dir=r'D:\TFProjects\catsdogscompl')

它确实会下载一些东西,但是这些是 TFRECORD 文件,而不是 jpg。如何获取实际的 jpg?

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

    TFDS 实际上返回 tf.data.Dataset。如主页所述

    所有数据集都公开为 tf.data.Datasets ,从而实现易于使用和高性能的输入管道。

    但您实际上可以加载数据集并将其手动保存为 jpeg。

    import tensorflow as tf
    import tensorflow_datasets as tfds
    from uuid import uuid1
    import os
    import warnings
    
    (raw_train, raw_validation, raw_test), metadata = tfds.load(
        'cats_vs_dogs',
        split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
        with_info=True,
        data_dir=r'D:\TFProjects\catsdogscompl')
    
    def save_dataset_as_jpegs(dataset, path,):
        """
    
        saves every image to the 'path' using random name + target
    
        :param dataset: dataset you want to save
        :param path: where you want to store it
        :param metadata: metadata from dataset. required to get class names.
        :return: Nothing. Just saves the dataset as jpegs.
        """
    
        for obj in dataset:
            im, name = obj['image'], obj['image/filename']
            serialized_im = tf.image.encode_jpeg(im)
    
            path_and_name = os.path.join(path, name.numpy().decode())
            tf.io.write_file(path_and_name, serialized_im)
    
    save_dataset_as_jpegs(raw_train, 'jpegs_train/')
    save_dataset_as_jpegs(raw_validation, 'jpegs_validation/')
    save_dataset_as_jpegs(raw_test, 'jpegs_test/')
    

    此代码将 raw_test 数据集保存到文件夹 jpegs_test。

    【讨论】:

    • l4morak 感谢您的有用帖子,唯一的问题是我基本上需要以某种方式将标签放入其中。所以随机我不再知道里面是什么。所以我希望能够区分它,以便复制文件。所以就像猫和狗一样,但不仅限于这个例子,还有不止2个类的情况。因此,我认为/预期此信息必须在数据集中。
    • @StatTistician 如果您的意思是它实际上应该节省课程 - 它确实如此。名称具有以下格式:随机字符串 + "_" + target_class + ".jpeg"。因此,需要随机 uuid 以确保同一类的每个图像都以不同的名称保存。但目标也得救了。附言您可以稍微更改它以将不同的类保存到不同的文件夹。
    • 感谢您的快速回复。所以它将所有内容都存储在一个带有标签的文件夹中?是否可以将标签放在名称的前面(以便我可以根据它进行排序),如果有超过 2 个类会发生什么?这段代码还能用吗?那么像 Dog_1.jpg Dog_2.jpg Cat_1.jpg Cat_2.jpg Horse_1.jpg Horse_2.jpg(我不在乎数字)?
    • @StatTistician 1) 我添加了从元数据中提取类名信息的功能。 2)你确定你不只是复制代码吗?您可能只保存了一部分数据集。 (raw_test,正如我提到的)。你还需要保存raw_train和raw_validation,这个函数给了你这个机会。
    • @StatTistician 我发现这个警告是由 TFDS 数据集引发的。当你迭代它时,你会得到这个错误。如果您查看元数据内部,它会显示“有 1738 个损坏的图像被丢弃”。我认为,当您迭代时,它只会丢弃它们,而保存的图像没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 2019-06-09
    • 2011-03-13
    • 1970-01-01
    • 2017-10-12
    • 2013-06-10
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多