☰
PaddleGAN 中的 Pixel2Style2Pixel 实战指南:基于 StyleGAN V2 的人像编码、重建与卡通化
2026/9/27 3:07:09 网站建设 项目流程
  • 人工智能
  • 深度学习
  • 计算机视觉
  • 媒体生成
  • 视频处理
  • 图像处理

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

导读

Pixel2Style2Pixel(pSp)是一类「图像编码(Image Encoding)」方法:它用一个规模较大的编码器把输入图像映射到 StyleGAN V2 的风格向量空间,再借助 StyleGAN V2 生成器作为解码器还原图像,从而让编码前与解码后的图像保持强关联。本文基于 PaddleGAN 仓库中的 docs/en_US/tutorials/pixel2style2pixel.md 编写,结合 applications/tools/pixel2style2pixel.py、ppgan/apps/pixel2style2pixel_predictor.py 与 ppgan/models/generators/generator_pixel2style2pixel.py 的源码实现,完整讲解其原理、命令行用法、全部参数含义与底层推理链路。读完本文,你将掌握如何用一条命令完成人像重建与卡通化推理,并能理解 pSp 的渐进式风格编码器(Gradual Style Encoder)与 StyleGAN V2 解码器的协作机制。

Pixel2Style2Pixel 原理

Pixel2Style2Pixel 的核心任务可以概括为Image Encoding(图像编码)。它不同于传统的「直接生成」式 GAN 任务:pSp 首先训练一个规模相当大的编码器,把输入图像整体编码为 StyleGAN V2 的风格向量(style vector),然后将风格向量送入 StyleGAN V2 生成器完成解码。由于编码与解码发生在同一个风格空间中,编码前的输入图像与解码后的输出图像之间存在强关联,模型天然具备图像到图像(image-to-image)翻译的能力。

pSp 编码器输出的是一个W+ 空间的风格码序列:对于 1024×1024 分辨率的 StyleGAN V2 生成器,其n_latent = log2(size) * 2 - 2 = 18,即解码过程需要 18 个 512 维的风格码,分别控制生成网络不同层级的特征(粗糙结构、中等结构、精细纹理)。编码器要做的,就是从一张人脸图像中回归出这一组 18×512 的风格码。

主要功能

从原文档的定位出发,Pixel2Style2Pixel 可用于以下四类任务:

  • 将图像转成隐藏编码(Convert image to hidden codes):得到输入图像对应的 18 个风格码,可用于后续编辑、融合等操作;
  • 将人脸转正(Turn face to face):对侧脸、偏转姿态的人像进行重建,输出正视化的人脸;
  • 根据草图或分割结果生成图像(Generate images based on sketches or segmentation results):在风格空间内完成条件式图像合成;
  • 将低分辨率图像转成高清图像(Convert low-resolution images to high-definition images):借助 StyleGAN V2 的先验完成超分式的重建。

PaddleGAN 中已实现的模型

目前 PaddleGAN 开放了两种可直接使用的预训练模型类型,对应 pixel2style2pixel_predictor.py 中model_cfgs字典的配置:

model_type用途内置模型配置
ffhq-inversion人像重建(Portrait reconstruction)输入 Resize 至 256×256、归一化至 [-1, 1],size=1024,style_dim=512,n_mlp=8,channel_multiplier=2
ffhq-toonify人像卡通化(Portrait cartoonization)与ffhq-inversion相同的结构与预处理配置,使用卡通化权重

两种模型的预训练权重均由 PaddleGAN 官方模型仓库提供:当命令行传入上述model_type且未指定weight_path时,predictor 会自动下载对应权重并按其内置配置覆盖 size、style_dim、n_mlp、channel_multiplier 等模型参数。

使用方法:一行命令完成推理

进入仓库的applications/目录,选择一张本地图像作为输入,运行:

cd applications/ python -u tools/pixel2style2pixel.py \ --input_image <YOUR INPUT IMAGE> \ --output_path <DIRECTORY TO STORE OUTPUT IMAGE> \ --weight_path <YOUR PRETRAINED MODEL PATH> \ --model_type ffhq-inversion \ --seed 233 \ --size 1024 \ --style_dim 512 \ --n_mlp 8 \ --channel_multiplier 2 \ --cpu

提示:若在仓库根目录执行,等价命令为python -u applications/tools/pixel2style2pixel.py ...。命令末尾的--cpu表示使用 CPU 推理,若在 GPU 环境运行则删去该参数。模型推理依赖 PaddlePaddle 环境,安装方式见仓库的 docs/en_US/install.md 与根目录 requirements.txt。

