# 人脸验证与检索 Android SDK 文档

# 1、简介

人脸识别(Face Recognize),是一项提取人脸特征信息进行智能分析的生物识别技术,识别率高达99.4%,比肉眼更准确。 MSC SDK 中人脸识别(IdentityVerifier)功能,主要分为下面几类型:

(1)人脸验证——1:1 相似度对比 通过提取两张人脸的特征,进行相似度对比,最终返回相应的置信度得分,系统根据特征匹配程度决定“拒绝”或者“接受”。用于判断两个输入人脸是否属于同一人。

(2)人脸检索——1:N相似度对比 在大规模人脸数据库中快速找出与待检索人脸相似度最高的一个或多个人脸。

人脸识别详细的接口介绍及说明请参考: MSC Android API 文档, 在集成过程中如有疑问,可登录语音云开发者论坛,查找答案或与其他开发者交流。

# 2. 参数相关说明

在人脸识别过程的主要参数有:

  • 人脸识别会话类型(MFV_SST): 会话类型,包括注册(enroll),验证(verify),删除(delete)

  • 用户ID(AUTH_ID):标识每个使用人脸功能的终端用户的唯一ID

  • 业务场景(MFV_SCENES):业务类型,人脸业务为ifr

其中人脸检测和聚焦是对任意人脸图片检测,与用户是否已注册无关,故不需要设置用户 ID。 识别结果通过 RequestListener 回调返回,其中包含了是否成功等信息,详细的 JSON 格式请参照附录-人脸识别结果

相关概念的说明如下:

名称 说明
enroll/注册 上传包含一张人脸的图片到云端,引擎对其进行特征抽取,生成一个与之对应的模型,返回模型id(gid)。
verify/验证 注册成功后,上传包含一张人脸的图片到云端,引擎将其与所注册的人脸模型进行比对,验证是否为同一个人,返回验证结果。
delete/删除 删除注册的人脸模型
auth_id/用户id 由应用传入,用于标识用户身份,长度为6-18个字符(由英文字母、数字、下划线组成,不能以数字开头),注:注册和验证都必须指定auth_id.

为了获得较高的准确率,请确保输入的图片满足以下要求:

项目 要求
色彩、格式 彩色,PNG、JPG、BMP格式的图片。
人脸大小 、角度 大小应超过100*100像素,可以容忍一定程度的侧脸,为保证识别准确率,最好使用正脸图片。
光照 均匀光照,可容忍部分阴影。
遮挡物 脸部尽量无遮挡,眼镜等物品会一定程度上影响准确率。

# 3、SDK集成指南

# 1、导入SDK

将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。如下图所示:

注:

  1. arm版本已经逐步淘汰了,arm架构的推荐使用armeabi-v7a。
  2. 如果您需要将应用push到设备使用,请将设备cpu对应指令集的libmsc.so push到/system/lib中。

# 2、添加用户权限

在工程 AndroidManifest.xml 文件中添加如下权限

<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!--外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />

注意:如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码:

-keep class com.iflytek.**{*;}
-keepattributes Signature

# 3、初始化

初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");

createUtility方法的第二个参数为传入的初始化参数列表,可配置的参数如下:

参数 说明 必填
appid 8位16进制数字字符串,应用的唯一标识,与下载的SDK一一对应。
usr 开发者在云平台上注册的账号。
pwd 账号对应的密码,与账号同时存在。
engine_mode 引擎模式,可选值为:msc:只使用MSC的能力;plus:只使用语记能力;auto:云端使用MSC,本地使用语记;默认取值为auto。注:使用MSC本地功能的请设置为msc。
force_login 在createUtility时会对进程名称进行检查,如果名称与应用包名不一致则不进行login操作,返回null,用以规避在子进程反复进行调用的问题。此参数设置是否强制login。默认值:false (进行检查,不强制login)。
lib_name 在createUtility时会加载动态库,此时可以传入动态库名称。例如:libmsc_xxx_1072.so(xxx为您的公司名,1072为科大讯飞sdk版本号), 默认值:msc。注:如您是预装软件,为了避免动态库冲突建议修改名称。

