- 人工智能
- 深度学习
- 计算机视觉
- 媒体生成
- 视频处理
- 图像处理
【免费下载链接】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.
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 facadesdata/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.name | UnetGenerator | U-Net 结构生成器,num_downs: 8对应 unet256 |
model.discriminator.input_nc | 6 | 条件 GAN 需要同时接收输入与输出图像,通道数为input_nc + output_nc |
model.direction | b2a | 翻译方向,a2b表示 A→B;源码中通过该参数交换 A/B 域(setup_input) |
pixel_criterion.loss_weight | 100 | L1 像素损失权重,远高于对抗损失,保证结构一致性 |
lr_scheduler | LinearDecay | 前 100 epoch 保持0.0002学习率,后 100 epoch 线性衰减至 0 |
optimizer | Adam(beta1=0.5) | 生成器与判别器各自独立优化器 |
validate.metrics.fid | FID | 验证阶段用 FID 指标评估生成质量 |
export_model | netG | 导出推理模型时仅导出生成器 |
数据增强部分值得注意:训练时先Resize到 286×286,再通过 PairedRandomCrop 随机裁剪到 256×256,最后以 0.5 概率做 PairedRandomHorizontalFlip——这些"配对变换"会保证 A、B 两张图施加完全相同的几何变换,是成对数据增强正确性的关键实现细节。
2.5 数据集实现:PairedDataset
PairedDataset 负责读取成对数据:扫描dataroot目录下所有图像路径,每条样本包含一对左右拼接的 AB 图,交给预处理链依次完成加载、按宽度切分、增强与归一化。在测试集上,由于不进行随机裁剪与翻转,只有Resize → Transpose → Normalize,确保评估结果可复现。
2.6 预训练模型下载
| 模型 | 数据集 | 下载地址 |
|---|---|---|
| Pix2Pix_cityscapes | cityscapes | https://paddlegan.bj.bcebos.com/models/Pix2Pix_cityscapes.pdparams |
| Pix2Pix_facades | facades | https://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_Bloss_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 cityscapesdata/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: ResnetGenerator | 9 个 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_cityscapes | cityscapes | https://paddlegan.bj.bcebos.com/models/CycleGAN_cityscapes.pdparams |
| CycleGAN_horse2zebra | horse2zebra | https://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.
相关推荐
PaddleGAN 图像翻译实战指南:Pix2Pix 与 CycleGAN 的配对/非配对训练全解析
PaddleGAN 图像翻译实战指南:Pix2Pix 与 CycleGAN 的配对/非配对训练全解析 PaddleGAN 内置了两种经典的图像到图像翻译(Ima
人工智能深度学习计算机视觉媒体生成视频处理图像处理pytorch-CycleGAN-and-pix2pix 实战指南:CycleGAN 与 pix2pix 图像到图像翻译的安装、训练与推理
pytorch CycleGAN and pix2pix 实战指南:CycleGAN 与 pix2pix 图像到图像翻译的安装、训练与推理 本文围绕开源仓库 p
人工智能深度学习计算机视觉媒体生成基于 PyTorch 的 CycleGAN 与 pix2pix 图像到图像翻译实战指南:安装、训练、测试与预训练模型应用
基于 PyTorch 的 CycleGAN 与 pix2pix 图像到图像翻译实战指南:安装、训练、测试与预训练模型应用 本指南以 pytorch CycleG
人工智能深度学习计算机视觉媒体生成
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考