news 2026/9/28 2:57:48

PaddleGAN 图像翻译实战指南:Pix2Pix 与 CycleGAN 的原理、配置与训练全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleGAN 图像翻译实战指南:Pix2Pix 与 CycleGAN 的原理、配置与训练全解析
  • 人工智能
  • 深度学习
  • 计算机视觉
  • 媒体生成
  • 视频处理
  • 图像处理

【免费下载链接】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
点击查看免费下载

Pix2Pix 与 CycleGAN 是图像翻译(Image-to-Image Translation)领域最具代表性的两大经典框架:前者利用成对图像完成条件式翻译,后者仅凭非成对图像即可通过循环一致性约束实现风格迁移。本文以 PaddleGAN 开源仓库中的 Pix2Pix / CycleGAN 教程 为主体,结合仓库内的模型实现、数据集类与 YAML 配置文件,完整梳理两条技术路线从原理、数据准备、配置解析到训练/测试的端到端流程,读者可据此在 PaddleGAN 中直接复现 facades 与 cityscapes 两个经典实验,并迁移到自己的数据集上。

一、两种图像翻译范式:配对与非配对

图像翻译的目标是把一张输入图像映射为另一风格/域的输出图像。围绕"训练数据是否需要一一对应",衍生出两条经典路线:

模型数据要求网络组成代表应用
Pix2Pix成对图像(同一画面的两种风格)1 个生成器 + 1 个判别器线稿上色、语义分割图 → 街景、立面图翻译
CycleGAN非成对图像(两个独立风格集)2 个生成器 + 2 个判别器马 ↔ 斑马、油画 ↔ 照片、夏 ↔ 冬

两者的本质差异在于:Pix2Pix 在 cGAN 基础上把"另一种风格的图像"作为监督条件直接注入生成网络,使生成结果与目标风格强相关;而 CycleGAN 依靠循环一致性(Cycle-Consistency)在源域与目标域之间建立隐式对应,无需数据间一对一的映射。在 PaddleGAN 中,二者分别由 Pix2PixModel 与 CycleGANModel 实现,训练入口统一为 tools/main.py。

二、Pix2Pix:基于配对数据的条件图像翻译

2.1 原理:cGAN 中的监督信息注入

Pix2Pix 是在 cGAN(Conditional GAN)基础上改进而来的。cGAN 的生成网络不仅输入噪声向量,还同时输入一个条件作为监督信息;Pix2Pix 则将另一种风格的图像作为监督信息输入生成网络,从而让生成的 fake 图像与作为监督信息的风格图像产生关联,最终实现图像翻译。

从源码可以更精确地理解这条链路。在 Pix2PixModel.forward 中,生成器只接收real_A一个输入并产出fake_B:

self.fake_B = self.nets'netG' # G(A)

判别器则采用条件式设计,把"输入图像 + 生成结果"在通道维拼接后送入判别,这正是配置中判别器input_nc: 6(3 通道输入 + 3 通道输出)的来源。在 backward_D 中:

fake_AB = paddle.concat((self.real_A, self.fake_B), 1) pred_fake = self.nets'netD') real_AB = paddle.concat((self.real_A, self.real_B), 1) pred_real = self.nets'netD' self.loss_D = (self.loss_D_fake + self.loss_D_real) * 0.5

生成器的损失由两部分叠加(backward_G):对抗损失loss_G_GAN让G(A)骗过判别器,像素级 L1 损失loss_G_L1则强制G(A) → B逼近真实目标图:

self.loss_G = self.loss_G_GAN + self.loss_G_L1

这里的 L1 损失正是配置中pixel_criterion.loss_weight: 100所指的"像素准则"——它权重远高于对抗损失,是保证翻译结果与目标结构一致的关键。

2.2 数据准备:成对数据集与目录结构

Pix2Pix 使用成对数据训练。官方 facades 数据集的目录结构如下:

facades ├── test ├── train └── val

其中每个目录下是一张张"左右拼接"的 AB 图像(左半为 A 域、右半为 B 域),训练时由预处理算子 SplitPairedImage 按宽度对半切开,分别生成 A、B 两个域的图像。

