写点什么

带你玩转 OpenHarmony AI:基于 Seetaface2 的人脸识别

  • 2022-12-21
    天津
  • 本文字数:2847 字

    阅读完需:约 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 人脸识别引擎搭建了一套全自动人脸识别系统所需的三个核心模块:


  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; }
复制代码


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开发者官方账号 2021-12-15 加入

OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展

评论

发布
暂无评论
带你玩转OpenHarmony AI:基于Seetaface2的人脸识别_OpenHarmony_OpenHarmony开发者_InfoQ写作社区