带你玩转OpenHarmony AI:基于Seetaface2的人脸识别
简介
随着时代的进步,全民刷脸已经成为一种新型的生活方式,这也是全球科技进步的又一阶梯,人脸识别技术已经成为一种大趋势,无论在智慧出行、智能家居、智慧办公等场景均有较广泛的应用场景,本文介绍了基于SeetaFace2人脸识别引擎在OpenAtom OpenHarmony(以下简称“OpenHarmony”)上实现人脸识别的AI能力。
什么是SeetaFace2
SeetaFace2是由中科视拓(北京)科技有限公司开发并使用BSD开源协议开源出来的一款人脸识别引擎库,其搭建了一套全自动人脸识别系统所需的三个核心模块,即:人脸检测模块FaceDetector、面部关键点定位模块 FaceLandmarker 以及人脸特征提取与比对模块FaceRecognizer。除了三个核心模块外,它还提供了两个辅助模块FaceTracker和QualityAssessor用于人脸跟踪和质量评估。下图是SeetaFace2人脸识别算法组件:
SeetaFace2能做什么
SeetaFace2采用标准C++开发,全部模块均不依赖任何第三方库,支持x86架构(Windows、Linux)和ARM架构,可以轻松地移植到OpenHarmony上。SeetaFace2支持的上层应用包括但不限于人脸门禁、无感考勤、人脸比对等。如下图展示了SeetaFace2支持的应用矩阵:
SeetaFace2人脸识别原理
SeetaFace2人脸识别引擎搭建了一套全自动人脸识别系统所需的三个核心模块:
1. 人脸检测(FaceDetector)
在图像中首先定位出人脸的位置,然后裁剪(crop)出包含人脸位置的矩形框,一般还会进行填充、缩放到指定尺寸,还可能会对人脸图像进行标准化normalize;
2. 面部关键点定位(FaceLandmarker)
提取人脸关键点坐标,然后使用放射变化或相似变换等进行人脸对齐变换。面部关键点定位的目标就是把所有的人脸图片统一到一个固定的正脸姿态大小,从而提高模型对人脸姿态变化的鲁棒性。
3. 人脸特征提取与比对模块(FaceRecognizer)
主要使用深度学习等方法提取人脸的特征,然后通过特征对比,计算人脸的相似度。
SeetaFace2人脸识别的具体过程如下图所示:
两步带你实现人脸识别
关于SeetaFace2的如何移植到OpenHarmony移植请参照文档:SeetaFace2移植开发文档(请参考文章末尾相关文档链接),这里我们主要分析通过SeetaFace2如何实现人脸识别。
从上面人脸识别的流程图可以知道人脸识别主要包含2个大块:人脸注册和人脸识别。
1. 人脸注册
人脸注册首先需要对传入的图片进行人脸检测,当检测到人脸后会提取对应的人脸信息,并将信息保存用于对比。
人脸信息检测实现:
std::vector<SeetaFaceInfo> DetectFace(const SeetaImageData &image)
{
auto faces = FD.detect(image);
return std::vector<SeetaFaceInfo>(faces.data, faces.data + faces.size);
}
其中FD是三大模块中的人脸检测模块(FaceDetector),其加载了人脸检测模型:
seeta::ModeStting FD_model("fd_2_00.dat", seeta::ModeStting::CPU, 0);
而返回SeetaFaceInfo数据则是检测到的人脸信息,其中包含了人脸个数,人脸区域坐标以及人脸置信度得分数据。然后通过人脸信息检测返回的数据进行面部关键点定位。
面部关键点定位实现:
std::vector<SeetaPointF> DetectPoints(const SeetaImageData &image, const SeetaRect &face)
{
std::vector<SeetaPointF> points(PD.number());
PD.mark(image, face, points.data());
return std::move(points);
}
其中的PD是三大模块中的关键点定位模块(FaceLandmarker),关键点定位需要根据面部特征模型进行对比分析的,SeetaFace2提供2种面部特征模型。分别是通过5点定位和通过81点定位,此实例中我们使用的是81点定位模型:
seeta::ModeStting PD_model("pd_2_00_pts81.dat", seeta::ModeStting::CPU, 0);
获取完面部特征数据后,SeetaFace2提供了一个人脸数据库进行保存对应的人脸信息数据,以此来完成人脸信息的注册:
int64_t Register(const SeetaImageData &image)
{
auto faces = DetectFace(image);
auto points = DetectPoints(image, faces.pos); return FDB.Register(image, points.data());
}
其中FDB是SeetaFace2实现的FaceDatabase数据库管理。该数据库也为人脸识别提供面部特征数据的对比结果,面部特征对比也需要一个人脸数据模型:
seeta::ModeStting FDB_model("fr_2_00.dat", seeta::ModeStting::CPU, 0);
通过以上步骤,我们就已经完成了人脸的注册。
2. 人脸识别
人脸识别和人脸注册步骤类似,都需要先检测人脸信息及提取面部特征数据。唯一的区别在于提取面部特征时需要进行人脸质量评估,最后根据质量评估结果进行识别,具体实现如下:
int64_t RecogizePoint(const SeetaImageData &image)
{
int64_t result = 0;
seeta::ModeStting FD_model("fd_2_00.dat", seeta::ModeStting::CPU, 0); // 此3步创建3个模型
seeta::ModeStting PD_model("pd_2_00_pts81.dat", seeta::ModeStting::CPU, 0);
seeta::ModeStting FDB_model("fr_2_00.dat", seeta::ModeStting::CPU, 0); seeta::FaceDetector FD(FD_model); // 创建人脸检测模块
seeta::FaceLandmarker PD(PD_model); // 创建面部关键点定位模块
seeta::FaceDatabase FDB(FDB_model); // 创建人脸特征信息数据库模块 auto faces = FD.detect(image); // 获取人脸特征信息
for (SeetaFaceInfo &face : faces) { // 对比每个人脸信息
int64_t index = -1;
float similarity = 0;
std::vector<SeetaPointF> points(PD.number());
PD.mark(image, face, points.data()); // 获取人脸框信息
auto score = QA.evaluate(image, face.pos, points.data()); // 获取人脸质量评分
if (score == 0) {
HILOGI("no ignored\r\n");
} else {
auto queried = FDB.QueryTop(image, points.data(), 1, &index, &similarity); // 从注册的人脸数据库中对比相似度
if (queried < 1) {
continue;
}
if (similarity > threshold) {
HILOGI("get recognized face!! \r\n");
result++;
}
}
} return result;
}
参考链接
OpenHarmony知识体系工作组
https://gitee.com/openharmony-sig/knowledge
SeetaFace2移植开发文档
SeetaFace2 GitHub源码地址
https://github.com/seetafaceengine/SeetaFace2
SeetaFace2 Demo样例地址
本文为技术分析文章,仅供大家学习、研讨及交流使用。如在实际应用场景中收集人脸图像,应遵守《个人信息保护法》《最高人民法院关于审理使用人脸识别技术处理个人信息相关民事案件适用法律若干问题的规定》等关于处理和保护敏感个人信息、面部生物识别信息的规定。
带你玩转OpenHarmony AI:基于Seetaface2的人脸识别的更多相关文章
- 基于node.js人脸识别之人脸对比
基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...
- 基于 OpenCV 的人脸识别
基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...
- 【计算机视觉】基于OpenCV的人脸识别
一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...
- 基于MATLAB的人脸识别算法的研究
基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...
- 基于 HTML5 的人脸识别技术
基于 HTML5 的人脸识别技术 https://github.com/auduno/headtrackr/
- 【AI图像识别一】人脸识别测试探索
****************************************************************************** 本文主要介绍AI能力平台的人脸识别技术的测 ...
- java基于OpenCV的人脸识别
基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ...
- 基于百度AI开放平台的人脸识别及语音合成
基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...
- 知物由学 | 基于DNN的人脸识别中的反欺骗机制
"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...
- 基于OpenCV的人脸识别[iOS开发笔记(2)]
开始了OpenCV的试水工作了... 1.Get ready 在OpenCV中我们会使用函数cv::CascadeClassifier 来进行人脸检测.但是在使用本函数之前我们需要添加一个XML文件对 ...
随机推荐
- python中json.dumps() 与json.dump(),json.load()与json.loads()区别?
json.dumps() 将 Python 对象转换为 JSON 字符串,并返回该字符串.而 json.dump() 将 Python 对象转换为 JSON 字符串,并将该字符串写入文件. json. ...
- For 循环跟yield区别?
for循环遍历一个万亿级别的长列表,会将这个列表的全部数据载入到内存中去,如果你的内存很小就会溢出,即使是内存很大,这个操作也是十分占用资源的. 而使用生成器,则会将数据的状态(例如:遍历到列表的哪个 ...
- Java 常用类 String的常用方法(1)
1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 import java.sql.SQLOutput; 6 impo ...
- C++入门编程----C++运算符(8)
什么是运算符 运算符是让程序执行特定的数学或逻辑操作的符号,用来表示针对数据的特定操作,也称之为操作符.C++运算符分别有算术运算符.关系运算符.逻辑运算符.赋值运算符.位运算符.移位运算符.size ...
- 【5分钟】W10 64bit系统本地安装postgresql 11
1.下载 官网下载地址 2.安装 一路默认,有一个选语言的可以选中chinese simple(中文简体). 3.初始化 1)进入bin: cd C:\Program Files\PostgreS ...
- koa 放置 前台打包dist 目录
const Koa = require('koa'); const app = new Koa() //public是指的放置前端静态资源的文件夹名称 app.use(require('koa-sta ...
- 基于python的socket通信之阿里云socket端口不通的解决方案
问题描述: 使用python脚本进行socket业务流程,前几天还可以通信很好的,今天突然发现端口不通了.那就排查端口为啥不通了呢? 方案一:设置阿里云安全组 这个网上不少例子,笔者也按照这个操作过, ...
- STM32进入HardFault_Handler的调试方法
在编写STM32程序代码时由于自己的粗心会发现有时候程序跑着跑着就进入了 HardFault_Handler中断,按照经验来说进入HardFault_Handler故障的原因主要有两个方面: 1:内存 ...
- 矢量数据库与LLM的集成:实践指南
矢量数据库与LLM的集成:实践指南 本文将了解到什么是矢量数据库,以及如何与LLMs进行集成.通过LLMs和向量数据库的结合,可以节省微调带来的开销和时间. 通常,LLM会在各种各样的数据上进行训练, ...
- x86架构的内存溢出攻击原理演示(加强对计算机运行原理的理解,说明内存溢出的危害)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...