OpenHarmony开发者论坛

标题: 拆·应用丨第4期:基于开源鸿蒙的RKNN人脸识别应用案例 [打印本页]

作者: 开源鸿蒙知行录    时间: 2026-1-22 10:46
标题: 拆·应用丨第4期:基于开源鸿蒙的RKNN人脸识别应用案例
[md]> 【拆·应用】是为开源鸿蒙应用开发者打造的技术分享平台,是汇聚开发者的技术洞见与实践经验、提供开发心得与创新成果的展示窗口。诚邀您踊跃发声,期待您的真知灼见与技术火花!
> **引言**
> 本期内容由AI Model SIG提供,介绍了在开源鸿蒙中,基于`RK3588`的`RKNN`人脸识别应用开发全流程。

# 背景介绍

在边缘计算领域,`RK3588`作为一款高性能AIoT芯片,具备`6TOPS`的NPU算力,非常适合部署人脸识别等计算机视觉应用。**深圳市视美泰技术股份有限公司**(以下简称“视美泰”)基于开源鸿蒙系统,结合`Rockchip NPU`强大的AI算力,基于`RKNN`开发了人脸识别应用案例,此案例将`RKNN`能力与开源鸿蒙进行适配和集成,为开发者提供直观、便捷的AI应用体验。

# `RKNN`介绍

`RKNN`是瑞芯微推出的神经网络推理加速引擎,`Rockchip NPU`平台使用的模型类型,`RKNN`通常应用于边缘设备上的深度学习任务,如人脸识别、物体检测和语音识别等。它是一个强大的神经网络开发和运行框架,简化了深度学习模型开发的多个复杂步骤,并提供了优秀的跨平台支持和模型优化能力。

