如何在OpenHarmony上使用SeetaFace2人脸识别库? 精华
如何在OpenHarmony上使用SeetaFace2人脸识别库?
简介
相信大部分同学们都已了解或接触过OpenAtom OpenHarmony(以下简称“OpenHarmony”)了,但你一定没在OpenHarmony上实现过人脸识别功能,跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和OpenCV实现人脸识别。
项目效果
本项目实现了导入人脸模型、人脸框选和人脸识别三大功能,操作流程如下:
1. 录入页面点击右下角按钮,跳转拍摄页面进行拍照;
2. 选择一张或多张人脸作为训练模型,并设置对应的名字;
3. 选择一张未录入的人脸图片,点击框选按钮实现人脸图片框选功能;
4. 最后点击识别,应用会对当前图片进行匹配,最终在界面中显示识别结果。
快速上手
设备端开发
设备端通过OpenCV对图像进行处理并通过Seetaface2对图形数据进行人脸头像的识别,最终输出对应的NAPI接口提供给应用端调用。因此设备端开发主要涉及到OpenCV和Seetaface2的移植以及NAPI接口的开发。
OpenCV库移植
OpenCV是一个功能非常强大的开源计算机视觉库。此库已由知识体系工作组移植到了OpenHarmony中,后期还会将此库合入到主仓。在此库上主仓之前,我们只需要以下几个步骤就可以实现OpenCV的移植使用。
1. 通过以下命令下载已经移植好的OpenCV
2. 将OpenCV拷贝到OpenHarmony目录的third_party下
3. 适当裁剪编译选项
打开OpenCV目录下的BUILD.gn,如下:
不需要video以及flann功能,将对应的模块注释即可。
4. 添加依赖子系统的part_name,编译框架子系统会将编译出的库拷贝到系统文件中。
此项目中我们新建了一个SeetaFaceApp的子系统,该子系统中命名part_name为SeetafaceApi,所以我们需要在对应模块中的BUILD.gn中加上part_name="SeetafaceApi"
以module/core为例:
5. 编译工程需要添加OpenCV的依赖。
在生成NAPI的BUILD.gn中添加以下依赖:
至此,人脸识别中OpenCV的移植使用完成。
SeetaFace2库移植
SeetaFace2是中科视拓开源的第二代人脸识别库。包括了搭建一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块FaceDetector、面部关键点定位模块FaceLandmarker以及人脸特征提取与比对模块 FaceRecognizer。
关于SeetaFace2的移植请参照文档:SeetaFace2移植开发文档。
NAPI接口开发
关于OpenHarmony中的NAPI开发,参考视频:
OpenHarmony中napi的开发视频教程。本文将重点讲解NAPI接口如何实现OpenCV以及SeetaFace的调用。
1. 人脸框获取的NAPI接口的实现。
int GetRecognizePoints(const char *image_path);
此接口主要是通过应用层输入一张图片,通过OpenCV的imread接口获取到图片数据,并通过人脸检测模块FaceDetector分析获得图片中所有的人脸矩形框(矩形框是以x,y,w,h的方式)并将人脸框矩形以数组的方式返回到应用层。
人脸框矩形获取的主要代码如下:
其中FD_model是人脸检测模型,而FL_model是面部关键点定位模型(此模型分为5点定位和81点定位,本项目中使用的是81点定位模型),这些模型从开源项目中免费获取。
通过以上方式获取到对应的人脸矩形框后,再将矩形框以数组的方式返回到应用端:
其中array是通过napi_create_array创建的一个NAPI数组对象,通过 napi_set_element将所有的矩形框数据保存到array对象中,最后通过 napi_set_named_property将array转换成应用端可识别的对象类型result并将其返回。
2. 人脸搜索识别初始化与逆初始化。
1. int FaceSearchInit();
2. int FaceSearchDeinit();
这2个接口主要是提供给人脸搜索以及识别调用的,初始化主要包含模型的注册以及识别模块的初始化:
而逆初始化就是做一些内存的释放。
3. 人脸搜索识别注册接口的实现。
int FaceSearchRegister(const char *value);
需要注意的是,该接口需要应用端传入一个json数据的参数,主要包含注册人脸的名字,图片以及图片个数,如{"name":"刘德华","sum":"2","image":{"11.jpg","12.jpg"}}。而解析参数的时候需要调用 napi_get_named_property对json数据的各个对象进行解析,具体代码如下:
通过napi_get_cb_info获取从应用端传来的参数,并通过 napi_get_named_property获取对应的name以及图片个数,最后通过napi_get_element获取图片数组中的各个image,将name和image通过FaceSearchRegister接口将图片和名字注册到SeetaFace2模块的识别引擎中。具体实现如下:
注册完数据后,后续可以通过该引擎来识别对应的图片。
4. 获取人脸搜索识别结果接口的实现。
该接口实现了通过传入一张图片,在识别引擎中进行搜索识别。如果识别引擎中有类似的人脸注册,则返回对应人脸注册时的名字,否则返回不识别(ignored)字样。该方法是通过异步回调的方式实现的:
其中FaceSearchRecognizeExecuteCB实现了人脸识别
FaceSearchRecognizeCompleteCB函数通过napi_resolve_deferred接口将识别结果返回到应用端。
通过人脸特征提取与比对模块,对传入的数据与已注册的数据进行对比,并通过返回对比的相似度来进行判断当前人脸是否为可识别的,最后返回识别结果。具体实现代码:
至此,所有的NAPI接口已经开发完成。
5. NAPI库编译开发完NAPI接口后,我们需要将我们编写的库加入到系统中进行编译,我们需要添加一个自己的子系统。
首先在库目录下新建一个ohos.build
其次同一目录新建一个BUILD.gn,将库源文件以及对应的依赖加上,如下:
添加完对应的文件后,我们需要将我们的子系统添加到系统中进行编译,打开build/subsystem_config.json并在最后添加以下代码:
添加完子系统再修改产对应的品配置
打开productdefine/common/products/rk3568.json并在最后添加以下代码:
做完以上修改后我们就可以通过以下命令直接编译NAPI的库文件了:
参考RK3568快速上手-镜像烧录完成烧录即可。
应用端开发
在完成设备NAPI功能开发后,应用端通过调用NAPI组件中暴露给应用的人脸识别接口,即可实现对应功能。接下来就带着大家使用NAPI实现人脸识别功能。
开发准备
1. 下载DevEco Studio 3.0 Beta4;
2. 搭建开发环境,参考开发准备;
3. 了解属性eTS开发,参考eTS语言快速入门;
SeetaFace2初始化
1. 首先将SeetaFace2 NAPI接口声明文件放置于SDK目录/api下;
2. 然后导入SeetaFace2 NAPI模块;ck-start/star
3. 调用初始化接口;
获取所有人脸图片
通过文件管理模块fileio和媒体库管理mediaLibrary,获取指定应用数据目录下所有的图片信息,并将路径赋值给faceList,faceList数据用于Image组件提供url进行加载图片
设置人脸模型
获取选中的人脸图片地址和输入的名字,调用SeetafaceApp.FaceSearchRegister(params)进行设置人脸模型。其中参数params由name名字、image图片地址集合和sum图片数量组成。
实现框选人脸
调用SeetafaceApp.GetRecognizePoints传入当前图片地址,获取到人脸左上和右下坐标,再通过CanvasRenderingContext2D对象绘画出人脸框。
实现人脸识别
调用SeetafaceApp.FaceSearchGetRecognize(url),传入图片地址对人脸进行识别并返回对应识别出来的名字。
参考文档
SeetaFace2移植开发文档:
OpenHarmony中napi的开发视频教程:
https://www.bilibili.com/video/BV1L44y1p7KE?spm_id_from=333.999.0.0
RK3568快速上手:
https://growing.openharmony.cn/mainPlay/learnPathMaps?id=27
人脸识别应用:
应用开发准备:
https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/quick-start/start-overview.md/
eTS语言快速入门:
https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/quick-start/start-with-ets.md/
知识体系工作组:
https://gitee.com/openharmony-sig/knowledge
之前在codelab见过HarmonyOS的人脸识别:https://developer.huawei.com/consumer/cn/codelabsPortal/carddetails/HarmonyOS-BiometricAuthentication
OpenCV的人脸识别确实挺成熟的
都是开源项目确实能减少不少成本
SeetaFace2 有鸿蒙版本吗,就是已经写好BUILD.gn的版本;参照SeetaFace2 移植开发文档估计都需要写半天
已收藏
dev/third_party/SeetaFace2 · OpenHarmony-SIG/knowledge_demo_travel - 码云 - 开源中国 (gitee.com)
好活,当赏!