- 人工智能
- 深度学习
- 计算机视觉
- 媒体生成
- 视频处理
- 图像处理
【免费下载链接】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.
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.yaml | Paint-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_path | None | 训练后提取的生成器权重weight_of_generator.pdparams |
--pretrained_model | None | 官方预训练模型,可选trees、stone、mountains、birds、lightning(自动下载,见 singan_predictor.py) |
--mode | random_sample | random_sample/editing/harmonization/sr/animation/paint2image |
--output_path | output_dir | 结果输出目录 |
--seed | None | 随机种子(传入后调用paddle.seed) |
--cpu | False | 以 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 的完整流程可归纳为四步:
- 模式校验与参数检查:仅允许六种模式;
sr/harmonization/editing/paint2image必须提供ref_image,harmonization/editing必须提供mask_image(singan_predictor.py); - 输入准备:按模式构造初始张量
x_init——随机采样为按scale_v/scale_h扩展的零张量;编辑/协调/paint2image 为插值后的参考图;超分为按比例插值的参考图(singan_predictor.py); - 金字塔前向:构造各尺度噪声
z_pyramid,逐尺度调用生成器;超分模式则迭代执行"生成→放大→再生成"(singan_predictor.py); - 后处理与保存:随机采样拼网格输出
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.
相关推荐
A2UI Swift 原生实现全解析:从 A2UISwiftCore 运行时引擎到 SwiftUI 渲染适配器与 iOS 示例客户端
A2UI Swift 原生实现全解析:从 A2UISwiftCore 运行时引擎到 SwiftUI 渲染适配器与 iOS 示例客户端 本篇技术指南以 swift
人工智能深度学习计算机视觉媒体生成视频处理图像处理Tensor2Tensor MultiProblem 多任务训练实战:从任务定义、数据生成到推理全流程
Tensor2Tensor MultiProblem 多任务训练实战:从任务定义、数据生成到推理全流程 MultiProblem 是 Tensor2Tensor
人工智能深度学习机器学习预训练PaddleGAN PReNet 图像去雨实战:渐进式去雨网络原理、配置解析与训练评估指南
PaddleGAN PReNet 图像去雨实战:渐进式去雨网络原理、配置解析与训练评估指南 PReNet(Progressive Image Deraining
人工智能深度学习计算机视觉媒体生成视频处理图像处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考