java人脸识别

文章目录

前言

为什么选择虹软呢?

注册虹软账号,下载SDK

将jar包安装到maven本地仓库

项目实战

导入jar包

编写配置文件

Service

编写测试类

人脸识别更多应用

前言

虹软人脸识别技术‌是由虹软公司开发的一系列人脸识别技术,包括人脸检测、活体检测、人脸识别等。这些技术基于深度学习算法,能够在复杂环境下快速准确地识别人脸,广泛应用于智能手机、DSC、平板、IP Camera、机器人、智能家居、智能终端等领域‌

为什么选择虹软呢?

虹软的SDK免费为用户提供使用,只要首次使用时需要联网激活,激活后可离线使用。

使用周期为1年,1年后需要联网再次激活

虹软链接: 虹软人脸识别邀请您https://ai.arcsoft.com.cn/operator/resource/2021/regular/index.html#/invite?sign=473b1a064dfb45faa14eb22e4a1bf796

注册虹软账号,下载SDK

将jar包安装到maven本地仓库

由于虹软的依赖没有提交到maven公共仓库,直接在pom.xml中引入依赖是找不到的

进入到 libs 目录,需要将 arcsoft-sdk-face-3.0.0.0.jar 安装到本地仓库:
mvn install:install-file -Dfile="文件所在路径\arcsoft-sdk-face-3.0.0.0.jar" -DgroupId=com.arcsoft.face -DartifactId=arcsoft-sdk-face -Dversion=3.0.0.0 -Dpackaging=jar -X
  • -Dfile:指定你要安装的 jar 包的路径。
  • -DgroupId:定义此 jar 包的组 ID,一般根据组织名称设定,比如 com.arcsoft.face
  • -DartifactId:定义此 jar 包的 artifact ID,一般根据项目名称设定,比如 arcsoft-sdk-face
  • -Dversion:指定版本号,3.0.0.0
  • -Dpackaging:定义包的类型,通常为 jar
  • -X:打印详细安装信息,方便出现错误后排查

项目实战

导入jar包

        <dependency><groupId>com.arcsoft.face</groupId><artifactId>arcsoft-sdk-face</artifactId><version>3.0.0.0</version></dependency>

编写配置文件

在resource目录下创建libs目录,将dll文件复制到libs目录下

arcsoft:appId: AkumSmcBBTdfRwyvedpvjYJGgGpXXshP3kdAQYean8MrsdkId: AYBs2ReqwhFxyBpycbDsDt5tim4bpHJ5Q5V9KNtd8yYelibPath: libs   #指向dll文件所在目录

导入配置类

 import com.arcsoft.face.*;
