共计 3580 个字符,预计需要花费 9 分钟才能阅读完成。
简介
随着时代的提高,全民刷脸曾经成为一种新型的生存形式,这也是寰球科技进步的又一阶梯,人脸识别技术曾经成为一种大趋势,无论在智慧出行、智能家居、智慧办公等场景均有较宽泛的利用场景,本文介绍了基于 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 人脸识别引擎搭建了一套全自动人脸识别零碎所需的三个外围模块:
- 人脸检测 (FaceDetector)
在图像中首先定位出人脸的地位,而后裁剪 (crop) 出蕴含人脸地位的矩形框,个别还会进行填充、缩放到指定尺寸,还可能会对人脸图像进行标准化 normalize; - 面部关键点定位 (FaceLandmarker)
提取人脸关键点坐标,而后应用喷射变动或类似变换等进行人脸对齐变换。面部关键点定位的指标就是把所有的人脸图片对立到一个固定的正脸姿势大小,从而进步模型对人脸姿势变动的鲁棒性。 - 人脸特征提取与比对模块 (FaceRecognizer)
次要应用深度学习等办法提取人脸的特色,而后通过特色比照,计算人脸的类似度。SeetaFace2 人脸识别的具体过程如下图所示:
两步带你实现人脸识别
对于 SeetaFace2 的如何移植到 OpenHarmony 移植请参照文档:SeetaFace2 移植开发文档(请参考文章开端相干文档链接),这里咱们次要剖析通过 SeetaFace2 如何实现人脸识别。
从下面人脸识别的流程图能够晓得人脸识别次要蕴含 2 个大块:人脸注册和人脸识别。
- 人脸注册
人脸注册首先须要对传入的图片进行人脸检测,当检测到人脸后会提取对应的人脸信息,并将信息保留用于比照。
人脸信息检测实现:
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);
通过以上步骤,咱们就曾经实现了人脸的注册。
-
人脸识别
人脸识别和人脸注册步骤相似,都须要先检测人脸信息及提取面部特色数据。惟一的区别在于提取面部特色时须要进行人脸品质评估,最初依据品质评估后果进行辨认,具体实现如下: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…
SeetaFace2 移植开发文档 https://gitee.com/openharmony…
SeetaFace2 GitHub 源码地址 https://github.com/seetafacee…
SeetaFace2SeetaFace2 Demo 样例地址 https://gitee.com/openharmony…
本文为技术剖析文章,仅供大家学习、研究及交换应用。如在理论利用场景中收集人脸图像,应恪守《个人信息保护法》《最高人民法院对于审理应用人脸识别技术解决个人信息相干民事案件适用法律若干问题的规定》等对于解决和爱护敏感个人信息、面部生物辨认信息的规定。