紧跟上节我们介绍了InsightFace中各个流程使用到的模型并选择了retinaface和arcface来实现我们人脸识别的任务。
根据LuckFox官方和RKNPU2的文档指引,我们需要先获取onnx(最常用)的模型格式,但这在InsightFace官方程序中并未提供,我们可以自己找一下已有的insighface,onnx化部署工作。
一般我会先在onnx_model_zoo项目下寻找,这个项目由ONNX官方收录了许多完成了预训练的ONNX模型,可以降低我们的转换工作的难度。
但是很不幸,这里只提供了retinanet的网络模型,并没有retinaface的模型,而且里面的arcface模型采用的骨干网络为ResNet100过于复杂庞大,虽然也可以转换为rknn而且精度更高,但不适合在RV1106这样计算资源十分紧张的端侧设备上部署,我们希望能找到一个使用mobilenetssd作为骨干网络的arcface模型。
最后我在这两个项目里面找到了我们需要的onnx模型。
其中的retinaface模型仍需要我们从pth转换到onnx但这个过程比较简单,前面也已经有网友给出了转换步骤和脚本
- git clone https://github.com/bubbliiiing/retinaface-pytorch
- cd retinaface-pytorch
- touch 2onnx.py
-
- from nets.retinaface import RetinaFace
- from utils.config import cfg_mnet
- import torch
- model_path='model_data/Retinaface_mobilenet0.25.pth'
- model=RetinaFace(cfg=cfg_mnet,pretrained = False)
- device = torch.device('cpu')
- model.load_state_dict(torch.load(model_path,map_location=device),strict=False)
- net=model.eval()
- example=torch.rand(1,3,640,640)
- torch.onnx.export(model,(example),'model_data/retinaface.onnx',verbose=True,opset_version=9)
Retianface:
Arcface:
我们发现arcface模型的batch没有固定,rv1106似乎也不支持批量推理和动态输入,所以需要我们手动调整一下
-
- import onnx
- def change_input_size(model_path, new_size1):
- model = onnx.load(model_path)
- for input in model.graph.input:
- input.type.tensor_type.shape.dim[0].dim_value = new_size1
- onnx.save(model, model_path)
- change_input_size("w600k_mbf.onnx", 1)
调整完成后得到的arcface模型结构如下:
至此我们就得到了retinaface和arcface两个关键的onnx模型,下一节我们将完成onnx2rknn的工作。
这里也给出了onnx模型供大家参考
|