import com.arcsoft.face.enums.*;
import com.arcsoft.face.toolkit.ImageFactory;
import com.arcsoft.face.toolkit.ImageInfo;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;@Configuration
@Slf4j
public class FaceEngineConfig {//从官网获取@Value("${arcsoft.appId}")private String appId;@Value("${arcsoft.sdkId}")private String sdkKey;@Value("${arcsoft.libPath}")private String libPath;private FaceEngine faceEngine;/*** 初始化引擎*/@PostConstruct //bean创建后执行public void init() {log.info("初始化引擎");Resource resource = new ClassPathResource(libPath);String path = "";try{path = resource.getFile().getPath();}catch (IOException e){log.error("获取lib路径失败");}faceEngine = new FaceEngine(path);  // 初始化成员变量//激活引擎int errorCode = faceEngine.activeOnline(appId, sdkKey);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {log.error("引擎激活失败");throw  new RuntimeException("引擎激活失败");}ActiveFileInfo activeFileInfo=new ActiveFileInfo();errorCode = faceEngine.getActiveFileInfo(activeFileInfo);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {log.error("获取激活文件信息失败");throw  new RuntimeException("获取激活文件信息失败");}//引擎配置EngineConfiguration engineConfiguration = new EngineConfiguration();//设置引擎模式为:人脸检测、属性检测、3DAngle检测engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);//设置检测人脸的角度engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);//设置最大检测的人脸数量engineConfiguration.setDetectFaceMaxNum(10);//设置人脸检测的尺寸,16表示检测图片中人脸尺寸为图片长宽的1/16engineConfiguration.setDetectFaceScaleVal(16);// 功能配置FunctionConfiguration functionConfiguration = new FunctionConfiguration();// 设置是否支持年龄检测functionConfiguration.setSupportAge(true);// 设置是否支持3D角度检测functionConfiguration.setSupportFace3dAngle(true);// 设置是否支持人脸检测functionConfiguration.setSupportFaceDetect(true);// 设置是否支持人脸识别functionConfiguration.setSupportFaceRecognition(true);// 设置是否支持性别检测functionConfiguration.setSupportGender(true);// 设置是否支持活体检测functionConfiguration.setSupportLiveness(true);// 设置是否支持红外活体检测functionConfiguration.setSupportIRLiveness(true);// 将功能配置应用到引擎配置中engineConfiguration.setFunctionConfiguration(functionConfiguration);//初始化引擎errorCode = faceEngine.init(engineConfiguration);if (errorCode != ErrorInfo.MOK.getValue()) {log.error("初始化引擎失败");throw new RuntimeException("初始化引擎失败");}}/*** 传入一张图片,判断是否存在为人脸*/public boolean checkIsPortrait(File file){ImageInfo imageInfo = ImageFactory.getGrayData(file);//定义人脸列表List<FaceInfo> faceInfoList = new ArrayList<>();faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);//faceInfoList列表为空,说明照片中没有一张人脸,!true//即true为含有人脸,false没有人脸return !faceInfoList.isEmpty();}/*** 传入一张图片,获取人脸特征* @param file* @return*/public FaceFeature getFaceFeature(File file) {//这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据ImageInfo imageInfo = getRGBData(file);//新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面List<FaceInfo> faceInfoList = new ArrayList<>();//向引擎传入从图片分离的信息数据int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),imageInfo.getImageFormat(), faceInfoList);if (errorCode3 != ErrorInfo.MOK.getValue()) {System.out.println("数据传入失败");} else {System.out.println("数据传入成功");System.out.println(faceInfoList);}//提取人脸特征FaceFeature faceFeature = new FaceFeature();int errorCode4 = faceEngine.extractFaceFeature(imageInfo.getImageData(),imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),faceInfoList.get(0), faceFeature);if (errorCode4 != ErrorInfo.MOK.getValue()) {System.out.println("人脸特征提取失败!");} else {System.out.println("人脸特征提取成功!");System.out.println("特征值大小:" + faceFeature.getFeatureData().length);}return faceFeature;}/*** 传入人脸特征,返回是否相似,相似对大于0.8则认为相似*/public boolean compareFace(FaceFeature faceFeature1, FaceFeature faceFeature2) {//人脸相似度FaceSimilar faceSimilar = new FaceSimilar();int errorCode5 = faceEngine.compareFaceFeature(faceFeature1, faceFeature2, faceSimilar);if (errorCode5 != ErrorInfo.MOK.getValue()) {System.out.println("人脸对比操作失败!");return false;} else {System.out.println("人脸相似度:" + faceSimilar.getScore());return faceSimilar.getScore() > 0.8;}}/*** 返回值是map,map中包含性别、年龄、三维角度、活体*/public Map<String, String> getFaceInfo(File file) {HashMap<String, String> faceInfo = new HashMap<>();//这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据ImageInfo imageInfo = getRGBData(file);//新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面List<FaceInfo> faceInfoList = new ArrayList<>();//向引擎传入从图片分离的信息数据int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),imageInfo.getImageFormat(), faceInfoList);if (errorCode3 != ErrorInfo.MOK.getValue()) {System.out.println("数据传入失败");} else {System.out.println("数据传入成功");System.out.println(faceInfoList);}//以下实现属性提取,提取某个属性要启用相关的功能FunctionConfiguration functionConfiguration = new FunctionConfiguration();functionConfiguration.setSupportAge(true);functionConfiguration.setSupportFace3dAngle(true);functionConfiguration.setSupportGender(true);functionConfiguration.setSupportLiveness(true);faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);//下面提取属性,首先实现process接口int errorCode6 = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);if (errorCode6 != ErrorInfo.MOK.getValue()) {System.out.println("process接口调用失败,错误码:"+errorCode6);} else {System.out.println("process接口调用成功!");}//创建一个存储年龄的列表List<AgeInfo> ageInfoList = new ArrayList<>();int errorCode7 = faceEngine.getAge(ageInfoList);if (errorCode7 != ErrorInfo.MOK.getValue()) {System.out.print("获取年龄失败,错误码:");System.out.println(errorCode7);} else {System.out.println("年龄获取成功!");faceInfo.put("age",String.valueOf(ageInfoList.get(0).getAge()));System.out.println("年龄:" + ageInfoList.get(0).getAge());}//性别检测List<GenderInfo> genderInfoList = new ArrayList<>();int errorCode8 = faceEngine.getGender(genderInfoList);if (errorCode8 != ErrorInfo.MOK.getValue()) {System.out.print("获取性别失败,错误码:");System.out.println(errorCode8);} else {System.out.println("性别获取成功!");faceInfo.put("gender",genderInfoList.get(0).getGender()==0 ? "男" : "女");System.out.println("性别:" + genderInfoList.get(0).getGender());}//3D信息检测List<Face3DAngle> face3DAngleList = new ArrayList<>();int errorCode9 = faceEngine.getFace3DAngle(face3DAngleList);if (errorCode9 != ErrorInfo.MOK.getValue()) {System.out.println("3D信息检测失败,错误码:"+errorCode9);} else {System.out.println("3D信息获取成功!");faceInfo.put("3DAngle",face3DAngleList.get(0).getPitch()+","+face3DAngleList.get(0).getRoll()+","+face3DAngleList.get(0).getYaw());System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," +face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());}//活体检测List<LivenessInfo> livenessInfoList = new ArrayList<>();int errorCode10 = faceEngine.getLiveness(livenessInfoList);if (errorCode10 != ErrorInfo.MOK.getValue()) {System.out.println("活体检测失败,错误码:"+errorCode10);} else {System.out.println("活体检测成功");faceInfo.put("liveness",String.valueOf(livenessInfoList.get(0).getLiveness()));System.out.println("活体:" + livenessInfoList.get(0).getLiveness());}return faceInfo;}
}

