Keras的image_dataset_from_directory能否为单张图片输入两个标签?
单图双标签(人数+天气预测)加载实现
tf.keras.utils.image_dataset_from_directory原生仅支持单标签加载,它的标签生成逻辑是基于图片所在文件夹名称映射单个离散值,直接传入成对标签列表不会被正确解析,要么触发张量维度不匹配报错,要么会把整个标签对识别为单个独立类别,完全无法满足多任务训练的标签输入要求。可以通过以下两种方案实现单图双标签的输入:
方案1:轻量改造现有image_dataset_from_directory加载逻辑
不需要完全重构加载流程,只需要拆分图片加载和标签加载两步再做拼接即可:
- 调用
image_dataset_from_directory时将labels参数设置为None,仅加载并预处理图片张量,不使用接口原生生成的单标签 - 通过接口返回的数据集对象的
file_paths属性,拿到所有加载图片的绝对路径,按照路径和你提前标注好的标签做匹配,生成和图片顺序严格对应的标签列表,每个列表元素为(人数值, 天气标签)的二元组,天气标签可以先用字符串存储,后续再做编码转换 - 用TensorFlow的Dataset原生API把图片数据集和自定义标签数据集拼接为最终可用的数据集,输出结构为
(图片张量, (人数标签, 天气标签)),可以直接送入多输出模型训练
示例代码:
import tensorflow as tf # 仅加载图片,关闭原生标签生成 img_dataset = tf.keras.utils.image_dataset_from_directory( directory="./your_image_folder", labels=None, image_size=(224, 224), batch_size=32 ) # 按图片加载顺序匹配自定义双标签 # 可通过img_dataset.file_paths获取所有图片路径,和你存储的标注信息一一匹配 custom_labels = [ (6, 1), # 6人、多云 (3, 0), # 3人、晴 (0, 2) # 0人、降雨 # 补全所有图片对应的标签对 ] # 拼接为最终的双标签数据集 label_dataset = tf.data.Dataset.from_tensor_slices(custom_labels) train_dataset = tf.data.Dataset.zip((img_dataset, label_dataset))
方案2:用通用tf.data接口构建数据集(适合结构化存储标签的场景)
如果你的标注信息存在CSV、JSON等结构化文件中,直接用tf.data的通用加载流程更灵活,完全不需要受image_dataset_from_directory的目录结构限制:
- 整理三个等长列表:所有图片的存储路径、对应人数标签、对应天气标签
- 编写单样本处理函数,完成图片读取、解码、缩放等预处理操作,同时返回图片和对应的双标签
- 直接从张量切片构建数据集,做映射预处理后按批次加载即可
示例代码:
import tensorflow as tf import pandas as pd # 读取结构化标注文件,示例csv包含三列:file_path, people_count, weather label_df = pd.read_csv("./annotation.csv") def process_single_sample(file_path, people_label, weather_label): # 读取并预处理图片 img = tf.io.read_file(file_path) img = tf.io.decode_jpeg(img, channels=3) img = tf.image.resize(img, (224, 224)) # 返回图片和双标签 return img, (people_label, weather_label) # 构建数据集 train_dataset = tf.data.Dataset.from_tensor_slices(( label_df["file_path"].values, label_df["people_count"].values, label_df["weather"].values )).map(process_single_sample).batch(32)
注意:如果天气标签使用
"sunny" "cloudy" "rainy"这类字符串格式,在送入模型训练前需要先做类别编码,映射为0/1/2的整数或者对应维度的独热向量;人数标签为0-9的整数值,可以直接送入多任务模型的分类/回归头。
内容的提问来源于stack exchange,提问作者EduardoriosChicago
相关产品推荐
相关产品推荐

