高级使用

双目活体

1. 摄像头要求

为了提升双目活检的效果,算法对红外摄像头和红外补光灯有一定的要求。需要选择成像清晰的红外摄像头,控制红外补光灯的 强度,防止红外图像太亮或太暗这两种极端的状况。我们也提供适配我们算法的最佳双目摄像头。

参数 指标
宽动态比 >= 80db
信噪比 >= 50db
白平衡 建议开启
帧率 越大越好
格式 YUV/MJPG
分辨率 >= 480p
双目间距 <= 3cm

红外正常曝光

../_images/normal_exp.jpg

红外过度曝光(不能活检)

../_images/high_exp.jpg

红外低曝光(不能活检)

../_images/low_exp.jpg

2. 指标

活体检测存在几个标准的指标,如下所示:

  • 拒绝率(TRR):如99%,代表100次作弊假体攻击,会有99次被拒绝。
  • 误拒率(FRR):如0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。
  • 通过率(TAR):如99%,指100次真人请求,会有99次因为活体分数高于阈值而通过。
  • 阈值(Threshold):高于此数值,则可判断为活体。

Dface的红外活体级别就是活体阈值,推荐0.6即可。

3. DfaceEngine双目模式

DFaceEngine使用:

//设置红外活体级别(阈值)
dfaceEngine.setIRAntiLevel(0.6f);
//彩色相机画面RGB字节数组
byte[] bmpByteColor = ImageUtils.getPixelsRGBA(bitmap);
//判断红外相机是否打开
if(mCameraIR != null){
        //红外相机画面RGB字节数组
        byte[] bmpByteIR = ImageUtils.getPixelsRGBA(bitmapIR);
        //双目模式,引擎默认做红外活体判断
        fusions = dfaceEngine.update(bmpByteColor, bmpByteIR);
    }else{
        //单目模式,引擎不做红外活体判断
        fusions = dfaceEngine.update(bmpByteColor);
    }
}

DfaceInfrared单独使用:

//设置红外活体级别
dfaceInfrared.setAntiLevel(0.4);
//活体检测(bbox 彩色摄像头对应的人脸边框)
int live = dfaceInfrared.liveness_check(frame, bbox);

4. Android原生Camera API双目配置

请与开发板厂商沟通Android固件原生Camera API是否支持同时打开两个摄像头预览,安卓5.1及5.1以前的版本默认最大支持同时打开1个摄像头预览。如果不支持双目预览,需要重新编译HAL硬件层。 在CameraHal_Module.h中将#define CAMERAS_SUPPORTED_SIMUL_MAX 1 修改为 2。 我们也提供通用UVC驱动版的Demo,能够在任意开发板上调用双摄,如有需要请联系我们。

单目活体

1. 摄像头要求

目前单目活体在宽动态摄像头下效果最佳,可选用USB宽动态摄像头或者MIPI摄像头+板芯ISP这种方案。摄像头噪点过大也会影响单活活检效果。我们也提供适配我们算法的最佳USB宽动态摄像头。

参数 指标
宽动态比 >= 80db
信噪比 >= 50db
白平衡 建议开启
帧率 越大越好
格式 YUV/MJPG
分辨率 >=480p

2. 级别配置

目前单目活体提供3个级别,分别是Filter1过滤,Filter2过滤,Filter1+Filter2过滤,算法的运算量依次提高,用户可以根据实际应用场景和设备性能来选择最适合的单目活体方案。

//DfaceEngine设置单目活体级别
dfaceEngine.setRGBAntiLevel(1);

//dfaceRgbAnti设置单目活体级别
dfaceRgbAnti.setAntiLevel(1);

3. Filter1配置

目前单目活体提供Filter1数量,Filter1跨帧数这些选项。 Filter1数量: 数量越大,单目活体越精确,但运行性能会成线下下降。移动端建议设置在1~4之间。 Filter1跨帧数: 防止活检偶然跳动影响判断结果,我们提供了跨帧的滑动平均值。跨帧数越大,活检需要确认的时间越久。

DFaceEngine使用:

//打开单目活体过滤
dfaceEngine.setRGBLiveFilter(true);
//设置活体置信度为0.85
dfaceEngine.setRGBLiveThreshold(0.85);
//设置Filter1 count为4
dfaceEngine.setRGBLiveFilter1Count(4);
//设置Pat 跨帧数
dfaceEngine.setRGBLiveFilterCrossFrameCount(1);