参数详解(含源码默认值)

入口脚本 applications/tools/pixel2style2pixel.py 使用argparse解析参数,各参数的作用、默认值如下表:

参数含义源码默认值
--input_image输入图像的文件路径(必填)无
--output_path生成图片存放的文件夹'output_dir'
--weight_path预训练模型路径;若指定了内置model_type,该参数失效None
--model_typePaddleGAN 内置模型类型,当前可用ffhq-inversion、ffhq-toonify;未指定时按default处理None
--seed随机数种子,用于固定推理过程中的随机噪声None
--size模型参数,输出图像分辨率1024
--style_dim模型参数,风格 z 的维度512
--n_mlp模型参数,风格 z 经过的多层感知机(MLP)层数8
--channel_multiplier模型参数,通道乘积,影响模型大小与生成图片质量2
--cpu是否使用 CPU 推理,若不用请从命令中去除False

从源码看,各模型参数的真实默认值与命令行默认值保持一致:

  • --size决定输出分辨率,对应 StyleGAN V2 生成器的输出尺寸;--style_dim决定风格码维度,二者在 predictor 构造生成器时直接传给Pixel2Style2Pixel(opts)。
  • --n_mlp控制风格 MLP 的层数(style_mlp由NormStyleCode + n_mlp 层 Linear+LeakyReLU组成,见 stylegan2_clean_arch.py)。
  • --channel_multiplier通过生成器内部的channels字典决定各分辨率层级的通道数(如 64×64 层为256 * channel_multiplier、1024×1024 层为16 * channel_multiplier,见 stylegan2_clean_arch.py),因此它直接影响模型体积与生成质量。
  • --seed传入 predictor 后,会同时执行paddle.seed(seed)、random.seed(seed)与np.random.seed(seed)(见 predictor),用于固定噪声注入,保证多次推理结果可复现。
  • --model_type与--weight_path的优先级:当weight_path is None且model_type命中内置配置时,predictor 自动下载权重并读取内置超参;否则直接加载weight_path指向的权重文件(见 predictor)。

源码级推理流程解析

命令行只是外壳,完整的推理链路位于 ppgan/apps/pixel2style2pixel_predictor.py。其run()方法依次完成四件事:人脸对齐 → 图像预处理 → 编码与解码 → 结果落盘。

第一步:人脸对齐(run_alignment)

run_alignment(image_path)(predictor)是 pSp 推理的前置步骤,直接决定重建质量:

  1. 人脸检测与关键点提取:使用ppgan.faceutils.dlib检测人脸并提取 68 点 landmarks;若未检测到人脸,会抛出Could not find a face in the given image.异常(predictor)。
  2. 定向裁剪:基于左右眼中心、嘴部中心计算眼睛-眼睛向量与眼睛-嘴部向量,构造一个按人脸姿态定向的四边形裁剪框(quad),并对图像做缩放、裁剪、边界 padding。
  3. 反射填充与模糊:在边缘 padding 区域使用'reflect'反射填充,配合高斯模糊与中值平滑,使裁剪区域边界自然过渡(predictor)。
  4. 透视变换:最终将裁剪结果变换到 4096×4096(transform_size)的四边形投影空间,为后续缩放到 256×256 做准备(predictor)。

第二步:图像预处理

对齐后的图像会经过model_cfgs[model_type]['transform']的标准化流水线(predictor):

T.Resize((256, 256)) # 缩放到 256×256 T.Transpose() # HWC -> CHW T.Normalize([127.5]*3, [127.5]*3) # 归一化到 [-1, 1]

也就是说,尽管最终输出是 1024×1024,编码器实际接收的是 256×256 的输入。

第三步:编码-解码与结果保存

predictor 调用生成器前向:

dst_img, latents = self.generator(paddle.to_tensor(transformed_image[None, ...]), resize=False, return_latents=True)
  • resize=False表示不解码后不做 256×256 的平均池化,直接保留 1024×1024 输出;
  • return_latents=True同时返回编码器输出的 18 个风格码(latents);
  • 输出图像经(dst_img * 0.5 + 0.5) * 255反归一化到 [0, 255] 像素范围。

结果保存到--output_path目录(predictor):

输出文件内容
src.png对齐(裁剪)后的人脸图像
dst.png重建/卡通化后的 1024×1024 结果图
dst.npy编码器输出的风格码(latents,形状约 [18, 512]),可用于后续编辑

这也是「将图像转成隐藏编码」能力的直接体现:dst.npy就是输入图像在 StyleGAN V2 风格空间中的表示。

