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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:07:36