# 人脸识别
[TOC]
人脸识别(Face Recognize),是一项提取人脸特征信息进行智能分析的生物识别技术,识别率高达99.4%,必肉眼更准确。 MSC SDK 中人脸识别(IdentityVerifier)功能,主要分为下面几类型:
(1)人脸验证——1:1 相似度对比
通过提取两张人脸的特征,进行相似度对比,最终返回相应的置信度得分,系统根据特征匹配程度决定“拒绝”或者“接受”。用于判断两个输入人脸是否属于同一人。
(2)人脸检索——1:N相似度对比
在大规模人脸数据库中快速找出与待检索人脸相似度最高的一个或多个人脸。
注册、验证和模型管理相关说明:
| 名称 | 说明 |
| --- | --- |
| enroll/注册 | 上传包含一张人脸的图片到云端,引擎对其进行特征抽取,生成一个与之对应的模型,返回模型id(gid)。 |
| verify/验证 | 注册成功后,上传包含一张人脸的图片到云端,引擎将其与所注册的人脸模型进行比对,验证是否为同一个人,返回验证结果。 |
| delete/删除 | 删除注册的人脸模型 |
| auth_id/用户id | 由应用传入,用于标识用户身份,长度为6-18个字符(由英文字母、数字、下划线组成,不能以数字开头),注:注册和验证都必须指定auth_id. |
为了获得较高的准确率,请确保输入的图片满足以下要求:
|项目|要求|
|:---:|---|
|色彩、格式|彩色,PNG、JPG、BMP格式的图片。|
|人脸大小 、角度|大小应超过100\*100像素,可以容忍一定程度的侧脸,为保证识别准确率,最好使用正脸图片。|
|光照|均匀光照,可容忍部分阴影。|
|遮挡物|脸部尽量无遮挡,眼镜等物品会一定程度上影响准确率。|
在人脸识别过程的主要参数有:
* 人脸识别会话类型(MFV_SST):λ 会话类型,包括注册(enroll),验证(verify),删除(delete)
* 用户ID(AUTH_ID):标识每个使用人脸功能的终端用户的唯一ID
* 业务场景(MFV_SCENES):业务类型,人脸业务为ifr
其中人脸检测和聚焦是对任意人脸图片检测,与用户是否已注册无关,故不需要设置用户 ID。
识别结果通过 RequestListener 回调返回,其中包含了是否成功等信息,详细的 JSON 格式请参照 附录。
## 人脸注册
具体接口调用如下,通过注册的mEnrollListener中onResult回调中json格式结果进行解析。
~~~
// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ifr");
// 设置会话类型
mIdVerifier.setParameter(SpeechConstant.MFV_SST, "enroll");
// 设置用户id
mIdVerifier.setParameter(SpeechConstant.AUTH_ID, mAuthid);
// 设置监听器,开始会话
mIdVerifier.startWorking(mEnrollListener);
while( !isDataFinished ){
// 写入数据,data为图片的二进制数据
mIdVerifier.writeData("ifr", params, data, offset, length );
}
mIdVerifier.stopWrite("ifr");
~~~
## 人脸验证
具体接口参数调用如下,通过注册的mVerifyListener中onResult回调中json格式结果进行解析。
~~~
// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ifr");
// 设置会话类型
mIdVerifier.setParameter(SpeechConstant.MFV_SST, "verify");
// 设置验证模式,单一验证模式:sin
mIdVerifier.setParameter(SpeechConstant.MFV_VCM, "sin");
// 用户id
mIdVerifier.setParameter(SpeechConstant.AUTH_ID, mAuthid);
// 设置监听器,开始会话
mIdVerifier.startWorking(mVerifyListener);
while( !isDataFinished ){
// 写入数据,data为图片的二进制数据
mIdVerifier.writeData("ifr", params, data, offset, length );
}
mIdVerifier.stopWrite("ifr");
~~~
## 模型操作
人脸注册成功后,在语音云端上会生成一个对应的模型来存储人脸信息,人脸模型的操作即对模型进行删除,暂时尚未支持查询"query"操作。具体调用参考如下
~~~
// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ifr");
// 用户id
mIdVerifier.setParameter(SpeechConstant.AUTH_ID, authid);
// 设置模型参数,若无可以传空字符传
StringBuffer params = new StringBuffer();
// 执行模型操作,cmd取值"delete" 删除
mIdVerifier.execute("ifr", cmd, params.toString(), mModelListener);
~~~
## 安全性问题
在人脸识别中,最重要的问题,可能是图片的可复制重复使用的问题。根据前文可知道, MSC SDK 在人脸识别时,并不是直接使用摄像头等硬件,只要应用传入二进制的图片数据即可。这时,在验证时,即使用一张他人照片,MSC SDK 也是无法分辨的;同时,应用即使是使用摄像头来拍摄实时照片,也有可能被用户使用照片来欺骗。所以,在这样的情况下,人为的管理则显得尤其重要:如要求用户验证时,有管理员在场保证其不使用他人照片(在公司打卡、门禁的场景)等。
此外,模型更新,APPID 和 用户 ID 要注意的问题,可参考声纹密码章节中的安全性问题说明,此处不再重复。
把人脸识别结合声纹密码,可以提供更高的安全性,参考融合验证章节。
## 1:N人脸检索
通过上传一张图片,鉴别是哪个用户 ID 的 1:N 鉴别功能,参考声纹识别中1:N检索部分。