本文档记录 mattmdjaga/segformer_b2_clothes SegFormer-B2 服装语义分割模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
该模型基于 SegFormer-B2(层级化 Transformer + All-MLP Decoder,24.7M 参数),在服装解析数据集上微调。支持 18 类服装/人体区域分割:Background、Hat、Hair、Sunglasses、Upper-clothes、Skirt、Pants、Dress、Belt、Left-shoe、Right-shoe、Face、Left-leg、Right-leg、Left-arm、Right-arm、Bag、Scarf。适用于电商商品图解析、虚拟试衣、时尚分析等场景。
SegFormer-B2 是 B0 的增强版——更大的 hidden dimension 和更多 transformer 层,分割精度更高但推理速度稍慢。B2 vs B0:参数量 24.7M vs 3.7M,精度显著提升,适合对服装细节要求高的场景。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda create -n mattmdjaga_segformer_b2_clothes python=3.11 -y
conda activate mattmdjaga_segformer_b2_clothes
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/simplepython inference.py --image person.jpg --device npu
python inference.py --image_dir ./photos/ --device npu编程接口:
from inference import SegformerSegmentor
seg = SegformerSegmentor(
model_path="./mattmdjaga_segformer_b2_clothes", device="npu"
)
pred = seg.predict(["person.jpg"])
# pred[0].shape → (128, 128) 像素级 18 类分割python inference.py --image person.jpg --device npu预期输出:各服装区域的像素占比(Background, Upper-clothes, Pants 等),无运行时错误。
测试条件:6 张合成 512×512 图像(固定种子),batch_size=4,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| CPU 吞吐量 | 0.5 img/s |
| NPU 吞吐量 | 23.4 img/s |
| CPU/NPU 加速比 | 51.6 × |
SegFormer-B2 比 B0 大(24.7M vs 3.7M),NPU 推理速度稍慢但加速比仍然极高(51.6×)。服装分割的 512×512 输入分辨率导致 CPU 几乎无法实时处理。
分别在 CPU 和 NPU 上推理 6 张合成 512×512 图像,比较逐像素 18 维分类 logits 的展平余弦相似度。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 1.000000 |
| 精度误差率 | 0.0000% |
结论:精度误差率 0.0000%,NPU 与 CPU 输出完全一致,评测通过。
AutoModelForSemanticSegmentation.from_pretrained() 加载model.to("npu:0") 迁移,SegFormer 全部算子(Conv2d, LayerNorm, GELU, Mix-FFN)NPU 原生支持AutoImageProcessor CPU 端预处理(512×512 resize + ImageNet 标准化)import torch, torch_npu
from transformers import AutoImageProcessor, AutoModelForSemanticSegmentation
model = AutoModelForSemanticSegmentation.from_pretrained(
"segformer_b2_clothes"
).to("npu:0")
processor = AutoImageProcessor.from_pretrained("segformer_b2_clothes")
from PIL import Image
image = Image.open("person.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), 18 classes