Java实现人脸识别登录、注册等功能(最新完整版)

目录
  • 前言:
  • 难度分析:
  • 项目回顾(百度云AI)
    • 最终效果演示:
    • 技术选型:
    • 项目需求分析
    • 项目搭建
    • 注意事项(项目搭建前了解)
    • 项目总结

前言:

这段时间由于学校实行静态化管理,寝室门和校门都是用了人脸识别的装置,每次经过都会激发我的好奇心,也想自己搞一个人脸识别玩玩,随着开始查找资料来研究这方面的信息,还好有好几家公司都有提供这方面的免费API,也是省下来很多功夫。一开始采用的是face++,但是在执行到最后一步人脸搜索时出现问题,一直提示INVALID_OUTER_ID,跟着官方文档,一步步抽离再封装,最终还是以失败告终,无奈只能选择放弃。接着辗转第二家 百度AI ,这次还是比较顺利的,中间只出现过一次错误  ,而且官方大大还给出了解决方案,很是贴心,最终还是实现了开始的预想:成功使用人脸来实现注册和登录功能。

本系列项目从设计到实现源码全部开源免费学习使用,一起追向理想,欢迎各位大佬监督打卡开发!

难度分析:

由于使用的是百度云AI/face++这两个平台的现有的Api接口,所以分别对二者的难度进行分析介绍:

  • face++

旷视face++的难度在于需要自己对官方提供的代码段进行独立封装,这就比较考验开发者的代码抽取能力和 自我独立封装的技能,如果不能很好地进行抽取封装,就会造成代码的冗余以及内存的浪费,这样封装的效 果并不能达到最佳。比较耗费时间,在抽取face++平台的代码段时需要对IO流有着比较好的理解,从而读取 读取配置文件中的内容,这里就不多做介绍。

  • 百度云AI

百度云AI可以让开发者对开发难度有所选择,因为该平台提供了两种方式:第一种方式类似于face++需要抽 取代码然后进行代码封装,难度分析见上述face++对分析;第二种方式则是百度云提供了Maven仓库,可以 直接导入依赖,直接调用相应的Api进行开发即可!有较好的选择性!

前端使用JQuery调用本地摄像头进行拍摄(自我感觉这是最难的部分)

项目回顾(百度云AI)

最终效果演示:

技术选型:

  • SpringBoot
  • BootStrap
  • Thymeleaf
  • 百度云AI / Face++

项目需求分析

为了用户登录的便捷,不再输入账号密码进行手动登录与注册,而是使用JQuery调用本机的摄像头进行拍摄照片,然后调用人脸识别接口将人脸信息自动注册进所使用的平台(百度云/Face++)后,用户即可进行人脸扫描实现登录操作。

项目搭建

1. 前期准备 ① 进入百度云的人脸识别控制台

如果没有百度账号可以使用手机号快速进行注册进入百度云AI控制台

②创建人脸识别应用

【1】创建应用

【2】可以选择自己想要使用的接口:比如人脸识别、语音技术等,本次项目采用的是人脸识别,官方也默认选择了人脸识别的全部接口,所以也不需要做改动,只需要填写应用名称即可!

【3】获取秘钥

2. 测试百度云API

① 导入依赖

<dependency>
  <groupId>com.baidu.aip</groupId>
  <artifactId>java-sdk</artifactId>
  <version>4.9.0</version>
</dependency>

② 测试部分API(人脸注册、人脸检测、人脸搜索等)

人脸注册

用于从人脸库中新增用户,可以设定多个用户所在组及组内用户的人脸图片

典型应用场景:构建属于自己人脸库,比如:会员人脸注册、已有用户补全人脸信息

测试代码

//人脸注册
@Test
public void testFaceRegister() throws IOException {
  //1. 创建Java代码和百度云交互的Client对象
  AipFace client = new AipFace("AppId","Api_key","Api_secret");
  //2. 参数设置(示例下表格对参数进行介绍)
  HashMap<String,String> map = new HashMap<>();
  map.put("quality_control","NORMAL");//图片质量
  map.put("liveness_control","LOW");//活体检测
  //3. 构造图片
  String path = "本地图片路径";
  //上传的图片  两种格式:url地址 Base64字符串形式
  byte[] bytes = Files.readAllBytes(Paths.get(path));
  String encode = Base64Util.encode(bytes);
  //4.调用api方法完成人脸注册
  /**
  * 参数1:图片的url或者base64字符串
  * 参数2:图片形式(URL,BASE64)
  * 参数3:组Id(固定一个字符串)
  * 参数4:用户Id
  * 参数5:hashMap基本参数配置
  */
  JSONObject res = client.addUser(encode, "BASE64", "pdx", "1000", map);
  System.out.println(res.toString());
}

