基于tf.data构建输入管道:成对图像关联与路径匹配错误解决
用tf.data构建成对图像输入管道的正确方法
核心问题
你之前用&拼接路径的方式完全错误,这会生成无效的文件路径,导致TensorFlow找不到对应文件。正确的思路是直接关联成对的路径列表,而不是拼接路径。下面是和pix2pix教程对齐的实现步骤:
1. 确保成对路径的对应关系
先确认你的真实图像路径列表和绘图图像路径列表是严格一一对应的——比如列表第i个位置的真实图,必须对应同位置的绘图图,顺序不能乱。
2. 用from_tensor_slices打包成对路径
直接把两个路径列表传入tf.data.Dataset.from_tensor_slices,生成包含成对路径的数据集:
import tensorflow as tf # 假设你已经有这两个路径列表 train_real_paths = ["train/real/img1.jpg", "train/real/img2.jpg", ...] train_sketch_paths = ["train/sketch/img1.jpg", "train/sketch/img2.jpg", ...] # 构建训练集的基础数据集,每个元素是(真实图路径, 绘图图路径) train_dataset = tf.data.Dataset.from_tensor_slices((train_real_paths, train_sketch_paths))
3. 编写图像加载与预处理函数
参照pix2pix的预处理逻辑,写一个函数读取并处理每对图像:
def load_pair(real_path, sketch_path): # 读取并解码真实图像 real_img = tf.io.read_file(real_path) real_img = tf.image.decode_jpeg(real_img, channels=3) real_img = tf.image.convert_image_dtype(real_img, tf.float32) # 读取并解码绘图图像 sketch_img = tf.io.read_file(sketch_path) sketch_img = tf.image.decode_jpeg(sketch_img, channels=3) sketch_img = tf.image.convert_image_dtype(sketch_img, tf.float32) # 适配pix2pix的输入输出:resize到256x256,归一化到[-1, 1] real_img = tf.image.resize(real_img, [256, 256]) sketch_img = tf.image.resize(sketch_img, [256, 256]) real_img = (real_img - 0.5) * 2.0 sketch_img = (sketch_img - 0.5) * 2.0 # 返回顺序:输入绘图图,目标真实图(和pix2pix的训练逻辑一致) return sketch_img, real_img
然后用map把这个函数应用到整个数据集:
train_dataset = train_dataset.map(load_pair, num_parallel_calls=tf.data.AUTOTUNE)
4. 配置训练用的数据集参数
加上shuffle、batch和prefetch优化,提升训练效率:
BATCH_SIZE = 16 BUFFER_SIZE = 1000 train_dataset = train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
测试集的构建逻辑
测试集的步骤和训练集完全一致,只是不需要shuffle:
test_real_paths = ["test/real/img1.jpg", "test/real/img2.jpg", ...] test_sketch_paths = ["test/sketch/img1.jpg", "test/sketch/img2.jpg", ...] test_dataset = tf.data.Dataset.from_tensor_slices((test_real_paths, test_sketch_paths)) test_dataset = test_dataset.map(load_pair, num_parallel_calls=tf.data.AUTOTUNE) test_dataset = test_dataset.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

