Java后端 + 百度SDK实现人脸识别

Java后端 + 百度SDK实现人脸识别

人工智能越来越贴近我们的生活,相信大家也经常接触到人脸识别,手机付款、app注册验证、门禁等等。

如果要用Java后台使用这些功能,那么需要怎么做呢?请看完下面这篇文章,就能轻松、简单入门了!

手把手教你实现人脸识别、人脸对比

  1. 注册百度账号 https://ai.baidu.com/
    打开网站,注册百度账号并登录。然后按图1的提示进行操作。
    在图1中,选择 “人脸检测” 跳转到 图2。
    在图2中 点击 “立即使用” 然后跳转到 图3。
    在图3中 点击“创建应用” 然后跳转到 图4.
    在图4中 完成应用申请 然后就有了图5(我们最终需要的就是这个 刚创建应用的参数AppID等)

图1:在这里插入图片描述
图2:
在这里插入图片描述
图3:
在这里插入图片描述
图4:
在这里插入图片描述
图5:
在这里插入图片描述

  1. Java SDK 文档地址:https://ai.baidu.com/docs#/Face-Java-SDK/top
    这里有详细的API文档。
    在这里插入图片描述
  2. pom.xml 配置:
		<dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.10.0</version></dependency>
  1. 人脸识别java类
    下面的 APPID/AK/SK 改成你的,找2张人像图片在线生成Base64然后复制在下面就可以测试了。
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import org.apache.commons.codec.binary.Base64;
import org.json.JSONObject;import java.util.ArrayList;
import java.util.HashMap;public class FaceTest {//设置APPID/AK/SKprivate static String APP_ID = "改成你的图5中的参数";private static String API_KEY = "改成你的图5中的参数";private static String SECRET_KEY = "改成你的图5中的参数";public static void main(String[] args) {// 初始化一个AipFaceAipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);// 可选:设置网络连接参数client.setConnectionTimeoutInMillis(2000);client.setSocketTimeoutInMillis(60000);// 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//            client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
//            client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理/** START  获取读取 图片Base64编码 **/// 方法一:String image1 = "找一张有人脸的图片,在线图片生成Base64编码 然后复制到这里";String image2 = "找一张有人脸的图片,在线图片生成Base64编码 然后复制到这里";// 方法二:/*// 读本地图片byte[] bytes = FileUtils.fileToBytes("D:\\Documents\\Pictures\\fc.jpg");byte[] bytes2 = FileUtils.fileToBytes("D:\\Documents\\Pictures\\fj.jpg");// 将字节转base64String image1 = Base64.encodeBase64String(bytes);String image2 = Base64.encodeBase64String(bytes2);*//** END 获取读取 图片Base64编码 **/// 人脸对比// image1/image2也可以为url或facetoken, 相应的imageType参数需要与之对应。MatchRequest req1 = new MatchRequest(image1, "BASE64");MatchRequest req2 = new MatchRequest(image2, "BASE64");ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();requests.add(req1);requests.add(req2);JSONObject res = client.match(requests);System.out.println(res.toString(2));// 人脸检测// 传入可选参数调用接口HashMap<String, String> options = new HashMap<String, String>();options.put("face_field", "age");options.put("max_face_num", "2");options.put("face_type", "LIVE");options.put("liveness_control", "LOW");JSONObject res2 = client.detect(image1, "BASE64", options);System.out.println(res2.toString(2));}
}

上面方法二中的相关类:

Base64.encodeBase64String(bytes) 来自 import org.apache.commons.codec.binary.Base64;
FileUtils.fileToBytes(“D:\Documents\Pictures\fc.jpg”);
FileUtils类 如下:

