java人脸识别Demo

  • 前言
  • 一、获取SDK
  • 二、实现人脸识别
    • 1.对象
    • 2.接口类
    • 3.配置类
    • 4.控制类
    • 5.人脸识别的配置参数
  • 最后说明

前言

java实现人脸识别,数据存储在mongo中(只是个Demo,仅用于学习)

1:没有手写算法(那是大佬干的事),调用虹软的SDK
2:没有使用mongo GridFS存储照片,只是存储了照片的特征

一、获取SDK

1:登录虹软官网,选择 x64 位的java版本SDK
2:记录下APP_ID,SDK_KEY

下载的.zip包里有javaDemo,.jar,.dll。
idea里面让项目依赖jar包:file -> project structure -> modules -> 选择模块 -> dependencies -> 右边+,选择jar包
看官网介绍就知道怎么使用。

二、实现人脸识别

1.对象

@Data
public class FaceDemo {/*** 主键id**/@Idprivate Long id;/*** 特征**/private byte[] faceFeature;/*** 姓名**/private String name;/*** 相似度 0-100**/private Integer similarValue;
}

2.接口类

public interface FaceDemoRepository extends MongoRepository<FaceDemo,Long> {}

3.配置类

@Slf4j
@Component
public class FaceEngineInit implements CommandLineRunner {@Value("${faceDemo.hongRuan.appId}")private String appId;@Value("${faceDemo.hongRuan.appKey}")private String appKey;@Value("${faceDemo.hongRuan.dllPath}")private String dllPath;public FaceEngine faceEngine;@Overridepublic void run(String... args) throws Exception {log.debug("初始化人脸识别引擎...开始");faceEngine = new FaceEngine(System.getProperty("user.dir") + dllPath);//激活引擎int errorCode = faceEngine.activeOnline(appId, appKey);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("引擎激活失败");}ActiveFileInfo activeFileInfo = new ActiveFileInfo();errorCode = faceEngine.getActiveFileInfo(activeFileInfo);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("获取激活文件信息失败");}//引擎配置EngineConfiguration engineConfiguration = new EngineConfiguration();engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);engineConfiguration.setDetectFaceMaxNum(10);engineConfiguration.setDetectFaceScaleVal(16);//功能配置FunctionConfiguration functionConfiguration = new FunctionConfiguration();functionConfiguration.setSupportAge(true);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()) {System.out.println("初始化引擎失败");}log.debug("初始化人脸识别引擎...结束");}}

4.控制类

import com.arcsoft.face.*;
import com.arcsoft.face.toolkit.ImageInfo;
import com.google.common.collect.Lists;
import com.tao.faceDemo.config.FaceEngineInit;
import com.tao.faceDemo.entity.FaceDemo;
import com.tao.faceDemo.service.FaceDemoRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;@Slf4j
@RestController
@RequestMapping(value = "faceDemo")
public class FaceController {@Value("${faceDemo.hongRuan.similarValueTemplate}")private Integer similarValueTemplate;@Value("${faceDemo.hongRuan.tempDir}")private String tempDir;@Autowiredprivate FaceDemoRepository faceDemoRepository;@Autowiredprivate FaceEngineInit faceConfig;@RequestMapping(value = "faceAdd", method = RequestMethod.POST)public Long faceAdd(@RequestParam("file") MultipartFile file, @RequestParam("name") String name) throws IOException {//根据照片获取特征FaceFeature faceFeature = this.getFaceFeature(file);//将特诊数据存入mongoFaceDemo faceDemo = new FaceDemo();faceDemo.setId(System.currentTimeMillis());faceDemo.setFaceFeature(faceFeature.getFeatureData());faceDemo.setName(name);//插入mongodbfaceDemoRepository.insert(faceDemo);return faceDemo.getId();}@RequestMapping(value = "faceCompare", method = RequestMethod.POST)public FaceDemo faceCompare(@RequestParam("file") MultipartFile file) throws IOException {System.out.println("similarValueTemplate = " + similarValueTemplate);System.out.println("tempDir = " + tempDir);//根据照片获取特征FaceFeature faceFeature = this.getFaceFeature(file);//查询库里所有特征  这里没有考虑到 百万级数据的问题//todo 百万计数据时,查询使用分页,比较特征使用线程池submitList<FaceDemo> faceDemoList = faceDemoRepository.findAll();//遍历库里数据,获得大于相似度的值List<FaceDemo> resultFaceInfoList = Lists.newLinkedList();FaceEngine faceEngine = faceConfig.faceEngine;for (FaceDemo faceDemo : faceDemoList) {FaceFeature sourceFaceFeature = new FaceFeature();sourceFaceFeature.setFeatureData(faceDemo.getFaceFeature());FaceSimilar faceSimilar = new FaceSimilar();faceEngine.compareFaceFeature(faceFeature, sourceFaceFeature, faceSimilar);//获取相似值Integer similarValue = plusHundred(faceSimilar.getScore());//相似值大于配置预期,加入到识别到人脸的列表if (similarValue > similarValueTemplate) {FaceDemo info = new FaceDemo();info.setName(faceDemo.getName());info.setSimilarValue(similarValue);resultFaceInfoList.add(info);}}if (CollectionUtils.isEmpty(resultFaceInfoList)) {return null;}//从大到小排序resultFaceInfoList.sort((h1, h2) -> h2.getSimilarValue().compareTo(h1.getSimilarValue()));return resultFaceInfoList.get(0);}private int plusHundred(Float value) {BigDecimal target = new BigDecimal(value);BigDecimal hundred = new BigDecimal(100f);return target.multiply(hundred).intValue();}public FaceFeature getFaceFeature(MultipartFile file) throws IOException {File temp = new File(System.getProperty("user.dir") + tempDir + file.getOriginalFilename());file.transferTo(temp);//人脸检测ImageInfo imageInfo = getRGBData(temp);List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();FaceEngine faceEngine = faceConfig.faceEngine;int errorCode;errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);System.out.println(faceInfoList);//特征提取FaceFeature faceFeature = new FaceFeature();errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);return faceFeature;}
}

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

5.人脸识别的配置参数

## 人脸识别参数
faceDemo:hongRuan: appId: XXXXXXXXXXappKey: XXXXXXXXXXsimilarValueTemplate: 85tempDir: /faceAdd/dllPath: /dllPath

项目结构图


最后说明

1:faceAdd文件夹的作用:MultipartFile转File使用的临时文件夹,也可以使用其他方式转为File,如:流
2:这只是个demo,没有考虑到大数据量的情况,但相信几百几千的人脸对比还是能支持的。


java人脸识别Demo(数据库mongo)相关推荐

