本文档记录 jonathandinu/face-parsing 面部解析(Face Parsing)模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
该模型基于 SegFormer-B0(层级化 Transformer + MLP Decoder),在 CelebAMask-HQ 面部数据集上微调,支持 19 类面部区域的逐像素语义分割。涵盖:background、skin、nose、eye_g(眼镜)、l_eye、r_eye、l_brow、r_brow、l_ear、r_ear、mouth、u_lip、l_lip、hair、hat、ear_r(耳环)、neck_l(项链)、neck、cloth。分辨率 512×512,输出 128×128 的分割图(输入 1/4)。
SegFormer-B0 是 NVIDIA 提出的轻量级语义分割 Transformer,仅 3.7M 参数,推理极快。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3image_processor_type 字段名conda create -n face-parsing python=3.11 -y
conda activate face-parsing
pip install torch==2.8.0 torch_npu==2.8.0.post4 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers torchvision pillow numpy \
-i https://pypi.tuna.tsinghua.edu.cn/simple
# 修复过时的 preprocessor 配置名
sed -i 's/SegformerFeatureExtractor/SegformerImageProcessor/' \
./face-parsing/preprocessor_config.jsonpython inference.py --image face.jpg --device npu编程接口:
from inference import SegformerSegmentor
seg = SegformerSegmentor(model_path="./face-parsing", device="npu")
pred = seg.predict(["face.jpg"])
# pred[0].shape → (128, 128) 像素级 19 类分割python inference.py --image demo.png --device npu预期输出:面部各区域的像素占比(skin, hair, nose 等),无运行时错误。模型目录含 demo.png 示例图片可用。
测试条件:6 张合成 512×512 图像(固定随机种子),batch_size=4,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 0.3 img/s |
| NPU 吞吐量 | 14.0 img/s |
| CPU/NPU 加速比 | 45.2 × |
SegFormer-B0 轻量架构在 NPU 上获得极高加速比(45.2×),适合实时面部解析应用。
分别在 CPU 和 NPU 上推理 6 张合成 512×512 图像,比较逐像素 19 维分类 logits 的展平余弦相似度和像素分类匹配率。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 0.999999 |
| 像素匹配率 | 99.91% |
| 精度误差率 | 0.0001% |
结论:精度误差率 0.0001%,像素级分类几乎完全一致,评测通过。
AutoModelForSemanticSegmentation.from_pretrained() 加载preprocessor_config.json 中 image_processor_type 为过时的 SegformerFeatureExtractor,需改为 SegformerImageProcessor。不改会导致 ValueError: Unrecognized image processormodel.to("npu:0") 一步迁移,所有算子(Conv2d, LayerNorm, GELU, Mix-FFN)NPU 原生支持AutoImageProcessor 在 CPU 完成预处理(512×512 resize + ImageNet 标准化),tensor 转移至 NPUimport torch, torch_npu
from transformers import AutoImageProcessor, AutoModelForSemanticSegmentation
model = AutoModelForSemanticSegmentation.from_pretrained("face-parsing").to("npu:0")
processor = AutoImageProcessor.from_pretrained("face-parsing")
from PIL import Image
image = Image.open("face.jpg").convert("RGB")
inputs = processor(images=image, return_tensors="pt")
inputs = {k: v.to("npu:0") for k, v in inputs.items()}
with torch.no_grad():
outputs = model(**inputs)
seg_map = outputs.logits.argmax(dim=1) # (1, 128, 128)sed -i 's/SegformerFeatureExtractor/SegformerImageProcessor/' preprocessor_config.json,否则 AutoImageProcessor 报错。这是因为模型使用的是旧版 transformers 保存的配置名。model.config.id2label 查看。quantize_config.json),可用于边缘端 INT8 推理加速。