下载方式有两种:

# 方式一:wget 直接下载 wget http://efrosgans.eecs.berkeley.edu/pix2pix/datasets/facades.tar.gz --no-check-certificate
# 方式二:使用仓库自带的下载脚本(会自动解压并软链到 data/facades) python data/download_pix2pix_data.py --name facades

data/download_pix2pix_data.py 支持的官方数据集名包括cityscapes、night2day、edges2handbags、edges2shoes、facades、maps,下载后会通过os.symlink建立data/<name>软链接,与配置文件中的dataroot直接对应。

2.3 训练与测试命令

示例以 facades 数据为准;若要使用自己的数据集,只需修改配置文件中的数据集路径。

# 训练 python -u tools/main.py --config-file configs/pix2pix_facades.yaml # 测试(--evaluate-only 跳过训练,--load 加载权重) python tools/main.py --config-file configs/pix2pix_facades.yaml --evaluate-only --load ${PATH_OF_WEIGHT}

tools/main.py是仓库统一的训练/测试入口(tools/main.py):--load加载生成器权重后进行评估或微调,--resume则用于从包含 epoch 与优化器状态的 checkpoint 继续训练。命令行还支持 options.py 中定义的--no-cuda、--val-interval、-o/--opt(覆盖 YAML 配置)、--seed、--amp/--amp_level(混合精度训练)等参数,例如-o epochs=300可直接在命令行覆盖训练轮数。

2.4 配置文件全解(configs/pix2pix_facades.yaml)

仓库提供了 configs/pix2pix_facades.yaml 与 configs/pix2pix_cityscapes.yaml 两个现成配置,其核心结构完全一致:

epochs: 200 output_dir: output_dir model: name: Pix2PixModel generator: name: UnetGenerator norm_type: batch input_nc: 3 output_nc: 3 num_downs: 8 # unet256 ngf: 64 use_dropout: False discriminator: name: NLayerDiscriminator ndf: 64 n_layers: 3 input_nc: 6 # 3 通道输入 + 3 通道输出,拼接后送入判别器 norm_type: batch direction: b2a pixel_criterion: name: L1Loss loss_weight: 100 gan_criterion: name: GANLoss gan_mode: vanilla # 在 @to_static 下训练(benchmark 用),默认关闭 to_static: False dataset: train: name: PairedDataset dataroot: data/facades/train num_workers: 4 batch_size: 1 preprocess: - name: LoadImageFromFile key: pair - name: SplitPairedImage key: pair paired_keys: [A, B] - name: Transforms input_keys: [A, B] pipeline: - name: Resize size: [286, 286] interpolation: 'bicubic' # cv2.INTER_CUBIC keys: [image, image] - name: PairedRandomCrop size: [256, 256] keys: [image, image] - name: PairedRandomHorizontalFlip prob: 0.5 keys: [image, image] - name: Transpose keys: [image, image] - name: Normalize mean: [127.5, 127.5, 127.5] std: [127.5, 127.5, 127.5] keys: [image, image] test: name: PairedDataset dataroot: data/facades/test # ... 与 train 相同的预处理链,但无随机裁剪/翻转,Resize 直接到 256 lr_scheduler: name: LinearDecay learning_rate: 0.0002 start_epoch: 100 decay_epochs: 100 optimizer: optimG: name: Adam net_names: [netG] beta1: 0.5 optimD: name: Adam net_names: [netD] beta1: 0.5 log_config: interval: 100 visiual_interval: 500 snapshot_config: interval: 5 validate: interval: 4000 save_img: false metrics: fid: name: FID batch_size: 8 export_model: - {name: 'netG', inputs_num: 1}

关键参数含义:

配置项默认值说明
model.generator.nameUnetGeneratorU-Net 结构生成器,num_downs: 8对应 unet256
model.discriminator.input_nc6条件 GAN 需要同时接收输入与输出图像,通道数为input_nc + output_nc
model.directionb2a翻译方向,a2b表示 A→B;源码中通过该参数交换 A/B 域(setup_input)
pixel_criterion.loss_weight100L1 像素损失权重,远高于对抗损失,保证结构一致性
lr_schedulerLinearDecay前 100 epoch 保持0.0002学习率,后 100 epoch 线性衰减至 0
optimizerAdam(beta1=0.5)生成器与判别器各自独立优化器
validate.metrics.fidFID验证阶段用 FID 指标评估生成质量
export_modelnetG导出推理模型时仅导出生成器

数据增强部分值得注意:训练时先Resize到 286×286,再通过 PairedRandomCrop 随机裁剪到 256×256,最后以 0.5 概率做 PairedRandomHorizontalFlip——这些"配对变换"会保证 A、B 两张图施加完全相同的几何变换,是成对数据增强正确性的关键实现细节。

2.5 数据集实现:PairedDataset

PairedDataset 负责读取成对数据:扫描dataroot目录下所有图像路径,每条样本包含一对左右拼接的 AB 图,交给预处理链依次完成加载、按宽度切分、增强与归一化。在测试集上,由于不进行随机裁剪与翻转,只有Resize → Transpose → Normalize,确保评估结果可复现。

2.6 预训练模型下载

模型数据集下载地址
Pix2Pix_cityscapescityscapeshttps://paddlegan.bj.bcebos.com/models/Pix2Pix_cityscapes.pdparams
Pix2Pix_facadesfacadeshttps://paddlegan.bj.bcebos.com/models/Pixel2Pixel_facades.pdparams

下载后即可用 2.3 节的测试命令直接推理,无需训练。

三、CycleGAN:无配对数据的循环一致性翻译

3.1 原理:两个生成器 + 两个判别器 + 循环一致性

当难以获得成对数据时(如马与斑马的照片不可能逐像素对应),CycleGAN 提供了优雅的解法。它由两个生成网络和两个判别网络组成:

  • 生成网络 A:输入 A 类风格图片,输出 B 类风格图片;
  • 生成网络 B:输入 B 类风格图片,输出 A 类风格图片;
  • 判别器 D_A / D_B 分别负责判别各自目标域的图像真假。

与 Pix2Pix 最大的不同在于,CycleGAN 无需在源域与目标域之间建立一对一的映射即可实现图像翻译,其核心是循环一致性:G_A(A) → B',再把B'交给G_B还原出A',强制A' ≈ A,从而约束两个生成器互为逆映射,防止塌缩到无意义的映射。

从 CycleGANModel.forward 可以看到完整的前向链路:

self.fake_B = self.nets'netG_A' # G_A(A) self.rec_A = self.nets'netG_B' # G_B(G_A(A)) 循环重建 self.fake_A = self.nets'netG_B' # G_B(B) self.rec_B = self.nets'netG_A' # G_A(G_B(B)) 循环重建

对应的生成器总损失在 backward_G 中由四类损失叠加(此处配置中lambda_a = lambda_b = 10.0):

self.loss_G = self.loss_G_A + self.loss_G_B + self.loss_cycle_A + self.loss_cycle_B + self.loss_idt_A + self.loss_idt_B
  • loss_G_A / loss_G_B:对抗损失,让生成结果骗过对应判别器;
  • loss_cycle_A / loss_cycle_B:循环一致性损失(L1),约束G_B(G_A(A)) ≈ A、G_A(G_B(B)) ≈ B;
  • loss_idt_A / loss_idt_B:恒等损失(Identity Loss),当把真实 B 图喂给 G_A 时强制其保持原样,用于稳定颜色与纹理。

此外,判别器更新时使用了 ImagePool 图像缓冲池(默认pool_size=50),从历史生成的图像中随机取样判别,缓解判别器对单批样本的过拟合。

3.2 数据准备:非成对数据集的目录结构

CycleGAN 使用非成对数据,官方 cityscapes 数据集的目录结构如下:

cityscapes ├── test ├── testA ├── testB ├── train ├── trainA └── trainB