测试结果:只要最后error_code为0则表示测试成功,后续封装代码也是需要判断error_code的值

参数介绍:

参数名称 是否必选 类型 默认值 说明
image String   图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
image_type String   图片类型BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
face_field string   age,expression,face_shape,gender,glasses,landmark,landmark150,quality,eye_status,emotion,face_type,mask,spoofing信息逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度
max_face_num uint32   最多处理人脸的数目,默认值为1,根据人脸检测排序类型检测图片中排序第一的人脸(默认为人脸面积最大的人脸),最大值120
face_type string   人脸的类型LIVE表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等
IDCARD表示身份证芯片照:二代身份证内置芯片中的人像照片WATERMARK表示带水印证件照:一般为带水印的小图,如公安网小图CERT表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片默认LIVE

人脸检测

判断图片是否具有面部信息

测试代码

    @Test
    public void testFaceCheck() throws IOException {
        //1. 创建Java代码和百度云交互的Client对象
        AipFace client = new AipFace("AppId","Api_key","Api_secret");
        //2. 构造图片
        String path = "本地图片路径";
        //上传的图片  两种格式:url地址 Base64字符串形式
        byte[] bytes = Files.readAllBytes(Paths.get(path));
        String encode = Base64Util.encode(bytes);
        //调用Api方法进行人脸检测
        /**
         * 参数1:图片的url或者base64字符串
         * 参数2:图片形式(URL,BASE64)
         * 参数3:hashMap中的基本参数配置(null:使用默认配置)
         */
        JSONObject res = client.detect(encode, "BASE64", null);
        System.out.println(res.toString(2));
    }

测试结果:

参数介绍:

参数名称 是否必选 类型 默认值 说明
image String   图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
image_type String   图片类型BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
face_field string   age,expression,face_shape,gender,glasses,landmark,landmark150,quality,eye_status,emotion,face_type,mask,spoofing信息逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度
max_face_num uint32   最多处理人脸的数目,默认值为1,根据人脸检测排序类型检测图片中排序第一的人脸(默认为人脸面积最大的人脸),最大值120
face_type string   人脸的类型LIVE表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等
IDCARD表示身份证芯片照:二代身份证内置芯片中的人像照片WATERMARK表示带水印证件照:一般为带水印的小图,如公安网小图CERT表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片默认LIVE

人脸搜索

根据用户上传的图片和指定人脸库中的所有人脸进行比较,获取相似度最高的一个或者某几个的评分

