趙丙秀
摘要:有關人臉識別技術的應用越來越普及,已經滲透到家庭看護、移動互聯網、智能硬件、政府警用、金融、監控、零售、社交娛樂等各個領域。國內有許多企業提供了人臉識別產品。該文介紹了基于Js、Ajax、Jsp等技術利用百度AI的SDK的Web人臉注冊登錄的實現。
關鍵詞:AIPFace;人臉識別;百度AI;Jsp
中圖分類號:TP393 文獻標識碼:A
文章編號:1009-3044(2019)07-0114-02
近幾年來,有關人臉識別技術的應用越來越普及,已逐漸滲透到各行各業,如家庭看護、遠程驗證注冊、政府警用、網吧兼管、手機支付等等。例如:“I Baby”全景嬰兒監視器,其借助人臉識別技術,監護寶寶,并實時同步到移動設備上,讓家長隨時隨地都能監管寶貝。微軟公司的顏齡機器人"how-old.net"網站可從用戶提供人物照片,識別出人性別和年齡。現在各大金融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標簽。
navigator.getMedia({ video: true }, function(stream) {
mediaStreamTrack = stream.getTracks()[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 = document.getElementById("canvas");
var video = document.getElementById("video");
var context = canvas.getContext("2d");
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
context.drawImage(video,0,0);
var imgData = canvans.toDataURL();
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 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.put("top_num", 5); JSONObject res = client.verifyUser(username, Arrays.asList("group1", "group2"), path, options); Double result = Double.parseDouble(res.getJSONArray("result").get(0) .toString()); return result; 4 結束語 基于百度AI平臺的Web人臉注冊和登錄系統,將人臉圖像存入將注冊的人臉圖片存入百度人臉庫,利用百度AI平臺中AipFace中提供的注冊人臉、驗證人臉的方法來實現人臉的添加和識別。人臉識別注冊登錄技術可以廣泛應用到各種系統中,節省了注冊時間和登錄時間,并具有一定的安全措施。 參考文獻 [1] 楊紫荊,韋思宏.潘林.人臉自動檢測與識別技術探究[J].設備管理與維修,2018(16):162-163. [2] 羅佳偉,孫雪峰,李琳.基于百度AI平臺的Web人臉注冊和登錄系統的設計[J].中國新通信,2018(6):73. 【通聯編輯:朱寶貴】