编写测试类

import com.arcsoft.face.FaceFeature;
import edu.nhky.hhb.config.FaceEngineConfig;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.File;
import java.util.Map;@SpringBootTest
class TestFaceEngineConfig {@Autowiredprivate FaceEngineConfig faceEngineConfig;//判断是否是人脸@Testvoid CheckIsPortraitTest(){File file = new File("E:\\Users\\31118\\Pictures\\1.png");boolean checkIsPortrait = faceEngineConfig.checkIsPortrait(file);System.out.println(checkIsPortrait);}//获取人脸特征@Testvoid getFaceFeatureTest(){File file = new File("E:\\Users\\31118\\Pictures\\1.png");FaceFeature faceFeature = faceEngineConfig.getFaceFeature(file);System.out.println(faceFeature);}//比较人脸@Testvoid compareFaceTest(){File file1 = new File("E:\\Users\\31118\\Pictures\\1.png");File file2 = new File("E:\\Users\\31118\\Pictures\\1.png");FaceFeature faceFeature1 = faceEngineConfig.getFaceFeature(file1);FaceFeature faceFeature = faceEngineConfig.getFaceFeature(file2);//判断是不是一个人boolean isSamePerson = faceEngineConfig.compareFace(faceFeature1, faceFeature);if (isSamePerson){System.out.println("两种人脸,是同一个人");}else {System.out.println("两种人脸,不是同一个人");}}//获取人脸信息@Testvoid getFaceInfoTest(){File file = new File("E:\\Users\\31118\\Pictures\\1.png");//获取人脸信息Map<String, String> faceInfo = faceEngineConfig.getFaceInfo(file);System.out.println(faceInfo);}
}

 测试结束

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习路线】Python自动化运维 详细知识点学习路径(附学习资源)

学习本路线内容之前&#xff0c;请先学习Python的基础知识 其他路线&#xff1a; Python基础 >> Python进阶 >> Python爬虫 >> Python数据分析&#xff08;数据科学&#xff09; >> Python 算法&#xff08;人工智能&#xff09; >> Pyth…

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目&#xff0c;前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…

73.矩阵置零 python

矩阵置零 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a; 题解思路分析Python 实现代码代码解释提交结果 题目 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例…

【深度学习】通俗理解偏差(Bias)与方差(Variance)

在统计学习中&#xff0c;我们通常使用方差与偏差来衡量一个模型 1. 方差与偏差的概念 偏差(Bais)&#xff1a; 预测值和真实值之间的误差 方差(Variance)&#xff1a; 预测值之间的离散程度 低偏差低方差、高偏差低方差&#xff1a; 图中每个点表示同一个模型每次采样出不同…

Git学习记录

针对各个项目的gitignore文件示例 github/gitignore: A collection of useful .gitignore templates 忽略文件 文件 .gitignore 的格式规范如下&#xff1a; • 所有空行或者以 &#xff03; 开头的行都会被 Git 忽略。 • 可以使用标准的 glob 模式匹配。 • 匹配模式…

自然语言转 SQL:通过 One API 将 llama3 模型部署在 Bytebase SQL 编辑器

使用 Open AI 兼容的 API&#xff0c;可以在 Bytebase SQL 编辑器中使用自然语言查询数据库。 出于数据安全的考虑&#xff0c;私有部署大语言模型是一个较好的选择 – 本文选择功能强大的开源模型 llama3。 由于 OpenAI 默认阻止出站流量&#xff0c;为了简化网络配置&#…

Cookie和Session

会话&#xff1a; 有状态会话&#xff1a; 客户端知道发起请求的是谁 无状态会话&#xff1a; 不知道发起请求的是谁 只知道有请求 http是无状态请求 保存会话信息的两种技术&#xff1a; 可以通过Cookie和Session储存会话信息 cookie&#xff1a;客户端技术 信心存…