  1. 虹软人脸识别 - 采用数据库存取人脸特征数据

    虹软人脸识别 - 采用数据库存取人脸特征数据 前几天有个朋友遇到了个问题,他在使用虹软的人脸识别引擎时,想更换一下人脸识别的存储方式,原本demo中使用的是文件的方式进行存储,而他想要通过数据库的方式 ...

  2. vc中人脸识别数据导入mysql_虹软人脸识别 - 采用数据库存取人脸特征数据

    虹软人脸识别 - 采用数据库存取人脸特征数据 前几天有个朋友遇到了个问题,他在使用虹软的人脸识别引擎时,想更换一下人脸识别的存储方式,原本demo中使用的是文件的方式进行存储,而他想要通过数据库的方式 ...

  3. PHP虹软人脸识别,虹软人脸识别demo使用教程

    最近在研究虹软家的arcface 人脸识别 demo,现在就给大家分享一下官方的demo 工程如何使用? 1.下载代码: git clone https://github.com/asdfqwrasd ...

  4. 基于JAVA人脸识别公司签到系统(Springboot框架+AI人工智能) 开题报告

      本科生毕业论文 基于Java(springboot框架)人脸识别公司签到系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学本 ...

  5. Android人脸识别Demo竖屏YUV方向调整和图片保存

    2019独角兽企业重金招聘Python工程师标准>>> 本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况. 1.首先可 ...

  6. Android基于虹软(ArcSoft)实现从0到1的人脸识别demo

    Android基于虹软(ArcSoft)实现从0到1的人脸识别demo 1.在虹软的开发者中心创建一个自己的应用,将APP_ID与SDK_KEY记录下来,后面会用到.创建完后就可以下载SDK了. 2. ...

  7. 在Ubuntu 18.04上部署Intel OpenVINO Toolkit并使用CPU与iGPU运行官方人脸识别Demo

    本博客依据Intel OpenVINO Toolkit 官方资料,经博主亲自实践,踩雷排坑后记录分享. intel NCS & OpenVINO 交流QQ群:608483784 测试平台软件版 ...

  8. 2020/11/13·Java·人脸识别一键登录/注册

    Java·人脸识别一键登录/注册 1.eclipse 和 tomcat 服务器的安装与使用 1.1 Eclipse 的安装 1.2 Eclipse 配置 Tomcat 1.3 新建 Web 项目 1. ...

  9. android 人脸识别demo

    Android 人脸识别 demo 可以使用 Google 的 Mobile Vision API 来实现.这是一个免费的.开源的库,可以帮助开发人员在应用程序中检测人脸.识别人脸.扫描条形码和二维码 ...

  10. 【javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)】

    javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码) 文章目录 javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄 ...

最新文章

  1. Django中的常用命令
  2. CSS3 box-orient box-direction box-align box-flex box-pack
  3. VS.NET中的生成解决方案和重新生成解决方案有什么区别?
  4. cmd 查看本地ip_西门子WinCCV7.4使用普通网卡通过TCP/IP连接PLC步骤
  5. 计算机硬件耗电,电脑中最耗电的三个硬件排行:这答案意料之外的情理之中!...
  6. 【JVM调优工具篇】使用JProfiler追踪GC Roots溯源
  7. 关于获取网络流,根据网络流转byte[],本地文件流转byte[],方法记录
  8. css3实现的一些灰色的导航条按钮
  9. 10年 | 写了10年的代码,我最怕写Mybatis这些配置,现在有详解了
  10. 设置y轴刻度_Origin中如何设置坐标轴单位长度相等? axisisometric
  11. 计算机双硬盘安装需要跳线吗,双硬盘安装图文教程
  12. realme v11密码解锁_真我V11忘记密码怎么刷机删除跳过激活账号使用
  13. Enterprise Library
  14. java文字水印模糊_使用Java给图片添加文字水印并消除锯齿
  15. 华北电力计算机技术考研难度,华北电力大学(专业学位)计算机技术考研难吗
  16. html插入cad,cad插件有哪些
  17. 阿里国际站P4P直通车玩法
  18. tensorflow 版本列表_TensorFlow 版本兼容性
  19. SQL语句的内外左右连接
  20. cordova获取手机IMEI

热门文章

  1. 用Python写个魂斗罗,另附30个Python小游戏源码
  2. 利用PYTHON代码,自动玩王者荣耀,再也不担心女朋友打电话
  3. 远程通讯测试软件,USR-TCP232-304和虚拟串口软件通讯测试
  4. .NET Framework框架的介绍
  5. 【MFC开发(7)】编辑框控件Edit Control
  6. Transwarp Inceptor 问题记录与解决
  7. Java--文本文档编写Java代码
  8. svn文件本地删除 服务器不删,svn delete-删除文件和目录命令大全
  9. bilibili开源弹幕库UML类图
  10. 哈里斯鹰优化算法(HHO)附代码