人脸识别face-api.js应用简介

前阵子学习了一下face-api.js ,偶有心得,跟大家分享一下。
face-api.js的原始项目是https://github.com/justadudewhohacks/face-api.js ,最后一个release是2020年3月22日的0.22.2版,组件较老,API文档很全,很适合开发参考。另有一位大佬的分支 https://github.com/vladmandic/face-api ,最近的release是2023年6月13日的1.7.12,组件较新,适合拿来使用。
在这里插入图片描述

face-api.js的人脸识别是基于对68个人脸特征点的检测来实现的,看得出来这个是基于二维图片识别来标识人脸的,可以在图片,视频中识别。跟咱们现在经常接触到的活体识别、3D结构光识别比可能要弱一些,不过胜在开源免费,也方便直接使用,在一些对人脸识别要求不高的场景,可以较好的应用。
vladmandic/face-api的release里包含demo,稍作修改就可以放在自己的项目里使用。比如webcam.js里,就有在浏览器中调用摄像头识别视频中人脸的方法。
具体怎么玩,可以这样弄下:
在后端定义一个人脸特征库 faces.json,格式如下:
[
{
uid:uid1,
descriptors:[
base64String1,
base64String2,

]
},
{
uid:uid2,
descriptors:[
base64String3,
base64String4,

]
}

]
一个用户可以登记一次或多次人脸特征(可以在自己的项目里自行限制),为了便与保存文件和网络传输,特征采用base64编码的字符串。其实face-api.js采集出来的人脸特征是一个Float32Array,包含128个浮点数。
人脸注册,前端可以用下面这段:

  faceapi
    .detectSingleFace(video, optionsSSDMobileNet)
    .withFaceLandmarks()
	.withFaceDescriptor()
	.then((result) => {
		if (result) {
			fetch2s_reg(result.descriptor,userid).then({...});//将用户与特征绑定信息传到后端
			return true;
			}
		else {
 	     const fps = 1000 / (performance.now() - t0);
    	 requestAnimationFrame(() => detectVideo(video, canvas));
      	 return true;
      	}
    })

人脸识别,前端可以用下面这段:

  faceapi
    .detectSingleFace(video, optionsSSDMobileNet)
    .withFaceLandmarks()
	.withFaceDescriptor()
	.then((result) => {
		if (result) {
			fetch2s_rec(result.descriptor).then({...});//将特征信息传到后端,后端进行匹配后返回前端结果
			return true;
			}
		else {
 	     const fps = 1000 / (performance.now() - t0);
    	 requestAnimationFrame(() => detectVideo(video, canvas));
      	 return true;
      	}
    })

前文介绍过一种后端可以向一个可信任前端调用的方法,在这里可以用一下。
可信任前端可以用于人脸识别匹配检查。浏览器访问它,将执行连接后端websocket,获取当前人脸库,创建人脸匹配器;每次后端收到新的人脸绑定信息后,也会更新人脸库,并将人脸库更新也传到这个可行前端,它重新创建人脸匹配器(根据已有的文档资料,发现只能根据全量人脸库,创建人脸匹配器,无法增量更新)

let labeledDescriptors = [
  new faceapi.LabeledFaceDescriptors(
    'obama',
    [descriptorObama1, descriptorObama2]
  ),
  new faceapi.LabeledFaceDescriptors(
    'trump',
    [descriptorTrump]
  )
]
faceMatcher = new faceapi.FaceMatcher(labeledDescriptors)

人脸识别,其实调用很简单:

let bestMatch = faceMatcher.findBestMatch(descriptor)

拿人脸匹配器根据输入参数人脸特征,返回最佳匹配结果和差异度。
匹配是找出与目标特征值欧几里得距离最小的特征值,以及这个最小值的大小。
其他注意要点:JS前端到nodejs后端,人脸特征float32array可以fetch方式传arraybuffer数据,uid可以放到header里传出;后端nodejs收到arraybuffer的float32array数组,直接转base64编码,更新内存中的人脸库json数组中,并通过websocket发送到可信前端以更新人脸匹配器,关于保存到json文件,不用每次更新都写入,可以定义一个接口,按请求来写入。可信前端需要处理获取人脸库,将base64编码的字符串还原位float32array的人脸特征,然后创建人脸匹配器;以及执行人脸匹配检查。

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

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

相关文章

DS线性表之单链表的讲解和实现(2)

文章目录 前言一、链表的概念二、链表的分类三、链表的结构四、前置知识准备五、单链表的模拟实现定义头节点初始化单链表销毁单链表打印单链表申请节点头插数据尾插数据头删数据尾删数据查询数据在pos位置之后插入数据删除pos位置之后的数据 总结 前言 本篇的单链表完全来说是…

高性能计算应用优化实践之VASP

VASP简介 VASP是最常见的第一性原理计算软件之一。第一性原理计算是基于密度泛函理论,通过选择合适的交换关联赝势(GGA或LDA),然后基于迭代方法自洽求解Kohn-Sham方程,直到所求出的新的电荷密度与输入的电荷密度在收敛判据范围内&#xff0c…

Python酷库之旅-第三方库Pandas(145)

目录 一、用法精讲 656、pandas.Timestamp.resolution属性 656-1、语法 656-2、参数 656-3、功能 656-4、返回值 656-5、说明 656-6、用法 656-6-1、数据准备 656-6-2、代码示例 656-6-3、结果输出 657、pandas.Timestamp.second属性 657-1、语法 657-2、参数 6…

