Java实现人脸登录、注册等功能【完整版】

指引目录

    • 🍓 难度分析
    • 🍒 项目回顾(百度云AI
      • 🍇 最终效果演示
      • 🍌 技术选型
      • 🥝 项目需求分析
      • 🌽 项目搭建
        • 1. 前期准备
          • ① 进入百度云的人脸识别控制台
          • ②创建人脸识别应用
        • 2. 测试百度云API
          • ① 导入依赖
          • ② 测试部分API(人脸注册、人脸检测、人脸搜索等
        • 3. 搭建项目(使用Thymeleaf模板引擎
          • ① 创建Maven项目
          • ② 编写properties配置文件
          • ③ 展示对上述部分Api接口进行二次封装
          • ④ 编写Controller前端控制器代码
      • 🍉 注意事项(项目搭建前了解
          • ① 出现qps不足如何解决
          • ② oauth 获取错误
      • ⭐️ 项目总结

🍓 难度分析

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

  • face++

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

  • 百度云AI

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

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

🍒 项目回顾(百度云AI

🍇 最终效果演示

在这里插入图片描述

🍌 技术选型

  • 🍀 SpringBoot
  • 🌾 BootStrap
  • 🌴 Thymeleaf
  • 🌻 百度云AI / Face++

🥝 项目需求分析

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DMRfhF6Z-1652173334791)(/Users/wumao/docu<i></i>ments/Typora笔记/typora-user-images/image-20220510155115622.png)]

🌽 项目搭建

1. 前期准备

① 进入百度云的人脸识别控制台

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

②创建人脸识别应用

【1】创建应用

在这里插入图片描述

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

在这里插入图片描述

【3】获取秘钥
在这里插入图片描述

2. 测试百度云API

① 导入依赖
<dependency>  <groupId>com.baidu.aip</groupId>  <artifactId>java-sdk</artifactId>  <version>4.9.0</version></dependency>
② 测试部分API(人脸注册、人脸检测、人脸搜索等
  • 人脸注册

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

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

测试代码

//人脸注册@Testpublic 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方法完成人脸注册    JSonObject res = client.addUser(encode, "base64", "pdx", "1000", map);  System.out.println(res.toString());}

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-noSP5q2r-1652173334793)(/Users/wumao/docu<i></i>ments/Typora笔记/typora-user-images/image-20220510141916574.png)]

参数介绍

参数名称是否必选类型默认值说明
imageString图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
image_typeString图片类型base64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
face_fieldstring包age,expression,face_shape,gender,glasses,landmark,landmark150,quality,eye_status,emotion,face_type,mask,spoofing信息逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度
max_face_numuint32最多处理人脸的数目,默认值为1,根据人脸检测排序类型检测图片中排序第一的人脸(默认为人脸面积最大的人脸,最大值120
face_typestring人脸的类型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方法进行人脸检测                JSonObject res = client.detect(encode, "base64", null);        System.out.println(res.toString(2));    }

测试结果
在这里插入图片描述

参数介绍

参数名称是否必选类型默认值说明
imageString图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断
image_typeString图片类型base64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
face_fieldstring包age,expression,face_shape,gender,glasses,landmark,landmark150,quality,eye_status,emotion,face_type,mask,spoofing信息逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度
max_face_numuint32最多处理人脸的数目,默认值为1,根据人脸检测排序类型检测图片中排序第一的人脸(默认为人脸面积最大的人脸,最大值120
face_typestring人脸的类型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=base64ai.groupId="自定义组"server.max-http-header-size=1000KBspring.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);    }        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;    }        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";}
  • 实现人脸登录逻辑
@RequestMapping("/face-login")@ResponseBodypublic  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仓库

❗️❗️❗️让好奇心促使技术的成长❗️❗️❗️
在这里插入图片描述

 
友情链接
鄂ICP备19019357号-22