DfaceRgbAnti单独使用:

//设置Filter1 数量为4
dfaceRgbAnti.setFilter1Count(4);
//设置Filter1 跨帧数
dfaceRgbAnti.setFilter1CrossFrameCount(2);
//活体检测
float score = dfaceRgbAnti.liveness_check(frame, bbox);

4. Filter2配置

目前单目活体提供Filter2占比配置,表示Filter2过滤在最终活体分值的比重,默认是0.5, 占到1半。

//打开单目活体过滤
dfaceEngine.setRGBLiveFilter(true);
//设置活体置信度为0.85
dfaceEngine.setRGBLiveThreshold(0.85);
//设置Filter2占比0.5
dfaceEngine.setRGBLiveFilter2Proportion(0.5);

DfaceRgbAnti单独使用:

//设置Filter2占比0.5
dfaceRgbAnti.setFilter2Proportion(0.5);
//活体检测
float score = dfaceRgbAnti.liveness_check(frame, bbox);

5. 指标

活体检测存在几个标准的指标,如下所示:

  • 拒绝率(TRR):如99%,代表100次作弊假体攻击,会有99次被拒绝。
  • 误拒率(FRR):如0.5%,指1000次真人请求,会有5次因为活体分数低于阈值被错误拒绝。
  • 通过率(TAR):如99%,指100次真人请求,会有99次因为活体分数高于阈值而通过。
  • 阈值(Threshold):高于此数值,则可判断为活体。

RGB单目活体阈值越高,拒绝率增加,通过率会降低,请根据实际应用场景调整,推荐0.8.

人脸检测和识别

1. 检出率与性能的配置

影响人脸检测运行性能的因素很多,主要和人脸检测的工作模式和最小检测人脸有关。最小检测人脸设的越大,速度越快,但人脸检出率会下降。我们为人脸检测提供了两种工作模式 ,分别是速度优先模式和精度优先模式,不同场景可以切换,例如平常摄像头检测可以使用速度优先模式,图片检测(身份证,注册的图片)场景建议使用精度优先模式,增加人脸检出率。

//设置最小检测人脸为80
dfaceDetect.SetMinSize(80);
//工作模式 0:速度优先 1:精度优先
dfaceDetect.SetWorkMode(0);
//人脸检测
List<Bbox> box = dfaceDetect.detectionMax(frame);

2. 识别距离配置

识别距离主要受摄像头分辨率和识别最小脸设置值有关,我们提供两个最小脸设置,分别是检测最小脸设置和识别最小脸设置。值越小,检测和识别距离越远(注意检测最小脸会影响检测速度,值越小,速度越慢)。摄像头分辨率越高,能够进一步提升检测和识别距离上限。 DFaceEngine检测最小脸和识别最小脸设置:

//设置检测最小脸
dfaceEngine.setDetectMinSize(80);
//识别最小脸
dfaceEngine.setRecognizeMinSize(100);
分辨率 检测最小脸 识别最小脸 有效距离
480P 100px 100px 1m
720P 120px 100px 3m
1080P 160px 100px 5m

3. 降低误识率

为了降低生产环境的误识率,需要关注以下几个指标,找到最适合的平衡点。

方法 缺点
提高识别阈值 增加部分识别确认时间
增加姿态过滤 额外增加计算时间
增加人脸质量过滤 额外增加计算时间
增加识别最小脸尺寸 减少识别有效距离
提高人脸底库质量 额外增加维护底库成本
改用更高精度的模型 增加识别计算耗时

熟客和陌生人

1. 陌生人重识别

DFaceEngine提供陌生人重识别帧数间隔设置,熟客有可能角度原因会误认为是moshenr陌生人,因此DFaceEngine内部有重识别机制,确保不会漏掉本应该识别的熟客。配置项重识别帧数间隔会影响用户体验,该值越小,整体画面会越卡,但识别灵敏度会提高;该值越大,整体画面越流程,但识别灵敏度会降低。默认是8.

//设置陌生人重识别帧数间隔
dfaceEngine.setReRecognizeLoopCount(8);