摘要:有关人脸识别技术的应用越来越普及,已经渗透到家庭看护、移动互联网、智能硬件、政府警用、金融、监控、零售、社交娱乐等各个领域。国内有许多企业提供了人脸识别产品。该文介绍了基于Js、Ajax、Jsp等技术利用百度AI的SDK的Web人脸注册登录的实现。
关键词:AIPFace;人脸识别;百度AI;Jsp
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2019)07-0114-02
近几年来,有关人脸识别技术的应用越来越普及,已逐渐渗透到各行各业,如家庭看护、远程验证注册、政府警用、网吧兼管、手机支付等等。例如:“I Baby”全景婴儿监视器,其借助人脸识别技术,监护宝宝,并实时同步到移动设备上,让家长随时随地都能监管宝贝。微软公司的颜龄机器人"how-old"网站可从用户提供人物照片,识别出人性别和年龄。现在各大
金融APP利用人脸识别技术,实现身份验证、账号注册、扫脸放贷、扫脸支付等。
1 基本思想
目前国内有许多企业提供了人脸识别产品,比如北京旷视科技、北京商汤科技、腾讯、阿里、百度等。本系统利用百度ai人脸识别,注册时,将页面中采集的人脸图像存入百度云人脸库和服务器中。登录时,将采集到得人脸图像与百度云人脸库中的人脸信息进行比对,比对成功则可以成功登录。
本系统前端采用HTML5、JS、CSS3等技术对注册和登录页面进行设计和布局。利用JSP、Ajax、Servlet等技术进行后端的处理和交互。注册具体过程:
1)当用户注册时,通过打开本地摄像头提取人的脸部;2)获取到人脸之后在通过ajax进行提交到Servlet;3)在Servlet里面进行处理(添加到人脸库中),并且将前台ajax传过来的base64图像进行转换成图片,然后上传到服务器中;4)提交到人脸库的同时,设置编号为注册用户名。
登录具体过程:
1)用户需要输入登录的用户名(username);2)通过本地打开摄像头进行获取人脸的base64图像信息;3)将base64图像信息转换成图片之后在进行与服务器中的人脸进行比对。比对成功则成功登录。
2 百度人脸识别SDK
人脸识别使用百度人脸识别Java SDK。其中AipFace是人脸识别的Java客户端,为使用人脸识别的开发人员提供了一系列的交互方法。这里列举几个方法:
人脸搜索:search(image, imageType, groupIdList, options)
人脸检测:detect(image, imageType, options)
人脸注册:addUser(image, imageType, groupId, userId, options)
人脸验证:verifyUser(userId, groupIdList, path, options);
在使用百度人臉识别Java SDK之前需要导入相关的jar包。步骤如下:
1)在百度下载Java SDK压缩工具包。
2)将下载的aip-java-sdk-version.zip解压后,复制到工程文件夹中。
3)在Eclipse中选中工程点击右键,选中“Properties”打开工程属性视图,选中“ Java Build Path -> Add JARs”。
4)添加SDK工具包aip-java-sdk-version.jar和第三方依赖工具包log4j-1.2.17.jar、json-20160810.jar。
3 具体实现
1)数据库设计
本系统数据库采用MySql数据库,用于登录的用户表users的各字段名和类型如下:
id int(11) NOT NULL, username varchar(50) NOT NULL, password varchar(50) DEFAULT NULL, headphoto varchar(50) DEFAULT NULL
2)Js读取摄像头获得头像信息
打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签。
Media({ video: true }, function(stream扫脸支付) {
mediaStreamTrack = Tracks()[0];
video.src = (window.URL || window.webkitURL).createObjectURL(stream);
video.play();
}, function(err) { console.log(err); });
3)获取人脸图像
Js代码中获得图像,然后将用户名和图像利用Ajax技术提交给FaceServlet文件进行注册处理。截取图片主要用到canvas绘图,使用drawImage方法将video的内容绘至canvas中。将截取的内容上传至服务器,将canvas中的内容转为base64格式上传。
拍照按钮处理的核心代码:
var canvans = ElementById("canvas");
var video = ElementById("video");
var context = Context("2d");
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
context.drawImage(video,0,0);
var imgData = DataURL();
var imgData1 = imgData.substring(22); //在前端截取22位字符串作为图像数据
var username = $("#username").val();
$.ajax({ type: "post", url: "FaceServlet?tag=reg",
data:{"img":imgData1,"username":username}, success: function(data){
if(data=="恭喜你!人脸注册成功,即将跳转登录页面"){
alert(data); location.href = "login.jsp"; }
if(data=="人脸识别失败,请正对屏幕摄像头!!"){
alert(data); return false; }
},error:function(msg){ alert("错误"); } });
4)利用人脸图像进行注册或登录
FaceServlet中注册处理,如果是注册,则需要将提交的数据存入数据库和将用户名和图像存入百度人脸库。如果是登录,则将获得的人脸图像与人脸库中的进行比对。
其中有三个核心代码:GenerateImage将图像上传服务器,facesetAddUser将图像上传人脸库,verifyUser方法为验证用户的方法。
public booleanGenerateImage(String imgStr, String imgFilePath),其核心代码如下:
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes = decoder.decodeBuffer(imgStr); // Base64解码
for (int i = 0; i
if (bytes[i] < 0) {// 調整异常数据
bytes[i] += 256; } }
OutputStream out = new FileOutputStream(imgFilePath); // 生成jpeg图片
out.write(bytes);
public booleanfacesetAddUser(AipFace client, String path, String username)的核心代码:
HashMap options = new HashMap();
JSONObject res = client.addUser(username, "test_users_info", Arrays.asList("group1", "group2"), path, options);
if (res.keySet().contains("error_code")) { return false; }
return true;
public Double verifyUser(AipFace client, String path, String username)的核心代码:
HashMap options = new HashMap(1);
options.put("top_num", 5);
JSONObject res = client.verifyUser(username, Arrays.asList("group1", "group2"), path, options);
发布评论