ToB企服应用市场:ToB评测及商务社交产业平台

标题: java人脸识别 [打印本页]

作者: 曹旭辉    时间: 2025-1-14 19:55
标题: 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  安装到本地仓库:
  1. 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
复制代码


项目实战

导入jar包

  1.         <dependency>
  2.         <groupId>com.arcsoft.face</groupId>
  3.         <artifactId>arcsoft-sdk-face</artifactId>
  4.         <version>3.0.0.0</version>
  5.         </dependency>
复制代码


编写设置文件

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

  1. arcsoft:
  2.   appId: AkumSmcBBTdfRwyvedpvjYJGgGpXXshP3kdAQYean8Mr
  3.   sdkId: AYBs2ReqwhFxyBpycbDsDt5tim4bpHJ5Q5V9KNtd8yYe
  4.   libPath: libs   #指向dll文件所在目录
复制代码

导入设置类

  1. import com.arcsoft.face.*;
  2. import com.arcsoft.face.enums.*;
  3. import com.arcsoft.face.toolkit.ImageFactory;
  4. import com.arcsoft.face.toolkit.ImageInfo;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import jakarta.annotation.PostConstruct;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.context.annotation.Configuration;
  15. import org.springframework.core.io.ClassPathResource;
  16. import org.springframework.core.io.Resource;
  17. import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
  18. @Configuration
  19. @Slf4j
  20. public class FaceEngineConfig {
  21.     //从官网获取
  22.     @Value("${arcsoft.appId}")
  23.     private String appId;
  24.     @Value("${arcsoft.sdkId}")
  25.     private String sdkKey;
  26.     @Value("${arcsoft.libPath}")
  27.     private String libPath;
  28.     private FaceEngine faceEngine;
  29.     /**
  30.      * 初始化引擎
  31.      */
  32.     @PostConstruct //bean创建后执行
  33.     public void init() {
  34.         log.info("初始化引擎");
  35.         Resource resource = new ClassPathResource(libPath);
  36.         String path = "";
  37.         try{
  38.             path = resource.getFile().getPath();
  39.         }catch (IOException e){
  40.             log.error("获取lib路径失败");
  41.         }
  42.         faceEngine = new FaceEngine(path);  // 初始化成员变量
  43.         //激活引擎
  44.         int errorCode = faceEngine.activeOnline(appId, sdkKey);
  45.         if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
  46.            log.error("引擎激活失败");
  47.            throw  new RuntimeException("引擎激活失败");
  48.         }
  49.         ActiveFileInfo activeFileInfo=new ActiveFileInfo();
  50.         errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
  51.         if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
  52.             log.error("获取激活文件信息失败");
  53.             throw  new RuntimeException("获取激活文件信息失败");
  54.         }
  55.         //引擎配置
  56.         EngineConfiguration engineConfiguration = new EngineConfiguration();
  57.         //设置引擎模式为:人脸检测、属性检测、3DAngle检测
  58.         engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
  59.         //设置检测人脸的角度
  60.         engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
  61.         //设置最大检测的人脸数量
  62.         engineConfiguration.setDetectFaceMaxNum(10);
  63.         //设置人脸检测的尺寸,16表示检测图片中人脸尺寸为图片长宽的1/16
  64.         engineConfiguration.setDetectFaceScaleVal(16);
  65.       // 功能配置
  66.         FunctionConfiguration functionConfiguration = new FunctionConfiguration();
  67.         // 设置是否支持年龄检测
  68.         functionConfiguration.setSupportAge(true);
  69.         // 设置是否支持3D角度检测
  70.         functionConfiguration.setSupportFace3dAngle(true);
  71.         // 设置是否支持人脸检测
  72.         functionConfiguration.setSupportFaceDetect(true);
  73.         // 设置是否支持人脸识别
  74.         functionConfiguration.setSupportFaceRecognition(true);
  75.         // 设置是否支持性别检测
  76.         functionConfiguration.setSupportGender(true);
  77.         // 设置是否支持活体检测
  78.         functionConfiguration.setSupportLiveness(true);
  79.         // 设置是否支持红外活体检测
  80.         functionConfiguration.setSupportIRLiveness(true);
  81.         // 将功能配置应用到引擎配置中
  82.         engineConfiguration.setFunctionConfiguration(functionConfiguration);
  83.         //初始化引擎
  84.         errorCode = faceEngine.init(engineConfiguration);
  85.         if (errorCode != ErrorInfo.MOK.getValue()) {
  86.             log.error("初始化引擎失败");
  87.             throw new RuntimeException("初始化引擎失败");
  88.         }
  89.     }
  90.     /**
  91.      * 传入一张图片,判断是否存在为人脸
  92.      */
  93.     public boolean checkIsPortrait(File file){
  94.         ImageInfo imageInfo = ImageFactory.getGrayData(file);
  95.         //定义人脸列表
  96.         List<FaceInfo> faceInfoList = new ArrayList<>();
  97.         faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
  98.         //faceInfoList列表为空,说明照片中没有一张人脸,!true
  99.         //即true为含有人脸,false没有人脸
  100.         return !faceInfoList.isEmpty();
  101.     }
  102.     /**
  103.      * 传入一张图片,获取人脸特征
  104.      * @param file
  105.      * @return
  106.      */
  107.     public FaceFeature getFaceFeature(File file) {
  108.         //这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据
  109.         ImageInfo imageInfo = getRGBData(file);
  110.         //新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面
  111.         List<FaceInfo> faceInfoList = new ArrayList<>();
  112.         //向引擎传入从图片分离的信息数据
  113.         int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
  114.                 imageInfo.getImageFormat(), faceInfoList);
  115.         if (errorCode3 != ErrorInfo.MOK.getValue()) {
  116.             System.out.println("数据传入失败");
  117.         } else {
  118.             System.out.println("数据传入成功");
  119.             System.out.println(faceInfoList);
  120.         }
  121.         //提取人脸特征
  122.         FaceFeature faceFeature = new FaceFeature();
  123.         int errorCode4 = faceEngine.extractFaceFeature(imageInfo.getImageData(),
  124.                 imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),
  125.                 faceInfoList.get(0), faceFeature);
  126.         if (errorCode4 != ErrorInfo.MOK.getValue()) {
  127.             System.out.println("人脸特征提取失败!");
  128.         } else {
  129.             System.out.println("人脸特征提取成功!");
  130.             System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
  131.         }
  132.         return faceFeature;
  133.     }
  134.     /**
  135.      * 传入人脸特征,返回是否相似,相似对大于0.8则认为相似
  136.      */
  137.     public boolean compareFace(FaceFeature faceFeature1, FaceFeature faceFeature2) {
  138.         //人脸相似度
  139.         FaceSimilar faceSimilar = new FaceSimilar();
  140.         int errorCode5 = faceEngine.compareFaceFeature(faceFeature1, faceFeature2, faceSimilar);
  141.         if (errorCode5 != ErrorInfo.MOK.getValue()) {
  142.             System.out.println("人脸对比操作失败!");
  143.             return false;
  144.         } else {
  145.             System.out.println("人脸相似度:" + faceSimilar.getScore());
  146.             return faceSimilar.getScore() > 0.8;
  147.         }
  148.     }
  149.     /**
  150.      * 返回值是map,map中包含性别、年龄、三维角度、活体
  151.      */
  152.     public Map<String, String> getFaceInfo(File file) {
  153.         HashMap<String, String> faceInfo = new HashMap<>();
  154.         //这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据
  155.         ImageInfo imageInfo = getRGBData(file);
  156.         //新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面
  157.         List<FaceInfo> faceInfoList = new ArrayList<>();
  158.         //向引擎传入从图片分离的信息数据
  159.         int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
  160.                 imageInfo.getImageFormat(), faceInfoList);
  161.         if (errorCode3 != ErrorInfo.MOK.getValue()) {
  162.             System.out.println("数据传入失败");
  163.         } else {
  164.             System.out.println("数据传入成功");
  165.             System.out.println(faceInfoList);
  166.         }
  167.         //以下实现属性提取,提取某个属性要启用相关的功能
  168.         FunctionConfiguration functionConfiguration = new FunctionConfiguration();
  169.         functionConfiguration.setSupportAge(true);
  170.         functionConfiguration.setSupportFace3dAngle(true);
  171.         functionConfiguration.setSupportGender(true);
  172.         functionConfiguration.setSupportLiveness(true);
  173.         faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),
  174.                 imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);
  175.         //下面提取属性,首先实现process接口
  176.         int errorCode6 = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),
  177.                 imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);
  178.         if (errorCode6 != ErrorInfo.MOK.getValue()) {
  179.             System.out.println("process接口调用失败,错误码:"+errorCode6);
  180.         } else {
  181.             System.out.println("process接口调用成功!");
  182.         }
  183.         //创建一个存储年龄的列表
  184.         List<AgeInfo> ageInfoList = new ArrayList<>();
  185.         int errorCode7 = faceEngine.getAge(ageInfoList);
  186.         if (errorCode7 != ErrorInfo.MOK.getValue()) {
  187.             System.out.print("获取年龄失败,错误码:");
  188.             System.out.println(errorCode7);
  189.         } else {
  190.             System.out.println("年龄获取成功!");
  191.             faceInfo.put("age",String.valueOf(ageInfoList.get(0).getAge()));
  192.             System.out.println("年龄:" + ageInfoList.get(0).getAge());
  193.         }
  194.         //性别检测
  195.         List<GenderInfo> genderInfoList = new ArrayList<>();
  196.         int errorCode8 = faceEngine.getGender(genderInfoList);
  197.         if (errorCode8 != ErrorInfo.MOK.getValue()) {
  198.             System.out.print("获取性别失败,错误码:");
  199.             System.out.println(errorCode8);
  200.         } else {
  201.             System.out.println("性别获取成功!");
  202.             faceInfo.put("gender",genderInfoList.get(0).getGender()==0 ? "男" : "女");
  203.             System.out.println("性别:" + genderInfoList.get(0).getGender());
  204.         }
  205.         //3D信息检测
  206.         List<Face3DAngle> face3DAngleList = new ArrayList<>();
  207.         int errorCode9 = faceEngine.getFace3DAngle(face3DAngleList);
  208.         if (errorCode9 != ErrorInfo.MOK.getValue()) {
  209.             System.out.println("3D信息检测失败,错误码:"+errorCode9);
  210.         } else {
  211.             System.out.println("3D信息获取成功!");
  212.             faceInfo.put("3DAngle",face3DAngleList.get(0).getPitch()+","+face3DAngleList.get(0).getRoll()+","+face3DAngleList.get(0).getYaw());
  213.             System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," +
  214.                     face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());
  215.         }
  216.         //活体检测
  217.         List<LivenessInfo> livenessInfoList = new ArrayList<>();
  218.         int errorCode10 = faceEngine.getLiveness(livenessInfoList);
  219.         if (errorCode10 != ErrorInfo.MOK.getValue()) {
  220.             System.out.println("活体检测失败,错误码:"+errorCode10);
  221.         } else {
  222.             System.out.println("活体检测成功");
  223.             faceInfo.put("liveness",String.valueOf(livenessInfoList.get(0).getLiveness()));
  224.             System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
  225.         }
  226.         return faceInfo;
  227.     }
  228. }
