胡娟,蒲源
(1.廣東白云學院大數(shù)據(jù)與計算機學院,廣東廣州 510400;2.華南理工大學未來技術學院,廣東廣州 511442)
人臉識別技術作為一種高效且準確的身份驗證方法,已廣泛應用于各個領域。銀行、機場、邊境檢查站等場所采用人臉識別技術,可大幅度提高管理的安全性。在商業(yè)領域,人臉識別技術同樣能夠優(yōu)化企業(yè)效率,如自助結(jié)賬、門禁控制和員工考勤等環(huán)節(jié)。此外,人臉識別技術在醫(yī)療保健、社交網(wǎng)絡和電子商務等領域的應用,為用戶帶來了更加智能化的服務。騰訊云神圖作為人臉識別技術的領軍產(chǎn)品,以其卓越的準確性和穩(wěn)定性,贏得了業(yè)界的廣泛認可。
低代碼平臺是在企業(yè)需要更快速地開發(fā)應用程序、縮短上線時間并減少開發(fā)成本的情況下誕生的。低代碼平臺的設計目的是讓開發(fā)者在不需要大量編碼的情況下,利用可視化拖放界面和預先定義的組件來構(gòu)建應用程序。這種方法可以大大提高開發(fā)效率,它令非專業(yè)開發(fā)者也能夠輕松創(chuàng)建復雜的應用程序,從而降低了開發(fā)門檻和學習曲線。將復雜的機器學習和深度學習知識與低代碼技術相結(jié)合,有助于讓缺乏機器學習算法經(jīng)驗的人員快速開發(fā)出高質(zhì)量的人臉識別系統(tǒng)。
低代碼(Low-Code) 一詞最早在2014 年被提出,指通過圖形用戶界面和配置,來代替?zhèn)鹘y(tǒng)的手工編碼計算機程序來創(chuàng)建應用程序軟件的平臺。低代碼開發(fā)平臺提供一個所見即所得的頁面可視化編輯器,實現(xiàn)零代碼/低代碼生成頁面,可以快速搭建可視化頁面生產(chǎn)平臺,讓非技術人員可以通過拖拽和配置,自助生成H5頁面、PC頁面、TV頁面,大大降低軟件開發(fā)生產(chǎn)成本。
騰訊云神圖人臉識別基于騰訊優(yōu)圖強大的面部分析技術,提供包括人臉檢測與分析、比對、搜索、驗證、五官定位、活體檢測等多種功能,為開發(fā)者和企業(yè)提供高性能高可用的人臉識別服務??蓱糜谠诰€娛樂、在線身份認證等多種應用場景,充分滿足各行業(yè)客戶的人臉屬性識別及用戶身份確認等需求。
該系統(tǒng)通過前端部署的人臉抓拍攝像機將實時采集的人臉數(shù)據(jù)通過專用網(wǎng)絡上傳到人臉識別服務器,采用騰訊云神圖人臉識別服務來進行比對分析。在人臉識別API中,使用了一系列復雜的算法和技術來進行人臉檢測和特征提取。當出現(xiàn)人臉與人臉庫數(shù)據(jù)不匹配的情況,會通過郵件、短信等方式進行警報或告警,最后生成數(shù)據(jù)分析與比對報告。圖1是該系統(tǒng)業(yè)務整體架構(gòu)圖。
圖1 人臉識別系統(tǒng)業(yè)務整體架構(gòu)圖
通過攝像頭拍照,使用人臉檢測算法檢測圖像中是否存在人臉。如果圖像中存在人臉,則根據(jù)返回的面部輪廓邊界框的坐標、眼睛、鼻子等關鍵點的位置判斷是否需要預處理。如果抓拍到的是人的側(cè)臉,可能會因為光照、遮擋、姿態(tài)等因素的影響,從而導致人臉圖像的面部區(qū)域發(fā)生了變形或偏移。這時需要進行旋轉(zhuǎn)圖片、縮放圖片、人臉對齊、人臉裁剪等預處理操作,以便后續(xù)能夠更加準確地進行特征提取。將提取出的人臉特征向量與已有的人臉庫中的面孔特征向量進行比對,計算圖像的特征向量和人臉庫中的特征向量之間的相似度。如果相似度高于設定的閾值,系統(tǒng)會判斷這些人臉圖像為同一人,匹配成功。如果匹配成功,記錄相關信息;如果匹配失敗,則可以選擇發(fā)出告警信號,并記錄相關信息,最后生成數(shù)據(jù)分析報告。圖2展示了該系統(tǒng)業(yè)務的整個流程。
圖2 低代碼人臉識別系統(tǒng)流程圖
1)人臉檢測:人臉檢測基于深度學習技術,通過訓練大量人臉圖像數(shù)據(jù)建立模型。在應用過程中,模型對輸入的圖像進行分析。首先,模型通過滑動窗口(Sliding Window)[3]的方式和尺度金字塔[4]掃描圖像中可能包含的人臉區(qū)域,然后對于每個窗口使用分類器來判斷其是否包含人臉。借助多尺度檢測(Multi-Scale detection) 和非極大值抑制(簡稱為NMS 算法,Non-Maximum Suppression) ,可以準確地定位到人臉區(qū)域。騰訊云神圖在尺度金字塔掃描圖中使用的是高斯金字塔(Gaussian Pyramid)[5]技術。高斯金字塔是一種多尺度圖像處理方法,它通過不斷進行下采樣和高斯濾波,生成一系列圖像金字塔,每一層圖像的大小都是前一層圖像的一半,并且對每一層圖像進行平滑處理以保留重要的圖像特征。騰訊云神圖人臉檢測還使用了全卷積網(wǎng)絡(Fully Convolutional Network,F(xiàn)CN)。該算法將人臉圖像作為輸入,在網(wǎng)絡中進行多輪卷積和池化等操作,最終輸出每個人臉關鍵點的位置坐標。
2)特征提?。候v訊云神圖使用深度學習方法將人臉圖像轉(zhuǎn)換為128維特征向量。特征提取前需要對輸入的人臉圖像進行預處理,如人臉縮放、對齊等,使其滿足模型的輸入要求。然后利用預訓練的深度卷積神經(jīng)網(wǎng)絡(ResNet 和Inception 等)對人臉圖像進行特征提取。卷積神經(jīng)網(wǎng)絡通過多層卷積、池化和激活函數(shù)等操作,從淺層的邊緣和紋理特征到深層的高級語義特征逐層進行提取,這樣提取出的特征更具有區(qū)分性和更強的表達能力,它能有效地描述不同個體之間的人臉差異。經(jīng)過卷積神經(jīng)網(wǎng)絡提取出的特征通常具有較高的維度,為了將這些特征映射到128維空間,需要添加全連接層進行降維。全連接層將前一層的所有神經(jīng)元與當前層的所有神經(jīng)元進行連接。通過調(diào)整全連接層的神經(jīng)元數(shù)量,可以實現(xiàn)降維。例如,前一層有512 個神經(jīng)元,而全連接層只有128 個神經(jīng)元,那么特征就會被映射到128維空間。最后,對生成的128維特征向量進行歸一化處理,使其具有單位長度。這樣做的目的是消除特征向量的尺度影響,以便于后續(xù)的相似度計算和人臉識別。
3)人臉識別:提取出特征向量之后需要計算相似度。特征向量的相似度是指兩個特征向量之間的相似程度,通常用余弦相似度(Cosine Similarity)來衡量。余弦相似度衡量的是兩個向量在方向上的相似程度,而不考慮它們在長度上的差異。當兩個向量指向相似的方向時,夾角余弦值接近于1,說明它們非常相似;當兩個向量指向截然相反的方向時,夾角余弦值接近于-1,說明它們非常不相似;當兩個向量垂直時,夾角余弦值接近于0,說明它們之間沒有相似性。對于兩個特征向量a 和b,它們的余弦相似度可以通過下面的公式計算:
cosine_similarity(a,b)=(a·b)/(||a||*||b||)
其中,a·b表示向量a和向量b的點積,||a||和||b||分別表示向量a和向量b的模長。余弦相似度的取值范圍在-1~1,數(shù)值越大表示兩個向量越相似,數(shù)值越小表示兩個向量越不相似。在人臉比對中,可以將兩個人臉的特征向量進行余弦相似度計算,從而判斷它們是否屬于同一個人。
要使用騰訊云神圖人臉識別API,首先需要注冊一個騰訊云賬戶并獲取API 密鑰(SecretId 和Secret-Key)。然后使用以下命令,安裝騰訊云SDK:
npm install tencentcloud-sdk-nodejs --save。安裝完就可以在低代碼開發(fā)平臺的自定義控件中編寫代碼了。下面介紹各核心模塊的設計與實現(xiàn)。
人臉抓拍,采集人臉圖像上傳到服務器之后,對人臉進行檢測。首先,需要導入騰訊云SDK tencentcloud-sdk-nodejs-iai,這是一個Node.js 庫,用于與騰訊云的智能圖像識別IAI服務進行通信。通過tencentcloud.iai.v20200303.Client 創(chuàng)建一個新的IaiClient 實例。該實例用于與騰訊云IAI 服務進行交互。clientConfig 對象包含了一些配置信息,如身份驗證憑據(jù)secretId和secretKey,這些是用于訪問騰訊云API的密鑰。區(qū)域region,用于指定請求的目標地域。服務端點endpoint,是IAI服務的API地址,用于發(fā)送請求。使用clientConfig 配置信息創(chuàng)建IaiClient 實例之后,準備請求參數(shù)(params)。在這段代碼中,將人臉圖片的URL 地址放到了params 中。調(diào)用client.DetectFaceAttributes(params)方法,發(fā)送一個請求到騰訊云IAI服務以檢測人臉屬性。這是一個異步方法,返回一個Promise。使用.then 和.catch 處理Promise。如果請求成功,data 變量將包含返回的人臉屬性數(shù)據(jù),然后將其打印到控制臺。如果發(fā)生錯誤,err變量將包含錯誤信息,然后將其打印到控制臺。人臉檢測代碼如下:
const tencentcloud = require("tencentcloud-sdknodejs-iai");
const IaiClient=tencentcloud.iai.v20200303.Client;
const clientConfig={
credential:{
secretId:"SecretId",
secretKey:"SecretKey",
},
region:"",
profile:{
httpProfile:{
endpoint:"iai.tencentcloudapi.com",
},
},
};
const client=new IaiClient(clientConfig);
const params={
ImageUrl: ′https://example.com/your-face-image.jpg′
};
client.DetectFaceAttributes(params).then(
(data)=>{
console.log(data);
},
(err)=>{
console.error("error",err);
}
);
五官關鍵點定位的目的是更精準地分析人臉信息。通過對面部五官關鍵點的定位,可以更加準確地確定面部特征的位置。核心代碼如下:
const client=new IaiClient(clientConfig);
const params={
ImageUrl: ′https://example.com/your-face-image.jpg′,
FaceAttributesType:′faceoutline′
};
client.AnalyzeFace(params).then(
(data)=>{
console.log(data);
const faceShapeSet = data.FaceShapeSet;// 提取五官關鍵點數(shù)據(jù)
console.log(faceShapeSet);//輸出五官關鍵點數(shù)據(jù)
},
(err)=>{
console.error("error",err);
}
);
這段代碼中使用AnalyzeFace 方法定位人臉的五官。五官定位的結(jié)果是返回一組包含五官關鍵點坐標的數(shù)據(jù)。這些關鍵點通常包括眼睛、鼻子、嘴巴、臉頰等部位的坐標。要使用AnalyzeFace 方法進行五官定位,需要在params 對象中添加一個名為FaceAttributesType的屬性,并將其值設置為faceoutline。這樣在分析人臉時會返回五官關鍵點數(shù)據(jù)。效果如圖3所示。
圖3 五官關鍵點坐標定位
對于兩張圖片中的人臉進行相似度比對,返回人臉相似度分數(shù),實現(xiàn)1∶1 比對。1∶1 比對是人臉識別技術中的一種對比方式,也被稱為驗證。在1∶1比對中,通常先將兩張照片進行特征提取,然后計算它們之間的相似度得分。如果相似度得分超過了設定的閾值,則可以認為這兩張照片屬于同一個人。核心代碼如下:
const client=new IaiClient(clientConfig);
const params={
ImageUrlA: ′https://example.com/your-face-image-A.jpg′,
ImageUrlB: ′https://example.com/your-face-image-B.jpg′
};
client.CompareFace(params).then(
(data)=>{
console.log(data);
const similarityScore = data.Score;// 提取相似度得分
console.log(′Similarity Score: ′, similarityScore);//輸出相似度得分
},
(err)=>{
console.error("error",err);
}
);
這段代碼中的CompareFace方法可以比較兩張人臉圖像。代碼中,params 對象包含了兩個名為ImageUrlA和ImageUrlB的屬性。這些屬性分別包含兩張人臉圖片的URL 地址。當調(diào)用client.CompareFace(params)方法時,騰訊云IAI服務會比較這兩張圖像并計算它們之間的相似度得分。.then 處理函數(shù)用于處理成功的響應。響應中包含的data 對象包含CompareFace 方法的結(jié)果。通過訪問data.Score,可以獲取相似度得分。效果如圖4所示。
圖4 1:1比對結(jié)果
對于給定的一張人臉照片,和已有人臉庫中的N個人臉進行比對,找出最相似的一張臉或多張臉,并給出相似度排序,實現(xiàn)1:N 搜索。人臉搜索核心代碼如下:
const client=new IaiClient(clientConfig);
const params={
ImageUrl: ′https://example.com/your-face-image.jpg′,
GroupIds:[′group_id_1′,′group_id_2′]
};
client.SearchFaces(params).then(
(data)=>{
console.log(data);
},
(err)=>{
console.error("error",err);
}
);
這段代碼使用了SearchFaces方法,在指定的人臉庫分組中搜索與給定人臉圖像相似的人臉。在params 對象中,ImageUrl 屬性包含人臉圖片的URL 地址,GroupIds 屬性包含一個字符串數(shù)組,表示要在其中搜索的人臉庫分組ID列表。人臉庫分組ID列表通過將人臉數(shù)據(jù)分組,可以方便地對不同的人臉數(shù)據(jù)進行批量操作,例如刪除人臉數(shù)據(jù)、修改或添加等操作。同時,通過對人臉數(shù)據(jù)進行分組,還可以方便地進行人臉識別和人臉搜索。在進行人臉搜索時,根據(jù)分組ID來指定只在特定的分組中進行搜索,從而提高搜索效率和準確度。調(diào)用client.SearchFaces(params)方法后,騰訊云IAI 服務將在指定的人臉庫分組中查找與給定人臉圖像相似的人臉。.then 處理函數(shù)用于處理成功的響應。響應中的data 對象包含了SearchFaces方法的搜索結(jié)果。
結(jié)合低代碼開發(fā)平臺和人臉識別技術,本文設計了一款高效的人臉識別系統(tǒng)。該系統(tǒng)實現(xiàn)了自動化人臉對齊、裁剪,并且人臉識別的準確性高。未來,可以在此基礎上進一步完善和擴展功能,以滿足更多的企業(yè)需求。例如,可以將該系統(tǒng)應用于安防領域,對訪客的身份進行識別和登記;也可以將其應用于教育領域[6],通過人臉識別來驗證考生的身份。