SeetaFace6人脸特征提取与对比C++代码实现Demo

        SeetaFace6包含人脸识别的基本能力:人脸检测、关键点定位、人脸识别,同时增加了活体检测、质量评估、年龄性别估计,并且顺应实际应用需求,开放口罩检测以及口罩佩戴场景下的人脸识别模型。

        官网地址:https://github.com/SeetaFace6Open/index

1. 概述

        人脸特征提取与对比,就是将待识别的人脸经过处理变成二进制数据的特征,然后基于特征表示的人脸进行相似度计算,最终与相似度阈值对比,一般超过阈值就认为特征表示的人脸是同一个人。

        为了应对不同级别的应用需求,SeetaFace6将开放三个版本模型:

文件名

特征长度

建议阈值

说明

face_recognizer.csta

1024

0.62

通用场景高精度人脸识别

face_recognizer_mask.csta

512

0.48

带口罩人脸识别模型

face_recognizer_light.csta

512

0.55

轻量级人脸识别模型

        需要注意的是,不同模型提取的特征是不具备可比较性的,哪怕特征一样。如果在正在运行的系统替换了识别模型的话,所有底库照片全部需要重新提取特征再进行比较才行。

2. 人脸特征提取

        首先构造人脸识别器:

#include <seeta/FaceRecognizer.h>
seeta::FaceRecognizer *new_fr() {
    seeta::ModelSetting setting;
    setting.append("face_recognizer.csta");
    return new seeta::FaceRecognizer(setting);
}

        特征提取过程可以分为两个步骤:

  1. 根据人脸5个关键点裁剪出人脸区域
  2. 人脸区域输入特征提取网络提取特征。

        两个步骤分别对应seeta::FaceRecognizerCropFaceV2ExtractCroppedFace

        特征长度是不同模型可能不同的,要使用GetExtractFeatureSize方法获取当前使用模型提取的特征长度。

#include <seeta/FaceRecognizer.h>
#include <memory>
std::shared_ptr<float> extract_v2(
        seeta::FaceRecognizer *fr,
        const SeetaImageData &image,
        const std::vector<SeetaPointF> &points) 
{
    std::shared_ptr<float> features(new float[fr->GetExtractFeatureSize()],std::default_delete<float[]>());
    seeta::ImageData face = fr->CropFaceV2(image, points.data());
    fr->ExtractCroppedFace(face, features.get());
    return features;
}

3. 人脸特征对比

        人脸特征对比就是计算两个特征的相似度,相似度的范围是[0, 1]

#include <seeta/FaceRecognizer.h>
#include <memory>float compare(seeta::FaceRecognizer *fr,
        const std::shared_ptr<float> &feat1,
        const std::shared_ptr<float> &feat2) 
{
    return fr->CalculateSimilarity(feat1.get(), feat2.get());
}

4. 关于相似度和阈值

        阈值起到的作用就是给出识别结果是否是同一个人的评判标准。如果两个特征的相似度超过阈值,则认为两个特征所代表的人脸就是同一个人。

        因此该阈值和对应判断的相似度,是算法统计是否一个人的评判标准,并不等同于自然语义下的人脸的相似度。这样表述可能比较抽象,说个具体的例子就是,相似度0.5,在阈值是0.49的时候,就表示识别结果就是一个人,这个相似度也不表示两个人脸有一半长的一样。同理相似度100%,也不表示两个人脸完全一样,连岁月的痕迹也没有留下。

        识别算法直接给出来的相似度如果脱离阈值就没有意义。识别算法的性能好不好,主要看其给出的不同样本之间的相似度有没有区分性,能够用阈值将正例和负例样本区分开来。

        这里对一种错误的测试方式给出说明。经常有人提出问题,A算法比B算法效果差,原因是拿两张照片,是同一个人,A算法给出的相似度比B算法给出的低。但是经过上述讨论,希望读者能够明白这种精度测试方式的片面性。

5. 关于1比1和1比N

        一般的人脸识别应用,我们都可以这样去区分,1比1和1比N。

        一般的1比1识别,狭义上讲就是人证对比,使用读卡器从身份证,或者其他介质上读取到一张照片,然后和现场抓拍到的照片做对比。这种一般是做认证的场景,用来判别证件、或者其他凭证方式是否是本人在进行操作。因此广义上来讲,员工刷工卡,然后刷脸认证;个人账户进行刷脸代替密码;这种知道待识别人员身份,然后进行现场认证的方式,都可以属于1比1识别的范畴。一般的1比1识别,狭义上讲就是人证对比,使用读卡器从身份证,或者其他介质上读取到一张照片,然后和现场抓拍到的照片做对比。这种一般是做认证的场景,用来判别证件、或者其他凭证方式是否是本人在进行操作。因此广义上来讲,员工刷工卡,然后刷脸认证;个人账户进行刷脸代替密码;这种知道待识别人员身份,然后进行现场认证的方式,都可以属于1比1识别的范畴。

        1比N识别与1比1区别在于,对于现场待识别的人脸,不知道其身份,需要在一个底库中去查询,如果在底库中给出对应识别结果,如果不在底库中,报告未识别。

        1比N识别从接口调用上来说,首先需要将底库中的人脸全部提取特征,然后,对现场抓拍到的待识别人脸提取特征,最终使用特征与底库中的特征进行比较选出相似度最高的人脸,这时相似度若超过阈值,则认为识别成功,反之待识别人员不在底库。而常见的1比N识别就是摄像头下的动态人脸识别。

