如何为图像及其相应标签构建 TensorFlow 输入管道

Posted

技术标签:

【中文标题】如何为图像及其相应标签构建 TensorFlow 输入管道【英文标题】:how to build TensorFlow input pipelines for images and their coresponding label 【发布时间】:2021-12-31 04:37:36 【问题描述】:

我想用他们的标签创建一个图像生成器。 首先,从 csv 导入数据,然后使用以下代码映射 43 个类:

label_map = v:i for i, v in enumerate(classes)

输出将是这样的:

'Danger': 4,
 'Give Way': 5,
 'Hump': 6,
 'Left Bend': 7,
 'Left Margin': 8,...

然后将使用以下命令从目录加载图像:

train_images = glob('/Desktop/dataset/resized_train/*')

现在我使用 csv 文件映射标签:

train_labels = df['label'].map(label_map)

现在,当我想用​​相应的标签显示每张图片时,我不能。

我使用了这个代码:

    img = tf.io.read_file(image_path)
    img = tf.image.decode_image(img, channels=3)
    img.set_shape([None,None,3])
    img = tf.image.resize(img, [image_w, image_h])
    img  = img/255.0
    return img

def load_data(image_path, label):
    image = read_img(image_path)
    return image, label
def data_generator(features,labels):
    dataset = tf.data.Dataset.from_tensor_slices((features,labels))
    dataset = dataset.shuffle(buffer_size=100)
    autotune = tf.data.experimental.AUTOTUNE
    dataset = dataset.map(load_data, num_parallel_calls=autotune)
    dataset = dataset.batch(batch_size=batch_size)
    dataset = dataset.repeat()
    dataset = dataset.prefetch(autotune)
    return dataset

def show_img(dataset):
    plt.figure(figsize=(15,15))
    for i in range(8):
        for val in dataset.take(1):
            img  = val[0][i]*255.0
            plt.subplot(4,2,i+1)
            plt.imshow(tf.cast(img,tf.uint8))
            plt.title(val[1][i].numpy())
            plt.subplots_adjust(hspace=1)
    plt.show()

train_dataset = data_generator(train_images,train_labels)
val_dataset = data_generator(val_images,val_labels)
show_img(train_dataset)

当我运行 show_img 时,它会显示图像,但标签都是 0。

【问题讨论】:

【参考方案1】:

您的代码似乎运行良好。我最初认为您的代码无法正常工作,因为您将train_labels 作为熊猫系列传递给from_tensor_slices,但这似乎不是问题。我只能想象dataset.shuffle中的buffer_size太小了。例如,如果我将buffer_size 设置为1,那么每次调用dataset.take(1) 都会得到相同的样本,因为根据docs:

[...] 如果您的数据集包含 10,000 个元素但 buffer_size 设置为 1,000,则 shuffle 最初将仅从缓冲区中的前 1,000 个元素中选择一个随机元素 [...]

也许您的前 100 个元素的标签为 0?同样,这只是一个建议。我已经设法让你的代码每次都使用一个大的buffer_size来检索不同的标签:

import pandas as pd
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

classes = ['Danger', 'Give Way', 'Hump']
label_map = v:i for i, v in enumerate(classes)
d = 'label': ['Danger', 'Give Way', 'Hump', 'Danger', 'Give Way', 'Hump', 'Danger', 'Give Way', 'Hump'],
     'other': [1, 2, 3, 4, 5, 6, 7, 8, 9]
df = pd.DataFrame(data=d)

train_labels = df['label'].map(label_map)

def load_data(image, label):
    image /= 255.0
    return image, label

features = tf.random.normal((9, 32, 32, 3))
dataset = tf.data.Dataset.from_tensor_slices((features, train_labels))
dataset = dataset.shuffle(buffer_size=9)
dataset = dataset.map(load_data, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset = dataset.batch(batch_size=2)
dataset = dataset.repeat()
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)

plt.figure(figsize=(5,5))
for i in range(2):
    for val in dataset.take(1):
        img  = val[0][i]*255.0
        plt.subplot(1,2,i+1)
        plt.imshow(tf.cast(img,tf.uint8))
        plt.title(val[1][i].numpy())
        plt.subplots_adjust(hspace=1)
plt.show()

【讨论】:

以上是关于如何为图像及其相应标签构建 TensorFlow 输入管道的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 2.0 Keras:如何为 TensorBoard 编写图像摘要

TensorFlow 2.0 Keras:如何为TensorBoard编写图像摘要

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

如何为 iPhone 5 显示器加载 xib

如何为图像分类中的马赛克增强创建类标签?

如何为 xib 文件的 2 个图像之间的 2 个标签实现约束