乐趣区

虹软人脸识别-faceId及IR活体检测的介绍

前几天虹软推出了 Android ArcFace 2.2 版本的 SDK,相比于 2.1 版本,2.2 版本中的变化如下:

• VIDEO 模式新增 faceId(类似于之前文章中提到的 trackId)
• 新增 IR 活体检测功能
• 新增 IR、RGB 的活体阈值设置

一、faceId 介绍

1. 定义

在连续的视频帧中,当一个人脸进入视频画面直到离开,其 faceId 不变。

2. 应用场景举例

在门禁应用场景下,若一个人长时间停留在画面中,借助 faceId 的功能,在此人的人脸特征提取成功后,可不再对此人的后续人脸信息进行处理。

3. 注意事项

faceId 在 VIDEO 模式下有意义;
faceId 在 IMAGE 模式下无效。

二、IR 活体检测

1. 接口介绍

支持的颜色格式如下:
Windows: GRAY、DEPTH_U16、NV21、NV12、I420
Android: GRAY、DEPTH_U16、NV21
:若图像数据的颜色格式不在上述列表中,必须对图像数据进行格式转换。

2. IR 活体检测实现方案

单目摄像头检测方案(IR)

单目摄像头检测流程

注意:在 Windows 平台下,若通过 OpenCV 获取 IR 摄像头的图像数据,由于其颜色格式为 BGR_24,不能用于 IR 活体检测,需要转成 GRAY(或 IR 活体检测接口支持的其他颜色格式),但 BGR_24 数据可直接用于人脸检测。

• 双目摄像头检测方案(IR + RGB)

双目摄像头检测流程

人脸检测结果信息调整:若 RGB 摄像头和 IR 摄像头的成像不一致(存在偏移、旋转、镜像等问题),需要将传递给 IR 活体检测的人脸信息(人脸框、人脸角度)进行调整。

3. 双目 IR 活体检测遇到的坑

在双目的画面有明显的不一致的情况时,若我们直接把 RGB 摄像头的人脸检测结果用于 IR 活体检测,很有可能会报 81925(人脸置信度低)错误。原来,摄像头回传的数据和我们直接看到的画面很可能是不一样的,我们看到的画面可能是经过处理的(缩放、旋转、镜像等)。

• 检测方法

最直观的检查方法就是将摄像头数据显示到屏幕上。只要我们把 2 个摄像头回传的数据显示到屏幕上,就能了解两个摄像头数据的成像关系。例如 Android 平台可使用以下方式查看 NV21 数据:
示例流程
nv21 -> YuvImage -> jpg bytes -> bitmap -> ImageView。
示例代码

 @Override
  public void onPreview(final byte[] nv21, Camera camera) {
    ......
    //30 帧一次,把帧数据显示到界面上(要是每帧都做就太卡了),若还是影响 UI 请放到子线程处理
    if (index++ % 30 == 0) {YuvImage yuvImage = new YuvImage(nv21, ImageFormat.NV21, previewSize.width, previewSize.height, null);
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      yuvImage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);
      byte[] bytes = baos.toByteArray();
      ivFrame.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
    }
    ......
  }

• 解决方案

1. RGB 和 IR 摄像头图像数据的其中一个被左右镜像

对于这种情况,我们在将 RGB 数据的人脸检测结果用于 IR 活体检测时,需要将其人脸框(rect)进行左右镜像调整。(Android demo 中已提供左右镜像的代码):

 /**
     * 人脸框水平镜像
     *
     * @param rect 人脸框
     * @return 水平镜像后的人脸框
     */
    private Rect mirrorRectHorizontal(Rect rect) {Rect newRect = new Rect(rect);
        newRect.right = previewSize.width - rect.left;
        newRect.left = previewSize.width - rect.right;
        return newRect;
    }

2. RGB 和 IR 摄像头图像数据均被镜像或均未被镜像

对于这种情况,RGB 数据的人脸检测结果用于 IR 活体检测时,不需要进行镜像调整。

3. RGB 和 IR 摄像头图像数据有旋转关系

若有旋转关系,我们不仅要旋转人脸信息(FaceInfo)中的人脸框(rect),还需要修改人脸角度(orient)。否则 IR 活体检测将无法解析人脸,报 81925 错误。
(Android demo 中已提供将 orient 单次旋转 90 度的代码):

/**
 * 获取逆时针旋转 90 度后的人脸角度
 *
 * @param orient 人脸角度信息,即 {@link FaceInfo#orient} 属性,由 {@link FaceEngine#detectFaces(byte[], int, int, int, List)} 接口获取
 * @return 旋转后的人脸角度
 */
private int rotateOrient(int orient) {switch (orient) {
        case FaceEngine.ASF_OC_0:
            return FaceEngine.ASF_OC_90;
        case FaceEngine.ASF_OC_90:
            return FaceEngine.ASF_OC_180;
        case FaceEngine.ASF_OC_180:
            return FaceEngine.ASF_OC_270;
        case FaceEngine.ASF_OC_270:
            return FaceEngine.ASF_OC_0;
        default:
            throw new IllegalArgumentException("unsupported orient'" + orient + "'");
    }
}

以上是个人使用的一点心得,如果需要下载虹软 sdk 可以到官网:https://ai.arcsoft.com.cn/pro…

退出移动版