如何在Keras中无预定义尺寸加载.jpg图片构建标准化数据集
不预先指定尺寸加载目录图片数据集(TensorFlow/Keras)
因为image_dataset_from_directory要求统一图片尺寸才能生成批量张量,所以要实现不预先指定尺寸加载,需要用tf.data手动构建数据集,步骤如下:
1. 遍历目录获取图片路径与标签
先手动遍历数据集目录,收集所有图片的路径和对应的分类标签:
import tensorflow as tf import os # 替换为你的数据集根目录 data_dir = "pizza_not_pizza" class_names = ["pizza", "not_pizza"] image_paths = [] labels = [] for label_idx, class_name in enumerate(class_names): class_dir = os.path.join(data_dir, class_name) for img_file in os.listdir(class_dir): img_path = os.path.join(class_dir, img_file) image_paths.append(img_path) labels.append(label_idx)
2. 定义图片加载与转置函数
编写函数加载原尺寸图片,根据你的数据集情况转置统一尺寸:
def load_and_normalize(img_path, label): # 读取原图片文件 img_raw = tf.io.read_file(img_path) # 解码图片,保留原尺寸和RGB通道 img = tf.image.decode_image(img_raw, channels=3, expand_animations=False) # 转置384×512的图片为512×384,统一尺寸 h, w = img.shape[0], img.shape[1] if h == 384 and w == 512: img = tf.transpose(img, perm=[1, 0, 2]) # 归一化到[0,1]区间(模型训练常用) img = tf.cast(img, tf.float32) / 255.0 return img, label
3. 构建并优化数据集
用tf.data把路径和标签转为可迭代的数据集,应用处理函数后批量:
# 从路径和标签创建基础数据集 dataset = tf.data.Dataset.from_tensor_slices((image_paths, labels)) # 并行加载处理图片 dataset = dataset.map(load_and_normalize, num_parallel_calls=tf.data.AUTOTUNE) # 设置批量大小并预加载(提升训练效率) dataset = dataset.batch(32).prefetch(tf.data.AUTOTUNE)
这样处理后,所有图片都会被转为512×384的张量,且全程没有预先强制指定尺寸,完全基于原图片尺寸处理。
内容的提问来源于stack exchange,提问作者Kliker
相关产品推荐
相关产品推荐

