在RK3588 NPU上部署RetinaFace:Python端到端推理实战

张开发
2026/4/7 15:09:29 15 分钟阅读

分享文章

在RK3588 NPU上部署RetinaFace:Python端到端推理实战
1. 环境准备与模型获取在RK3588开发板上部署RetinaFace模型前我们需要先搭建好基础环境。RK3588的NPU神经网络处理单元是瑞芯微推出的第三代AI加速引擎算力高达6TOPS特别适合运行人脸检测这类计算机视觉模型。我实测发现相比纯CPU推理NPU加速能带来5-8倍的性能提升。首先需要安装RKNN-Toolkit2工具链这是瑞芯微官方提供的NPU开发套件。建议使用Python3.8环境通过pip直接安装pip install rknn_toolkit2-1.4.0-cp38-cp38-linux_x86_64.whl模型文件可以从两个渠道获取官方rknn_model_zoo提供的RetinaFace预训练模型自行转换的ONNX模型需注意输入输出节点匹配我推荐直接使用官方提供的rknn模型因为已经针对NPU做了深度优化。下载后你会得到两个关键文件RetinaFace.rknn约3.7MBtest.jpg测试图片2. 模型转换详解虽然官方提供了转换好的rknn模型但了解转换过程对后续调试很有帮助。转换的核心是处理原始模型的非常规算子比如RetinaFace中的PRIOR_BOX层。我在转换时遇到过报错后来发现需要特别处理anchor生成逻辑。完整的转换流程如下from rknn.api import RKNN rknn RKNN() ret rknn.config(mean_values[[104, 117, 123]], std_values[[1, 1, 1]]) ret rknn.load_onnx(modelretinaface.onnx) ret rknn.build(do_quantizationTrue, dataset./dataset.txt) ret rknn.export_rknn(./retinaface.rknn)关键参数说明mean_values/std_values必须与训练时一致do_quantization开启量化能减小模型体积dataset.txt包含100-200张校准图片路径常见踩坑点输入尺寸不匹配会导致转换失败某些算子需要手动注册实现量化校准图片要有代表性3. Python推理全流程3.1 核心代码解析推理脚本主要包含以下几个关键部分Anchor生成器class Anchors: def __init__(self, cfg, image_size): self.min_sizes cfg[min_sizes] self.steps cfg[steps] self.feature_maps [ [ceil(image_size[0]/step), ceil(image_size[1]/step)] for step in self.steps ] def get_anchors(self): anchors [] for k, f in enumerate(self.feature_maps): # 具体实现见完整代码 return np.array(anchors).reshape(-1,4)图像预处理def letterbox_image(image, size): ih, iw image.shape[:2] scale min(size[0]/iw, size[1]/ih) nw, nh int(iw*scale), int(ih*scale) image cv2.resize(image, (nw, nh)) new_image np.ones((size[1], size[0], 3)) * 128 # 居中填充 new_image[(size[1]-nh)//2:(size[1]-nh)//2nh, (size[0]-nw)//2:(size[0]-nw)//2nw] image return new_image后处理逻辑解码人脸框坐标非极大抑制(NMS)过滤重叠框关键点坐标转换3.2 性能优化技巧通过多次测试我总结了几个提升推理速度的方法固定输入尺寸使用320x320分辨率比动态尺寸快20%内存复用避免在循环中频繁申请释放内存批量推理一次处理多帧需修改模型输入实测在RK3588上单帧推理时间可以稳定在15ms以内完全满足实时检测需求。4. 结果可视化与调试检测结果的绘制需要注意坐标系的转换特别是当使用letterbox预处理时。关键代码片段def draw_results(image, boxes): for box in boxes: x1, y1, x2, y2 map(int, box[:4]) cv2.rectangle(image, (x1,y1), (x2,y2), (0,255,0), 2) # 绘制五个关键点 for i in range(5): x, y int(box[5i*2]), int(box[6i*2]) cv2.circle(image, (x,y), 2, (0,0,255), -1) return image常见问题排查检测框偏移检查预处理和后处理的坐标转换漏检人脸调整置信度阈值建议0.5-0.7关键点错位确认anchor生成是否正确5. 完整项目部署将整个项目部署到RK3588开发板时建议采用以下结构/retinaface_npu ├── models │ ├── RetinaFace.rknn ├── utils │ ├── anchor.py │ ├── nms.py ├── test.jpg ├── retinaface.py启动推理只需执行python3 retinaface.py --model models/RetinaFace.rknn --img test.jpg我在实际项目中遇到过NPU内存不足的问题后来发现是同时运行了多个模型实例。建议通过进程锁确保单实例运行或者使用RKNN提供的共享内存机制。

更多文章