java人脸识别系统,登陆人脸识别
00-1010前言:难度分析:项目评审(百度云AI)最终效果演示:技术选择:项目需求分析:项目建设注意事项(项目建设前了解)项目总结
00-1010年期间,由于学校的静态管理,在宿舍门口和校门使用了人脸识别设备,每次路过都引起了我的好奇心,也想自己来一个人脸识别游戏。随着我开始找资料研究这些资料,好在已经有几家公司提供了这方面的免费API,也省了不少功夫。一开始用的是face++,但是最后一步人脸搜索出现了问题。INVALID_OUTER_ID总是被提示遵循官方文件,一步一步,然后密封。最后以失败告终,但他别无选择,只能放弃。然后我去了第二次百度AI,这次很顺利。中间只有一个错误,官方给出了解决方案,考虑的很周到。终于实现了最初的预期:成功利用人脸实现了注册和登录功能。
这一系列项目从设计到实现的源代码全部开源并免费学习使用,一起追求理想,欢迎大家监督打卡开发!
00-1010由于使用了百度云AI/face现有的Api接口,所以分别对两个平台的难点进行了分析和介绍:
face鄙视脸的难点在于需要独立封装官方提供的代码段,考验开发者的代码提取能力和自我独立封装技巧。如果提取和打包做不好,会造成代码冗余和内存浪费,所以打包效果达不到最佳。这需要很多时间。提取face平台的代码段时,需要对IO流有很好的了解,这样才能读取读取配置文件中的内容。所以这里就不介绍了。
百度云AI百度云AI允许开发者选择开发难度,因为平台提供了两种方式:第一种方式类似于face,需要提取代码,然后打包。难度分析见上面人脸对分析;第二种方式是百度云提供Maven仓库,可以直接导入依赖项,直接调用相应的Api进行开发!选择性好!
用前端JQuery调用本地摄像头拍摄(感觉这是最难的部分)
目录
前言:
00-1010 springbootbootstrapthymeref百度云AI/Face
00-1010为了方便用户登录,我们不再通过输入账号密码手动登录注册,而是使用JQuery调用本机的摄像头拍照,然后调用人脸识别接口,将人脸信息自动注册到用户使用的平台(百度云/Face)中,让用户扫脸登录。
00-1010 1.准备进入百度云的人脸识别控制台。
如果没有百度账号,可以用手机号快速注册进入百度云AI控制台。
创建人脸识别应用。
[1]创建应用程序
【2】可以选择自己想用的界面:比如人脸识别,语音技术等。本项目采用人脸识别,默认选择人脸识别的所有界面,无需修改,只需填写应用名称即可!
[3]获取密钥
2.测试百度云API
进口依赖
依赖groupIdcom.baidu.aip/groupId神器Java-SDK/神器版本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方法完成人脸注册 /** * 参数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,根据人脸检测排序类型检测图片中排序第一的人脸(默认为人脸面积最大的人脸),最大值120face_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,根据人脸检测排序类型检测图片中排序第一的人脸(默认为人脸面积最大的人脸),最大值120face_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=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); } /** * 人脸注册,将用户照片存入人脸库中 * @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")@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仓库
到此这篇关于Java实现人脸登录、注册等功能的文章就介绍到这了,更多相关Java人脸登录、注册内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。