基于百度AI平台的Web人脸注册和登录系统的实现
作者:赵丙秀
来源:《电脑知识与技术》2019年第07
        摘要:有关人脸识别技术的应用越来越普及,已经渗透到家庭看护、移动互联网、智能硬件、政府警用、金融、监控、零售、社交娱乐等各个领域。国内有许多企业提供了人脸识别产品。该文介绍了基于JsAjaxJsp等技术利用百度AISDKWeb人脸注册登录的实现。
        关键词:AIPFace;人脸识别;百度AIJsp
        中图分类号:TP393 文献标识码:A
        文章编号:1009-3044201907-0114-02
        近几年来,有关人脸识别技术的应用越来越普及,已逐渐渗透到各行各业,如家庭看护、远程验证注册、政府警用、网吧兼管、手机支付等等。例如:“I Baby”全景婴儿监视器,其借助人脸识别技术,监护宝宝,并实时同步到移动设备上,让家长随时随地都能监管宝贝。微软公司的颜龄机器人"how-old"网站可从用户提供人物照片,识别出人性别和年龄。现在各大
金融APP利用人脸识别技术,实现身份验证、账号注册、扫脸放贷、扫脸支付等。
        1 基本思想
        目前国内有许多企业提供了人脸识别产品,比如北京旷视科技、北京商汤科技、腾讯、阿里、百度等。本系统利用百度ai人脸识别,注册时,将页面中采集的人脸图像存入百度云人脸库和服务器中。登录时,将采集到得人脸图像与百度云人脸库中的人脸信息进行比对,比对成功则可以成功登录。
        本系统前端采用HTML5JSCSS3等技术对注册和登录页面进行设计和布局。利用JSPAjaxServlet等技术进行后端的处理和交互。注册具体过程:
        1)当用户注册时,通过打开本地摄像头提取人的脸部;2)获取到人脸之后在通过ajax进行提交到Servlet3)在Servlet里面进行处理(添加到人脸库中),并且将前台ajax传过来的base64图像进行转换成图片,然后上传到服务器中;4)提交到人脸库的同时,设置编号为注册用户名。
        登录具体过程:
        1)用户需要输入登录的用户名(username);2)通过本地打开摄像头进行获取人脸的base64图像信息;3)将base64图像信息转换成图片之后在进行与服务器中的人脸进行比对。比对成功则成功登录。
        2 百度人脸识别SDK
        人脸识别使用百度人脸识别Java SDK。其中AipFace是人脸识别的Java客户端,为使用人脸识别的开发人员提供了一系列的交互方法。这里列举几个方法:
        人脸搜索:searchimage imageType groupIdList options
        人脸检测:detectimage imageType options
        人脸注册:addUserimage imageType groupId userId options
        人脸验证:verifyUseruserId 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.jarjson-20160810.jar
        3 具体实现
        1)数据库设计
        本系统数据库采用MySql数据库,用于登录的用户表users的各字段名和类型如下:
        id int11 NOT NULL username varchar50 NOT NULL password varchar50 DEFAULT NULL headphoto varchar50 DEFAULT NULL
        2Js读取摄像头获得头像信息
        打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签。
        Media{ video true } functionstream扫脸支付 {
        mediaStreamTrack = Tracks()[0]
        video.src = window.URL || window.webkitURL.createObjectURLstream);
        video.play();
        } functionerr { console.logerr); });
        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.drawImagevideo00);
        var imgData = DataURL();
        var imgData1 = imgData.substring22); //在前端截取22位字符串作为图像数据
        var username = $"#username".val();
        $.ajax{ type "post" url "FaceServlettag=reg"
        data{"img"imgData1"username"username} success functiondata{
        ifdata=="恭喜你!人脸注册成功,即将跳转登录页面"{
        alertdata); location.href = "login.jsp" }
        ifdata=="人脸识别失败,请正对屏幕摄像头!!"{
        alertdata); return false }
        }errorfunctionmsg{ alert"错误"); } });
        4)利用人脸图像进行注册或登录
        FaceServlet中注册处理,如果是注册,则需要将提交的数据存入数据库和将用户名和图像存入百度人脸库。如果是登录,则将获得的人脸图像与人脸库中的进行比对。
        其中有三个核心代码:GenerateImage将图像上传服务器,facesetAddUser将图像上传人脸库,verifyUser方法为验证用户的方法。
        public booleanGenerateImageString imgStr String imgFilePath),其核心代码如下:
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bytes = decoder.decodeBufferimgStr); // Base64解码
        for int i = 0 i
        if bytes[i] < 0 {// 調整异常数据
        bytes[i] += 256 } }
        OutputStream out = new FileOutputStreamimgFilePath); // 生成jpeg图片
        out.writebytes);
        public booleanfacesetAddUserAipFace client String path String username)的核心代码:
        HashMap options = new HashMap();
        JSONObject res = client.addUserusername "test_users_info" Arrays.asList"group1" "group2"), path options);
        if res.keySet().contains"error_code")) { return false }
        return true
        public Double verifyUserAipFace client String path String username)的核心代码:
        HashMap options = new HashMap1);
        options.put"top_num" 5);
        JSONObject res = client.verifyUserusername Arrays.asList"group1" "group2"), path options);