编码器与解码器架构:从源码看实现

模型主体 generator_pixel2style2pixel.py 以@GENERATORS.register()注册为 PaddleGAN 生成器,由两部分组成:

self.encoder = self.set_encoder() # 编码器 self.decoder = StyleGANv2Generator(opts.size, opts.style_dim, opts.n_mlp, opts.channel_multiplier) # 解码器

编码器:GradualStyleEncoder(渐进式风格编码器)

默认encoder_type为GradualStyleEncoder(generator_pixel2style2pixel.py),要点如下:

  • 主干网络:50 层的 ResNet 变体(mode='ir_se'),由BottleneckIRSE残差块堆叠而成(generator_pixel2style2pixel.py),每个残差块内嵌 SE 注意力模块。
  • 18 路风格输出:style_count = 18,与 StyleGAN V2 生成器所需的风格码数量一一对应。其中前 3 个(coarse_ind = 3)来自最粗糙的特征层(16×16 空间分辨率),中间 4 个(middle_ind = 7)来自中等层(32×32),后 11 个来自精细层(64×64)。
  • 特征融合:通过_upsample_add(双线性上采样 + 逐元素相加)把深层特征逐步回拼到浅层,保证粗糙到精细的多尺度信息都被编码进对应层级的风格码。
  • 代码中还提供了BackboneEncoderUsingLastLayerIntoW、BackboneEncoderUsingLastLayerIntoWPlus两种备选编码器(generator_pixel2style2pixel.py),分别将最后一层特征池化后映射为单个 512 维码或 18×512 码。

前向时,若启用start_from_latent_avg,编码器输出的风格码还会加上latent_avg(平均人脸风格中心)进行归一化(generator_pixel2style2pixel.py),使解码起点落在合理的人脸先验区域内。

解码器:StyleGAN V2 生成器

解码端直接复用 PaddleGAN 的StyleGANv2Generator(generator_styleganv2.py)。生成器把 18 个风格码按层级注入到从 4×4 常量输入开始的逐级上采样卷积中:

  • 风格码先经style_mlp(n_mlp层 MLP)映射;
  • 每一级StyleConv通过调制卷积(Modulated Convolution)与解调(Demodulate)将风格作用于特征图,并叠加随机噪声(见 stylegan2_clean_arch.py);
  • ToRGB模块逐级生成 RGB 分支并累加为最终图像(skip 连接),最终输出size×size的结果(见 stylegan2_clean_arch.py)。

正是「ResNet 编码器回归 18×512 风格码 + StyleGAN V2 逐级解码」的组合,让 pSp 在重建人像的同时保留了 StyleGAN V2 的生成质量与编辑能力。

生成结果展示

以下结果来自仓库 docs/imgs 目录,直观展示 pSp 的典型输出形态:

输入人像:

裁剪(对齐)人像、重建人像、卡通化人像依次如下:

可以看到:ffhq-inversion忠实重建输入人像(保持身份与姿态),而ffhq-toonify将重建结果进一步卡通化——两者共享同一套编码器架构,区别仅在于训练目标与预训练权重。

训练(TODO)

pSp 编码器的训练需要成对/非成对的人脸数据集与精心设计的损失函数(重建损失、感知损失、身份损失等),训练链路较为复杂。当前 PaddleGAN 仅提供推理能力,官方文档中标注了训练部分为 TODO(见 docs/en_US/tutorials/pixel2style2pixel.md),后续将补充训练脚本,便于用户训练更多类型的 Pixel2Style2Pixel 图像编码器。在训练脚本开放前,用户可通过ffhq-inversion/ffhq-toonify预训练模型直接完成推理,并将dst.npy导出的风格码用于下游任务。

参考资料

本文所述原理与论文出处为 Richardson 等人提出的 Pixel2Style2Pixel(Encoding in Style):

@article{richardson2020encoding, title={Encoding in Style: a StyleGAN Encoder for Image-to-Image Translation}, author={Richardson, Elad and Alaluf, Yuval and Patashnik, Or and Nitzan, Yotam and Azar, Yaniv and Shapiro, Stav and Cohen-Or, Daniel}, journal={arXiv preprint arXiv:2008.00951}, year={2020} }

PaddleGAN 中的实现位于 ppgan/models/generators/generator_pixel2style2pixel.py,推理入口与配置见 ppgan/apps/pixel2style2pixel_predictor.py 与 applications/tools/pixel2style2pixel.py,中文文档可参考 docs/zh_CN/tutorials/pixel2style2pixel.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
点击查看免费下载

相关推荐

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

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

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

立即咨询