如何在TensorFlow中从文件名加载包含PNG图像与NPY数组的数据集
解决TensorFlow中加载关联PNG图像与NPY数组的问题
我来帮你梳理一下具体的实现步骤,刚好我之前处理过类似的多文件关联加载场景,咱们一步步来:
1. 准备输入文本文件
首先把每组的三个文件路径按空格分隔,存成一行放在文本文件里(比如命名为file_list.txt),示例内容如下:
/nuove/corridoio_22092021/left/220921_141.png /nuove/corridoio_22092021/right/220921_141.png /nuove/corridoio_22092021/M/220921_141.npy # 可以添加更多样本组,每行对应一组
2. 定义数据加载函数
2.1 加载PNG图像的函数
用TensorFlow原生的tf.io.decode_png就能搞定,建议统一图像的 dtype 和归一化处理,方便后续训练:
def load_png_image(path): # 读取文件二进制内容 img_raw = tf.io.read_file(path) # 解码PNG,channels=3对应RGB图,channels=1对应灰度图,按需调整 img = tf.io.decode_png(img_raw, channels=3) # 转成float32类型并归一化到0-1区间 img = tf.cast(img, tf.float32) / 255.0 return img
2.2 加载NPY数组的函数
TensorFlow没有内置的NPY加载API,咱们用tf.py_function包装numpy的加载逻辑,把numpy数组转换成Tensor:
import numpy as np def load_npy_array(path): # tf.py_function需要接收numpy类型的输入,先转成字符串 path_np = path.numpy().decode('utf-8') # 用numpy加载NPY文件 array_np = np.load(path_np) # 转成TensorFlow张量 array_tf = tf.convert_to_tensor(array_np, dtype=tf.float32) return array_tf
如果你的NPY数组形状是固定的(比如(512, 512, 1)),可以给这个函数指定output_signature,让Dataset提前知道输出形状,避免后续报错:
from tensorflow import TensorSpec # 替换成你的NPY数组实际形状 load_npy_array = tf.function(load_npy_array, output_signature=TensorSpec(shape=(512, 512, 1), dtype=tf.float32))
3. 构建完整的Dataset流水线
现在把这些步骤串起来,从文本文件读取路径,拆分后分别加载数据,最后组合成一个样本:
import tensorflow as tf # 1. 读取文本文件,每行对应一组三个路径 dataset = tf.data.TextLineDataset('file_list.txt') # 2. 拆分每行的三个路径,得到左图、右图、NPY的单独路径 def split_path_line(line): paths = tf.strings.split(line, sep=' ') return paths[0], paths[1], paths[2] dataset = dataset.map(split_path_line) # 3. 分别加载图像和数组,组合成一个完整样本 def load_sample(left_path, right_path, npy_path): left_img = load_png_image(left_path) right_img = load_png_image(right_path) # 用tf.py_function包装NPY加载函数,指定输出类型 npy_array = tf.py_function(func=load_npy_array, inp=[npy_path], Tout=tf.float32) # 如果没设置output_signature,这里可以手动固定形状(可选) # npy_array.set_shape((512, 512, 1)) return {'left_image': left_img, 'right_image': right_img, 'npy_array': npy_array} dataset = dataset.map(load_sample) # 4. 后续流水线操作:打乱、分批、预取(按需调整参数) dataset = dataset.shuffle(buffer_size=100) dataset = dataset.batch(batch_size=8) dataset = dataset.prefetch(tf.data.AUTOTUNE)
关键注意事项
- 如果你的NPY数组形状不固定,那
output_signature和手动设形状的步骤可以跳过,但后续模型输入等需要固定形状的操作可能要额外处理。 tf.py_function会把NPY加载逻辑放到Python执行环境,小数据集完全够用;如果追求极致性能,可以考虑把NPY转成TFRecord格式。- 图像解码时,
channels参数要和你的PNG图像实际通道数匹配(RGB是3,灰度是1)。
内容的提问来源于stack exchange,提问作者etnamaid
相关产品推荐
相关产品推荐

