人脸组件
人脸组件整体介绍
SDK支持通过机器人设备中摄像头采集到的图像信息,进行人脸检测,在线/离线人脸识别。
组件配置
使用SDK的人脸组件功能前,需要人脸组件功能进行配置。
获取配置对象
FaceModuleConfig faceModuleConfig = new FaceModuleConfig()
配置组件
// 相机类型
faceModuleConfig.cameraType = FaceModuleConfig.TYPE_INTERNAL_FRONT;
// 相机图像帧,人脸检测前旋转角度
// 正常完成人脸检测识别,需要图像帧内的人脸方向为正向
faceModuleConfig.faceAngle = FaceModuleConfig.ANGLE_90;
// 预览图片方向
faceModuleConfig.videoDirection = FaceModuleConfig.ANGLE_270;
// 人脸识别方式为在线
faceModuleConfig.recType = FaceModuleConfig.REC_TYPE_ONLINE;
// 人脸识别方式为离线
// faceModuleConfig.recType = FaceModuleConfig.REC_TYPE_OFFLINE;
// 离线人脸图片目录路径(属性默认路径为/storage/emulated/0/baidu_robot/UserPicture)
// faceModuleConfig.offlineFaceRecognizeImageDir = "/sdcard/faceImage"
// 在线1:N人脸识别,设置使用人脸库ID
// 如果不设置,会默认使用开放平台配置的默认人脸库,设置人脸库属性要确保开放平台已配置对应的库信息
faceModuleConfig.faceGroup = "VIPFace";
组件使用流程
启动/停止人脸识别功能
通过调用RobotSDKManager.getInstance().startFaceRecognize()接口来启动人脸识别功能。
/**
* 启动人脸识别功能
* @param textureView UI预览用TextureView,需要设置为可见,View宽高最小为1dp*1dp
* @param faceTaskType 人脸功能任务类型(人脸识别使用FaceModuleConfig.TASK_FACE_RECOGNIZE)
* @param faceDetectCallBack 人脸检测回调接口
* @return 是否启动成功
*/
boolean startFaceRecognize(TextureView textureView,
int faceTaskType,
IFaceDetectCallBack faceDetectCallBack);
通过RobotSDKManager.getInstance().stopFaceRecognize()接口来停止人脸识别功能。
/**
* 停止人脸识别
*/
void stopFaceRecognize();
获取人脸检测回调信息
开启人脸识别功能后,可以通过实现IFaceDetectCallBack接口来获取启动人脸识别功能后,人脸检测的回调信息。
/**
* 人脸检测回调接口
*/
public interface IFaceDetectCallBack {
/**
* 人脸检测回调方法
*
* @param livenessModel 检测到人脸数据对象
*/
void onFaceDetectCallback(FaceModel livenessModel);
/**
* 人脸检测状态回调方法
*
* @param code 人脸检测状态码
* @param msg 人脸检测状态信息
*/
void onFaceDetectStatus(int code, String msg);
/**
* 人脸检测UI渲染接口(预留功能接口,暂不使用)
*
* @param livenessModel 检测到人脸数据对象
*/
void onFaceDetectDrawCallback(FaceModel livenessModel);
/**
* 离线人脸识别回调接口
* 人脸组件配置为离线识别时使用faceModuleConfig.recType = REC_TYPE_OFFLINE;
*
* @param faceModel 检测到人脸数据对象
*/
void onOfflineFaceRecognize(FaceModel faceModel);
/**
* 发现有人脸(没有人脸质量检测)
* @param livenessModel
*/
void onNoQualityDetectCallback(FaceModel livenessModel);
}
人脸检测回调接口实现样例:
private IFaceDetectCallBack mFaceDetectCallback = new IFaceDetectCallBack() {
@Override
public void onFaceDetectCallback(FaceModel livenessModel) {
if (livenessModel == null || livenessModel.getFaceInfo() == null) {
// 没有检测到人脸
} else {
// 检测到人脸
FaceInfo faceInfo = livenessModel.getFaceInfo();
// 人脸宽度
float faceWidth = faceInfo.width;
// 人脸高度
float faceHeight = faceInfo.height;
// 人脸分数
float faceScore = faceInfo.score;
// 性别
BDFaceSDKCommon.BDFaceGender bdFaceGender = faceInfo.gender;
// 年龄
int age = faceInfo.age;
// 是否带眼镜
BDFaceSDKCommon.BDFaceGlasses bdFaceGlasses = faceInfo.glasses;
}
}
@Override
public void onFaceDetectStatus(int statusCode, final String statusMsg) {
// 人脸检测时的状态码和状态信息,例如:statusCode = -20104,statusMsg = 图片比较模糊
int code = statusCode;
String msg = statusMsg;
}
@Override
public void onOfflineFaceRecognize(final FaceModel faceModel) {
if (faceModel != null) {
// 获取离线识别人脸的用户名称
String offlineUserName = faceModel.getOfflineRecognizeResult().mName;
}
}
@Override
public void onFaceDetectDrawCallback(FaceModel livenessModel) {
// 预留接口,暂不使用
}
/**
* 发现有人脸(没有人脸质量检测)
* @param livenessModel
*/
public void onNoQualityDetectCallback(FaceModel livenessModel) {
// 做人脸质量检测前的人脸数据对象
}
};
获取人脸识别结果
开启人脸识别功能后,想获取在线人脸识别结果,需要实现服务端指令回调接口IDirectiveCallback,实现的接口添加到SDK指令回调接口列表内:
IDirectiveCallback directiveCallback = new IDirectiveCallback() {
...
}
// 添加到SDK指令回调接口列表
RobotSDKManager.getInstance().addDirectiveListener(directiveCallback)
关于指令回调接口的具体介绍,可以参考 服务端和客户端交互指令说明 。
获取离线人脸识别结果
通过实现IFaceDetectCallBack接口onOfflineFaceRecognize方法获取离线人脸识别结果数据。
private IFaceDetectCallBack mFaceDetectCallback = new IFaceDetectCallBack() {
@Override
public void onFaceDetectCallback(FaceModel livenessModel) {
if (livenessModel == null || livenessModel.getFaceInfo() == null) {
// 没有检测到人脸
} else {
// 检测到人脸
FaceInfo faceInfo = livenessModel.getFaceInfo();
}
}
...
...
@Override
public void onOfflineFaceRecognize(final FaceModel faceModel) {
if (faceModel != null) {
// 获取离线识别人脸的用户数据对象faceModel
// 获取离线用户对象的用户名
String offlineUserName = faceModel.getOfflineRecognizeResult().mName;
}
}
};
加载离线人脸库数据
1.加载离线人脸库
使用离线人脸识别功能,需要先录入离线人脸库数据,人脸图片路径通过faceModuleConfig.offlineFaceRecognizeImageDir属性配置。
- 属性默认路径为/storage/emulated/0/baidu_robot/UserPicture。
通过RobotSDKManager.getInstance().recordAllFaceFeature()方法完成离线人脸数据的录入,数据录入后会作为离线人脸识别时的离线人脸库使用。
/**
* 加载离线人脸识别照片信息
* @param featureType 照片类型,普通照片使用BDFACE_FEATURE_TYPE_LIVE_PHOTO属性
* BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO(生活照)
* BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_ID_PHOTO(证件照)
* @return
*/
int recordAllFaceFeature(BDFaceSDKCommon.FeatureType featureType);
2.离线人脸库图片要求
- 支持jpg和png图片格式
- 图片尺寸 > 640 * 480, 作为离线人脸库底图尽量采用清晰人脸图片
增量更新离线人脸库数据
通过recordDeltaFaceFeature()方法增量更新本地存储离线人脸的数据库。
RobotSDKManager.getInstance().recordDeltaFaceFeature()
清空离线人脸数据库
通过clearLocalFaceDatabase()清空离线人脸特征的数据库。
RobotSDKManager.getInstance().clearLocalFaceDatabase()
其他API功能
离线人脸1:1验证
RobotSDKManager.getInstance().offlineCompareFace(@NonNull Bitmap src, @NonNull Bitmap dest,@NonNull IFaceCompareCallback callback)
IFaceCompareCallback的定义
/**
* 人脸比对回调接口
*/
public interface IFaceCompareCallback {
/**
* 人脸1:1识别结果回调
*
* @param score 对比相似度值(0-100)
*/
void onCompareSuccess(float score);
/**
* 错误事件回调
*
* @param errorCode 错误码
*/
void onCompareError(int errorCode);
}
在线人脸比对(1:1)相关接口
/**
* 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)
状态码以及错误码
错误码/状态码 | 描述 |
---|---|
-20100 | 未检测到人脸 |
-20101 | 人脸左右偏转角度超出限制 |
-20102 | 人脸平行平面内的头部旋转角超出限制 |
-20103 | 人脸上下偏转角超出限制 |
-20104 | 人脸模糊值超出限制 |
-20105 | 人脸光照值低于阈值 |
-20106 | 人脸左眼遮挡 |
-20107 | 人脸右眼遮挡 |
-20108 | 人脸鼻子遮挡 |
-20109 | 人脸嘴遮挡 |
-20110 | 人脸左脸颊遮挡 |
-20111 | 人脸右脸颊遮挡 |
-20112 | 人脸下巴遮挡 |