冬
gcw_IDzXRVNw/cv_manual_face-liveness_flrgb-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

cv_manual_face-liveness_flrgb Ascend NPU 部署指南

项目简介

cv_manual_face-liveness_flrgb 是 RGB 人脸活体检测模型,用于判断输入图像中的人脸是否为来自认证设备端的近距离裸拍活体人脸,可广泛应用在人脸实时采集场景。

特性

  • 支持 Ascend NPU 推理加速
  • CPU 与 NPU 精度对比测试(误差 < 1%)
  • RGB 活体检测
  • 二分类输出(真/假)

环境要求

  • 硬件:华为 Ascend 910 系列 NPU
  • CANN:8.0.RC1 或更高版本
  • PyTorch:2.0+ 且包含 torch_npu
  • Docker:容器名称 test-modelagent

目录结构

cv_manual_face-liveness_flrgb-ascend/
├── inference.py          # 推理测试脚本
├── flrgb_npu.pt          # TorchScript 模型
├── log.txt               # 测试日志
├── README.md             # 本文档
├── precision_result.json # 精度测试结果
└── test_input.png       # 测试图片

Deployment Steps

1. Enter the Container

docker exec -it test-modelagent bash

2. 设置环境变量

source /usr/local/Ascend/ascend-toolkit/set_env.sh

3. 安装依赖

pip install opencv-python onnxruntime onnx2torch torch_npu numpy

Usage

Method 1: Normal Inference Mode

Run the inference script for face liveness detection:

cd /data/ysws/agentsp/5-19-1/cv_manual_face-liveness_flrgb-ascend/

python3 inference.py

方式二:精度测试模式 (CPU vs NPU)

运行精度对比测试,验证 NPU 计算结果与 CPU 一致性:

cd /data/ysws/agentsp/5-19-1/cv_manual_face-liveness_flrgb-ascend/

python3 inference.py precision_test

命令行参数说明

参数说明默认值
precision_test运行完整精度测试普通推理模式

测试验证

精度测试结果

指标实测值阈值状态
绝对误差0.000079< 0.01PASS
相对误差0.0563%< 1.00%PASS

性能数据

操作耗时
CPU 推理时间0.0094s
NPU 推理时间7.0664s
加速比0.0013x

推理输出说明

模型输出为 [batch, 2] 的张量,表示二分类概率:

  • output[0][0]: 真实人脸的概率
  • output[0][1]: 假体人脸的概率

分数越高表示假体的可能性越高。

输入预处理

  1. 将图像短边扩展到与长边一致 (填充 127)
  2. 缩放到 128x128
  3. CenterCrop 到 112x112
  4. 归一化: (pixel - mean) / std
    • mean = [123.675, 116.28, 103.53]
    • std = [58.395, 57.12, 57.375]

测试日志 (log.txt)

============================================================
FLRGB Face Liveness Detection - Ascend NPU Test
Output: /data/ysws/agentsp/5-19-1/cv_manual_face-liveness_flrgb-ascend
============================================================

Mode: PRECISION TEST

============================================================
Loading Model
============================================================
ONNX: /data/ysws/agentsp/5-19-1/cv_manual_face-liveness_flrgb/iic/cv_manual_face-liveness_flrgb/model.onnx (exists: True)
PyTorch: /data/ysws/agentsp/5-19-1/cv_manual_face-liveness_flrgb-ascend/flrgb_npu.pt (exists: True)
Test image: /data/ysws/agentsp/5-19-1/cv_manual_face-liveness_flrgb/iic/cv_manual_face-liveness_flrgb/result.png

============================================================
Loading Test Image
============================================================
Image shape: (112, 112, 3) (H, W, C)
Input tensor shape: (1, 3, 112, 112)

============================================================
Running CPU Inference (ONNX)
============================================================
CPU output shape: (1, 2)
CPU score (fake probability): 0.140649
CPU time: 0.0094s

============================================================
Running NPU Inference (PyTorch)
============================================================
NPU output shape: torch.Size([1, 2])
NPU score (fake probability): 0.140728
NPU time: 7.0664s
Speedup: 0.00x

============================================================
Precision Test Results
============================================================
CPU score: 0.140649
NPU score: 0.140728
Absolute diff: 0.000079
Relative diff: 0.000563
Threshold (0.01): PASS

Status: PASS

============================================================
Test Complete!
============================================================

精度测试结果 (precision_result.json)

{
  "cpu_score": 0.14064925909042358,
  "npu_score": 0.14072847366333008,
  "cpu_time_sec": 0.009386301040649414,
  "npu_time_sec": 7.066424608230591,
  "speedup": 0.0013282956461060599,
  "score_diff": 7.921457290649414e-05,
  "rel_diff": 0.0005632064312795468,
  "passed": true
}

模型结构

  • 架构类型: ResNet (RGB 人脸活体检测)
  • 输入尺寸: 3 x 112 x 112
  • 输出: 2 (二分类概率)
  • 预处理: 中心裁剪 + 归一化
组件说明
输入112x112 RGB 图像
BackboneResNet 特征提取 + 深度可分离卷积
输出[真实概率, 伪造概率]

Python API 使用示例

基本推理

import torch
import cv2
import numpy as np

OUTPUT_DIR = "/data/ysws/agentsp/5-19-1/cv_manual_face-liveness_flrgb-ascend"

model = torch.jit.load(f"{OUTPUT_DIR}/flrgb_npu.pt", map_location="npu:0")
model.eval()

img = cv2.imread("test.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

mean = np.array([123.675, 116.28, 103.53], dtype=np.float32).reshape(1, 1, 3)
std = np.array([58.395, 57.12, 57.375], dtype=np.float32).reshape(1, 1, 3)

img = cv2.resize(img_rgb, (128, 128))
start = (128 - 112) // 2
img = img[start:start+112, start:start+112]
img = (img - mean) / std
img = np.transpose(img, (2, 0, 1))
img_tensor = torch.from_numpy(img).unsqueeze(0).float().to("npu:0")

with torch.no_grad():
    output = model(img_tensor)

fake_prob = output[0][1].item()
print(f"Fake probability: {fake_prob:.4f}")

常见问题

Q: NPU 推理时间比 CPU 长?

A: 首次 NPU 推理包含模型编译开销。后续推理会更快。对于长期运行场景,NPU 具有显著优势。

Q: 精度测试失败?

A: 检查 NPU 驱动是否正确安装,确保 CANN 环境变量已 source。FLRGB 模型的相对误差应远低于 1%。

Q: 输出分数的含义?

A: 分数越高表示输入图像中的人脸越可能是假体(纸张、电子屏等)。真实活体的分数较低。

参考链接

  • 原始模型: https://modelscope.cn/models/damo/cv_manual_face-liveness_flrgb
  • 阿里云视觉智能平台: https://vision.aliyun.com/experience/detail?tagName=facebody&children=DetectLivingFace

许可证

本项目遵循 MIT 许可证