6. 演示Demo

6.1 开发环境

  •   - Windows 10 Pro x64
  •   - Visual Studio 2015
  •   - Seetaface6
  •   - Sqlite

6.2 功能介绍

        演示程序主界面如下图所示,包括人脸注册、人脸1:1验证、人脸1:N辨识、数据库信息、删除和清空等操作。

        (1)人脸注册

        输入用户ID,读取一张人脸图片,进行人脸检测、特征提取;左侧显示读取的人脸图片,右侧显示注册成功的人脸图片,并保存人脸特征到sqlite数据库。

        (2)人脸1:1验证

        输入用户ID,检测该用户ID是否已注册;如果已注册,读取一张人脸图片,进行人脸检测和特征提取,并与数据库中存储的该ID人脸特征进行比对;比对结果显示左下角,左上显示读取的人脸图片,右下显示已注册的人脸图片。

        (3)人脸1:N辨识

        读取一张人脸图片,进行人脸检测和特征提取,并与数据库中存储的每个人脸特征依次进行比对;比对结果显示左下角,左上显示读取的人脸图片,右下显示已辨识到的人脸图片。

        (4)数据库信息

        单击“数据库信息”,左下角将显示数据库的记录数,以及用户ID。

        (5)删除

        单击“删除”,根据输入用户ID,进行记录删除。

        (6)清空

        单击“清空”,删除数据库中所有记录。

6.3 下载地址

        开发环境:

  • Windows 10 pro x64
  • Visual Studio 2015
  • Seetaface6
  • Sqlite

        下载地址:SeetaFace6人脸特征提取与对比C++代码实现Demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/615945.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hive Transaction事务表(含实现原理)

Hive Transaction事务表 在Hive中&#xff0c;事务表&#xff08;Transactional Tables&#xff09;允许用户执行事务性操作&#xff0c;包括ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性。事务表是在Hive 0.14版本引入的&#xff0c;并且在后续版本中不断…

conan2 基础入门(05)-(静态库动态库)(DebugRelease)

conan2 基础入门(05)-(静态库&动态库)(Debug&Release) 文章目录 conan2 基础入门(05)-(静态库&动态库)(Debug&Release)⭐准备预备文件和Code ⭐静态库&动态库静态库动态库 ⭐Debug&ReleaseReleaseDebug END视频教学settings.yml ⭐准备 本文均在windo…

以太ETH链市值机器人

在数字资产交易市场的浪潮中&#xff0c;如何高效地管理市值、提升交易流动性并保障资金安全&#xff0c;一直是交易所和项目方关注的焦点。市值管理机器人飞机//aishutuyu以太ETH链市值机器人凭借其卓越的功能和强大的安全保障&#xff0c;为数字资产交易市场带来了革命性的变…

GeoServer安装以及部署

GeoServer介绍 GeoServer是一个开源的服务器软件&#xff0c;用于共享和编辑地理空间数据。它支持多种地理空间数据格式&#xff0c;并且可以发布为多种服务格式&#xff0c;如Web Feature Service (WFS)、Web Map Service (WMS)、Web Coverage Service (WCS)&#xff0c;以及…

十天学会单片机可能吗?单片机入门需要多久?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 十天学“会”单片机&#xf…

前后端完全开源!功能丰富的在线教室项目:Agora Flat

Agora Flat&#xff1a;高效集成的在线教室解决方案&#xff0c;重塑互动学习新体验。- 精选真开源&#xff0c;释放新价值。 概览 Agora Flat是在GitHub平台上公开分享的一个全面开源项目&#xff0c;它精心设计为一个高性能的在线教室解决方案&#xff0c;旨在便捷地搭建支持…

Python装饰器带括号和不带括号的理解

装饰器是 Python 中一个强大且灵活的特性&#xff0c;允许用户在不修改原有函数或类定义的基础上&#xff0c;为其增加额外功能。 今天在尝试自定义 Python 装饰器的时候遇到了一个问题&#xff0c;因为以前一直是使用装饰器&#xff0c;基本没有自定义过装饰器&#xff0c;所…

