基本使用

DfaceEngine使用

DfaceEngine针对常见的不同的应用场景做了一些内部封装和优化,内部包含了人脸检测,跟踪,姿态过滤,光线质量过滤,单目活体过滤,红外活体过滤,提取特征码等功能, 用户无需关心人脸识别内部复杂的结构,只需要少量的代码即可完成现有业务逻辑和我们的SDK集成。目前支持单人识别,多人识别,人证对比这三种应用场景,以下是DfaceEngine的基本使用结构,具体应用请参考我们提供的demo源码。

1. 代码示例

//批量添加人脸特征数组和对应的数据库id数组
dfaceEngine.appendFeatureWithIdBatch(features, Ids);
//设置相似度置信度(比对相似度大于该置信度判定为同一个人)
dfaceEngine.setConfidence(0.7f);
//开启RGB单目活体过滤
dfaceEngine.setRGBLiveFilter(true);
//设置引擎工作模式(单人识别,多人识别,人证比对等)
dfaceEngine.setWorkingMode(EngineWorkingMode.WORKING_SINGLE_RECOGNIZE_MODE.getMode());
//启动引擎
dfaceEngine.start();
//读取每一帧摄像头画面
while(frame){
    //更新引擎输入数据
    List<Fusion> fusions = dfaceEngine.update(frame);
    //每个fusion代表一个人脸
    for(Fusion fusion : fusions) {
        //根据人脸识别引擎分析返回的人脸类型来处理不同的逻辑
        switch(fusion.faceType):
            //小脸
            case FUSION_FACE_SMALL:
                //获取该人脸的特征数据库id
                long id = fusion.featureId
                break;
            //姿态不正确的脸
            case FUSION_FACE_POSE_WRONG:
                //获取该人脸的特征数据库id
                long id = fusion.featureId
                break;
            //清晰度不够的脸
            case FUSION_FACE_BAD_QUALITY:
                //获取该人脸的特征数据库id
                long id = fusion.featureId
                break;
            //非活体的脸
            case FUSION_FACE_UNLIVE:
                //获取该人脸的特征数据库id
                long id = fusion.featureId
                break;
            //熟客
            case FUSION_FACE_KNOWN:
                //获取该人脸的特征数据库id
                long id = fusion.featureId.
                break;
            //陌生人
            case FUSION_FACE_UNKNOWN:
                //获取该人脸的特征数据库id
                long id = fusion.featureId.
                break;
    }
}

//关闭引擎
dfaceEngine.stop();

注解

  • 以上代码仅仅是java版的演示,C#和C++的以此类推,以实际调用为准.
  • DfaceEngine提供很多可选配置项,具体配置说明请查看 API文档
  • 双目请用dfaceEngine.update(frame, irframe); irframe表示红外画面

2. Fusion结构

Fusion是人脸识别引擎返回的重要数据结构,每个fusion代表一个人脸,它包含了人脸的边框位置信息,特征id, 人脸类型,比对相似度等。

public class Fusion {
   //人脸的边框位置信息
   public Bbox box;

   //人脸特征id,一般为数据库中的id
   public long featureId;

   //人脸特征
   public byte[] feature;

   //人脸特征大小, 代表特征字节数组的大小
   public short featureSize;

   //相似度
   public float similarity;

   //是否来自缓存命中
   public short inCache;

   //引擎分析返回的人脸类型(小脸,姿态不正确的脸,不清晰的脸,非活体的脸, 熟客, 陌生人)
   public short faceType; }

Dface各个模块使用

SDK提供人脸检测,人脸识别,人脸姿态,活体判断等各个独立的功能提供相应的模块,用户可以按照自己的需求灵活地调用。

1. DfaceDetect

DfaceDetect是人脸检测模块,可实时的实现多人检测,最大脸检测,人脸质量判断等功能。

//设置检测最小脸
dfaceDetect.SetMinSize(60);
dfaceDetect.SetNumThreads(1);
//检测人脸,返回人脸box列表
List<Bbox> faceBboxs = dfaceDetect.detection(frame, false);

注解

单人最大脸检测请用detectionMax函数,速度会提升很多。SetMinSize设置的值越大检测速度越快,但会漏检一些小脸,请按实际应用场景设置。

2. DfaceTrack

DfaceTrack是人脸跟踪模块,可实现实时多人跟踪功能。

