- 人工智能
- 深度学习
- 计算机视觉
- 媒体生成
- 视频处理
- 图像处理
【免费下载链接】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.
人脸解析(Face Parsing)是语义图像分割在人脸场景下的特化任务,它为输入人脸图像中的头发、嘴唇、鼻子、眼睛等语义成分逐像素分配类别标签。本文以 PaddleGAN 仓库中的 face_parse.md 为主体,结合仓库内预测器、分割模型与换妆应用的源码实现,讲解人脸解析的原理、BiSeNet 网络结构、开箱即用的命令行用法及其在换妆模型中的实际落地方式。读完本文,你将掌握 PaddleGAN 人脸解析工具的运行方法、参数含义、底层调用链,以及如何将解析结果接入 PSGAN 换妆等下游任务。
1. 人脸解析简介
人脸解析是语义图像分割的一种特殊情况:它计算人脸图像中不同语义成分(如头发、嘴唇、鼻子、眼睛、皮肤、眉毛等)的像素级标签映射。给定一张输入的人脸图像,人脸解析会为每个语义成分分配一个像素级标签,输出与输入同等分辨率、逐像素标注了语义类别的分割图。
PaddleGAN 选用BiSeNet(Bilateral Segmentation Network)来解决人脸解析问题。BiSeNet 由 Changqian Yu 等人于 2018 年提出,其核心思想是采用双分支结构兼顾"空间细节"与"上下文语义"两类信息:
- 空间路径(Spatial Path):以较小步长保留高分辨率特征,避免丢失空间细节;
- 上下文路径(Context Path):基于轻量骨干网络快速下采样,捕获全局上下文语义信息;
- 特征融合模块(Feature Fusion Module,FFM):将两条路径的特征加权融合,并用注意力精炼模块(Attention Refinement Module,ARM)精炼高层特征。
人脸解析工具在很多任务中都有应用,例如人脸识别、动画以及图像合成等。在 PaddleGAN 中,该工具目前应用在换妆模型上——PSGAN 预测器直接复用FaceParser来获得人脸各区域的分割掩码,用于妆容的定位与迁移。
2. BiSeNet 网络结构与源码实现
PaddleGAN 中 BiSeNet 的 Paddle 实现位于 ppgan/faceutils/mask/model.py,由以下几部分构成:
| 模块 | 类名 | 作用 |
|---|---|---|
| 上下文路径 | ContextPath | 以resnet18(pretrained=True)为骨干,输出 1/8、1/16、1/32 三档分辨率特征 |
| 注意力精炼模块 | AttentionRefinementModule | 对 1/16、1/32 特征做全局池化 + 通道注意力精炼 |
| 空间路径 | SpatialPath | 3 层步长为 2 的卷积逐步下采样,保留空间细节 |
| 特征融合模块 | FeatureFusionModule | 拼接空间/上下文特征后,通过注意力加权融合 |
| 输出层 | BiSeNetOutput | 三路输出分别上采样回原图分辨率,逐像素输出类别 logits |
关键实现细节(从源码结构看):
ContextPath.backbone_forward逐层取出resnet18的layer2/layer3/layer4输出作为三档上下文特征(model.py);- 对 1/32 特征先做全局平均池化(
F.avg_pool2d)再与 ARM 精炼结果相加,通过两级上采样逐步融合到 1/8 分辨率(model.py); BiSeNet.forward中,feat_res8直接取上下文路径的 1/8 特征作为空间路径的替代输入(feat_sp = feat_res8),经 FFM 融合后由conv_out输出主分割结果,同时conv_out16、conv_out32输出两条辅助分支,三路结果均插值回原图尺寸(model.py)。这种"主分支 + 辅助监督"的设计对应论文中的辅助损失结构。
在 ppgan/faceutils/mask/face_parser.py 中,FaceParser以BiSeNet(n_classes=19)实例化网络,并自动从BISENET_WEIGHT_URL(https://paddlegan.bj.bcebos.com/models/bisenet.pdparams)下载预训练权重,通过paddle.load+set_dict载入后置为eval()模式。
3. 快速上手:测试命令与参数
在仓库根目录下进入applications目录,运行以下命令即可完成人脸解析任务。程序运行成功后,会在output文件夹生成解析后的图片文件:
cd applications python tools/face_parse.py --input_image ../docs/imgs/face.png命令解析脚本位于 applications/tools/face_parse.py,支持以下参数:
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
--input_image | str | 输入待解析的人脸图片文件路径(必填) | 无 |
--cpu | 开关标志 | 强制在 CPU 上运行 | 关闭(默认使用 GPU,若有可用设备) |
当传入--cpu时,脚本会先执行paddle.set_device('cpu')再构建预测器(face_parse.py);不传该参数时,PaddlePaddle 将按环境自动选择可用设备(GPU 优先,无 GPU 时回退 CPU)。
解析完成后,结果图默认保存在output/face_parse.png,即 face_parse_predictor.py 中cv2.imwrite(save_path, mask)指定的输出路径与文件名。预测器的输出目录通过FaceParsePredictor(output_path='output')指定,可在 face_parse_predictor.py 中调整。
4. 完整运行流程拆解
FaceParsePredictor.run(ppgan/apps/face_parse_predictor.py)的执行链路如下:
读取并转换图片:
Image.open(image).convert("RGB")统一为 RGB 三通道;人脸检测:调用
futils.dlib.detect(image),使用 dlib 的 frontal face detector 检测人脸。检测前会先将图像按最大边长 361 缩放以提高检测稳定性,检测框坐标再映射回原图尺寸(dlib_utils.py);人脸裁剪:调用
futils.dlib.crop(image, face, up_ratio, down_ratio, width_ratio),按预设比例向外扩展人脸框。预测器中三个比例分别为:up_ratio = 0.6 / 0.85(向上扩展量 = 比例 × 人脸高度)down_ratio = 0.2 / 0.85(向下扩展量 = 比例 × 人脸高度)width_ratio = 0.2 / 0.85(左右扩展量 = 比例 × 图像宽度)
裁剪后若宽高不等,还会以人脸框中心为基准裁成正方形区域(dlib_utils.py);
归一化输入:将裁剪结果
cv2.resize到(512, 512),转为float32后交给FaceParser.parse;BiSeNet 推理:在 face_parser.py 的
parse方法中,图像先除以 255 归一化、转成 CHW 布局,再执行 ImageNet 统计量的标准化Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225));随后在paddle.no_grad()下前向推理,对输出的 logits 沿类别维执行argmax(0)得到逐像素类别索引;类别映射:将 BiSeNet 输出的 19 类索引通过
mapper字典映射到 14 类(详见第 5 节);输出可视化:掩码被
cv2.resize回(256, 256),再由mask2image为不同类别随机着色生成彩色标签图(visual.py),最终写入output/face_parse.png。
需要说明的是,若dlib.detect未检测到任何人脸,run会直接返回而不产出结果,因此输入图片应包含清晰、可被 dlib 检出的正脸。
5. 核心实现解析:FaceParser 的 19 类到 14 类映射
ppgan/faceutils/mask/face_parser.py 中,FaceParser定义了一个mapper字典,将 BiSeNet 输出的 19 个原始类别索引映射为下游可用的 14 类标签:
0→0, 1→1, 2→2, 3→3, 4→4, 5→5, 6→0, 7→11, 8→12, 9→0, 10→6, 11→8, 12→7, 13→9, 14→13, 15→0, 16→0, 17→10, 18→0映射逻辑从源码可以推断:原始 BiSeNet 的 19 类中,背景及若干细分类别(索引 0、6、9、15、16、18)被统一归并为标签 0,其余类别被重排为 1~13,最终构成适合换妆等下游任务使用的紧凑标签体系。parse返回的结果为float32类型的 Paddle Tensor,形状与输入一致(512×512),PSGAN 等下游模块可直接读取该掩码使用。
6. 人脸解析在换妆模型中的应用
原文档明确说明:"这个工具我们目前应用在换妆模型上"。从源码可以确认这一点:
- ppgan/apps/psgan_predictor.py 中,PSGAN 预测器与
FaceParsePredictor一样实例化了futils.mask.FaceParser(); - 在预测流程中调用
self.face_parser.parse(...)获得人脸各区域的解析掩码(psgan_predictor.py),作为妆容定位与迁移的重要输入。
这意味着人脸解析能力在 PaddleGAN 中并非孤立工具,而是换妆链路中的基础组件:解析掩码将人脸划分为嘴唇、眼部、皮肤等可独立处理的语义区域,换妆模型据此精准确定妆容施加的区域边界,从而实现更自然、区域化的妆容迁移效果。同一FaceParser被两个预测器复用,也体现了 ppgan/faceutils/mask/init.py 中工具模块的封装复用设计。
7. 结果展示
下图为人脸解析工具的典型输出:左半部分为输入人脸,右半部分为逐像素着色的解析结果,不同颜色对应不同的语义成分区域(头发、皮肤、五官等)。
解析结果以 256×256 的彩色标签图形式输出,可直接用于后续的换妆、人脸编辑等任务。
8. 参考文献
本文所介绍的人脸解析核心模型 BiSeNet 的原始出处如下:
@misc{yu2018bisenet, title={BiSeNet: Bilateral Segmentation Network for Real-time Semantic Segmentation}, author={Changqian Yu and Jingbo Wang and Chao Peng and Changxin Gao and Gang Yu and Nong Sang}, year={2018}, eprint={1808.00897}, archivePrefix={arXiv}, primaryClass={cs.CV} }9. 延伸阅读
- 人脸解析是 PSGAN 换妆 的关键前置组件,可结合该教程理解掩码的最终用途;
- 人脸相关的其他能力(人脸检测、人脸增强等)见 face_enhancement.md 与 face_parse.md 同系列教程;
- 模型推理入口与通用预测器基类见 base_predictor.py,命令行入口见 applications/tools/face_parse.py。
- 人工智能
- 深度学习
- 计算机视觉
- 媒体生成
- 视频处理
- 图像处理
【免费下载链接】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 人脸解析(Face Parsing)实战:基于 BiSeNet 的像素级人脸语义分割工具详解
PaddleGAN 人脸解析(Face Parsing)实战:基于 BiSeNet 的像素级人脸语义分割工具详解 人脸解析(Face Parsing)是语义图像
人工智能深度学习计算机视觉媒体生成视频处理图像处理PaddleFormers 人脸解析模型 face_parse 使用指南:基于 BiSeNet 的像素级人脸语义分割
PaddleFormers 人脸解析模型 face_parse 使用指南:基于 BiSeNet 的像素级人脸语义分割 导读 本文面向需要对人脸图像进行像素级语义
人工智能大模型微调模型推理服务PaddleGAN教程:用FaceParse实现人脸语义分割
PaddleGAN教程:用FaceParse实现人脸语义分割 人脸解析(Face Parsing)是语义图像分割的一种特殊情况,它能计算人脸图像中不同语义成分(
人工智能深度学习计算机视觉媒体生成视频处理图像处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考