复制代码


编写测试类

  1. import com.arcsoft.face.FaceFeature;
  2. import edu.nhky.hhb.config.FaceEngineConfig;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import java.io.File;
  7. import java.util.Map;
  8. @SpringBootTest
  9. class TestFaceEngineConfig {
  10.     @Autowired
  11.     private FaceEngineConfig faceEngineConfig;
  12.     //判断是否是人脸
  13.     @Test
  14.     void CheckIsPortraitTest(){
  15.         File file = new File("E:\\Users\\31118\\Pictures\\1.png");
  16.         boolean checkIsPortrait = faceEngineConfig.checkIsPortrait(file);
  17.         System.out.println(checkIsPortrait);
  18.     }
  19.     //获取人脸特征
  20.     @Test
  21.     void getFaceFeatureTest(){
  22.         File file = new File("E:\\Users\\31118\\Pictures\\1.png");
  23.         FaceFeature faceFeature = faceEngineConfig.getFaceFeature(file);
  24.         System.out.println(faceFeature);
  25.     }
  26.     //比较人脸
  27.     @Test
  28.     void compareFaceTest(){
  29.         File file1 = new File("E:\\Users\\31118\\Pictures\\1.png");
  30.         File file2 = new File("E:\\Users\\31118\\Pictures\\1.png");
  31.         FaceFeature faceFeature1 = faceEngineConfig.getFaceFeature(file1);
  32.         FaceFeature faceFeature = faceEngineConfig.getFaceFeature(file2);
  33.         //判断是不是一个人
  34.         boolean isSamePerson = faceEngineConfig.compareFace(faceFeature1, faceFeature);
  35.         if (isSamePerson){
  36.             System.out.println("两种人脸,是同一个人");
  37.         }else {
  38.             System.out.println("两种人脸,不是同一个人");
  39.         }
  40.     }
  41.     //获取人脸信息
  42.     @Test
  43.     void getFaceInfoTest(){
  44.         File file = new File("E:\\Users\\31118\\Pictures\\1.png");
  45.         //获取人脸信息
  46.         Map<String, String> faceInfo = faceEngineConfig.getFaceInfo(file);
  47.         System.out.println(faceInfo);
  48.     }
  49. }
复制代码
 测试结束


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4