☰
PaddleGAN SinGAN 实战指南:单图训练、多任务推理与源码解析
2026/9/26 2:39:07 网站建设 项目流程
  • 人工智能
  • 深度学习
  • 计算机视觉
  • 媒体生成
  • 视频处理
  • 图像处理

【免费下载链接】PaddleGAN

PaddlePaddle GAN library, including lots of interesting applications like First-Order motion transfer, Wav2Lip, picture repair, image editing, photo2cartoon, image style transfer, GPEN, and so on.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleGAN
点击查看免费下载

SinGAN 是 PaddleGAN 中一套基于单张自然图像训练的无条件生成模型实现,适用于随机采样、图像编辑与协调、超分辨率、动画生成以及 Paint-to-Image(涂鸦转图像)等任务。本文以 docs/en_US/tutorials/singan.md 为主线,结合 配置、模型实现、推理脚本 与 预测器 等仓库源码,完整覆盖从训练、微调、权重提取到五种推理模式的全流程,并深入解析多尺度金字塔的训练与采样原理,帮助读者在 PaddleGAN 中复现并扩展 SinGAN。

核心原理:从单张图像学习内部统计

与传统 GAN 在类级数据集(class-specific dataset)上训练、捕捉同类图像共性特征不同,SinGAN 仅使用一张图像进行训练:它从该图像多个尺度(scale)上的重叠图像块(overlapping patches)中学习图像自身的内部统计信息,因此属于无条件生成模型(unconditional generative model)——即完全由随机输入生成样本,而无需像条件 GAN(conditional GAN)那样依赖控制生成类别的 "class label"。

训练完成后,SinGAN 可以产出与训练图像在语义上相似、但包含全新物体布局与结构的高质量图像,且支持任意尺寸与宽高比的输出。这种"由单图学分布"的特性,使得它天然适用于纹理类、自然景观类图像的生成与编辑任务。

在 PaddleGAN 中,这一思想落地为 SinGANModel:

  • 多尺度金字塔:模型依据配置中的scale_factor与min_size,将训练图像逐级下采样,构建scale_num层由粗到细的金字塔(singan_model.py),scale_num = ceil(log(min_size / min(h, w)) / log(scale_factor)) + 1;
  • 逐尺度训练:每个尺度配一个生成器(SinGANGenerator)与一个判别器(SinGANDiscriminator),训练从最粗糙的尺度开始,逐级向精细尺度推进(singan_model.py);
  • 噪声金字塔:每一层生成器接收对应尺度的高斯噪声图,并在跨尺度时以上一尺度的输出作为条件输入,从而保证最终图像各尺度间结构一致(generator_singan.py)。

配置文件:四套模板与关键参数

仓库为 SinGAN 提供了 4 套配置文件(configs 目录):

配置文件适用任务与通用配置的主要差异
singan_universal.yaml所有任务通用(本文示例均基于此配置训练)基准参数
singan_sr.yaml超分辨率(作者推荐)scale_factor=0.793701(即(1/2)^(1/3))、min_size=18、recon_criterion.loss_weight=100.0
singan_animation.yaml动画生成(作者推荐)generator.noise_zero_pad=False
singan_finetune.yamlPaint-to-Image 微调total_iters=12000、is_finetune=True、finetune_scale=1、color_num=5

通用配置逐项解读

以 singan_universal.yaml 为例,核心参数如下:

