银川市网站建设_网站建设公司_Spring_seo优化
2026/1/22 4:13:18 网站建设 项目流程

如何为GPEN添加新数据集?datasets==2.21.0使用教程

你刚拿到GPEN人像修复增强模型镜像,想用自己的照片训练出更贴合个人风格的修复效果?但卡在了“怎么把我的数据加进去”这一步?别急——这篇教程就是为你写的。不讲抽象理论,不堆参数配置,只说清三件事:你的数据长什么样才合格、datasets==2.21.0怎么把它变成GPEN能读的格式、实操时最容易踩的坑在哪。全程基于镜像预装环境(PyTorch 2.5.0 + datasets 2.21.0),命令复制粘贴就能跑通。

1. 先搞懂GPEN要什么数据

GPEN不是“看图修图”,而是“学着修图”。它需要成对的照片:一张清晰高清的原图(High-Quality, HQ),一张对应位置、同样构图但被人工降质过的模糊/有噪/低分辨率图(Low-Quality, LQ)。模型通过对比学习,记住“这张脸模糊时该是什么样,清晰后又该还原成什么样”。

1.1 数据对的基本要求

  • 严格一一对应:HQ图001.png必须和LQ图001.png完全同名,放在不同文件夹里;
  • 尺寸一致:建议统一裁剪为512×512 像素(镜像默认训练配置);
  • 人脸居中:每张图中人脸需居中、正向、无严重遮挡(帽子/口罩/侧脸会显著影响对齐效果);
  • 格式统一.png.jpg即可,但同一数据集中不要混用。

小技巧:别手动降质!用镜像里已装好的basicsr工具批量生成LQ图。比如运行:

python /root/basicsr/basicsr/data/paired_image_dataset.py --input_dir ./hq_images --output_dir ./lq_images --degradation bsrgan

它会自动用BSRGAN算法给每张HQ图生成匹配的LQ版本,省时又标准。

1.2 为什么必须用 datasets==2.21.0?

镜像固定使用datasets==2.21.0(不是最新版),是因为GPEN训练脚本依赖该版本的DatasetDictImageFolder加载逻辑。新版datasets(如2.24+)修改了图像缓存路径和元数据结构,直接替换会导致KeyError: 'image'OSError: Unable to open file。所以——别升级,就用它

2. 用 datasets==2.21.0 构建可训练数据集

我们不用写复杂的数据类,直接用datasetsload_dataset接口加载本地文件夹。整个过程分三步:准备文件夹 → 创建dataset → 验证结构。

2.1 文件夹结构这样摆

在镜像里新建一个目录(比如/root/my_portrait_data),按如下结构组织:

my_portrait_data/ ├── train/ │ ├── HQ/ # 存放所有高清训练图(如 001.png, 002.png...) │ └── LQ/ # 存放所有对应低质图(同名:001.png, 002.png...) ├── val/ │ ├── HQ/ │ └── LQ/ └── test/ ├── HQ/ └── LQ/

正确示例:train/HQ/001.pngtrain/LQ/001.png是同一张脸的高清/低质版本
❌ 错误示例:train/HQ/001.jpgtrain/LQ/001.png后缀不一致,或LQ/002.png找不到HQ/002.png

2.2 一行代码加载成 DatasetDict

进入Python环境,执行以下代码(已适配 datasets 2.21.0):

from datasets import load_dataset # 加载整个数据集(自动识别 train/val/test 子目录) dataset = load_dataset( "imagefolder", data_dir="/root/my_portrait_data", drop_labels=True, # GPEN不需要分类标签,直接丢弃 split=["train", "validation", "test"] ) # 查看数据集结构 print(f"训练集大小:{len(dataset[0])}") print(f"验证集大小:{len(dataset[1])}") print(f"测试集大小:{len(dataset[2])}") print(f"样本字段:{dataset[0].features}")

输出应类似:

训练集大小:1280 验证集大小:128 测试集大小:64 样本字段:{'image': <PIL.Image.Image feature>

注意:load_dataset("imagefolder")在 2.21.0 中默认将每个子文件夹(HQ/LQ)视为独立类别。但我们不需要分类,所以用drop_labels=True跳过标签,只保留图像本身。

2.3 把HQ和LQ配对:关键的一步转换

imagefolder加载的是单图,而GPEN需要同时读取一对图。我们用datasets.Dataset.map()创建新字段:

def add_pair(example, idx): # 假设HQ和LQ文件名完全一致,只改路径 lq_path = example["image"].filename.replace("HQ", "LQ") try: from PIL import Image lq_img = Image.open(lq_path) return {"image_hq": example["image"], "image_lq": lq_img} except FileNotFoundError: # 如果找不到对应LQ图,跳过该样本 return None # 应用配对转换(仅处理训练集) train_ds = dataset[0].map( add_pair, with_indices=True, remove_columns=["image"], batched=False, desc="配对HQ/LQ图像" ) # 过滤掉配对失败的样本 train_ds = train_ds.filter(lambda x: x is not None) print(f"配对后有效训练样本数:{len(train_ds)}")

运行后你会看到进度条,最终输出类似配对后有效训练样本数:1275—— 说明5张图没找到对应LQ,已被自动剔除。

3. 让GPEN训练脚本能直接读取

GPEN官方训练脚本(train_gpen.py)默认从磁盘路径读取数据,不支持datasets.Dataset对象。所以我们把配对后的数据保存为标准文件夹结构,供训练脚本调用。

3.1 导出为GPEN兼容的文件夹

import os from pathlib import Path # 创建导出目录 export_dir = "/root/gpen_train_data" Path(export_dir).mkdir(exist_ok=True) def save_pair(example, idx): # 保存HQ图 hq_path = os.path.join(export_dir, f"HQ_{idx:05d}.png") example["image_hq"].save(hq_path) # 保存LQ图 lq_path = os.path.join(export_dir, f"LQ_{idx:05d}.png") example["image_lq"].save(lq_path) return {"hq_path": hq_path, "lq_path": lq_path} # 批量保存 train_ds.map(save_pair, with_indices=True, batched=False, desc="导出配对图像") print(f"已导出 {len(train_ds)} 对图像到 {export_dir}")

执行完,/root/gpen_train_data/下会出现:

HQ_00000.png HQ_00001.png ... LQ_00000.png LQ_00001.png ...

3.2 修改训练脚本的路径参数

打开/root/GPEN/train_gpen.py,找到数据加载相关参数(通常在argparse部分),将--dataroot指向你导出的目录:

# 原始默认值(注释掉) # parser.add_argument('--dataroot', type=str, default='./datasets/ffhq', help='path to images') # 改为你的路径 parser.add_argument('--dataroot', type=str, default='/root/gpen_train_data', help='path to paired images')

同时确认--HQ_suffix--LQ_suffix参数匹配你的文件名规则(默认是_HQ.png_LQ.png,我们导出的是HQ_00000.png,所以需微调):

# 在 train_gpen.py 中搜索并修改这两行: # self.HQ_suffix = '_HQ.png' → 改为:self.HQ_suffix = 'HQ_' # self.LQ_suffix = '_LQ.png' → 改为:self.LQ_suffix = 'LQ_'

验证是否生效:运行python train_gpen.py --help,检查--dataroot默认值是否已更新。

4. 实战:用你的数据跑一次训练

一切就绪,现在启动训练。为节省时间,我们先用小规模验证流程是否通畅。

4.1 快速验证数据加载

在训练前,先运行一个“空转”检查:

cd /root/GPEN python train_gpen.py \ --dataroot /root/gpen_train_data \ --name my_portrait_exp \ --model gpen \ --which_model_netG gpen \ --batch_size 2 \ --load_size 512 \ --crop_size 512 \ --niter 1 \ --niter_decay 0 \ --display_id 0 \ --print_freq 1

如果看到类似输出:

[Step 1/1] loss_G: 12.456 | loss_D: 0.892 | time: 0.42s

说明数据已成功加载,GPU正在计算——第一步通关!

4.2 关键参数调优建议(针对小数据集)

如果你只有几百张自拍,直接套用FFHQ的超参容易过拟合。推荐调整:

参数原FFHQ值你的小数据集建议原因
--batch_size82~4显存够用,小批量更稳定
--niter205~10防止过拟合,先看效果
--lr0.00010.00005学习率降低,避免震荡
--use_vgg_lossTrueFalseVGG特征损失需大数据支撑,小数据关掉更稳

提示:首次训练建议加--save_epoch_freq 1,每轮都保存模型,方便回溯最佳状态。

5. 常见问题与避坑指南

5.1 “找不到LQ图片”错误

现象FileNotFoundError: [Errno 2] No such file or directory: '/root/gpen_train_data/LQ_00000.png'
原因:导出时HQ/LQ命名规则不一致,或文件权限问题。
解决

  • 进入/root/gpen_train_data,执行ls -l HQ* \| head -5ls -l LQ* \| head -5,确认编号完全对应;
  • 检查文件权限:chmod 644 HQ_*.png LQ_*.png

5.2 训练loss爆炸(突然飙升到1e5)

现象:第3轮loss_G从10跳到120000
原因datasets==2.21.0加载的PIL图像默认为RGB模式,但GPEN训练脚本期望uint8数组。若图像含Alpha通道(如PNG带透明背景),np.array(img)会返回4通道,导致维度错乱。
解决:在add_pair函数中强制转RGB:

def add_pair(example, idx): lq_path = example["image"].filename.replace("HQ", "LQ") try: from PIL import Image hq_img = example["image"].convert("RGB") # 强制转RGB lq_img = Image.open(lq_path).convert("RGB") # 同样处理LQ return {"image_hq": hq_img, "image_lq": lq_img} except Exception as e: return None

5.3 训练速度慢得离谱(<0.1 step/s)

现象time: 12.45s每步,远低于正常的0.3~0.5s
原因datasetsImageFolder在2.21.0版本中默认启用内存映射(memory mapping),但小数据集反而拖慢IO。
解决:加载时禁用缓存:

dataset = load_dataset( "imagefolder", data_dir="/root/my_portrait_data", drop_labels=True, cache_dir=None, # 关键:不使用缓存 split=["train", "validation", "test"] )

6. 总结:你的数据集已就绪

到这里,你已经完成了为GPEN添加新数据集的全部核心步骤:

  • 明确数据规范:HQ/LQ严格配对、512×512、人脸居中;
  • 正确使用 datasets==2.21.0:用imagefolder加载 +map配对 +filter清洗;
  • 无缝对接GPEN训练脚本:导出标准文件夹 + 修改路径参数 + 调优超参;
  • 避开高频陷阱:命名一致性、RGB模式强制、缓存开关控制。

下一步,你可以:
--niter 5快速跑通全流程,确认输出图像质量;
增加数据量(建议≥500对)后,开启--use_vgg_loss提升细节;
尝试不同降质方式(bsrgan/realesrgan)生成LQ,观察修复风格差异。

记住:人像修复不是“越高清越好”,而是“越像你越好”。你的数据,才是GPEN真正学会“认出你”的唯一老师。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询