从图像本地目录创建 tensorflow 数据集

Posted

技术标签:

【中文标题】从图像本地目录创建 tensorflow 数据集【英文标题】:Create tensorflow dataset from image local directory 【发布时间】:2019-07-02 13:47:39 【问题描述】:

我在本地有一个非常庞大的图像数据库,数据分布就像每个文件夹都包含一个类别的图像。

我想使用 tensorflow 数据集 API 来批量获取数据,而无需将所有图像都加载到内存中。

我尝试过这样的事情:

def _parse_function(filename, label):
    image_string = tf.read_file(filename, "file_reader")
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    image = tf.cast(image_decoded, tf.float32)
    return image, label

image_list, label_list, label_map_dict = read_data()

dataset = tf.data.Dataset.from_tensor_slices((tf.constant(image_list), tf.constant(label_list)))
dataset = dataset.shuffle(len(image_list))
dataset = dataset.repeat(epochs).batch(batch_size)

dataset = dataset.map(_parse_function)

iterator = dataset.make_one_shot_iterator()

image_list 是一个列表,其中添加了图像的路径(和名称),而 label_list 是一个列表,其中每个图像的类都以相同的顺序添加了。

但是 _parse_function 不起作用,我记录的错误是:

ValueError:形状必须为 0 级,但对于输入形状为 [?] 的“file_reader”(操作:“ReadFile”)为 1 级。

我已经用谷歌搜索了错误,但对我没有任何作用。

如果我不使用 map 函数,我只是 recibe 图像的路径(存储在 image_list 中),所以我认为我需要 map 函数来读取图像,但我无法做到有效。

提前谢谢你。

编辑:

    def read_data():
        image_list = []
        label_list = []
        label_map_dict = 
        count_label = 0

        for class_name in os.listdir(base_path):
            class_path = os.path.join(base_path, class_name)
            label_map_dict[class_name]=count_label

            for image_name in os.listdir(class_path):
                image_path = os.path.join(class_path, image_name)

                label_list.append(count_label)
                image_list.append(image_path)

            count_label += 1

【问题讨论】:

你的 read_data 函数是如何工作的?您的管道和解析功能看起来不错,显然存在类型不匹配。 tf.read_file 接受带有文件名的 python 字符串。 嗨@Sharky,感谢您的关注!我已经编辑了代码并添加了读取代码的功能 【参考方案1】:

错误在这一行dataset = dataset.repeat(epochs).batch(batch_size) 您的管道将批处理大小作为输入的维度。

您需要在这样的地图功能之后批处理您的数据集

    dataset = tf.data.Dataset.from_tensor_slices((tf.constant(image_list), tf.constant(label_list)))
    dataset = dataset.shuffle(len(image_list))
    dataset = dataset.repeat(epochs)
    dataset = dataset.map(_parse_function).batch(batch_size)

【讨论】:

非常感谢!有用!现在,我的图像大小有问题,因为它们不一样,你知道如何在_parse_function中添加resize部分吗? 您可以使用tf.image.resize_imagestf.image.resize_image_with_crop_or_pad 更改图像大小。或tf.reshape 改变张量的形状

以上是关于从图像本地目录创建 tensorflow 数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何为图像分割创建带有掩码的自定义图像数据集?(特别是对于 Tensorflow)

从简单的 python 列表创建图像和标签的 tensorflow 数据集

将训练数据从 matlab 传输到 tensorflow

Tensorflow学习第1课——从本地加载MNIST以及FashionMNIST数据

警告:tensorflow:忽略带有图像 id 的检测,尽管配置参数为真

深度学习基于tensorflow的服装图像分类训练(数据集:Fashion-MNIST)