其中trainA与trainB分属两个独立风格域,样本之间无需任何对应关系。下载方式:

# 方式一:wget 直接下载(官方 facades.zip 示例) wget https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/facades.zip --no-check-certificate
# 方式二:仓库自带下载脚本 python data/download_cyclegan_data.py --name cityscapes

data/download_cyclegan_data.py 支持的官方数据集包括apple2orange、summer2winter_yosemite、horse2zebra、monet2photo、cezanne2photo、ukiyoe2photo、vangogh2photo、maps、cityscapes、facades等;其中cityscapes会从 PaddleGAN 官方镜像(paddlegan.bj.bcebos.com)下载以加速国内访问。

3.3 训练与测试命令

示例以 cityscapes 数据为例,自定义数据集同样只需修改配置:

# 训练 python -u tools/main.py --config-file configs/cyclegan_cityscapes.yaml # 测试 python tools/main.py --config-file configs/cyclegan_cityscapes.yaml --evaluate-only --load ${PATH_OF_WEIGHT}

3.4 配置文件全解(configs/cyclegan_cityscapes.yaml)

仓库提供的 configs/cyclegan_cityscapes.yaml 完整内容如下:

epochs: 200 output_dir: output_dir find_unused_parameters: True model: name: CycleGANModel generator: name: ResnetGenerator output_nc: 3 n_blocks: 9 ngf: 64 use_dropout: False norm_type: instance input_nc: 3 discriminator: name: NLayerDiscriminator ndf: 64 n_layers: 3 norm_type: instance input_nc: 3 cycle_criterion: name: L1Loss idt_criterion: name: L1Loss loss_weight: 0.5 gan_criterion: name: GANLoss gan_mode: lsgan dataset: train: name: UnpairedDataset dataroot_a: data/cityscapes/trainA dataroot_b: data/cityscapes/trainB num_workers: 0 batch_size: 1 is_train: True max_size: inf preprocess: - name: LoadImageFromFile key: A - name: LoadImageFromFile key: B - name: Transforms input_keys: [A, B] pipeline: - name: Resize size: [286, 286] interpolation: 'bicubic' keys: ['image', 'image'] - name: RandomCrop size: [256, 256] keys: ['image', 'image'] - name: RandomHorizontalFlip prob: 0.5 keys: ['image', 'image'] - name: Transpose keys: ['image', 'image'] - name: Normalize mean: [127.5, 127.5, 127.5] std: [127.5, 127.5, 127.5] keys: ['image', 'image'] test: name: UnpairedDataset dataroot_a: data/cityscapes/testA dataroot_b: data/cityscapes/testB num_workers: 0 batch_size: 1 max_size: inf is_train: False # 预处理链仅含 Resize/Transpose/Normalize lr_scheduler: name: LinearDecay learning_rate: 0.0002 start_epoch: 100 decay_epochs: 100 optimizer: optimG: name: Adam net_names: [netG_A, netG_B] beta1: 0.5 optimD: name: Adam net_names: [netD_A, netD_B] beta1: 0.5 log_config: interval: 100 visiual_interval: 500 snapshot_config: interval: 5

与 Pix2Pix 配置的关键差异:

配置项说明
model.name: CycleGANModel使用双生成器/双判别器架构(cycle_gan_model.py)
generator.name: ResnetGenerator9 个 ResNet 残差块的生成器,norm_type: instance实例归一化
discriminator.input_nc: 3判别器只接收单张图像(非条件式),无需拼接
gan_mode: lsgan最小二乘 GAN 损失,比 vanilla 训练更稳定
cycle_criterion: L1Loss循环一致性损失,配合默认lambda_a/lambda_b = 10.0约束双向重建
idt_criterion.loss_weight: 0.5恒等损失权重,稳定输入输出颜色分布
optimizer.net_names生成器侧[netG_A, netG_B]共享一个优化器,判别器侧同理
find_unused_parameters: True双生成器结构中存在未使用参数分支时避免 DDP 报错