ImportError: attempted relative import with no known parent package 报错的解决!

本人在做调用超级鹰API解决点触验证码时&#xff0c;两次出现本报错。研究后解决&#xff0c;步骤如下&#xff1a;&#xff08;注意&#xff1a;如果项目目录结构简单且无中文目录&#xff0c;直接使用绝对路径即可解决&#xff01;&#xff01;&#xff01;&#xff09; 1.项…

介绍下不同语言的异常处理机制

Golang 在Go语言中&#xff0c;有两种用于处于异常的机制&#xff0c;分别是error和panic&#xff1b; panic panic 是 Go 中处理异常情况的机制&#xff0c;用于表示程序遇到了无法恢复的错误&#xff0c;需要终止执行。 使用场景 程序出现严重的不符合预期的问题&#x…

使用gtsam添加OrientedPlane3Factor平面约束因子

在基于地面约束的SLAM优化中&#xff0c;已知的地面信息&#xff08;如 plan.pcd 文件中的地面模型&#xff09;可以用作一个先验约束&#xff0c;以帮助优化位姿估计。具体而言&#xff0c;这个过程涉及将地面模型和每个帧的位姿结合&#xff0c;以创建一个因子模型&#xff0…

Cython全教程2 多种定义方式

—— 本篇文章&#xff0c;主要讲述Cython中的四种定义关键字 全教程2 多种定义方式&#xff1a; 在Cython中&#xff0c;关于定义的关键字有四个&#xff0c;分别是&#xff1a; cdef、def、cpdef、DEF 一、cdef定义关键字 顾名思义&#xff0c;cdef关键字定义的是一个C函数…

WINFORM - DevExpress -> DevExpress总结[安装、案例]

安装devexpress软件 路径尽量不换&#xff0c;后面破解不容易出问题 vs工具箱添加控件例如: ①使用控制台进入DevExpress安装目录: cd C:\Program Files (x86)\DevExpress 20.1\Components\Tools ②添加DevExpress控件&#xff1a; ToolboxCreator.exe/ini:toolboxcreator…

primitive 的 Appearance编写着色器材质

import { nextTick, onMounted, ref } from vue import * as Cesium from cesium import gsap from gsaponMounted(() > { ... })// 1、创建矩形几何体&#xff0c;Cesium.RectangleGeometry&#xff1a;几何体&#xff0c;Rectangle&#xff1a;矩形 let rectGeometry new…

《JavaWeb开发-javascript基础》

文章目录 《JavaWeb开发-javascript基础》1.javascript 引入方式2.JS-基础语法-书写语法2.1 书写语法2.2 输出语句 3.JS-基础语法-变量4.JS-基础语法-数据类型&运算符4.1 数据类型4.2 运算符4.3 数据类型转换 5. JS-函数6. JS-对象-Array数组7. JS-对象-String字符串8. JS-…

从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)

引言&#xff1a; 在我们之前的文章中&#xff0c;我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天&#xff0c;我们将继续这个系列&#xff0c;重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统&#xff08;OpenAnolis&#…

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…

MySQL的安装

MySQL典型的关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;oracle、MySQL、SqlServer MySQL的版本 5.5~5.7、8.0 MySQL的安装和配置 下载地址&#xff1a; https://downloads.mysql.com/archives/community/ 安装包 (x86, 64-bit), MSI Installer 执行下一步即…

跨境电商领域云手机之选:亚矩阵云手机的卓越优势

在跨境电商蓬勃发展的当下&#xff0c;云手机已成为众多企业拓展海外市场的得力助手。亚矩阵云手机凭借其独特优势&#xff0c;在竞争激烈的云手机市场中崭露头角。不过&#xff0c;鉴于市场上云手机服务供应商繁多&#xff0c;企业在抉择时需对诸多要素予以审慎考量。 跨境电商…

【论文阅读】MAMBA系列学习

Mamba code&#xff1a;state-spaces/mamba: Mamba SSM architecture paper&#xff1a;https://arxiv.org/abs/2312.00752 背景 研究问题&#xff1a;如何在保持线性时间复杂度的同时&#xff0c;提升序列建模的性能&#xff0c;特别是在处理长序列和密集数据&#xff08;如…

Java100道面试题

1.JVM内存结构 1. 方法区&#xff08;Method Area&#xff09; 方法区是JVM内存结构的一部分&#xff0c;用于存放类的相关信息&#xff0c;包括&#xff1a; 类的结构&#xff08;字段、方法、常量池等&#xff09;。字段和方法的描述&#xff0c;如名称、类型、访问修饰符…