total_iters: 100000 # 总训练迭代数 output_dir: output_dir # 输出目录 model: name: SinGANModel generator: name: SinGANGenerator nfc_init: 32 # 最粗尺度生成器初始通道数 min_nfc_init: 32 # 生成器最小通道数 noise_zero_pad: True # 是否对噪声图做零填充 discriminator: name: SinGANDiscriminator nfc_init: 32 min_nfc_init: 32 gan_criterion: name: GANLoss gan_mode: wgangp # WGAN-GP 对抗损失 loss_weight: 1.0 recon_criterion: name: MSELoss # 重建损失 loss_weight: 10.0 gp_criterion: name: GradientPenalty # 梯度惩罚 loss_weight: 0.1 train_image: data/singan/stone.png # 训练图像路径 scale_factor: 0.75 # 金字塔相邻尺度缩放因子 min_size: 25 # 最粗尺度图像最短边 is_finetune: False # 是否为 Paint2Image 微调 dataset: train: name: EmptyDataset # 训练不需要数据集,图像由模型直接读取 test: name: SingleDataset dataroot: data/singan # 测试图像目录(必须只含一张图) num_workers: 0 batch_size: 1 preprocess: # 图像加载后转置并归一化到 [-1, 1] - name: LoadImageFromFile key: A - name: Transforms input_keys: [A] pipeline: - name: Transpose - name: Normalize mean: [127.5, 127.5, 127.5] std: [127.5, 127.5, 127.5] lr_scheduler: name: MultiStepDecay learning_rate: 0.0005 milestones: [9600] # 在第 9600 迭代将学习率乘 0.1 gamma: 0.1 optimizer: optimizer_G: name: Adam beta1: 0.5 beta2: 0.999 optimizer_D: name: Adam beta1: 0.5 beta2: 0.999 log_config: interval: 100 # 日志输出间隔 visiual_interval: 2000 # 可视化间隔 snapshot_config: interval: 10000 # 保存 checkpoint 间隔 validate: interval: -1 # 训练期不进行验证 save_img: True metrics: fid: name: FID batch_size: 1

参数说明(与源码对应):

  • nfc_init/min_nfc_init:控制生成器各尺度卷积通道数,通道数随尺度按min(nfc_init * 2^floor(i/4), 128)增长(generator_singan.py),判别器同样按此规则为每个尺度构建独立网络(singan_model.py);
  • scale_factor与min_size:决定金字塔层数scale_num与每一层分辨率,同时用于训练期与推理期图像的插值缩放;
  • noise_zero_pad:为True时噪声图填充 0 后再与上采样图像相加,为False时以随机噪声直接填充边界(对应 generator_singan.py 的nn.Pad2D与z_fixed);
  • recon_criterion.loss_weight:重建损失权重,超分场景(singan_sr.yaml)提高到100.0,以强化对输入图像结构的保真;
  • is_finetune/finetune_scale/color_num:微调模式下启用颜色量化(K-Means 聚类到color_num个中心色,见 singan_model.py),帮助 Paint-to-Image 输出更贴近训练图的配色。

训练与微调

标准训练

训练前需准备训练图像:将其放入data/singan目录(或修改配置中model.train_image与dataset.test.dataroot的路径)。执行:

python tools/main.py -c configs/singan_universal.yaml \ -o model.train_image=train_image.png

其中-o是命令行覆盖配置项(见 ppgan/utils/options.py),可灵活指定训练图像而不必改动配置文件。训练过程中,SinGANModel 会按total_iters / scale_num切分每层尺度的迭代数,并在每个scale_iters边界切换当前尺度(singan_model.py);每一层交替更新判别器与生成器,判别器损失包含 WGAN-GP 的真/假判别损失与梯度惩罚,生成器损失包含对抗损失与重建损失(singan_model.py)。

Paint-to-Image 微调

对Paint to Image场景,先用通用配置训练,再用微调配置继续训练以获得更贴近画作的配色效果:

python tools/main.py -c configs/singan_finetune.yaml \ -o model.train_image=train_image.png \ --load weight_saved_in_training.pdparams

微调从finetune_scale=1这一较细尺度开始(configs/singan_finetune.yaml),前若干尺度已冻结,仅针对后续尺度优化,且生成器的重建输入会被量化到训练图的聚类颜色中心(singan_model.py),这正是微调后结果配色更接近原图的原因。

评估(随机生成验证)

以下命令会在不更新权重的前提下,利用噪声金字塔随机生成一张与训练图像分辨率一致的图像:

python tools/main.py -c configs/singan_universal.yaml \ -o model.train_image=train_image.png \ --load weight_saved_in_training.pdparams \ --evaluate-only

注意事项(与文档一致):

  • train_image.png必须位于data/singan目录,或手动修改dataset.test.dataroot;
  • 该目录内只能包含一张图像,即训练图像本身;
  • 评估通过 SinGANModel.test_iter 完成,可配合配置中validate.metrics.fid计算 FID。

