基于百度Ai实现人脸识别注册和登录(Java)
2020-06-01 22:00
141 查看
基于百度Ai实现人脸识别注册和登录(Java)
本人小白一个第一次写 有不恰当的地方还请各位大佬指正
话不多说上干货
首先登录我们的百度控制台
然后我们创建一个新的人脸识别应用记住这两个划圈的地方等会我们会用得着
下一步我们创建一个人脸库
记好这个人脸库的名称等会我们也会用到
然后这次的人脸识别我们使用的是maven直接导入jar包的。
<dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.12.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency>
如果有不会使用maven的朋友也不用担心
我们可以直接从这里下载SDK 然后导入我们的idea
前期准备工作已经完成了
我使用的人脸识别核心思想
首先 先进行人脸注册 将我们注册好的照片上传到我们的人脸库中
当我们想进行人脸登录时 后台再一次将我们的照片和人脸库中的照片进行比对 用户的匹配得分大于我们所设置的阈值时我们此时可以认为两张人脸基本是一致的
此时我们就可以实现人脸登录了
首先我们需要先获取一下token(有效期为30天)
import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * 获取token类 */ public class AuthService { /** * 获取权限token * @return 返回示例: * { * "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567", * "expires_in": 2592000 * } */ public static String getAuth() { // 官网获取的 API Key 更新为你注册的 String clientId = "百度云应用的AK"; // 官网获取的 Secret Key 更新为你注册的 String clientSecret = "百度云应用的SK"; return getAuth(clientId, clientSecret); } /** * 获取API访问token * 该token有一定的有效期,需要自行管理,当失效时需重新获取. * @param ak - 百度云官网获取的 API Key * @param sk - 百度云官网获取的 Securet Key * @return assess_token 示例: * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567" */ public static String getAuth(String ak, String sk) { // 获取token地址 String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; String getAccessTokenUrl = authHost // 1. grant_type为固定参数 + "grant_type=client_credentials" // 2. 官网获取的 API Key + "&client_id=" + ak // 3. 官网获取的 Secret Key + "&client_secret=" + sk; try { URL realUrl = new URL(getAccessTokenUrl); // 打开和URL之间的连接 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("GET"); connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍历所有的响应头字段 for (String key : map.keySet()) { System.err.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = ""; String line; while ((line = in.readLine()) != null) { result += line; } /** * 返回结果示例 */ System.err.println("result:" + result); JSONObject jsonObject = new JSONObject(result); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("获取token失败!"); e.printStackTrace(System.err); } return null; } }
FaceSearch中的代码
map.put(“image”, img1);
注意我们传入的参数img1 已经在前台传输的过程中转化为base64
FileUtil,Base64Util,HttpUtil,GsonUtils大家就自行下载就行
package baidu.ai; import com.besjon.pojo.JsonRootBean; import com.besjon.pojo.User_list; import com.csi.util.Base64Util; import com.csi.util.FileUtil; import com.csi.util.GsonUtils; import com.csi.util.HttpUtil; import java.util.HashMap; import java.util.Map; public class FaceSearch { /** * 重要提示代码中所需工具类 * FileUtil,Base64Util,HttpUtil,GsonUtils请从 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下载 */ public static String faceSearch(String img1) { // 请求url String url = "https://aip.baidubce.com/rest/2.0/face/v3/search"; try { Map<String, Object> map = new HashMap<>(); map.put("image", img1); map.put("liveness_control", "NORMAL"); //Face_upload为当初人脸组的名字 map.put("group_id_list", "Face_upload"); map.put("image_type", "BASE64"); map.put("quality_control", "LOW"); String param = GsonUtils.toJson(map); // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 String accessToken = AuthService.getAuth(); String result = HttpUtil.post(url, accessToken, "application/json", param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; } }
同样的我的上传照片至人脸库中的代码也是这样的
package baidu.ai; import com.csi.util.GsonUtils; import com.csi.util.HttpUtil; import java.util.*; /** * 人脸注册 */ public class FaceAdd { /** * 重要提示代码中所需工具类 * FileUtil,Base64Util,HttpUtil,GsonUtils请从 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2 * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3 * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3 * 下载 */ public static String add(String img1) { // 请求url String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add"; try { Map<String, Object> map = new HashMap<>(); map.put("image", img1); //Face_upload为当初人脸组的名字 map.put("group_id", "Face_upload"); //user2为指定上传的名称可任意 map.put("user_id", "user2"); map.put("user_info", "abc"); map.put("image_type", "BASE64"); String param = GsonUtils.toJson(map); // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。 String accessToken = AuthService.getAuth(); String result = HttpUtil.post(url, accessToken, "application/json", param); System.out.println(result); return result; } catch (Exception e) { e.printStackTrace(); } return null; } }
前端部分代码
<body> <dl class="admin_login"> <dt> <strong></strong><em></em> <strong>请把你的脸放摄像头面前</strong> </dt> <div id="media"> <video id="video" width="100%" height="300" autoplay></video> <canvas id="canvas" width="530" height="300"></canvas> </div> <dd> <input type="button" onclick="query()" value="立即登录" class="submit_btn" /> </dd> </dl> <script type="text/javascript" src="js/alert.js"></script> <script type="text/javascript"> //var 是定义变量 var video = document.getElementById("video"); //获取video标签 var context = canvas.getContext("2d"); var con ={ audio:false, video:true, video:{ width:1980, height:1024, } }; //导航 获取用户媒体对象 navigator.mediaDevices.getUserMedia(con) .then(function(stream){ try{ video.src = window.URL.createObjectURL(stream); }catch(e){ video.srcObject=stream; } video.onloadmetadate = function(e){ video.play(); } }); function query(){ //把流媒体数据画到convas画布上去 context.drawImage(video,0,0,530,300); var base = getBase64(); $.ajax({ type:"post", url:"facelogin", data:{"base":base}, dataType: "json", success:function(json){ if(json.message==""){ $.MsgBox.Alert("消息","登录失败"); }else{ window.parent.location.replace("main.jsp"); } } }); } function getBase64() { var imgSrc = document.getElementById("canvas").toDataURL( "image/png"); return imgSrc.split("base64,")[1]; }; </script> </body>
<body> <dl class="admin_login"> <dt> <strong></strong><em></em> <strong>请把你的脸放摄像头面前</strong> </dt> <div id="media"> <video id="video" width="100%" height="300" autoplay></video> <canvas id="canvas" width="530" height="300"></canvas> </div> <dd> <input type="button" onclick="query()" value="立即注册" class="submit_btn" /> </dd> </dl> <script type="text/javascript" src="js/alert.js"></script> <script type="text/javascript"> //var 是定义变量 var video = document.getElementById("video"); //获取video标签 var context = canvas.getContext("2d"); var con ={ audio:false, video:true, video:{ width:1980, height:1024, } }; //导航 获取用户媒体对象 navigator.mediaDevices.getUserMedia(con) .then(function(stream){ try{ video.src = window.URL.createObjectURL(stream); }catch(e){ video.srcObject=stream; } video.onloadmetadate = function(e){ video.play(); } }); function query(){ //把流媒体数据画到convas画布上去 context.drawImage(video,0,0,530,300); var base = getBase64(); $.ajax({ type:"post", url:"faceRegister", data:{"base":base}, dataType: "json", success:function(json){ if(json!=''){ $.MsgBox.Alert("消息","注册成功"); } } }); } function getBase64() { var imgSrc = document.getElementById("canvas").toDataURL( "image/png"); return imgSrc.split("base64,")[1]; };
相应的controller层的方法
@Controller public class FaceController { @RequestMapping("/faceRegister") @ResponseBody public String FaceRegister(HttpServletRequest request){ System.out.println("---------faceregister-------"); String image = request.getParameter("base"); System.out.println(image); String result = FaceAdd.add(image); System.out.println("-----人脸注册成功"); return result; } @RequestMapping("/facelogin") @ResponseBody public String FaceLogin(HttpServletRequest request){ String image = request.getParameter("base"); String msg = FaceSearch.faceSearch(image); JsonRootBean rootBean = GsonUtils.fromJson(msg,JsonRootBean.class); User_list list = rootBean.result.user_list[0]; float score = list.getScore(); System.out.println("相似度:"+score); return msg; } }
这样我们的人脸识别登录就完成啦
小白第一次写东西如有不好或者侵权的地方还请各位大佬指正
有想要完整项目的可以联系2713355618@qq.com奥
欢迎各位大佬交流
相关文章推荐
- Django调用百度AI接口实现人脸注册登录代码实例
- 【Java】基于ArrayList实现的简单登录注册
- 基于java的微信小程序的实现(二)登录,注册,注销接口的实现
- JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)
- 【Java】运用JDBC实现一个注册、登录系统的编写
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- 基于MVC模式模拟实现登录注册开发过程(二)
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- 7. Swift 基于Xmpp和openfire实现一个简单的登录注册
- java实现登录窗口(含验证码验证、账户注册等)
- 基于struts2和hibernate实现登录和注册功能
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- Android实战简易教程-第二十三枪(基于Baas的用户注册和登录模块实现!)
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
- Java实现--登录和注册案例(把用户信息存进集合)
- JAVA、MySql实现登录注册(网页)
- 基于Node.js+express+MySQL+Bootstrap实现的简单登录注册
- 基于MVC 用户登录的实现(JavaBean + Servlet + JSP)
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
- Java实现登录、注册(使用数组存储数据)