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

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

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

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

1、faceId介绍

1. 定义

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

2. 应用场景举例

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

3. 注意事项

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

2、 IR活体检测

1. 接口介绍

支持的颜色格式以下:
Windows: GRAY、DEPTH_U1六、NV2一、NV十二、I420
Android: GRAY、DEPTH_U1六、NV21
注:若图像数据的颜色格式不在上述列表中,必须对图像数据进行格式转换。code

2. IR活体检测实现方案

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

 

单目摄像头检测流程orm

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

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

 

双目摄像头检测流程htm

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

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

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

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

    示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
@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/product/arcface.html?utm_source=cnblogs&utm_medium=referral

相关文章
相关标签/搜索