人脸识别模型部署实战
本文档根据《嘉楠K230开发手册》V1.0(2024-11-30)整理。正文、表格、示例代码与插图均来自原始手册。
人脸识别是广泛使用的人脸任务,它将当前人脸与已知的人脸身份库进行比较,判断是否认识当前人脸。
人脸识别一般包含2个步骤:人脸注册和人脸识别,人脸注册用于构建人脸数据库,人脸识别用于识别存在数据库中的人脸。
人脸注册:图像采集->人脸定位->人脸对齐->特征提取->数据库保存
人脸识别:图像采集->人脸定位->人脸对齐->特征提取->特征比对->给出识别结果 人脸对齐:对于一张图像,人脸检测模型输出人脸目标框坐标和5个人脸关键点,在进行人脸识别前,需要对检测得到的人脸框进行对齐;即在2D平面将人脸转正,减少人脸旋转造成的差异,以便于后续更准确的人脸识别。

PyTorch到ONNX转换
- 模型转换流程分析
选择人脸识别模型时,一般应选择轻量化的模型,backbone一般小于resnet50参数量较好。因此我们选择基于MobileNet且精度较高MobileFaceNet作为我们的人脸识别模型。
- 加载pth或ckpt模型到cpu
- 构建随机模型输入
- 导出onnx模型
**注:**pth、onnx都支持动态输入,而K230的模型暂时不支持动态输入,所以导出onnx时,onnx输入shape固定。
#convert_to_onnx.py
import numpy as np
import torch
from core import model #因模型而不同
def convert_onnx(net, path_module, output, opset=11):
assert isinstance(net, torch.nn.Module)
img = np.random.randint(0, 255, size=(112, 112, 3), dtype=np.int32)
img = img.astype(np.float)
img = (img / 255. - 0.5) / 0.5 # torch style norm
img = img.transpose((2, 0, 1))
img = torch.from_numpy(img).unsqueeze(0).float()
ckpt = torch.load(path_module,map_location='cpu')
net.load_state_dict(ckpt['net_state_dict'],strict=True)
net.eval()
torch.onnx.export(net, img, output, input_names=["data"], keep_initializers_as_inputs=False, verbose=False,
opset_version=opset)
if __name__ == '__main__':
net = model.MobileFacenet()
input_file = 'model/best/068.ckpt'
output_file = 'model/best/MobileFaceNet.onnx'
convert_onnx(net, input_file, output_file)
- 模型转换执行步骤
- 在Ubuntu中新建终端,并激活conda的人脸相关环境
conda activate py39_mobilenet
- 进入人脸检测源码目录
cd k230_sdk/src/reference/Pytorch_Retinaface/
执行效果:

- 拷贝转换程序至人脸识别源码目录
cp ../K230_AI_Demo_Development_Process_Analysis/onnx_related/onnx_export/face_recognition_convert_to_onnx.py .

执行转换程序
python face_recognition_convert_to_onnx.py

- 查看生成的模型文件
ls model/best/

其中MobileFaceNet.onnx为从068.ckpt转换过来的ONNX模型文件。