zoukankan      html  css  js  c++  java
  • 虹软人脸识别

    虹软人脸识别 - 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/product/arcface.html?utm_source=cnblogs&utm_medium=referral

  • 相关阅读:
    js object 常用方法总结
    深入研究js中的位运算及用法
    input事件中文触发多次问题研究
    景点地图开发实战
    炫酷线条动画--svg
    转:绝对干货--WordPress自定义查询wp_query所有参数详细注释
    canvas实例 ---- 制作简易迷宫(一)
    炫酷弹窗效果制作
    js排序算法总结—冒泡,快速,选择,插入,希尔,归并
    js 实现 promise
  • 原文地址:https://www.cnblogs.com/ccLqqy/p/11050991.html
Copyright © 2011-2022 走看看