SpringBoot+SeetaFace6搭建人脸识别平台
前言
最近多个项目需要接入人脸识别功能,之前的方案是使用百度云api集成,但是后续部分项目是内网部署及使用,考虑到接入复杂程度及收费等多种因素,决定参考开源方案自己搭建,保证服务的稳定性与可靠性
项目地址:https://gitee.com/code2roc/fastface
设计
经过检索对别多个方案后,使用了基于seetaface6+springboot的方式进行搭建,能够无缝接入应用
seetaface6是中科视拓最新开源的商业正式版本,包含人脸识别的基本能力:人脸检测、关键点定位、人脸识别,同时增加了活体检测、质量评估、年龄性别估计
官网地址:https://github.com/SeetaFace6Open/index
使用对接的sdk是tracy100大神的封装,支持 jdk8-jdk14,支持windows和Linux,无需考虑部署问题,直接使用jar包实现业务即可,内部同时封装了bean对象spring能够开箱即用
官网地址:https://github.com/tracy100/seetaface6SDK
系统目标实现人脸注册,人脸比对,人脸查找基础功能即可
实现
引用jar包
<dependency><groupId>com.seeta.sdk</groupId><artifactId>seeta-sdk-platform</artifactId><scope>system</scope><version>1.2.1</version><systemPath>${project.basedir}/lib/seetaface.jar</systemPath></dependency>
bean对象注册
FaceDetectorProxy为人脸检测bean,能够检测图像中是否有人脸
FaceRecognizerProxy为人脸比对bean,能够比对两张人脸的相似度
FaceLandmarkerProxy为人脸关键点bean,能够检测人脸的关键点,支持5个点和68个点
@Configuration
public class FaceConfig {@Value("${face.modelPath}")private String modelPath;@Beanpublic FaceDetectorProxy faceDetector() throws FileNotFoundException {SeetaConfSetting detectorPoolSetting = new SeetaConfSetting(new SeetaModelSetting(0, new String[]{modelPath + File.separator + "face_detector.csta"}, SeetaDevice.SEETA_DEVICE_CPU));FaceDetectorProxy faceDetectorProxy = new FaceDetectorProxy(detectorPoolSetting);return faceDetectorProxy;}@Beanpublic FaceRecognizerProxy faceRecognizer() throws FileNotFoundException {SeetaConfSetting detectorPoolSetting = new SeetaConfSetting(new SeetaModelSetting(0, new String[]{modelPath + File.separator + "face_recognizer.csta"}, SeetaDevice.SEETA_DEVICE_CPU));FaceRecognizerProxy faceRecognizerProxy = new FaceRecognizerProxy(detectorPoolSetting);return faceRecognizerProxy;}@Beanpublic FaceLandmarkerProxy faceLandmarker() throws FileNotFoundException {SeetaConfSetting detectorPoolSetting = new SeetaConfSetting(new SeetaModelSetting(0, new String[]{modelPath + File.separator + "face_landmarker_pts5.csta"}, SeetaDevice.SEETA_DEVICE_CPU));FaceLandmarkerProxy faceLandmarkerProxy = new FaceLandmarkerProxy(detectorPoolSetting);return faceLandmarkerProxy;}
}
在使用相关bean对象时,需要进行library的本地注册,指定cpu还是gpu模式
LoadNativeCore.LOAD_NATIVE(SeetaDevice.SEETA_DEVICE_CPU)
人脸检测
public FaceEnum.CheckImageFaceStatus getFace(BufferedImage image) throws Exception {SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);SeetaRect[] detects = faceDetectorProxy.detect(imageData);if (detects.length == 0) {return FaceEnum.CheckImageFaceStatus.NoFace;} else if (detects.length == 1) {return FaceEnum.CheckImageFaceStatus.OneFace;} else {return FaceEnum.CheckImageFaceStatus.MoreFace;}}
人脸比对
public FaceEnum.CompareImageFaceStatus compareFace(BufferedImage source, BufferedImage compare) throws Exception {float[] sourceFeature = extract(source);float[] compareFeature = extract(compare);if (sourceFeature != null && compareFeature != null) {float calculateSimilarity = faceRecognizerProxy.calculateSimilarity(sourceFeature, compareFeature);System.out.printf("相似度:%f\n", calculateSimilarity);if (calculateSimilarity >= CHECK_SIM) {return FaceEnum.CompareImageFaceStatus.Same;} else {return FaceEnum.CompareImageFaceStatus.Different;}} else {return FaceEnum.CompareImageFaceStatus.LostFace;}}
人脸关键点
private float[] extract(BufferedImage image) throws Exception {SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);SeetaRect[] detects = faceDetectorProxy.detect(imageData);if (detects.length > 0) {SeetaPointF[] pointFS = faceLandmarkerProxy.mark(imageData, detects[0]);float[] features = faceRecognizerProxy.extract(imageData, pointFS);return features;}return null;}
人脸数据库
- 注册
public long registFace(BufferedImage image) throws Exception {long result = -1;SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);SeetaRect[] detects = faceDetectorProxy.detect(imageData);if (detects.length > 0) {SeetaPointF[] pointFS = faceLandmarkerProxy.mark(imageData, detects[0]);result = faceDatabase.Register(imageData, pointFS);faceDatabase.Save(dataBasePath);}return result;}
- 查找
public long queryFace(BufferedImage image) throws Exception {long result = -1;SeetaImageData imageData = SeetafaceUtil.toSeetaImageData(image);SeetaRect[] detects = faceDetectorProxy.detect(imageData);if (detects.length > 0) {SeetaPointF[] pointFS = faceLandmarkerProxy.mark(imageData, detects[0]);long[] index = new long[1];float[] sim = new float[1];result = faceDatabase.QueryTop(imageData, pointFS, 1, index, sim);if (result > 0) {float similarity = sim[0];if (similarity >= CHECK_SIM) {result = index[0];} else {result = -1;}}}return result;}
- 删除
public long deleteFace(long index) throws Exception {long result = faceDatabase.Delete(index);faceDatabase.Save(dataBasePath);return result;}
拓展
集成了face-api.js,实现简单的张张嘴,摇摇头活体检测,精确度不是很高,作为一个参考选项
官网地址:https://github.com/justadudewhohacks/face-api.js
加载模型
Promise.all([faceapi.loadFaceDetectionModel('models'),faceapi.loadFaceLandmarkModel('models')]).then(startAnalysis);function startAnalysis() {console.log('模型加载成功!');var canvas1 = faceapi.createCanvasFromMedia(document.getElementById('showImg'))faceapi.detectSingleFace(canvas1).then((detection) => {if (detection) {faceapi.detectFaceLandmarks(canvas1).then((landmarks) => {console.log('模型预热调用成功!');})}})}
打开摄像头
<video id="video" muted playsinline></video>function AnalysisFaceOnline() {var videoElement = document.getElementById('video');// 检查浏览器是否支持getUserMedia APIif (navigator.mediaDevices.getUserMedia) {navigator.mediaDevices.getUserMedia({ video: { facingMode: "user" } }) // 请求视频流.then(function(stream) {videoElement.srcObject = stream; // 将视频流设置到<video>元素videoElement.play();}).catch(function(err) {console.error("获取摄像头错误:", err); // 处理错误});} else {console.error("您的浏览器不支持getUserMedia API");}}
捕捉帧计算关键点
function vedioCatchInit() {video.addEventListener('play', function() {function captureFrame() {if (!video.paused && !video.ended) {// 设置canvas的尺寸与视频帧相同canvas.width = 200;canvas.height = 300;// 绘制当前视频帧到canvascontext.drawImage(video, 0, 0, canvas.width, canvas.height);// 将canvas内容转换为data URL//outputImage.src = canvas.toDataURL('image/png');// 可以在这里添加代码将data URL发送到服务器或进行其他处理faceapi.detectSingleFace(canvas).then((detection) => {if (detection) {faceapi.detectFaceLandmarks(canvas).then((landmarks) => {})} else {console.log("no face")}})// 递归调用以持续捕获帧setTimeout(captureFrame, 100); // 每500毫秒捕获一次}}captureFrame(); // 开始捕获帧});}
相关文章:
SpringBoot+SeetaFace6搭建人脸识别平台
前言 最近多个项目需要接入人脸识别功能,之前的方案是使用百度云api集成,但是后续部分项目是内网部署及使用,考虑到接入复杂程度及收费等多种因素,决定参考开源方案自己搭建,保证服务的稳定性与可靠性 项目地址&…...
MySQL-06.DDL-表结构操作-创建
一.DDL(表操作) create database db01;use db01;create table tb_user(id int comment ID,唯一标识,username varchar(20) comment 用户名,name varchar(10) comment 姓名,age int comment 年龄,gender char(1) comment 性别 ) comment 用户表; 此时并没有限制ID为…...
在Visual Studio中使用CMakeLists.txt集成EasyX库的详细指南
EasyX库是一款专为Windows平台设计的轻量级C图形库,适合初学者和教育领域使用。结合Visual Studio和CMake工具链,用户可以轻松创建C项目,并集成EasyX库,实现丰富的图形编程效果。本文将详细介绍如何在Visual Studio中通过CMakeLis…...
CRC码计算原理
CRC8这里先以CRC8来说明CRC的计算过程1、CRC8在线计算器通过CRC在线计算器可以看见CRC8的特征多项式:x8+x2+x+1,初始值为0000’0000。CRC计算的核心是:反转+异或+移位(此处的CRC8没有涉及反转,见后面CRC16)。2、CRC8计算过程(1)、取值从高到低依次取需校验数据的位,这里…...
对高危漏洞“Docker Engine API is accessible without authentication”的修复
一.背景 之前文章maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网_1panel 构建镜像-CSDN博客将1Panel软件的Doocker端口给到了局域网,安全组兄弟扫描认为是高危漏洞,可能导致攻击者获取对Docker主机的完全控制权。 二.修复的建…...
两种方式创建Vue项目
文章目录 引言利用Vue命令创建Vue项目准备工作安装Vue CLI创建Vue项目方法一:使用vue init命令方法二:使用vue create命令启动Vue项目 利用Vite工具创建Vue项目概述利用Vite创建项目启动项目 结语 引言 大家好,今天我将向大家展示如何使用不…...
深入理解 C/C++ 指针
深入理解 C 指针:指针、解引用与指针变量的详细解析 前言 在 C 编程语言中,指针 是一个非常强大且重要的概念。对于初学者来说,指针往往会让人感到困惑不解。本文将通过形象的比喻,帮助大家深入理解指针、解引用与指针变量的概念…...
有什么方法可以保护ppt文件不被随意修改呢?
在工作或学习中,我们常常需要制作powerpoint演示文稿,担心自己不小心改动了或者不想他人随意更改,我们可以如何保护PPT呢?下面小编就来分享两个常用的方法。 方法一:为PPT设置打开密码 为PPT设置打开密码是最直接有效…...
[C#]项目中如何用 GraphQL 代替传统 WebAPI服务
在现代应用程序开发中,传统的 WebAPI 通常使用 RESTful 设计风格,然而近年来 GraphQL 作为一种新的 API 查询语言逐渐获得广泛应用。GraphQL 允许客户端精确地查询所需的数据,减少了过度请求和不足请求的问题。本文将详细讨论在项目中用 Grap…...
对后端返回的日期属性进行格式化(扩展 Spring MVC 的消息转换器)
格式化之前 格式化之后: 解决方式 方式一 在属性中加上注解,对日期进行格式化 JsonFormat(pattern "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;//JsonFormat(pattern &quo…...
踩坑记录-用python解析php Laravel8生成的jwt token一直提示 Invalid audience
import jwtdef token_required(token):with open(storage/oauth-public.key, r) as f:public_key f.read()try:# 尝试使用当前算法解码 token,同时指定受众decoded jwt.decode(token, public_key, algorithms[RS256], options{"verify_aud": False})# p…...
使用IOT-Tree Server制作一个边缘计算设备(Arm Linux)
最近实现了一个小项目,现场有多个不同厂家的设备,用户需要对此进行简单的整合,并实现一些联动控制。 我使用了IOT-Tree Server这个软件轻松实现了,不外乎有如下过程: 1)使用Modbus协议对接现有设备&#…...
(JAVA)B树和B+树的实现原理阐述
1. B 树 2-3树中,一个节点最多能有两个key,它的实现红黑树中适用对链接染色的方式去表达这两个key。下面将学习另一种树形结构B树,这种数据结构中,一个节点允许多余两个key的存在。 B树是一种树状数据结构,它能够存储…...
JC系列CAN通信说明
目录 一、CAN协议二、指令格式三、通信接线3.1、一对一通信3.2、组网通信 四、寄存器定义五、指令说明4、读取电源电压5、读取母线电流6、读取实时速度8、读取实时位置10、读取驱动器温度11、读取电机温度12、读取错误信息32、设定电流33、设定速度35、设定绝对位置37、设定相对…...
Ubuntu22——安装并配置局域网文件共享系统Samba
我们将共享目录设置为 /home/takway/share。以下是基于这个新目录的详细步骤: 在Ubuntu上安装并配置Samba 更新系统包列表 打开终端,执行以下命令来确保你的包列表是最新的: sudo apt update安装Samba 安装Samba及其相关工具: sud…...
HTML CSS 基础
HTML & CSS 基础 HTML一、HTML简介1、网页1.1 什么是网页1.2 什么是HTML1.3 网页的形成1.4总结 2、web标准2.1 为什么需要web标准2.2 Web 标准的构成 二、HTML 标签1、HTML 语法规范1.1基本语法概述1.2 标签关系 2、 HTML 基本结构标签2.1 第一个 HTML 网页2.2 基本结构标签…...
Nginx 使用 GeoIP 模块阻止特定国家 IP 地址的最佳实践
一、概述 为什么要阻止特定国家的 IP 地址? 在全球化的互联网上,网站和服务器可能会面对来自不同国家和地区的用户流量。虽然大多数情况下,我们希望网站能为全球用户提供服务,但在某些特定场景下,阻止来自特定国家的…...
vue3 + vite + cesium项目
GitHub - tingyuxuan2302/cesium-vue3-vite: 项目基于 vue3 vite cesium,已实现常见三维动画场,欢迎有兴趣的同学加入共建,官网服务器相对拉胯,请耐心等候...https://github.com/tingyuxuan2302/cesium-vue3-vite/tree/github...
DR模式 LVS负载均衡群集
DR模式 LVS负载均衡群集 部署共享存储关闭防火墙和核心防护下载,开启nfs服务创建共享文件夹和测试用的静态网页文件编辑nfs配置文件发布共享查看共享 配置 tomcat 服务器关闭防火墙和核心防护安装tomcat配置 tomcat 多实例 配置 nginx 服务器关闭防火墙和核心防护配…...
mysql复制表结构和数据
1.实例 #复制一张和test 一摸一样的表结构 CREATE TABLE test_one like test#往复制的表结构中复制数据 INSERT INTO test_one SELECT * FROM test#两者一起使用相当于 cv大法2.总结 完全实现了表结构和数据的复制,但是两条sql 得分两步执行 2.1 复制表结构 #复制…...
日期时间数据在数据分析中的实际应用
下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文6364字)。 2篇2章16节:R 语言中日期时间数据的关键处理要点_r语言从数字转为日期-CSDN博客 一、日期时间数据的概念 二、获取当前日期和时间 三、日期时间数据的转换与处理…...
通过curl命令在无SDK环境中测试Taotoken接口连通性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令在无SDK环境中测试Taotoken接口连通性 在服务器管理、持续集成流水线或轻量级容器环境中,你可能需要在没有…...
企业邮箱代理:谷歌企业邮箱安全防护架构与合规应用解析
前言谷歌企业邮箱凭借全球通用 IP 信誉、海外节点覆盖广等优势,成为外贸企业对接欧美、东南亚海外客户的首选办公邮箱。但国内企业直接使用,容易出现登录卡顿、邮件发送延迟、大批量开发信被限制等问题,做好针对性优化,才能最大化…...
Windows窗口置顶终极解决方案:如何用AlwaysOnTop提升300%工作效率
Windows窗口置顶终极解决方案:如何用AlwaysOnTop提升300%工作效率 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否因频繁切换窗口而打断工作流?是否…...
基于GeoDa与R语言的空间数据回归实践技术应用
空间数据是常见的数据形式之一,因此空间数据回归也是最常用的方法之一。由于空间数据之间往往有相关性,它们不满足经典统计学的数据独立性假设,所以回归的理论和建模方式与普通回归模型相比既陌生又复杂。GeoDa与R语言是建立空间回归模型最合…...
用ArcGIS做快餐店选址分析:手把手教你用OD方法分析KFC和麦当劳的聚集关系
用ArcGIS解码快餐店选址密码:OD方法揭示KFC与麦当劳的区位博弈 当你在商业区看到KFC和麦当劳总是比邻而居,是否好奇这背后隐藏着怎样的商业逻辑?本文将以空间分析的视角,带你用ArcGIS工具揭示两大快餐巨头的选址策略。不同于传统的…...
DLSS版本切换器:终极游戏性能优化指南
DLSS版本切换器:终极游戏性能优化指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经遇到过这种情况:和朋友玩同一款游戏,你的帧率却总是比别人低?或者游戏画…...
猫抓:创新视角下的浏览器资源嗅探技术完全指南
猫抓:创新视角下的浏览器资源嗅探技术完全指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-catch)…...
解锁网盘文件下载新体验:LinkSwift直链解析工具完全指南
解锁网盘文件下载新体验:LinkSwift直链解析工具完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...
FanControl传感器检测失败?从新手到专家的完整修复指南
FanControl传感器检测失败?从新手到专家的完整修复指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...