![1.jpg](https://forums-obs.openharmony.c ... 3380k3a34wmm3we.jpg "1.jpg")

# 技术实现详解

本案例采用双模型推理设计,充分发挥 `Rockchip NPU`的硬件优势:
`YOLOv5`人脸检测模型:负责实时检测图像中的人脸位置。
`FaceNet`特征提取模型:提取人脸特征向量,实现精准识别。
检测流程:摄像头采集 → 图像预处理 → RKNN推理 → 结果处理 → UI显示

1. 模型加载与初始化
   模型加载流程:

- 首先尝试从应用沙箱目录加载已保存的模型文件。
- 如果沙箱中不存在,则从 `rawfile`资源中加载。
- 初始化RKNN上下文,设置使用所有NPU核心(`RKNN_NPU_CORE_0_1_2`)。
- 查询模型的输入输出信息,获取tensor属性。

2. 预览流图像预处理

- 首先通过`opencv`库的 `imread`读取预览流图像。
- 获取的预览流图像为 `BGR`格式,需要将BGR转为RGB格式。
- 计算目标尺寸和缩放比例。
- 再通过计算出来的比例进行自适应缩放和填充,通过opencv库的 `resize`和 `copyMakeBorder`完成调整预览流图像大小和添加填充,这种处理方式可以避免图像变形,提高检测精度。
  
  ![2.png](https://forums-obs.openharmony.c ... upzhwp1p7xg4epp.png "2.png")

3. 人脸检测推理执行

- 准备并设置输入数据参数。
- 通过 `rknn_inputs_set`设置输入。
- 对预览流图片执行推理,获取输出结果。
- 通过后处理函数处理YOLOv5模型的输出,将输出转换为可用的检测结果,包括边界框坐标、类别和置信度。
  
  ![3.png](https://forums-obs.openharmony.c ... qgjvsjqqvcjc7bk.png "3.png")

4. 人脸识别图像预处理

- 首先根据人脸检测过程中保存的人脸边界坐标数据,对对应的预览流图片进行人脸裁切,将预览流中裁切出来的人脸图尺寸缩放到 `224\*224`,将这一尺寸作为标准的人脸识别输入尺寸,将缩放好的图片输出保存。
- 启动人脸识别工作线程(如果尚未启动)。
- 获取当前时间戳,查找刚刚输出的缩放好的图片,将时间戳最接近现在时间戳的添加到异步处理队列中。
  
  ![4.png](https://forums-obs.openharmony.c ... luyygh3yt9y8fuu.png "4.png")

5. 人脸识别推理流程

- 将准备推理的人脸图像进行预处理。
- 准备输入数据并且设置输入。
- 执行推理,获取输出结果。
- 查询输出张量的属性(包括零点和缩放因子),将输出向量大小调整为128维,并将量化的 `int8`数据转换回浮点数,实现将模型的量化输出转换回原始特征空间。
- 最后计算特征向量的平方和,计算L2范数,将特征向量的每个元素除以L2范数归一化后的特征向量长度为1,便于后续使用余弦相似度计算人脸相似性。
  
  ![5.png](https://forums-obs.openharmony.c ... xvvz8k891kh511k.png "5.png")

6. 获取人脸与人脸库对比

- 首先人脸库的人脸图像会在应用启动时,自动执行人脸识别推理,并保存从人脸图像中提取的128维特征向量。
- 再从实时人脸的图像中提取到128维特征向量后,会与人脸库中保存的128维特征向量进行点积计算,因为进行了归一化处理,所以返回值相似度的范围为0.0-1.0,当相似度为0.6以上即为同张人脸。
  
  ![6.png](https://forums-obs.openharmony.c ... v7i73uzxcuydezi.png "6.png")

## `NAPI`接口

本应用共提供3个`NAPI`接口,供开发者在ArkTS调用,能够快速实现人脸识别应用的开发:

> **TIPS**
> 下列接口返回值中 \* 表示仅在成功时存在并返回

`saveModelFile` - 保存模型文件

![7.jpg](https://forums-obs.openharmony.c ... dpt3knobu2bcdt9.jpg "7.jpg")

`saveFaceDatabaseImages` - 保存人脸数据库图片

![8.jpg](https://forums-obs.openharmony.c ... ejprn2rpnz44z47.jpg "8.jpg")

`processImageWithRKNN` - 图像处理与人脸识别

![9.jpg](https://forums-obs.openharmony.c ... 9po1fopovpz95o6.jpg "9.jpg")

## 程序运行流程

展示应用运行时的部分重要函数:

1. 应用启动阶段

![10.jpg](https://forums-obs.openharmony.c ... k465gzgtyedmslg.jpg "10.jpg")

2. 摄像头初始化

![12.jpg](https://forums-obs.openharmony.c ... 92mb57iim72h89h.jpg "12.jpg")

3. 图片处理流水线

![13.jpg](https://forums-obs.openharmony.c ... i621rts6rapfppa.jpg "13.jpg")

4. `RKNN NAPI`接口调用

![14.jpg](https://forums-obs.openharmony.c ... coxqj7xo74mc20h.jpg "14.jpg")

5. UI渲染与交互

![15.jpg](https://forums-obs.openharmony.c ... zocmz6ey6yiemnc.jpg "15.jpg")

![16.jpg](https://forums-obs.openharmony.c ... 8bh8l2zlko393hh.jpg "16.jpg")

# 技术特点

**NPU加速**: 充分利用`Rockchip NPU`的算力,实现高效的模型推理。
**多核心支持**: 设置使用所有NPU核心,最大化硬件利用率。
**异步处理**: 人脸识别采用异步处理,不阻塞UI线程。
**内存优化**: 智能管理模型数据和图像缓存,避免内存泄漏。
**实时结果反馈**: 提供实时的人脸检测和识别结果。

## 依赖

1. 操作系统及硬件依赖
   `OpenHarmony`系统版本: 仅支持 `OpenHarmony 5.0.0 Release 64位系统(API 12)`。
   设备要求: 需要支持`Rockchip NPU`的设备,案例默认适配RK3588。
2. 模型依赖
   将所需模型放置在 `rawfile/model/usemodel/`目录下。
   `yolov5.rknn`: 人脸检测模型,需要放置在 `rawfile/model/usemodel/`目录下。
   `facenet.rknn`: 人脸特征提取模型,需要放置在 `rawfile/model/usemodel/`目录下。
3. 人脸识别人脸库依赖
   将所需识别人物的参考人脸图片放置在 `rawfile/face_databases`目录下,按1-20命名,例如:1.jpg。

# 应用效果展示

> 演示使用板卡:`视美泰 AIoT-3588A`
> OpenHarmony版本:`OpenHarmony 5.0.0 Release 64位`
> `RKNPU`版本: `v0.9.8`

## 同一个人不同场景下的识别效果展示

![17.jpg](https://forums-obs.openharmony.c ... yzuwepci6gg7ye6.jpg "17.jpg")

![18.jpg](https://forums-obs.openharmony.c ... vkrz6hv1k75378c.jpg "18.jpg")

## 不同人的识别效果展示

![19.jpg](https://forums-obs.openharmony.c ... 14br6282zfgrrtl.jpg "19.jpg")

![20.jpg](https://forums-obs.openharmony.c ... rzbg74t4hznberl.jpg "20.jpg")

# 总结

本文主要介绍了基于开源鸿蒙系统,将`RKNN`适配了开源鸿蒙,实现`RKNN`人脸识别应用案例,可智能识别人脸及与人脸库中的参考人脸进行匹配比对。文中使用搭载`开源鸿蒙5.0.0 Release 64位`系统的`视美泰AIoT-3588A`开发板进行应用案例效果展示。

# 应用源码获取

RKNN人脸识别应用案例相关源码均已上传至[gitcode](https://gitcode.com/openharmony- ... cognitionDemo_api12)。
开源鸿蒙 [64位固件以及烧录文档](https://pan.baidu.com/s/1kgLCKylfeaYkuaBwehInBw?pwd=mf6t),提取码:mf6t

[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5