package com.weixin.demo.utils;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.*;public class FileUtils {protected static Logger logger = LoggerFactory.getLogger(FileUtils.class);public static byte[] fileToBytes(String filePath) {byte[] buffer = null;File file = new File(filePath);FileInputStream fis = null;ByteArrayOutputStream bos = null;try {fis = new FileInputStream(file);bos = new ByteArrayOutputStream();byte[] b = new byte[1024];int n;while ((n = fis.read(b)) != -1) {bos.write(b, 0, n);}buffer = bos.toByteArray();} catch (FileNotFoundException ex) {ex.printStackTrace();logger.error("", ex);} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);} finally {try {if (null != bos) {bos.close();}} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);} finally {try {if (null != fis) {fis.close();}} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);}}}return buffer;}public static void bytesToFile(byte[] buffer, final String filePath) {File file = new File(filePath);OutputStream output = null;BufferedOutputStream bufferedOutput = null;try {output = new FileOutputStream(file);bufferedOutput = new BufferedOutputStream(output);bufferedOutput.write(buffer);} catch (FileNotFoundException ex) {ex.printStackTrace();logger.error("", ex);} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);} finally {if (null != bufferedOutput) {try {bufferedOutput.close();} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);}}if (null != output) {try {output.close();} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);}}}}public static void bytesToFile(byte[] buffer, File file) {OutputStream output = null;BufferedOutputStream bufferedOutput = null;try {output = new FileOutputStream(file);bufferedOutput = new BufferedOutputStream(output);bufferedOutput.write(buffer);} catch (FileNotFoundException ex) {ex.printStackTrace();logger.error("", ex);} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);} finally {if (null != bufferedOutput) {try {bufferedOutput.close();} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);}}if (null != output) {try {output.close();} catch (IOException ex) {ex.printStackTrace();logger.error("", ex);}}}}/*** byte数组转换成16进制字符串* * @param src* @return*/public static String bytesToHexString(byte[] src) {StringBuilder stringBuilder = new StringBuilder();if (src == null || src.length <= 0) {return null;}for (int i = 0; i < src.length; i++) {int v = src[i] & 0xFF;String hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}/*** 根据文件流读取图片文件真实类型*/public static String getTypeByBytes(byte[] fileBytes) {byte[] b = new byte[4];System.arraycopy(fileBytes, 0, b, 0, b.length);String type = bytesToHexString(b).toUpperCase();if (type.contains("FFD8FF")) {return "jpg";} else if (type.contains("89504E47")) {return "png";} else if (type.contains("47494638")) {return "gif";} else if (type.contains("49492A00")) {return "tif";} else if (type.contains("424D")) {return "bmp";}return type;}public static String getTypeByFile(File file) {String fileName = file.getName();return fileName.substring(fileName.lastIndexOf(".") + 1);}public static String getTypeByFilePath(String filePath) {return filePath.substring(filePath.lastIndexOf(".") + 1);}public static byte[] toByteArray(InputStream input) throws IOException {ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int n = 0;while (-1 != (n = input.read(buffer))) {output.write(buffer, 0, n);}return output.toByteArray();}}

“人脸对比” 测试结果:
主要看 score 参数,越高越匹配。满分100分。

0 [main] INFO com.baidu.aip.client.BaseClient  - get access_token success. current state: STATE_AIP_AUTH_OK
2 [main] DEBUG com.baidu.aip.client.BaseClient  - current state after check priviledge: STATE_TRUE_AIP_USER
{"result": {"score": 90.39932251,"face_list": [{"face_token": "594b9857e1bc1a6f0bb6fa7183ca962d"},{"face_token": "f552428debe38d54081dfbce5d6d6e1e"}]},"log_id": 1345050756015080031,"error_msg": "SUCCESS","cached": 0,"error_code": 0,"timestamp": 1565601508
}

“人脸检测” 测试结果:

{"result": {"face_num": 1,"face_list": [{"liveness": {"livemapscore": 1},"angle": {"roll": -3.24,"pitch": 13.22,"yaw": 7.82},"face_token": "594b9857e1bc1a6f0bb6fa7183ca962d","location": {"top": 570.86,"left": 197.56,"rotation": 1,"width": 339,"height": 325},"face_probability": 1,"age": 23}]},"log_id": 1368654456015085521,"error_msg": "SUCCESS","cached": 0,"error_code": 0,"timestamp": 1565601508
}

