模型: UNet Human Matting
来源: ModelScope - iic/cv_unet_image-matting
论文: Boosting Semantic Human Matting with Coarse Annotations (CVPR 2020)
框架: PyTorch (原版为 TensorFlow,本仓库提供了 PyTorch 重构版本)
| 组件 | 版本要求 |
|---|---|
| Python | ≥ 3.8 |
| PyTorch | ≥ 2.0.0 |
| torch_npu | ≥ 2.0.0 (NPU 推理需要) |
| CANN | ≥ 8.0.0 (NPU 推理需要) |
| OpenCV | ≥ 4.5.0 |
| NumPy | ≥ 1.20.0 |
# 基础依赖
pip install torch torchvision
pip install opencv-python numpy
# NPU 依赖(如使用 Ascend NPU)
# pip install torch_npu # 根据 CANN 版本选择cd portrait_matting_deployportrait_matting_deploy/
├── inference.py # 主推理脚本
├── eval_benchmark.py # 精度/性能评估脚本
├── unet_model.py # UNet 模型定义
└── output/ # 输出目录(运行后自动创建)
├── input_image.png
├── output_cpu.png
├── output_npu.png
├── composite_cpu.png
├── composite_npu.png
├── comparison_sidebyside.png
└── diff_alpha.png# CPU 推理
python3 inference.py --device cpu --image <image_path_or_url>
# NPU 推理
python3 inference.py --device npu --image <image_path_or_url>
# CPU + NPU 对比
python3 inference.py --compare --image <image_path_or_url>
# 使用默认测试图片
python3 inference.py --compare主推理脚本,支持 CPU 和 NPU 推理。
python3 inference.py [--device auto|cpu|npu] [--image URL_OR_PATH]
[--output ./output] [--compare] [--input-size 224]参数说明:
| 参数 | 默认值 | 说明 |
|---|---|---|
--image | ModelScope demo 图片 | 输入图片路径或 URL |
--device | auto | 推理设备: auto/cpu/npu |
--output | ./output | 输出目录 |
--compare | False | 同时运行 CPU 和 NPU 并对比精度 |
--input-size | 224 | 模型输入尺寸 |
示例:
# 使用 ModelScope demo 图片进行 CPU + NPU 对比推理
python3 inference.py --compare
# 使用本地图片进行 NPU 推理
python3 inference.py --device npu --image /path/to/portrait.jpg
# 指定输出目录
python3 inference.py --compare --output ./my_results运行 python3 inference.py --compare 后,推理正常输出如下:
$ python3 inference.py --compare
[INFO] Devices to test: ['cpu', 'npu']
[INFO] Processing image: https://modelscope.oss-cn-beijing.aliyuncs.com/demo/image-matting/1.png
[INFO] Image loaded: /tmp/_temp_input_image.png
[INFO] Original size: 1200x800
[INFO] Model input size: 224x224
========================================
Running inference on: CPU
========================================
[INFO] Using CPU device
[INFO] Inference (10 runs): avg=1599.62ms, std=19.61ms
[INFO] Output saved to: ./output/output_cpu.png
[INFO] Composite (green bg) saved to: ./output/composite_cpu.png
========================================
Running inference on: NPU
========================================
[INFO] NPU available: 2 device(s), type: Ascend910_9362
[INFO] Inference (10 runs): avg=3.29ms, std=0.21ms
[INFO] Output saved to: ./output/output_npu.png
[INFO] Composite (green bg) saved to: ./output/composite_npu.png
============================================================
ACCURACY COMPARISON: CPU vs NPU (float tensor)
============================================================
[Alpha Channel] CPU vs NPU Comparison:
MAE: 0.0000000930
Max Absolute Diff: 0.0000009537
MSE: 0.0000000000
RMSE: 0.0000000892
PSNR: 138.31 dB
Cosine Similarity: 1.0000000000
Allclose(1e-4): True
Exact Match: False
[RGB Channels] CPU vs NPU Comparison:
MAE: 0.0000001206
Max Absolute Diff: 0.0000010133
MSE: 0.0000000000
RMSE: 0.0000000821
PSNR: 135.84 dB
Cosine Similarity: 1.0000000000
Allclose(1e-4): True
Exact Match: False
[Full RGBA] CPU vs NPU Comparison:
MAE: 0.0000001153
Max Absolute Diff: 0.0000010133
MSE: 0.0000000000
RMSE: 0.0000000833
PSNR: 136.34 dB
Cosine Similarity: 1.0000000000
Allclose(1e-4): True
Exact Match: False
============================================================
PERFORMANCE SUMMARY
============================================================
CPU : 1599.62 ms ± 19.61 ms per inference
NPU : 3.29 ms ± 0.21 ms per inference
Speedup (CPU/NPU): 486.11x
============================================================
ACCURACY METRICS (CPU vs NPU)
============================================================
Alpha Channel | MAE=0.0000000930 | PSNR=138.31 dB | CosSim=1.0000000000 | Allclose=True
RGB Channels | MAE=0.0000001206 | PSNR=135.84 dB | CosSim=1.0000000000 | Allclose=True
Full RGBA | MAE=0.0000001153 | PSNR=136.34 dB | CosSim=1.0000000000 | Allclose=True
============================================================
VERDICT: ✓ ALL PASS
============================================================
[SUCCESS] All outputs saved to: /opt/atomgit/portrait_matting_deploy/output
- input_image.png: Original input image
- output_cpu.png: Matting result (cpu)
- composite_cpu.png: Composited result (cpu)
- output_npu.png: Matting result (npu)
- composite_npu.png: Composited result (npu)
- diff_alpha.png: Alpha channel difference (5x amplified)完整的精度和性能基准测试脚本。
# 全量基准测试(CPU + NPU)
python3 eval_benchmark.py
# 仅 CPU 基准
python3 eval_benchmark.py --device cpu
# 仅 NPU 基准
python3 eval_benchmark.py --device npu
# 自定义测试图片
python3 eval_benchmark.py --images /path/to/img1.png /path/to/img2.pngPyTorch 模型在 CPU 和 NPU 上的输出在数值上完全对齐(同模型、同权重、同输入时),差异仅来自浮点运算精度差异。
| 指标 | 说明 | 达标标准 |
|---|---|---|
| MAE | 平均绝对误差 | < 0.001 |
| PSNR | 峰值信噪比 | > 50 dB |
| Cosine Similarity | 余弦相似度 | > 0.9999 |
| Allclose(1e-4) | 数值是否在容差内 | True |
| 通道 | MAE | MaxDiff | MSE | RMSE | PSNR(dB) | CosSim | Allclose |
|---|---|---|---|---|---|---|---|
| Alpha | 9.30e-8 | 9.54e-7 | ~0.0 | 8.92e-8 | 138.31 | 1.000000 | True |
| RGB | 1.21e-7 | 1.01e-6 | ~0.0 | 8.21e-8 | 135.84 | 1.000000 | True |
| RGBA | 1.15e-7 | 1.01e-6 | ~0.0 | 8.33e-8 | 136.34 | 1.000000 | True |
结论: CPU 和 NPU 推理结果在数值上高度一致(余弦相似度 = 1.0,所有通道均通过 Allclose(1e-4) 校验)。MAE 约 1e-7 量级,差异源于不同硬件(x86 CPU vs Ascend NPU)的浮点运算精度差异。
| 设备 | 平均耗时(ms) | FPS | 相对加速比 |
|---|---|---|---|
| CPU (aarch64) | ~1599.62 | ~0.6 | 1.0x (baseline) |
| NPU (Ascend910_9362) | ~3.29 | ~304 | ~486x |
运行完成后,输出目录包含以下文件:
| 文件 | 说明 |
|---|---|
input_image.png | 原始输入图片 |
output_cpu.png | CPU 推理结果 (BGRA) |
output_npu.png | NPU 推理结果 (BGRA) |
composite_cpu.png | CPU 结果合成(绿幕背景) |
composite_npu.png | NPU 结果合成(绿幕背景) |
comparison_sidebyside.png | CPU/NPU/差异并排对比图 |
diff_alpha.png | Alpha 通道差异图(5倍放大) |
composite_cpu.png 和 composite_npu.png,确认人像抠图效果正常comparison_sidebyside.png,确认 CPU 和 NPU 输出视觉上一致diff_alpha.png,正常情况下几乎全黑(差异极小)本实现基于 UNet 架构,参考了原始论文中的人像抠图方案:
| 属性 | 值 |
|---|---|
| 输入通道 | 3 (RGB) |
| 输出通道 | 4 (RGBA) |
| 默认输入尺寸 | 224×224 |
| 输入值域 | [0, 1] (float32) |
| 输出值域 | [0, 1] (sigmoid) |
Q: 为什么没有直接使用 ModelScope Pipeline?
A: 原始模型基于 TensorFlow 的 frozen graph (tf_graph.pb),在 aarch64 上安装 TensorFlow 较复杂。本仓库提供了 PyTorch 重写的 UNet 实现,方便在昇腾 NPU 上直接使用 torch_npu 进行推理。
Q: NPU 推理比 CPU 快多少?
A: 以 Ascend910 (Atlas 800 A2) 为例,224×224 输入下,NPU 推理约 3.3ms,CPU 约 1.6s(aarch64 无 SIMD 优化),加速比约 486x。稳定运行后 NPU 首次推理约 7-8ms(含初始化开销),后续推理稳定在 3.2-3.3ms。
Q: 精度损失如何?
A: 同模型、同权重、同输入下,CPU 和 NPU 的输出浮点差异在 1e-4 量级,PSNR > 60dB,可认为无损。
Q: 支持哪些 NPU 型号?
A: 支持所有通过 torch_npu 驱动的 Ascend NPU,包括 Ascend 910B4、910B3、310P 等。
Apache 许可协议 2.0