//开启跟踪
dfaceTrack.start();
while(frame){
   //检测人脸
   List<Bbox> faceBboxs = dfaceDetect.detection(frame, false);
   //跟踪人脸,需要以上检测人脸的边框输入
   List<Bbox> trackBoxs = dfaceTrack.update(frame, faceBboxs);
}
//关闭跟踪
dfaceTrack.stop();

警告

跟踪是预估判断,因此返回的位置信息有可能会超出摄像头画面范围。单独使用最好和摄像头画面范围做下判断,以免越界访问。

3. DfaceRecognize

DfaceRecognize是人脸识别模块,主要用于人脸特征提取。目前提供三种精度模式,高精度模式,普通模式,实时模式,由于高精度模式非常消耗cpu,因此不适合嵌入式端运行,嵌入式端运行推荐使用实时模式。

//设置检测最小脸
List<Bbox> bbox = dfaceDetect.detectionMax(frame, true);
//提取人脸特征
byte[] feature1 = dfaceRecognize.extractFaceFeatureByImg(frame, bbox.get(0));

警告

不同精度模式返回的特征数组大小尺寸不一样,因此比对需要相同尺寸的特征数组。目前实时模式返回512字节数组,其他精度返回2048字节数组。

4. DfaceCompare

DfaceCompare常用于人脸特征比对,适用于1:1,1:n比对。

//抽取人脸特征
byte[] feature1 = dfaceRecognize.extractFaceFeatureByImg(frame, bbox1Lst.get(0));
byte[] feature2 = dfaceRecognize.extractFaceFeatureByImg(frame, bbox2Lst.get(0));
//n个人脸特征
byte[][] feature_n;
//n个人脸特征对应的id
long[] idx_n;
//特征比对(1:1)
float similarity = dfaceCompare.similarityByFeature(feature1, feature2);
//特征比对(1:n), 返回前top个相似度高于threshold的对应的特征id
int[] idx = dfaceCompare.similarityByFeatureSort(feature_1,feature_n[][], dx_n, top, threshold)

警告

DfaceCompare初始化需要指定精度模式。

5. DfacePose

DfacePose是人脸姿态模块,主要用于人脸68关键点和姿态的判断。

//设置检测最小脸
List<Bbox> bbox = dfaceDetect.detectionMax(frame, true);
//判断68关键点和姿态
List<FaceLandmark> poses = dfacePose.predictPose(frame, Arrays.asList(bbox));

注解

  • 欧拉角介绍 欧拉角
  • yaw(偏航角): 人脸朝向视角,向右转脸为正角度,向左转脸为负角度(单位角度数)
  • pitch(俯仰角): 人脸朝向视角, 向下俯为正角度,向上仰为负角度(单位角度数)
  • roll(滚转角): 人脸朝向视角,向右滚头为正,向左滚头为负(单位角度数)
  • t_x: 摄像头为视角,向摄像头右方偏离为正,左方为负(单位米)
  • t_y: 摄像头为视角,向摄像头上方偏离为正,下方为负(单位米)
  • t_z: 摄像头为视角,偏离摄像头越远值越大,该值和摄像头焦距关系很大,实际生成环境需要设置好焦距参数

6. DfaceRgbAnti

DfaceRgbAnti是RGB单目活体检测模块,常用于活体判断。

//检测人脸
List<Bbox> boxs = dfaceDetect.detectionMax(frame,true);
//设置Filter1数量,数量越多越精确,但速度越慢
dfaceRgbAnti.setFilter1Count(8);
//活体判断,活体检测需要转回原图判断,尽量减少resize而造成的信息损失
float score = dfaceRgbAnti.liveness_check(frame, boxs.get(0));

警告

根据返回的score, 活体判断一般有三种结果,score接近0:非活体 score接近1:活体 score为负数:未知(例如人脸太小,不能检测到人脸等情况)

7. DfaceInfrared

DfaceInfrared是双目活体检测模块,常用于双目红外活体判断。

//彩色画面检测人脸边框
List<Bbox> boxs = dfaceDetect.detection(frame,true);
//活体判断,frame为红外摄像头输入的画面
int live = dfaceInfrared.liveness_check(frame, boxs.get(0));

警告

双目活体需要红外摄像头输入画面,但输入的人脸框位置是彩色摄像头检测到的。

8. DfaceTool

DfaceTool工具类,包含了一些图像处理,特征转换和数据库处理方法。