数据侧,训练时 A、B 域图像使用独立的LoadImageFromFile加载,且随机裁剪/翻转对 A、B 分别独立施加(UnpairedDataset.getitem中 B 域图像每次随机采样,A、B 无需对齐),这与配对数据的"同步变换"策略形成鲜明对比。

3.5 数据集实现:UnpairedDataset

UnpairedDataset 分别扫描dataroot_a与dataroot_b两个目录,训练时 A 域按序取图、B 域随机抽取(idx_b = random.randint(0, self.size_b - 1)),实现"非配对"采样;两个域数量不同时,数据集长度取两者最大值(__len__返回max(self.size_a, self.size_b))。

3.6 结果展示与模型下载

CycleGAN 的翻译效果示例(A 域到 B 域):

模型数据集下载地址
CycleGAN_cityscapescityscapeshttps://paddlegan.bj.bcebos.com/models/CycleGAN_cityscapes.pdparams
CycleGAN_horse2zebrahorse2zebrahttps://paddlegan.bj.bcebos.com/models/CycleGAN_horse2zebra.pdparams

四、从源码看两者的训练流程差异

综合 pix2pix_model.py 与 cycle_gan_model.py 的train_iter,可以总结两条路线的训练节奏差异:

  • Pix2Pix:每步先更新判别器(冻结生成器),再更新生成器(冻结判别器),交替优化;判别器接收拼接后的条件输入。
  • CycleGAN:每步先反向传播生成器损失并更新optimG(此时冻结两个判别器),随后分别通过 D_A、D_B 的反向传播更新optimD;生成器侧实际执行了 6 个子损失(2 对抗 + 2 循环 + 2 恒等)的联合反传。

这一顺序差异直接决定了各自配置中优化器与损失权重组织的写法,也是调参时首先需要理解的结构约束。

参考

本文原理部分基于以下经典论文,BibTeX 引用如下:

  • Image-to-Image Translation with Conditional Adversarial Networks(Pix2Pix,CVPR 2017)
@inproceedings{isola2017image, title={Image-to-Image Translation with Conditional Adversarial Networks}, author={Isola, Phillip and Zhu, Jun-Yan and Zhou, Tinghui and Efros, Alexei A}, booktitle={Computer Vision and Pattern Recognition (CVPR), 2017 IEEE Conference on}, year={2017} }
  • Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks(CycleGAN,ICCV 2017)
@inproceedings{CycleGAN2017, title={Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks}, author={Zhu, Jun-Yan and Park, Taesung and Isola, Phillip and Efros, Alexei A}, booktitle={Computer Vision (ICCV), 2017 IEEE International Conference on}, year={2017} }

仓库中还提供了对应的 TIPC(飞桨训推一体)测试配置(test_tipc/configs/Pix2pix/train_infer_python.txt 与 test_tipc/configs/CycleGAN/train_infer_python.txt),可用于自动化验证训练与推理全流程;英文版教程参见 docs/en_US/tutorials/pix2pix_cyclegan.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
点击查看免费下载

相关推荐

上一篇:Claude Code可视化管家opcode:从安装到自定义代理实操
下一篇:解读 vinext 1.0.0-beta.2 变更集:Cloudflare 部署、元数据与构建性能的 23 项修复与优化

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 2:52:10

异次元发卡网插件化架构与强制登录实战指南

简介&#xff1a;这是一套基于原生PHP开发的异次元发卡网完整源码&#xff0c;面向中小型数字商品经营者、独立开发者及二次开发需求者&#xff0c;解决在线虚拟商品&#xff08;如账号、卡密、API服务&#xff09;快速上架、安全交付与多渠道收款等核心问题。资源包共2000个文…

作者头像 李华
网站建设 2026/9/28 2:49:53

Woodpecker Workflow 语法完全指南:steps、条件执行与依赖编排实战

CI/CDDevOps 【免费下载链接】woodpecker Woodpecker is a simple, yet powerful CI/CD engine with great extensibility. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/wo/woodpecker 点击查看 免费下载 本篇指南以 Woodpecker CI/CD 引擎的 workflow 配置文件语法…

作者头像 李华