JAVA开发中SpringMVC框架的使用及常见的404问题原因以及SpringMVC框架基于注解的开发实例

一、JAVA开发中SpringMVC框架的使用及常见的404问题原因 使用SpringMVC建立一个web项目,在IDEA中file->new->project建立一个空项目project。不用选择create from archetype从模板创建。然后在项目的pom.xml中添加公共的依赖包括org.springframework&#xff…

YOLO11改进|卷积篇|引入空间通道重组卷积ScConv

目录 一、【SCConv】卷积1.1【SCConv】卷积介绍1.2【SCConv】核心代码 二、添加【SCConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SCConv】卷积 1.1【SCConv】卷积介绍 SCConv 模块提供了一种新的视角来看待CNNs的特征提取…

如何通过钢筋计来优化施工安全

在现代建筑工程中,施工安全一直是首要关注的问题。特别是在高层建筑、桥梁和地下工程等复杂结构中,确保钢筋的正确安装和稳定性能,直接关系到工程的整体安全性和耐久性。钢筋计作为一种专门用于测量和监测钢筋应力和应变的设备,其…

4.人员管理模块(开始预备工作)——帝可得管理系统

目录 前言一、需求分析1.页面原型2.创建SQL 二、使用若依框架生成前后端代码1.添加目录菜单2.添加数据字典3.配置代码生成信息4.下载代码并导入项目5.快速导入方法 三、 总结 前言 提示:本篇讲解人员管理模块的开发的预备工作,包括需求分析、生成代码、…

DockerCompose 启动 open-match

背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架,已有多家游戏厂商在生产环境使用,官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力,但是UOS目前不支持自建的Dedicated servers 集群&#x…

grpc的python使用

RPC 什么是 RPC ? RPC(Remote Procedure Call)远程过程调用,是一种计算机通信协议,允许一个程序(客户端)通过网络向另一个程序(服务器)请求服务,而无需了解…

【Matlab】Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表

Matlab 导入数据.csv或者.xlsx文件,然后使用这些数据来绘制图表 初始数据 filename C:\Users\jia\Desktop\yadian\data\1Hz 2024_09_12 17_10_06.csv; 代码: clc;clear close all; % 读取Excel文件 filename C:\Users\jia\Desktop\yadian\data\1Hz …

【EXCEL数据处理】保姆级教程 000016案例 EXCEL的vlookup函数。

【EXCEL数据处理】000016案例 vlookup函数。 前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】保姆级教…

Flutter包管理(三)

1、作用 在APP的实际开发过程中往往会依赖很多包,而这些包之间存在着交叉依赖、版本依赖,由开发者自己管理手动管理会非常麻烦,每种开发生态或编程官方会提供一些包的管理工具,在Flutter中我们在pubspec.yaml文件中来管理第三方依…

机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+

时间序列在回归预测的领域的重要性,不言而喻,在数学建模中使用及其频繁,但是你真的了解ARIMA、AR、MA么?ACF图你会看么?? 时间序列数据如何构造???,我打过不少…

GS-SLAM论文阅读笔记-MGSO

前言 MGSO首字母缩略词是直接稀疏里程计(DSO),我们建立的光度SLAM系统和高斯飞溅(GS)的混合。这应该是第一个前端用DSO的高斯SLAM,不知道这个系统的组合能不能打得过ORB-SLAM3,以及对DSO会做出怎么样的改进以适应高斯地图,接下来…

Android一个APP里面最少有几个线程

Android一个APP里面最少有几个线程 参考 https://www.jianshu.com/p/92bff8d6282f https://www.jianshu.com/p/8a820d93c6aa 线程查看 Android一个进程里面最少包含5个线程,分别为: main线程(主线程)FinalizerDaemon线程 终结者守护线程…

Golang | Leetcode Golang题解之第462题最小操作次数使数组元素相等II

题目&#xff1a; 题解&#xff1a; func partition(a []int, l, r int) int {x : a[r]i : l - 1for j : l; j < r; j {if a[j] < x {ia[i], a[j] a[j], a[i]}}a[i1], a[r] a[r], a[i1]return i 1 }func randomPartition(a []int, l, r int) int {i : rand.Intn(r-l1…

Android车载——VehicleHal运行流程(Android 11)

1 概述 本篇主要讲解VehicleHal的主要运行流程&#xff0c;包括设置属性、获取属性、订阅属性、取消订阅、持续上报属性订阅等。 2 获取属性流程 2.1 获取属性流程源码分析 作为服务注册到hwServiceManager中的类是VehicleHalManager&#xff0c;所以&#xff0c;CarServic…

【Qt】控件概述(2)—— 按钮类控件

控件概述&#xff08;2&#xff09; 1. PushButton2. RadioButton——单选按钮2.1 使用2.2 区分信号 clicked&#xff0c;clicked(bool)&#xff0c;pressed&#xff0c;released&#xff0c;toggled(bool)2.3 QButtonGroup分组 3. CheckBox——复选按钮 1. PushButton QPushB…

简单粗暴理解GNN、GCN、GAT

GNN 思想&#xff1a;近朱者赤近墨者黑 GNN的流程&#xff1a; 聚合&#xff08;把邻居的信息贴到自己身上来&#xff0c;作为它自己特征的补足&#xff09;更新循环&#xff08;为什么要多次&#xff1f;看以下例子&#xff09; GNN能干嘛&#xff1f; 1.结点分类&#xf…

动态规划lc

先找到规律&#xff0c;然后找边界情况&#xff1b;部分特殊情况分类讨论 *递归 70.爬楼梯 简单 提示 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a…