注意:参数需要以键值对的形式存储在字符串中传入createUtility方法,以逗号隔开,如“appid=12345678,usr=iflytekcloud,pwd=123456”。

# 4.人脸注册

根据mEnrollListener的onResult回调方法中得到注册结果

// 设置会话场景
mIdVerifier.setParameter(SpeechConstant.MFV_SCENES, "ifr");
// 设置会话类型
mIdVerifier.setParameter(SpeechConstant.MFV_SST, "enroll");
// 设置用户id
mIdVerifier.setParameter(SpeechConstant.AUTH_ID, authid);
// 注册监听器(IdentityListener)mEnrollListener,开始会话。
// 并通过mEnrollListener中onResult回调中获得json格式结果
mIdVerifier.startWorking(mEnrollListener);
// 子业务执行参数,若无可以传空字符传
StringBuffer params = new StringBuffer();
// 写入数据,mImageData为图片的二进制数据
mIdVerifier.writeData("ifr", params.toString(), mImageData, 0, mImageData.length);
// 停止写入
mIdVerifier.stopWrite("ifr");

# 5.人脸验证

通过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, authid);
// 注册监听器(IdentityListener)mVerifyListener,开始会话。
mIdVerifier.startWorking(mVerifyListener);
// 子业务执行参数,若无可以传空字符传
StringBuffer params = new StringBuffer();
// 写入数据,mImageData为图片的二进制数据
mIdVerifier.writeData("ifr", params.toString(), mImageData, 0, mImageData.length);
// 停止写入
mIdVerifier.stopWrite("ifr");

# 6.模型操作(删除)

人脸注册成功后,在语音云端上会生成一个对应的模型来存储人脸信息,人脸模型的操 作即对模型进行删除,暂时尚未支持查询"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);

# 7.1:N检索

鉴别与验证的过程相似,不过鉴别需要设置组 ID,以指定要鉴别的组。 其参数设置如下:

// 设置业务场景
mIdVerifier.setParameter( SpeechConstant.MFV_SCENES, "ifr" ); 
// 设置业务类型:鉴别(identify)
mIdVerifier.setParameter( SpeechConstant.MFV_SST, "identify" );
// 设置监听器,开始会话
mIdVerifier.startWorking( listener );
// 指定组id,最相似结果数
String params = "group_id="+groudID
while( !isDataFinished ){
	  // 写入数据
   	 mIdVerifier.writeData( scence, params, data, offset, length );
	}
	mIdVerifier.stopWrite( scence );
}

# 8.人脸识别结果

JSON字段 类型 说明
sst String 业务类型,取值为“enroll”或“verify”
ret int 返回值,0为成功,-1为失败
ssub String 业务类型为ifr
face_score double 人脸验证的得分(验证时返回)
sid String 本次交互会话的id
uid String 返回的用户id
decision String 描述信息,accepted:验证成功,rejected:验证失败

注册结果示例:

{
    "ret":0,
    "suc":1,
    "rgn":1,
    "sst":"enroll",
    "ssub":"ifr",
    "fid":"2e7d53cb78deadc67518dd53ac2e2a3a"
}

验证结果示例:

{
    "ret":0,
    "face_score":99.999,
    "voice_score":0,
    "ssub":"ifr",
    "decision":"accepted",
    "fusion_score":99.999,
    "sst":"verify"
}

人脸1:N 检索 参考附 录声纹结果 --声纹1:N检索

# 4、视频教程

起源发展

概念解析

技术原理

典型应用

# 5、常见问题

# 人脸验证与检索的主要功能是什么?

答:将人脸特征信息进行比对,判断是否属于同一个人。

# 人脸验证与检索的识别率是多少?

答:目前识别率高达99.4%,比肉眼更准确。

# 人脸验证与检索支持活体检测吗?

答:人脸验证与检索是支持静态照片,不支持活体检测功能。

# 人脸验证与检索最大支持创建多少个组,每个组最多支持多少人?

答:未付费最多可以创建10组,每组最多100人,商务合作:100组,每组10000人,超过组上限会报10144错误。