提取生成器权重

训练保存的 checkpoint 同时包含生成器与各尺度判别器,推理阶段只需生成器。使用 tools/extract_weight.py 提取:

python tools/extract_weight.py weight_saved_in_training.pdparams --net-name netG --output weight_of_generator.pdparams

其实现从 checkpoint 字典中取出netG对应的 state dict 并另存为.pdparams文件(extract_weight.py)。提取后的权重即可交给 applications/tools/singan.py 完成各类推理。

提示:tools/extract_weight.py也可用于提取其他模型的子网络权重,只需替换--net-name(例如判别器名netD0)。

推理:五大模式实战

推理统一使用applications/tools/singan.py,其参数解析与调用链见 singan.py,核心逻辑封装在 SinGANPredictor。

公共参数:

参数默认值说明
--weight_pathNone训练后提取的生成器权重weight_of_generator.pdparams
--pretrained_modelNone官方预训练模型,可选trees、stone、mountains、birds、lightning(自动下载,见 singan_predictor.py)
--moderandom_samplerandom_sample/editing/harmonization/sr/animation/paint2image
--output_pathoutput_dir结果输出目录
--seedNone随机种子(传入后调用paddle.seed)
--cpuFalse以 CPU 推理(调用paddle.set_device('cpu'))

未指定--weight_path时,预测器会依据--pretrained_model下载对应权重;两者都为空则报错(singan_predictor.py)。此外,预测器会从 checkpoint 中恢复scale_num、coarsest_shape、nfc_init、num_layers等超参,据此重建生成器(singan_predictor.py),因此训练配置与推理权重必须来自同一模型。

随机采样(Random Sample)

python applications/tools/singan.py \ --weight_path weight_of_generator.pdparams \ --mode random_sample \ --scale_v 1 \ # 垂直缩放 --scale_h 1 \ # 水平缩放 --n_row 2 \ --n_col 2
  • --scale_v/--scale_h:以训练图像尺寸为基准,指定输出在垂直/水平方向的放大倍数,二者乘积决定输出宽高比,默认均为1.0;
  • --n_row/--n_col:输出网格的行列数,即一次生成n_row * n_col张样本并拼成网格(singan_predictor.py),默认5行3列;
  • 从最粗尺度generate_start_scale=0开始,以全随机噪声金字塔经生成器逐级上采样得到最终图像。

图像编辑与协调(Editing & Harmonization)

python applications/tools/singan.py \ --weight_path weight_of_generator.pdparams \ --mode editing \ # 或 harmonization --ref_image editing_image.png \ --mask_image mask_of_editing.png \ --generate_start_scale 2
  • --ref_image:参考图像(编辑/协调/超分/paint2image 均必填);
  • --mask_image:编辑或协调任务的掩码图(必填,灰度图);
  • --generate_start_scale:从第几层尺度开始重新生成,默认0。值越大,改动越局部、越贴近参考图结构;从 singan_predictor.py 可见,参考图会被插值到generate_start_scale对应尺度作为生成起点;
  • 两者的差异在于掩码的膨胀半径:harmonization使用半径 7 的圆盘结构元,editing使用半径 20,随后对掩码做高斯模糊,再以(1 - mask) * ref + mask * out将生成结果融入参考图(singan_predictor.py)。

超分辨率(Super Resolution)

python applications/tools/singan.py \ --weight_path weight_of_generator.pdparams \ --mode sr \ --ref_image image_to_sr.png \ --sr_factor 4
  • --sr_factor:放大倍数,默认4.0。实现上按sr_iters = ceil(log(sr_factor, 1/scale_factor))迭代逐级放大(singan_predictor.py),每轮输出再插值放大后作为下一轮输入,最终统一缩放到ref * sr_factor的分辨率(singan_predictor.py)。

动画生成(Animation)