返回值(数据,只需要第一条,相似度最高的数据)score:相似度评分(80分以上可以认为是同一个人

测试代码:

    @Test
    public void testFaceSearch() throws IOException {
        //1. 创建Java代码和百度云交互的Client对象
				AipFace client = new AipFace("AppId","Api_key","Api_secret");
        //2. 构造图片
        String path = "本地图片路径";
        //上传的图片  两种格式:url地址 Base64字符串形式
        byte[] bytes = Files.readAllBytes(Paths.get(path));
        String encode = Base64Util.encode(bytes);
        //人脸搜索
        JSONObject res = client.search(encode, "BASE64", "pdx", null);
        System.out.println(res.toString(2));
    }

测试结果:

小结:

整体测试下来,和平常对数据库的操作类似,都是增删改查的操作,除了这些Api,还有其他的就不再赘述了,操作类似!所有测试代码也会同项目案例一并上传到Gitee仓库中

3. 搭建项目(使用Thymeleaf模板引擎)

① 创建Maven项目

引入相关依赖,构建所需文件目录

② 编写properties配置文件

ai.appId="api_id"
ai.apiKey="api_key"
ai.secretKey="api_secret"
ai.imageType=BASE64
ai.groupId="自定义组"
server.max-http-header-size=1000KB
spring.thymeleaf.cache=false

③ 展示对上述部分Api接口进行二次封装

    private AipFace client;
    private HashMap<String,String> map = new HashMap<>();
    private BaiduAiUtils(){
        map.put("quality_control","NORMAL");//图片质量
        map.put("liveness_control","LOW");//活体检测
    }
    @PostConstruct
    public void init(){
        client = new AipFace(APP_ID,API_KEY,SECRET_KEY);
    }
    /**
     * 人脸注册,将用户照片存入人脸库中
     * @param userId
     * @param image
     * @return
     */
    public Boolean faceRegister(String userId,String image){
        //人脸注册
        JSONObject res = client.addUser(image, IMAGE_TYPE, groupId, userId, map);
        Integer errorCode = res.getInt("error_code");
        return errorCode == 0? true : false;
    }
    /**
     * 人脸更新,更新人脸库中的用户照片
     * @param userId
     * @param image
     * @return
     */
    public Boolean faceUpdate(String userId,String image){
        //人脸更新
        JSONObject res = client.updateUser(image, IMAGE_TYPE, groupId, userId, map);
        Integer errorCode = res.getInt("error_code");
        return errorCode == 0 ? true : false;
    }

想要了解全部封装代码请移步Gittee仓库

④ 编写Controller前端控制器代码

首选创建一个FaceLoginController

跳转到人脸登录页面的控制器

@RequestMapping("/")
public String toLogin(){
  return "index";
}

实现人脸登录逻辑

/**
 * 人脸登录
 * @return
 * @throws Exception
 */
@RequestMapping("/face-login")
@ResponseBody
public  String searchface(@RequestBody @RequestParam(name = "imagebast64") StringBuffer imagebast64, HttpServletRequest request) throws Exception {
    String userId = faceLoginService.loginByFace(imagebast64);
    request.getSession().setAttribute("userId",userId);
    request.getSession().setAttribute("username","派大星");
    return userId;
}

实现人脸登录业务逻辑层

由于在封装接口时设定的imageType为Base64,所以在实现前端拍照时使用的是Canvas Api提供了toDataURL()方法将画布中的图形转换为图片,而默认情况下,toDataURL()方法把图形转变成Base64编码格式的png,其格式为data:image/png;base64,xxxxx,而,后面的内容才是接口中需要的部分,所以需要对字符串进行切割处理。前端部分具体见下图:

注意事项(项目搭建前了解)

① 出现qps不足如何解决

Open api qps request limit reached

这个问题官方也给出了具体的解决方案,在百度云控制台可以免费领取测试额度,也是对开发者的一个福利。

此处贴上免费资源领取地址

② oauth 获取错误

0 [main] WARN com.baidu.aip.client.BaseClient  - oauth get error, current state: STATE_TRUE_CLOUD_USER
{
  "error_msg": "IAM Certification failed",
  "error_code": 14
}

具体原因:

仔细检查:APP_ID、API_KEY、SECRET_KEY字符串中是否有空格

项目总结

使用百度云AI把项目整体搭建下来,可以很完美的实现最终的效果,人脸的识别速度也是相当迅速的,一些细节处理的特别到位,比如:在进行人脸识别的过程中眼睛必须对准摄像头,当你的眼睛有所阻碍时,会提示的某眼处有阻碍等等。但是在并发方面支持的并不是很到位!

新鲜出炉的代码将会及时更新到Gitee仓库

以上代码属于部分实现,想要了解完整版请移步派大星的Gitee仓库

到此这篇关于Java实现人脸登录、注册等功能的文章就介绍到这了,更多相关Java人脸登录、注册内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java+OpenCV实现图片中的人脸识别

    目录 MatOfRect.detectMultiScale函数 实现代码 ImageViewer.java DetectFace.java 运行 把识别出来的脸存成文件 经过前三个教程,我们可以知道了OpenCV的基本使用了. 今天,我们就要讲OpenCV中认出,这是一个人脸是怎么做的. MatOfRect.detectMultiScale函数 OpenCV用的是detectMultiScale来认出这是一个脸的.记得,这只是认出这是一个脸,而不是这个脸是谁. 这个脸是谁我们会逐步展开,前面勿求

  • Java OpenCV实现人脸识别过程详解

    准备 : 下载openCV安装包 :  https://opencv.org/ 安装包安装之后支持多种语言环境,此处使用Java,在Eclipse中引入 openCV目录下的java/opencv-320.jar,同时配置openCV库路径. Eclipse配置openCV 代码实现 : package test; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect;

  • Java实现简单GUI登录和注册界面

    本文实例为大家分享了Java实现简单GUI登录和注册界面的具体代码,供大家参考,具体内容如下 先看效果图: 登陆界面: 注册界面: 实现代码如下: 一.登陆界面 package cn.bms.view; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; imp

  • 基于Java实现扫码登录的示例代码

    目录 基本介绍 原理解析 1. 身份认证机制 2. 流程概述 代码实现 1. 环境准备 2. 主要依赖 3. 生成二维码 4. 扫描二维码 5. 确认登录 6. PC 端轮询 7. 拦截器配置 效果演示 1. 工具准备 2. 数据准备 3. 扫码登录流程展示 结语 基本介绍 相信大家对二维码都不陌生,生活中到处充斥着扫码登录的场景,如登录网页版微信.支付宝等.最近学习了一下扫码登录的原理,感觉蛮有趣的,于是自己实现了一个简易版扫码登录的 Demo,以此记录一下学习过程. 实际上是面试的时候被问到

  • java实现注册登录系统

    本文实例为大家分享了java实现注册登录系统的具体代码,供大家参考,具体内容如下 1.创建菜单,注册,登录,退出 2.注册模块: a) 通过键盘输入用户名,密码b) 保存用户名密码到user.txt文件(包含用户名和密码)c) 注册成功 3.登录模块 a) 通过键盘输入用户名和密码b) 判断(超过三次提示过多错误,需要休眠30秒)c) 登陆成功 import java.io.File; import java.io.FileInputStream; import java.io.FileOutp

  • Java基于虹软实现人脸识别、人脸比对、活性检测等

    目录 虹软 一.注册虹软开发者平台 二.开始使用SDK 虹软 免费,高级版本试用 支持在线.离线 有 Java SDK,C++ SDK 一.注册虹软开发者平台 点击注册 注册完成后可在“我的应用”中新建应用,获得 APP_ID 和 SDK_Key,请记住这两个信息,后续 SDK 中会用到. 接下来下载SDK就行了. 二.开始使用SDK SDK包结构在下载的sdk包中,包结构大概是这样 |—demo| |—ArcFaceDemo Demo工程|—doc| |—ARCSOFT_ARC_FACE_DE

  • java+opencv实现人脸识别功能

    背景:最近需要用到人脸识别,但又不花钱使用现有的第三方人脸识别接口,为此使用opencv结合java进行人脸识别(ps:opencv是开源的,使用它来做人脸识别存在一定的误差,效果一般). 1.安装opencv 官网地址:https://opencv.org/ , 由于官网下载速度是真的慢 百度网盘: 链接: https://pan.baidu.com/s/1RpsP-I7v8pP2dkqALDw7FQ 提取码: pq7v 如果是官网下载,就无脑安装就行了,安装完毕后. 将图一的两个文件复制到图

  • Java实现人脸识别登录、注册等功能(最新完整版)

    目录 前言: 难度分析: 项目回顾(百度云AI) 最终效果演示: 技术选型: 项目需求分析 项目搭建 注意事项(项目搭建前了解) 项目总结 前言: 这段时间由于学校实行静态化管理,寝室门和校门都是用了人脸识别的装置,每次经过都会激发我的好奇心,也想自己搞一个人脸识别玩玩,随着开始查找资料来研究这方面的信息,还好有好几家公司都有提供这方面的免费API,也是省下来很多功夫.一开始采用的是face++,但是在执行到最后一步人脸搜索时出现问题,一直提示INVALID_OUTER_ID,跟着官方文档,一步

  • Android开发人脸识别登录功能

    近来,很多公司的APP都实现了人脸识别登录的功能.今天呢,银鹏带大家从头到尾做一下这个人脸识别登录. 首先呢,我们需要采用一个拥有人脸识别算法的平台,这边我建议使用虹软的人脸识别,因为我个人用的就是这个,关键有一点好处,就是免费.注册链接:点击进入注册. 注册完毕以后,话不多说,我们进入流程. 第一步:在虹软平台创建应用 直接安装SDK查看激活码 下载虹软识别库地址:点击下载识别库 下载好之后进行依赖添加: implementation 'com.github.tyhjh:PermissionU

  • java web实现简单登录注册功能全过程(eclipse,mysql)

    目录 1.工程文件 2.DBBean.java 3.login.jsp 4.check.jsp 5.zhuce.jsp 6.zhuceck.jsp 7.success.jsp 8.zhucesu.jsp 9.数据库创造 总结 1.工程文件 基本的文件布局,没使用任何css文件,就是简单实现登录注册,页面没有做任何美化: 使用的是MySQL8.0.12,8一下的mysql链接代码有微小差别,网上教程基本都是8一下的,随便找找就能找到: 2.DBBean.java package Bean; imp

  • OpenCV Java实现人脸识别和裁剪功能

    本文实例为大家分享了OpenCV Java实现人脸识别和裁剪的具体代码,供大家参考,具体内容如下 安装及配置 1.首先安装OpenCV,地址 这里我下载的是Windows版的3.4.5 然后安装即可-- 2.Eclipse配置OpenCV Window->Preferences->Java->User Libraries New输入你的Libraries名 这里我的安装目录是D:\OpenCV,所以是: 然后引入dll,我是64位机子,所以是: Ok,下面创建Java项目做Java与Op

  • PyQt5+Caffe+Opencv搭建人脸识别登录界面

    最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的想法是用opencv自带的人脸检测算法检测出面部,利用caffe训练好的卷积神经网络来提取特征,通过计算当前检测到的人脸与已近注册的所有用户的面部特征之间的相似度,如果最大的相似度大于一个阈值,就可以确定当前检测到的人脸对应为这个相似度最大的用户了. ###Caffe人脸识别 因为不断有新的用户加入,然而添加新用户后重新调整CNN的网络结构太费时间,所以不能用CN

  • OPENCV+JAVA实现人脸识别

    本文实例为大家分享了JAVA实现人脸识别的具体代码,供大家参考,具体内容如下 官方下载 安装文件 ,以win7为例,下载opencv-2.4.13.3-vc14.exe 安装后,在build目录下 D:\opencv\build\java,获取opencv-2413.jar,copy至项目目录 同时需要dll文件 与 各 识别xml文件,进行不同特征的识别(人脸,侧脸,眼睛等) dll目录:D:\opencv\build\java\x64\opencv_java2413.dll xml目录:D:

  • 在Ubuntu中实现人脸识别登录的完整步骤

    1.安装Howdy: howdy项目地址 sudo add-apt-repository ppa:boltgolt/howdy sudo apt update sudo apt install howdy 2.添加自己的face sudo howdy add 报错: Enter a label for this new model [Initial model] (max 24 characters): tiger Camera path is not configured correctly,

  • Android用SharedPreferences实现登录注册注销功能

    Android用SharedPreferences实现登录注册注销功能 前言 本文用SharedPreferences本地缓存账号信息来实现登录注册功能,以及退出注销功能. 一.本文逻辑 本文的注册登录逻辑如下: 1.注册页面:有账号可以直接去登录页面.没有账号的话填写账号密码,检测账号密码不为空,点击立即注册,保存账号信息,跳转到登录页面. 2.登录页面:首先读取缓存的账号密码和是否记住密码,将账号显示,判断记住密码的标志,为空或false,不显示密码,需要输入密码,为true则直接将缓存的密

  • 教你使用Java实现扫雷小游戏(最新完整版)

    目录 效果展示 主类:GameWin类 底层地图MapBottom类 顶层地图MapTop类 底层数字BottomNum类 初始化地雷BottomRay类 工具GameUtil类 总结 大家好,我是orangemilk_,哈哈,学习Java已经到一个阶段啦,今天我们使用GUI来写一个扫雷小游戏吧! 效果展示 主类:GameWin类 package com.sxt; import javax.swing.*; import java.awt.*; import java.awt.event.Mou

  • python 识别登录验证码图片功能的实现代码(完整代码)

    在编写自动化测试用例的时候,每次登录都需要输入验证码,后来想把让python自己识别图片里的验证码,不需要自己手动登陆,所以查了一下识别功能怎么实现,做一下笔记. 首选导入一些用到的库,re.Image.pytesseract.selenium.time import re # 用于正则 from PIL import Image # 用于打开图片和对图片处理 import pytesseract # 用于图片转文字 from selenium import webdriver # 用于打开网站

随机推荐