You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:39:19