胡娟,蒲源
(1.广东白云学院大数据与计算机学院,广东广州 510400;2.华南理工大学未来技术学院,广东广州 511442)
人脸识别技术作为一种高效且准确的身份验证方法,已广泛应用于各个领域。银行、机场、边境检查站等场所采用人脸识别技术,可大幅度提高管理的安全性。在商业领域,人脸识别技术同样能够优化企业效率,如自助结账、门禁控制和员工考勤等环节。此外,人脸识别技术在医疗保健、社交网络和电子商务等领域的应用,为用户带来了更加智能化的服务。腾讯云神图作为人脸识别技术的领军产品,以其卓越的准确性和稳定性,赢得了业界的广泛认可。
低代码平台是在企业需要更快速地开发应用程序、缩短上线时间并减少开发成本的情况下诞生的。低代码平台的设计目的是让开发者在不需要大量编码的情况下,利用可视化拖放界面和预先定义的组件来构建应用程序。这种方法可以大大提高开发效率,它令非专业开发者也能够轻松创建复杂的应用程序,从而降低了开发门槛和学习曲线。将复杂的机器学习和深度学习知识与低代码技术相结合,有助于让缺乏机器学习算法经验的人员快速开发出高质量的人脸识别系统。
低代码(Low-Code) 一词最早在2014 年被提出,指通过图形用户界面和配置,来代替传统的手工编码计算机程序来创建应用程序软件的平台。低代码开发平台提供一个所见即所得的页面可视化编辑器,实现零代码/低代码生成页面,可以快速搭建可视化页面生产平台,让非技术人员可以通过拖拽和配置,自助生成H5页面、PC页面、TV页面,大大降低软件开发生产成本。
腾讯云神图人脸识别基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
该系统通过前端部署的人脸抓拍摄像机将实时采集的人脸数据通过专用网络上传到人脸识别服务器,采用腾讯云神图人脸识别服务来进行比对分析。在人脸识别API中,使用了一系列复杂的算法和技术来进行人脸检测和特征提取。当出现人脸与人脸库数据不匹配的情况,会通过邮件、短信等方式进行警报或告警,最后生成数据分析与比对报告。图1是该系统业务整体架构图。
图1 人脸识别系统业务整体架构图
通过摄像头拍照,使用人脸检测算法检测图像中是否存在人脸。如果图像中存在人脸,则根据返回的面部轮廓边界框的坐标、眼睛、鼻子等关键点的位置判断是否需要预处理。如果抓拍到的是人的侧脸,可能会因为光照、遮挡、姿态等因素的影响,从而导致人脸图像的面部区域发生了变形或偏移。这时需要进行旋转图片、缩放图片、人脸对齐、人脸裁剪等预处理操作,以便后续能够更加准确地进行特征提取。将提取出的人脸特征向量与已有的人脸库中的面孔特征向量进行比对,计算图像的特征向量和人脸库中的特征向量之间的相似度。如果相似度高于设定的阈值,系统会判断这些人脸图像为同一人,匹配成功。如果匹配成功,记录相关信息;如果匹配失败,则可以选择发出告警信号,并记录相关信息,最后生成数据分析报告。图2展示了该系统业务的整个流程。
图2 低代码人脸识别系统流程图
1)人脸检测:人脸检测基于深度学习技术,通过训练大量人脸图像数据建立模型。在应用过程中,模型对输入的图像进行分析。首先,模型通过滑动窗口(Sliding Window)[3]的方式和尺度金字塔[4]扫描图像中可能包含的人脸区域,然后对于每个窗口使用分类器来判断其是否包含人脸。借助多尺度检测(Multi-Scale detection) 和非极大值抑制(简称为NMS 算法,Non-Maximum Suppression) ,可以准确地定位到人脸区域。腾讯云神图在尺度金字塔扫描图中使用的是高斯金字塔(Gaussian Pyramid)[5]技术。高斯金字塔是一种多尺度图像处理方法,它通过不断进行下采样和高斯滤波,生成一系列图像金字塔,每一层图像的大小都是前一层图像的一半,并且对每一层图像进行平滑处理以保留重要的图像特征。腾讯云神图人脸检测还使用了全卷积网络(Fully Convolutional Network,FCN)。该算法将人脸图像作为输入,在网络中进行多轮卷积和池化等操作,最终输出每个人脸关键点的位置坐标。
2)特征提取:腾讯云神图使用深度学习方法将人脸图像转换为128维特征向量。特征提取前需要对输入的人脸图像进行预处理,如人脸缩放、对齐等,使其满足模型的输入要求。然后利用预训练的深度卷积神经网络(ResNet 和Inception 等)对人脸图像进行特征提取。卷积神经网络通过多层卷积、池化和激活函数等操作,从浅层的边缘和纹理特征到深层的高级语义特征逐层进行提取,这样提取出的特征更具有区分性和更强的表达能力,它能有效地描述不同个体之间的人脸差异。经过卷积神经网络提取出的特征通常具有较高的维度,为了将这些特征映射到128维空间,需要添加全连接层进行降维。全连接层将前一层的所有神经元与当前层的所有神经元进行连接。通过调整全连接层的神经元数量,可以实现降维。例如,前一层有512 个神经元,而全连接层只有128 个神经元,那么特征就会被映射到128维空间。最后,对生成的128维特征向量进行归一化处理,使其具有单位长度。这样做的目的是消除特征向量的尺度影响,以便于后续的相似度计算和人脸识别。
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,数值越大表示两个向量越相似,数值越小表示两个向量越不相似。在人脸比对中,可以将两个人脸的特征向量进行余弦相似度计算,从而判断它们是否属于同一个人。
要使用腾讯云神图人脸识别API,首先需要注册一个腾讯云账户并获取API 密钥(SecretId 和Secret-Key)。然后使用以下命令,安装腾讯云SDK:
npm install tencentcloud-sdk-nodejs --save。安装完就可以在低代码开发平台的自定义控件中编写代码了。下面介绍各核心模块的设计与实现。
人脸抓拍,采集人脸图像上传到服务器之后,对人脸进行检测。首先,需要导入腾讯云SDK tencentcloud-sdk-nodejs-iai,这是一个Node.js 库,用于与腾讯云的智能图像识别IAI服务进行通信。通过tencentcloud.iai.v20200303.Client 创建一个新的IaiClient 实例。该实例用于与腾讯云IAI 服务进行交互。clientConfig 对象包含了一些配置信息,如身份验证凭据secretId和secretKey,这些是用于访问腾讯云API的密钥。区域region,用于指定请求的目标地域。服务端点endpoint,是IAI服务的API地址,用于发送请求。使用clientConfig 配置信息创建IaiClient 实例之后,准备请求参数(params)。在这段代码中,将人脸图片的URL 地址放到了params 中。调用client.DetectFaceAttributes(params)方法,发送一个请求到腾讯云IAI服务以检测人脸属性。这是一个异步方法,返回一个Promise。使用.then 和.catch 处理Promise。如果请求成功,data 变量将包含返回的人脸属性数据,然后将其打印到控制台。如果发生错误,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;// 提取五官关键点数据
console.log(faceShapeSet);//输出五官关键点数据
},
(err)=>{
console.error("error",err);
}
);
这段代码中使用AnalyzeFace 方法定位人脸的五官。五官定位的结果是返回一组包含五官关键点坐标的数据。这些关键点通常包括眼睛、鼻子、嘴巴、脸颊等部位的坐标。要使用AnalyzeFace 方法进行五官定位,需要在params 对象中添加一个名为FaceAttributesType的属性,并将其值设置为faceoutline。这样在分析人脸时会返回五官关键点数据。效果如图3所示。
图3 五官关键点坐标定位
对于两张图片中的人脸进行相似度比对,返回人脸相似度分数,实现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 地址。当调用client.CompareFace(params)方法时,腾讯云IAI服务会比较这两张图像并计算它们之间的相似度得分。.then 处理函数用于处理成功的响应。响应中包含的data 对象包含CompareFace 方法的结果。通过访问data.Score,可以获取相似度得分。效果如图4所示。
图4 1:1比对结果
对于给定的一张人脸照片,和已有人脸库中的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 属性包含一个字符串数组,表示要在其中搜索的人脸库分组ID列表。人脸库分组ID列表通过将人脸数据分组,可以方便地对不同的人脸数据进行批量操作,例如删除人脸数据、修改或添加等操作。同时,通过对人脸数据进行分组,还可以方便地进行人脸识别和人脸搜索。在进行人脸搜索时,根据分组ID来指定只在特定的分组中进行搜索,从而提高搜索效率和准确度。调用client.SearchFaces(params)方法后,腾讯云IAI 服务将在指定的人脸库分组中查找与给定人脸图像相似的人脸。.then 处理函数用于处理成功的响应。响应中的data 对象包含了SearchFaces方法的搜索结果。
结合低代码开发平台和人脸识别技术,本文设计了一款高效的人脸识别系统。该系统实现了自动化人脸对齐、裁剪,并且人脸识别的准确性高。未来,可以在此基础上进一步完善和扩展功能,以满足更多的企业需求。例如,可以将该系统应用于安防领域,对访客的身份进行识别和登记;也可以将其应用于教育领域[6],通过人脸识别来验证考生的身份。