KEIL declaration may not appear after executable statement in block

KEIL declaration may not appear after executable statement in block 这个问题也是比较经典&#xff0c;就是不允许你的变量定义位置不允许在下边的代码区域&#xff0c;只允许在最上方 ‍ 修改编码模式为C99解决 ‍ ​​

机器学习周报第41周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 背景1.3 论文方法1.3.1 局部特征提取1.3.2 局部特征转换器 (LoFTR) 模块1.3.4 建立粗粒度匹配1.3.5 精细匹配 1.4 损失1.5 实现细节1.6 实验1.6.1 单应性估计1.6.2 相对位姿估计 二、论文代码总结 摘要 本周阅读了一篇特征匹配领域的…

Git团队协作机制

Git 团队协作机制 1.团队内协作 小故事&#xff1a;岳不群手里有华山剑法但是不完整&#xff0c;需要弟子令狐冲进行完善&#xff0c;岳不群将华山剑法推送&#xff08;push&#xff09;到代码托管中心&#xff0c;这样岳不群就有属于自己的远程库&#xff0c;令狐冲从远程库…

思通数科大模型在智能数据查询系统中的深度应用:销售数据分析的革新

在企业决策支持系统中&#xff0c;销售数据分析占据着举足轻重的地位。思通数科的大模型技术&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;和机器学习&#xff0c;为智能数据查询系统提供了强大的分析能力。本文将详细描述思通数科大模型在销售数据分析中的应用&am…

异常检测的学习和实战

1.应用&#xff1a; 1.在工业上的应用 当检测设备是否处于异常工作状态时&#xff0c;可以由上图分析得到&#xff1a;那些零散的点对应的数据是异常数据。因为设备大多数时候都是处于正常工作状态的&#xff0c;所以数据点应该比较密集地集中在一个范围内&#xff0c;而那些明…

Excel快速填充序号的方法

Excel快速填充序号常用的方法。 方法一&#xff1a;填充前面序号后拖拽 特点&#xff1a; 能有规律的填充&#xff0c;排序的行数由拖拽的行数决定。 此方法填充的序号等效于手打的序号&#xff0c;删除一行后下一行不会自动更新排序。 步骤&#xff1a;输入两个初始序号&…

Spring Cloud | “微服务“ 架构 与 Spring Cloud

“微服务” 架构 与 Spring Cloud 目录: "微服务" 架构 与 Spring Cloud1. 认识架构"单体" 架构"SOA" 架构"微服务" 架构 2. "微服务架构" 的功能 :① 微服务架构的 "自动化部署"② 服务 "集中化管理"③…

SpringBoot 使用logback(多环境配置)

Logback是由log4j创始人设计的又一个开源日志组件。可用于项目日志功能。官网地址 第1步&#xff1a;添加坐标依赖 <!--logback--> <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version…

ESP-01S刷固件ESP8266_NonOS_AT_Bin_V1.7.5_1 笔记240510

ESP-01S刷固件ESP8266_NonOS_AT_Bin_V1.7.5_1 笔记240510 固件下载地址 ESP-AT固件页面: https://www.espressif.com.cn/zh-hans/products/sdks/esp-at/resource 直接下载ESP8266 NonOS AT Bin V1.7.5.zip: https://www.espressif.com.cn/sites/default/files/ap/ESP8266_No…

Baidu Comate:释放编码潜能,革新软件开发

Baidu Comate Baidu Comate&#xff0c;智能代码助手&#xff0c;凭借着文心大模型的强大支撑&#xff0c;结合了百度多年的编程实战数据和丰富的开源资源&#xff0c;形成了一款崭新的编码辅助利器。它不仅具备着高智能、多场景、价值创造的特质&#xff0c;更可广泛应用于各…

sklearn之线性回归——以上证红利指数为例

文章目录 线性回归概念使用sklearn实现上证中立指数预测内置数据集的加载与处理 外部数据集的加载和处理数据内容数据加载和处理 开始预测分割数据集导入线性回归模型查看线性回归模型的系数绘制预测结果预测效果评估 最终代码 线性回归 线性回归&#xff08;Linear Regressio…

flutter开发实战-人脸识别相机使用

flutter开发实战-人脸识别相机使用 当需要拍摄的时候&#xff0c;需要检测到人脸再进行后续的操作&#xff0c;这里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 检测人脸face_camera: ^0.0.8iOS端需要设置相关权限 在info.plist文件中&…

数据库出现死锁的解决方法参考

死锁引起的原因一般是多个用户并发访问数据库导致的问题&#xff0c;或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…