人脸识别
人脸识别使用流程
当需要使用人脸识别时:
- 调用
RobotSDKEngine.getInstance.startFaceRecognize()
来启动人脸识别任务, - 调用
RobotSDKEngine.getInstance.registerFaceListener(RecognizeListener listener)
传入RobotSDKEngine.RecognizeListener
的实现来获取本地人脸检测的结果; - 调用
RobotSDKEngine.getInstance().addDirectiveListener()
,传入Screen类型 DirectiveListener 监听器实现,在onRenderPerson(UserCard card, byte[] data)
回调中获取在线人脸识别的结果,详见指令回调处理(请联系我们进行在线人脸库的人脸信息添加); - SDK支持配置人脸识别所使用的人脸 face group,需要调用
SDKConfig
的Builder
类的setFaceGroup(String faceGroup)
方法;
当需要结束人脸识别时:
- 调用
RobotSDKEngine.getInstance.unRegisterFaceListener()
来取消人脸识别任务的回调监听,并移除监听器实例; - 调用
RobotSDKEngine.getInstance.stopTracking()
:结束人脸识别任务;
接下来对方法进行详细说明:
/**
* 开始一次人脸识别,开发者需自行指定摄像头配置参数
*
* @param surfaceView 摄像头镜像展示所需要的view, 需要开发者自行在应用层维护其内存和生命周期。
* @param taskType 任务类型,目前支持:
* RobotSDKEngine.TASK_FACE_LOGIN:人脸登录任务
* RobotSDKEngine.TASK_FACE_RECOGNIZE:人脸识别任务
* @param config 摄像头配置参数,CameraConfig 具体说明见下文
* @return 摄像头打开成功则返回true,反之则为false
*/
public boolean startFaceRecognize(SurfaceView surfaceView,
@FaceTaskType int taskType,
CameraConfig config);
/**
* 开始一次人脸识别,SDK使用初始化时传入的默认的摄像头配置参数
*
* @param surfaceView 摄像头镜像展示所需要的view, 需要开发者自行在应用层维护其内存和生命周期。
* @param taskType 任务类型,目前支持:
* RobotSDKEngine.TASK_FACE_LOGIN:人脸登录任务
* RobotSDKEngine.TASK_FACE_RECOGNIZE:人脸识别任务
* @return 摄像头打开成功则返回true,反之则为false
*/
public boolean startFaceRecognize(SurfaceView surfaceView,
@FaceTaskType int taskType);
CameraConfig
方法列表如下:
/**
* 构造方法,初始化一个摄像头参数
* @param displayRotation 摄像头镜像画面的展示方向
* @param cameraType 接入的摄像头类型
* @param cameraParam 摄像头配置参数
*/
public CameraConfig(int displayRotation, int cameraType, String cameraParam)
/**
* 通过SDK初始化时配置的参数获取默认的 CameraConfig
* @return 默认CameraConfig 实例
*/
public static CameraConfig getDefault()
参数名 | 说明 | 可选值 |
---|---|---|
displayRotation | SurfaceView中预览画面的显示角度 | 可选的参数值分别为0、1、2、3; 分别对应的为view控件展示的镜像逆时针旋转0°、90°、180°、270° |
cameraType | 相机类型 | AbstractCamera.TYPE_RTSP :网络摄像头 AbstractCamera.TYPE_USB :外置USB摄像头 AbstractCamera.TYPE_INTERNAL_FRONT :前置摄像头 AbstractCamera.TYPE_INTERNAL_REAR :后置摄像头 |
cameraParam | 相机配置参数 | 1、当摄像头类型为内置时:此参数设置为:0代表后置,1代表前置; 2、当摄像头为USB Camera类型时,此参数应该为usb camera的设备号 |
人脸逻辑调用代码示例:
public class FaceTestActivity implements RobotSDKEngine.RecognizeListener {
private static final String TAG = "FaceTestActivity";
public static final CameraConfig CAMERA_CONFIG
= new CameraConfig(2, AbstractCamera.TYPE_INTERNAL_REAR, "0");
// 在线人脸识别结果回调
private class UserCardHandler implements IScreenListener {
@Override
public void onRenderPerson(UserCard card, byte[] data) {
String name = card.getName();
// todo
}
// other call back method goes here ...
};
private UserCardHandler mUserCardHandler = new UserCardHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wake_up);
RobotSDKEngine.getInstance().startFaceRecognize(surfaceView, TASK_FACE_LOGIN, CAMERA_CONFIG);
RobotSDKEngine.getInstance().registerFaceListener(callback);
RobotSDKEngine.getInstance().addDirectiveListener(NamespaceGroup.SCREEN, mUserCardHandler);
}
@Override
protected void onDestroy() {
super.onDestroy();
RobotSDKEngine.getInstance().stopTracking();
RobotSDKEngine.getInstance().unRegisterFaceListener();
RobotSDKEngine.getInstance().removeDirectiveListener(NamespaceGroup.SCREEN, mUserCardHandler);
}
@Override
public void onNewFace(FaceInfos faceInfos, Bitmap faceImage) {
}
// 查询到人脸相关信息的回调。
// 仅离线人脸识别会通过本接口回调数据
// 开发者需要实现基于指令的监听器以获得完整回调信息,详见”数据回调处理”
@Override
public void onFaceResult(int faceid, String personInfo) {
String userName = "";
if (personInfo != null) {
JSONObject obj = JSONObject.parseObject(personInfo);
int errorCode = obj.getIntValue("error_code");
if (errorCode == 0) {
if (obj.containsKey("customer")) {
obj = obj.getJSONObject("customer");
if (obj.containsKey("name")) {
userName = obj.getString("name");
if (userName == null || "null".equals(userName)) {
userName = "";
}
}
}
}
}
}
// 人脸移出回调,人脸从画面(摄像头镜像)中消失的时候触发
@Override
public void onFaceOut(int faceid) {
Log.d(TAG, "人脸移出摄像头,给出人脸的id号:" + faceid);
}
// 人脸检测出现错误的时候触发
@Override
public void onError(int errorCode) {
}
}
人脸检测事件监听器接口说明
RecognizeListener
为人脸识别监听器接口。具有如下回调函数:
public void onNewFace(FaceInfos faceInfos, Bitmap faceImage)
SDK通过摄像头检测到有人脸进入时回调该方法。
参数:
FaceInfos faceInfos
人脸信息,详情参考FaceInfos。
Bitmap faceImage
裁剪后的人脸图片(含背景)
public void onFaceTracker(FaceInfos faceInfos)
SDK通过摄像头检测每一帧图片中的人脸回调,当前图片帧有人脸存在时会回调该方法。
参数:
FaceInfos faceInfos
人脸信息,详情参考FaceInfos。
public void onFaceResult(int faceid, String personInfo)
SDK识别出onNewFace函数检测到的人脸的具体信息时回调该方法,返回人脸id和详细信息。
参数:
int faceid
:人脸ID
String personInfo
:personInfo 的返回值有如下情况:
-
人脸匹配到人脸库中人脸且相似度分数高于 SDKConfig.setOfflineFaceRecogScore 中设置的阈值时:
// name 字段对应本地人脸入库时,人脸照片的文件名,score 字段对应相似度分数; "{'name':'<人脸照片文件名>', 'score':'<相似度分数>'}"
-
当前人脸匹配到人脸库中的人脸但相似度分数低于 SDKConfig.setOfflineFaceRecogScore 中设置的阈值时:
// name 字段对应一个空白字符串,score 字段对应相似度分数; "{'name':'', 'score':'<相似度分数>'}"
-
当前人脸没有匹配到人脸库中的人脸时:
// name 字段对应一个空白字符串,score 字段为 -1 ; {'name':'', 'score':'-1'}
public void onFaceOut(int faceid)
SDK检测到人脸离开摄像头能捕捉到的区域时回调用该方法
参数:
int faceid
:人脸ID
public void onError(int errorCode)
:发生错误时回调用该方法,并给出错误码
参数:
int errorCode
:错误码,当errorCode为-1是表示face认证失败,请检查人脸认证信息。
状态名称 | 状态值 | 类别 |
---|---|---|
face认证失败 | -1 | 人脸 |
人脸FaceInfos说明
参数名称 | 类型 | 详细说明 |
---|---|---|
faceInfo | FaceInfo | 人脸基本信息 |
faceAttribute | BDFaceSDKAttribute | 人脸基本属性 |
faceEmotion | BDFaceSDKEmotions | 人脸表情信息 |
liveScore | float | 活体验证得分 |
FaceInfo
参数名称 | 类型 | 详细说明 |
---|---|---|
mWidth | float | 人脸的宽度 (方形),与长度相等 |
mAngle | float | 平面内旋转角[-180(逆时针), 180(顺时针)] |
mCenter_y | float | 人脸中心点Y值 |
mCenter_x | float | 人脸中心点X值 |
mConf | float | 人脸置信度 |
landmarks | int[] | 4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心 |
face_id | int | Id值 |
headPose | float[] | 俯仰角:headPose[0]代表抬头低头角度阈值,中间为0,上下为正负;headPose[1]代表左右角度阈值,中间为0左正右负、headPose[2]代表顺逆时针角度阈值 |
illum | float | 人脸亮度 |
blur | float | 人脸模糊度 |
occlu | float[] | 人脸模糊度:0~6(不确保全部出现)分别代表左眼、右眼、鼻子、嘴巴、左脸、右脸、下巴的遮挡程度 |
BDFaceSDKAttribute
参数名称 | 类型 | 详细说明 |
---|---|---|
age | float | 年龄 |
race | BDFaceRace | 种族(枚举类型)依次为:黄种人、白种人、黑种人、印度人 |
emotion | BDFaceEmotion | 情绪(枚举类型)依次为:无表情、微笑、大笑 |
glasses | BDFaceGlasses | 佩戴眼镜状况(枚举类型)依次为:不带眼镜、普通透明眼镜、墨镜 |
gender | BDFaceGender | 性别(枚举类型)依次为:女、男 |
BDFaceSDKEmotions
参数名称 | 类型 | 详细说明 |
---|---|---|
emotion | BDFaceEmotionEnum | 表情(枚举类型)依次为:生气、厌恶、害怕、开心、伤心、惊讶、无表情 |
expression_conf | float | 当前表情的置信度 (取值范围:0~1) |
expression_conf_list | float[] | 当前表情的置信度列表 |
离线人脸识别相关接口
RobotSDKEngine.getInstance().recordAllFaceFeature()
:
全量更新本地存储离线人脸特征的数据库
所有图片需要保存在如下目录:/sdcard/baidu_robot/UserPicture/RobotSDKEngine.getInstance().recordDeltaFaceFeature()
:
增量更新本地存储离线人脸特征的数据库
所有图片需要保存在如下目录:/sdcard/baidu_robot/UserPicture/RobotSDKEngine.getInstance().clearLocalFaceDatabase()
:清空离线人脸特征的数据库RobotSDKEngine.getInstance().offlineCompareFace(Bitmap src, Bitmap dest, OfflineFaceCallBack callBack)
:离线人脸1:1验证,src,dest分别表示需要对比的两张图片,传入的图片大小必须小于1M,callback参数为对比结果回调,这个方法必须等到callback有回调返回之后才能进行下一次调用这个方法,
/**
*
* 离线人脸1:1比对,图片必须小于1M
*
* @param src 第一张图片
* @param dest 第二张图片
* @param callBack 回调结果
* @throws Exception: Throws Exception if :
* <p>1. last call of this function isn't finished<p>
* <p>2. callback is null<p>
*/
public void offlineCompareFace(@NonNull Bitmap src,
@NonNull Bitmap dest,
@NonNull OfflineFaceCallBack callBack) throws Exception
RobotSDKEngine.OfflineFaceCallBack定义如下:
/**
* 离线人脸监听器接口
*/
public interface OfflineFaceCallBack {
/**
* 人脸1:1识别结果回调
*
* @param score 对比相似度值(0-100)
*/
public void onCompareSuccess(float score);
/**
* 错误事件回调
*
* @param errorCode 错误码
*/
public void onOfflineError(int errorCode);
}
在线人脸比对(1:1)相关接口
以下方法均可通过RoboSDKEngine
调用,需要注意两张图片的大小之和需要小于12M:
/**
* 1:1 图片比对 (生活照)
* 单次请求,两张图片的大小之和需要小于12M
*
* @param faceImg 待比对人脸照片
* @param dailyPhotoImg 生活照,通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等
*/
public void compareFaceWithDailyPhoto(Bitmap faceImg, Bitmap dailyPhotoImg)
/**
* 1:1 图片比对 (身份证芯片照)
* 单次请求,两张图片的大小之和需要小于12M
*
* @param faceImg 待比对人脸照片
* @param idCardPhotoInChip 身份证芯片照,即二代身份证芯片中内置的人像照片
*/
public void compareFaceWithChipIDCard(Bitmap faceImg, Bitmap idCardPhotoInChip)
/**
* 1:1 图片比对 (带水印证件照)
* 单次请求,两张图片的大小之和需要小于12M
*
* @param faceImg 待比对人脸照片
* @param docPhotoWithWatermark 带水印证件照,一般为带水印的小图,如公安网小图
*/
public void compareFaceWithWatermarkIDCard(Bitmap faceImg, Bitmap docPhotoWithWatermark)
/**
* 1:1 图片比对 (普通证件照)
* 单次请求,两张图片的大小之和需要小于12M
*
* @param faceImg 待比对人脸照片
* @param docPhotoImg 证件照片,如拍摄的身份证、工卡、护照、学生证等证件图片,注:需要确保人脸部分不可太小,通常为100px*100px
*/
public void compareFaceWithDocPhoto(Bitmap faceImg, Bitmap docPhotoImg)