人脸检测 相关请求参数、返回参数解释。(详情请访问第2点的SDK地址:即 https://ai.baidu.com/docs#/Face-Java-SDK/top)
在这里插入图片描述
在这里插入图片描述
人脸对比 相关请求参数、返回参数解释。(详情请访问第2点的SDK地址:即 https://ai.baidu.com/docs#/Face-Java-SDK/top)
在这里插入图片描述

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

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

相关文章

路由器局域网设置_路由器基础介绍

路由器已经商用很多年了&#xff0c;但是一些SSID&#xff0c; DHCP, 这些名词都还没有搞懂&#xff0c;遇到路由器问题&#xff0c;不知所措&#xff0c;只能求助于网管。但是有些问题是很简单的&#xff0c;只要稍微去学习就可以解决问题。下面介绍路由器的一些简单问题。路由…

mysql主键设置after_mysql如何改变主键属性

mysql改变主键属性的方法&#xff1a;1、使用关键字modify&#xff0c;代码为【alter table tbl_name modify.....】&#xff1b;2、使用关键字change&#xff0c;代码为【alter table tbl_name change..】。本教程操作环境&#xff1a;windows7系统、mysql8.0.22版&#xff0c…

python打包成exe_Python打包成exe时,再犯这几个错误就说不过去了

大家好&#xff0c;我是今天的值班小编&#xff0c;不知道朋友们开工了没有&#xff0c;小编的公司已经远程办公好几天了。今天由于写游戏教程的那位小编弃坑不更新文章了&#xff0c;只好由本小编继续来解决粉丝朋友们的问题。 如果朋友们在使用python的过程中遇到了任何问题&…

机器视觉 光学工程专业_瑞士Idonus MEMS制造设备 创新技术 机器视觉测量(远心光学)...

机器视觉从图像处理算法到光学安装&#xff0c;idonus 提供部分或全部机器视觉解决方案。典型应用包括机械零件的高通量自动测量、表面质量检测、定位、质量控制或识别。我们定制开发的解决方案可与机器人化或手动设备相结合。我们的报价&#xff1a;定制硬件和软件&#xff0c…

vs 中使用32 位mysql_vs2010连接mysql数据库(含win32和x64两种平台)

数据库安装&#xff1a; 此处有两种安装方式&#xff0c;第一种使用xxx.msi图形化安装方式&#xff0c;和普通的exe软件安装方式一样&#xff0c;按照默认选项一直下一步就可以。mysql下载地址为http://dev.mysql.com/downloads/windows/installer/ 第二种是在mysql官网下载zip…

电脑时间校对器_笔记本电脑如何保养?华为教你五招轻松延长使用时间

集微网7月11日消息(文/数码控)&#xff0c;近日华为花粉俱乐部官方微信公众号发表长文教用户如何保养笔记本电脑&#xff0c;具体有以下五招&#xff1a;

uvc能支持多大分辨率_华为手环B5测评:该有的功能一个不缺,甚至还能变身蓝牙耳机...

前阵子&#xff0c;华为召开nova5系列新品发布会的同时&#xff0c;也给用户们带来了华为手环B5的新配色--铅石青。华为手环B5在去年7月发布&#xff0c;分为三个版本&#xff1a;运动版999元、商务版1199元、时尚版1499元。​此次更新的是运动版&#xff0c;售价仍为999元&…

cf不能全屏win7的解决方法_win7系统局域网不能访问怎么办 win7局域网不能访问解决方法...

在局域网当中比较实用的功能要数共享文件了&#xff0c;局域网共享可以让用户们共享和管理资源更加便捷&#xff0c;可以大大提高工作效率&#xff0c;不过最近有位win7系统用户使用电脑的时候&#xff0c;发现电脑无法访问局域网中的其他任何一台电脑&#xff0c;这让用户不知…

CGLib动态代理原理

CGLib动态代理原理 CGLib动态代理是代理类去继承目标类&#xff0c;然后重写其中目标类的方法啊&#xff0c;这样也可以保证代理类拥有目标类的同名方法&#xff1b; 看一下CGLib的基本结构&#xff0c;下图所示&#xff0c;代理类去继承目标类&#xff0c;每次调用代理类的方…

sql读取excel数据_Python 读取 Excel 数据,并插入到MySQL

说实话&#xff0c;个人不建议用Python来读取Excel进行入库操作&#xff0c;有条件的话&#xff0c;可以尝试用 ETL 工具&#xff0c;快速导入到MySQL中&#xff0c;或者也可使用 SQL 的导入工具进行。写本文的目的在于&#xff1a;记录一下之前做过一次这个同类型的东西。也为…

无向图的深度优先遍历非递归_图算法总结

&#xfeff;[TOC]图算法1、图的表示1.1、邻接矩阵&#xff08;有向图、无向图、带权图、代码实现&#xff09;1、无向图的邻接矩阵 2、有向图的邻接矩阵 3、带权值的图 有了上述的理解&#xff0c;我们可以设计数据结构&#xff0c;并实现了。C实现如下&#xff1a;#include1.…

华为ipd项目管理流程_IPD:一套卓越的产品开发经营体系

IPD全流程指的不仅仅是“产品开发流程”&#xff0c;而是如何实现产品“从机会到商业变现”的全流程。华为通过20年的全流程实践&#xff0c;才做到持续性推出高质量产品和解决方案。本期IPD全流程班&#xff0c;帮助企业研发管理者学习这套结构化流程&#xff0c;其中划下重点…

Springboot中@ComponentScan 注解

三个点&#xff1a; 1、工程中Application类的位置。默认情况下就不需要配置ComponentScan这个注解了。 因为Application类&#xff0c;在启动的时候&#xff0c;默认是加载和Application类所在同一个目录下的所有类&#xff0c;包括所有子目录下的类。所以一般情况下&#xff…

在react里写原生js_小程序原生开发与第三方框架选择

最近正在更新《微信小程序入门与实践》一书的第二版。书中有一章节谈到了”多样化的小程序开发“&#xff0c;摘取并加以整理分享给各位开发者。我一向不推荐也不提倡公众号阅读学习编程&#xff0c;文章更多的是列出小程序如今多样化的框架选择&#xff0c;并简单剖析它们之间…

springboot中service层注入的是实现类,但Controller层接收的是接口

我们习惯这样编写代码&#xff1a; 在service层写接口&#xff0c;然后用实现类去实现接口&#xff0c;并且将实现类注入到容器中 Service public class AccountServiceImpl implements AccountService {}在controller层却是用接口操作service的bean的方法&#xff0c; Auto…

mysql data transfer_MySQL主从同步加速 Transfer-- FAQ

Q: Transfer是什么A: 是一个解决MySQL原生主从同步延迟的方案。 Transfer本身是一个在MySQL源码上打的patch&#xff0c;可以用于当Slave&#xff0c;也可以用于当第三方工具&#xff0c;将Master的数据同步发给Slave。 利用多线程实现主从无延迟。Q: Transfer目前的发布形式&a…

springboot整合mybatisplus中@Mapper与@MapperScan的使用

一、Mapper与MapperScan不可同时使用 二、Mapper用于注解单个mapper接口 三、Mapper Scan用于批量注解Mapper接口 四、Mapper不起作用时&#xff0c;因为缺少下图中的依赖包 以上为自己整合框架中遇到的问题与解决方案&#xff0c;如果以上解决方案不能解决您的问题&#x…

html列表按时间排序代码_按字母顺序排序的列表

有时候你需要自制一份课件PPT或者手写笔记的关键词索引&#xff0c;用来开卷考试查阅PPT或者复习查阅笔记时能快速定位查阅内容位置&#xff0c;这时你可能想要一个按字母顺序排序的列表来帮助构建需要的索引。LaTeX自身的index本身并不支持这样的功能&#xff0c;修改起来也颇…

@MapperScan和@ComponentScan使用问题

报错如下 原因&#xff1a;当MapperScan和ComponentScan一起使用时&#xff0c;项目启动时扫描包会发生冲突&#xff0c;找不到swagger配置类的包和mapper接口的包 解决办法&#xff1a;MapperScan和ComponentScan可以一起使用。 改为MapperScan&#xff08;basePackages {}…

C语言中CY位什么时候才能为1_你真的了解C语言中的整型吗?

整型数据类型1. 整型数据类型在上一节当中&#xff0c;我们遇到了整型(integer)int&#xff0c;用来表示一个整数的数据类型。下面呢我们来讨论一下C语言里面的整数数据类型。看到这里你可能想问&#xff0c;一个整数而已&#xff0c;为什么会需要定义这么多的类型出来呢?要知…