简介

随着时代的进步,全民刷脸已经成为一种新型的生活方式,这也是全球科技进步的又一阶梯,人脸识别技术已经成为一种大趋势,无论在智慧出行、智能家居、智慧办公等场景均有较广泛的应用场景,本文介绍了基于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移植开发文档

https://gitee.com/openharmony-sig/knowledge_demo_smart_home/blob/master/docs/SeetaFace2/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E5%BA%93%E7%9A%84%E7%A7%BB%E6%A4%8D.md

SeetaFace2 GitHub源码地址

https://github.com/seetafaceengine/SeetaFace2

SeetaFace2 Demo样例地址

https://gitee.com/openharmony-sig/knowledge_demo_travel/tree/master/docs/FaceRecognition_CXX/README.md

本文为技术分析文章,仅供大家学习、研讨及交流使用。如在实际应用场景中收集人脸图像,应遵守《个人信息保护法》《最高人民法院关于审理使用人脸识别技术处理个人信息相关民事案件适用法律若干问题的规定》等关于处理和保护敏感个人信息、面部生物识别信息的规定。

带你玩转OpenHarmony AI:基于Seetaface2的人脸识别的更多相关文章

  1. 基于node.js人脸识别之人脸对比

    基于node.js人脸识别之人脸对比 Node.js简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  2. 基于 OpenCV 的人脸识别

    基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...

  3. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  4. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  5. 基于 HTML5 的人脸识别技术

    基于 HTML5 的人脸识别技术 https://github.com/auduno/headtrackr/

  6. 【AI图像识别一】人脸识别测试探索

    ****************************************************************************** 本文主要介绍AI能力平台的人脸识别技术的测 ...

  7. java基于OpenCV的人脸识别

    基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ...

  8. 基于百度AI开放平台的人脸识别及语音合成

    基于百度AI的人脸识别及语音合成课题 课题需求 (1)人脸识别 在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄.性别.颜 ...

  9. 知物由学 | 基于DNN的人脸识别中的反欺骗机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  10. 基于OpenCV的人脸识别[iOS开发笔记(2)]

    开始了OpenCV的试水工作了... 1.Get ready 在OpenCV中我们会使用函数cv::CascadeClassifier 来进行人脸检测.但是在使用本函数之前我们需要添加一个XML文件对 ...

随机推荐

  1. 高效的PDF文字提取技术

    无论是行政法规.学术论文还是企业合同,PDF文档为我们提供了一种便捷.稳定的信息传递方式.然而,从PDF文件中提取文本信息对于数据分析.内容编辑等后续处理来说至关重要. PDF文本提取技术是一种可以从 ...

  2. Vue 之 new vue({})与export default {} 的区别

    刚入门 vue 的,可能会有这样的困惑:什么时候用new vue({}),什么时候用export default {} 呢? 比如,我们在用 cli 创建项目时 在 main.js 入口里面用的时ne ...

  3. Redis灵魂11问

    目录 说说redis都有哪些数据类型吧 Redis为什么快呢? 那为什么Redis6.0之后又改用多线程呢? 知道什么是热key吗?热key问题怎么解决? 什么是缓存击穿.缓存穿透.缓存雪崩? 缓存击 ...

  4. 【Azure Developer】使用Key Vault的过程中遇见的AAD 认证错误

    在使用应用程序访问Key Vault获取密钥信息时,现后遇见了多种认证错误.使用的代码为: String keyVaultUrl = "https://test-xxx.vault.azur ...

  5. 揭秘可视化图探索工具 NebulaGraph Explore 是如何实现图计算的

    前言 在可视化图探索工具 NebulaGraph Explorer 3.1.0 版本中加入了图计算工作流功能,针对 NebulaGraph 提供了图计算的能力,同时可以利用工作流的 nGQL 运行能力 ...

  6. BeanShell Sampler 前置处理器

    一概念: 前置处理器主要作用: 用于修改即将发送的http的请求数据 BeanShell预处理器可以在取样器发送请求之前被执行,可以通过它完成发送请求所需的数据 其中的ctx.vars.props.p ...

  7. C++ Qt开发:运用QThread多线程组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QTh ...

  8. 苹果AppleMacOs系统Sonoma本地部署无内容审查(NSFW)大语言量化模型Causallm

    最近Mac系统在运行大语言模型(LLMs)方面的性能已经得到了显著提升,尤其是随着苹果M系列芯片的不断迭代,本次我们在最新的MacOs系统Sonoma中本地部署无内容审查大语言量化模型Causallm ...

  9. 统一身份认证系统 OpenLDAP 完整部署

    0)LDAP 介绍 LDAP 是什么?在那些地方用会用到 LDAP? LDAP英文名称:Lightweight Directory Access Protocol 轻型目录访问协议. 常用在单点登录, ...

  10. Python面向对象之多态和鸭子类型

    [一]多态 [1]什么是多态 多态指的是一类事物有多种形态 [2]示例 比如动物有多种形态:猫.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): ...