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

如何将8/6通道拼接的NumPy数组保存为适配flow_from_directory的图像文件?

多通道数组保存与Keras flow_from_directory适配方案

一、格式选择说明

JPG、PNG这类常见图像格式仅支持最多3通道(RGB)或4通道(RGBA),你的8通道图像、6通道掩码无法直接存储为这类格式,必须使用TIFF(推荐)或NPY格式,这两类格式能够完整保留多通道数组的原始信息。

二、保存多通道数组为TIFF文件

推荐使用tifffile库处理多通道TIFF文件,兼容性和稳定性更好:

1. 安装依赖

pip install tifffile numpy pillow

2. 保存代码示例

先移除数组的batch维度(原数组为(1,512,512,8),需转为(512,512,8)),再执行保存:

import tifffile
import numpy as np

# 去除batch维度
img_array = img_concatenate[0]  # shape: (512, 512, 8)
mask_array = mask_concatenate[0] # shape: (512, 512, 6)

# 保存为TIFF文件
tifffile.imwrite('data/images/train/img_001.tif', img_array)
tifffile.imwrite('data/masks/train/mask_001.tif', mask_array)

三、适配flow_from_directory的自定义数据生成器

flow_from_directory默认仅处理3通道图像,因此需要自定义生成器来读取多通道TIFF文件,同时保持目录结构符合flow_from_directory的要求:

1. 目录结构规范

按照训练/验证集分类、图像/掩码分离的原则组织:

data/
├── images/
│   ├── train/
│   │   ├── img_001.tif
│   │   └── img_002.tif
│   └── val/
│       ├── img_003.tif
│       └── img_004.tif
└── masks/
    ├── train/
    │   ├── mask_001.tif
    │   └── mask_002.tif
    └── val/
        ├── mask_003.tif
        └── mask_004.tif

2. 自定义生成器实现

from tensorflow.keras.preprocessing.image import ImageDataGenerator
import tifffile
import numpy as np

def load_tiff(path):
    # 读取多通道TIFF文件
    return tifffile.imread(path)

# 定义数据生成器(可按需添加数据增强参数)
img_datagen = ImageDataGenerator(rescale=1./255)
mask_datagen = ImageDataGenerator()

# 自定义配对生成器,同步读取图像与掩码
def custom_generator(img_gen, mask_gen):
    while True:
        # 触发基础生成器更新批次路径
        next(img_gen)
        next(mask_gen)
        # 按批次读取真实多通道数据
        start_idx = img_gen.batch_index * img_gen.batch_size
        end_idx = start_idx + img_gen.batch_size
        # 处理边界批次
        if end_idx > len(img_gen.filepaths):
            end_idx = len(img_gen.filepaths)
        # 读取当前批次的图像和掩码
        img_batch = np.array([load_tiff(path) for path in img_gen.filepaths[start_idx:end_idx]])
        mask_batch = np.array([load_tiff(path) for path in mask_gen.filepaths[start_idx:end_idx]])
        # 掩码归一化(按需调整)
        mask_batch = mask_batch / np.max(mask_batch)
        yield img_batch, mask_batch

# 初始化基础生成器(仅用于获取文件路径,不读取图像内容)
img_train_gen = img_datagen.flow_from_directory(
    'data/images/train',
    target_size=(512, 512),
    batch_size=8,
    class_mode=None,
    shuffle=True,
    color_mode='rgb'  # 参数仅占位,实际读取由自定义函数完成
)

mask_train_gen = mask_datagen.flow_from_directory(
    'data/masks/train',
    target_size=(512, 512),
    batch_size=8,
    class_mode=None,
    shuffle=True,
    color_mode='rgb'
)

# 生成可用于训练的配对数据生成器
train_generator = custom_generator(img_train_gen, mask_train_gen)

# 训练模型示例
# model.fit(train_generator, steps_per_epoch=len(img_train_gen), epochs=10)

四、替代方案:保存为NPY文件

如果追求更快的读取速度,可以将数组直接保存为NPY格式:

1. 保存NPY文件

np.save('data/images/train/img_001.npy', img_array)
np.save('data/masks/train/mask_001.npy', mask_array)

2. 修改自定义生成器的读取函数

将load_tiff替换为NPY读取函数即可:

def load_npy(path):
    return np.load(path)

内容的提问来源于stack exchange,提问作者Syuuuu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:46