python applications/tools/singan.py \ --weight_path weight_of_generator.pdparams \ --mode animation \ --animation_alpha 0.6 \ # 帧序列与训练图像的贴近程度 --animation_beta 0.7 \ # 控制生成片段的平滑度与变化速率 --animation_frames 20 \ # 动画总帧数 --animation_duration 0.1 # 每帧时长(秒)
  • 该模式下batch_size = animation_frames,每帧独立采样一组噪声,再按alpha/beta加权组合相邻帧噪声(singan_predictor.py),从而在保持图像整体内容的前提下让细节随帧平滑变化;
  • 结果以 GIF 保存为animation.gif,duration控制每帧显示时长(singan_predictor.py)。

Paint to Image(涂鸦转图像)

python applications/tools/singan.py \ --weight_path weight_of_generator.pdparams \ --mode paint2image \ --ref_image paint.png \ --generate_start_scale 2
  • 将涂鸦/简笔画作为参考图,从指定尺度开始生成,使输出继承涂鸦的构图与训练图的纹理风格;若先用singan_finetune.yaml微调再推理,结果配色会更接近训练图像(见前文"训练与微调")。

从源码理解推理链路

SinGANPredictor.run 的完整流程可归纳为四步:

  1. 模式校验与参数检查:仅允许六种模式;sr/harmonization/editing/paint2image必须提供ref_image,harmonization/editing必须提供mask_image(singan_predictor.py);
  2. 输入准备:按模式构造初始张量x_init——随机采样为按scale_v/scale_h扩展的零张量;编辑/协调/paint2image 为插值后的参考图;超分为按比例插值的参考图(singan_predictor.py);
  3. 金字塔前向:构造各尺度噪声z_pyramid,逐尺度调用生成器;超分模式则迭代执行"生成→放大→再生成"(singan_predictor.py);
  4. 后处理与保存:随机采样拼网格输出random_sample.png,编辑/协调按掩码融合,超分统一缩放,动画保存 GIF(singan_predictor.py)。

生成器前向的核心在 SinGANGenerator.forward:对每个尺度,将缩放后的噪声(z_pyramid[i] * sigma[scale])与填充后的上尺度图像相加,送入GeneratorConcatSkip2CleanAdd(卷积块堆叠 + Tanh 输出 + 与下采样输入残差相加),随后双线性插值到下一尺度继续。sigma每尺度由重建误差动态估计(singan_model.py),控制噪声注入强度。

此外,仓库 test_tipc/configs/singan/train_infer_python.txt 提供了 SinGAN 的 TIPC(Training and Inference Pipeline)验证配置,覆盖训练、导出(tools/export_model.py导出为singan_random_sample推理模型)与 CPU 推理(tools/inference.py --model_type singan)全流程,可作为集成验证与回归测试的参考。

引用与延伸阅读

SinGAN 原始论文:

@misc{shaham2019singan, title={SinGAN: Learning a Generative Model from a Single Natural Image}, author={Tamar Rott Shaham and Tali Dekel and Tomer Michaeli}, year={2019}, eprint={1905.01164}, archivePrefix={arXiv}, primaryClass={cs.CV} }

相关仓库资源:

  • 配置文件:configs/singan_universal.yaml、configs/singan_sr.yaml、configs/singan_animation.yaml、configs/singan_finetune.yaml
  • 模型实现:ppgan/models/singan_model.py、ppgan/models/generators/generator_singan.py、ppgan/models/discriminators/discriminator_singan.py
  • 推理工具:applications/tools/singan.py、ppgan/apps/singan_predictor.py
  • 训练入口:tools/main.py、tools/extract_weight.py
  • 文档:docs/zh_CN/tutorials/singan.md(中文版教程)
  • 人工智能
  • 深度学习
  • 计算机视觉
  • 媒体生成
  • 视频处理
  • 图像处理

【免费下载链接】PaddleGAN

PaddlePaddle GAN library, including lots of interesting applications like First-Order motion transfer, Wav2Lip, picture repair, image editing, photo2cartoon, image style transfer, GPEN, and so on.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleGAN
点击查看免费下载

相关推荐

上一篇:better-monadic-for vs 原生Scala:3个关键场景的代码对比与优势分析
下一篇:手把手教你安装shadPS4:在电脑上畅玩PS4游戏的完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询