5.6ZK人脸识别算法

5.6ZK人脸识别算法

参考价: 面议

具体成交价以合同协议为准
2023-12-02 12:48:02
19
产品属性
关闭
广东东控智能科技有限公司

广东东控智能科技有限公司

免费会员
收藏

组合推荐相似产品

产品简介

5.6ZK人脸识别算法ZKLiveFace算法描述面部识别系统是从图像或视频中自动识别到人脸的系统

详细介绍

5.6ZK人脸识别算法



5.6ZK人脸识别图像
ZKLiveFace 算法描述
 
面部识别系统是从图像或视频中自动识别到人脸的系统。作为生物识别技术之一,面部识别有许多优于其他生物识别技术的地方:与生俱来的,非侵入性的,且易于使用。如今,源于工业技术的快速发展(如数码摄像机,移动网络设备)和日益增强的安全需求,面部识别变得越来越重要,已经被广泛应用于各种系统中,包括考勤,安防,视频监控等。
 
ZKLiveFace 作为基于可见光光源面部识别算法,是一种快速、准确的 1:1 和 1:N 算法,面向软件开发商和系统集成商开放,可根据不同的市场和客户需求,提供定制不同的 SDK 版本;并且不同的 SDK 版本,在不同平台下的面部模板支持比对和识别具备一致性。
 
ZKLiveFace SDK 技术说明:
 
图像
1)为获得高质量面部模板及速度,请根据实际应用场景设置探测距离。
2)面部登记和识别时推荐的mix成像分辨率是 640 x 480 像素。小于这个像素的分辨率也支持,但是会降低面部登记和识别的准确性,影响面部模板的质量。
3) 登记过程中使用多个图像,因为这种方式可以提高面部模板的质量,进而提升面部识别的质量和可靠性。
 
光照
应考虑可控的和不可控的光照条件。
需注意如下典型的状况:
正面直射光和漫射光对人脸的各个角度和整个人脸区域的阴影有同样的光分布。
某些类型的光照还会造成眼镜或人脸的反光。
 
面部姿势
面部识别算法可支持多种姿势:
1) 头倾斜±30 度 ±25 度是正常的值,对于大多数接近正面的面部图像,这个倾斜度是足够的。
2)俯仰与正面位置偏离±30 度 ±25 度是正常的值,如果在人脸登记过程中同一张人脸有几幅不同角度的低头图像,低头的允许公差可以增加到±30 度。
3)摇头与偏离正面位置±30 度±15 度的偏离是正常的值,对于接近正面的面部图像,这个偏离度也是足够的。为支持人脸正面±30 度的偏离角度,推荐登记同一人脸的不同图像到数据库中。
 
面部表情
面部算法尽可能支持一定不自然的面部表情下的人脸识别的准确性。不自然的表情例子如下(允许使用但不推荐使用)大笑(露出牙齿或嘴里面的部分)
挑眉毛
闭眼
皱眉毛
眼镜,化妆,头发,胡须和小胡子
为保证人脸识别的质量,算法 SDK 支持部分面部被眼镜或头发遮挡的状况:眼镜—普通的带框眼镜会降低人脸识别的质量,因为它们会遮挡部分面部,导致部分人脸特征不可见。隐形眼镜—隐形眼镜不影响人脸识别效果。但是戴隐形眼镜的人有时也可能戴普通镜片眼镜。
 
浓妆可能隐藏或者扭曲面部特征
发型—有些发型可能遮挡部分面部,面部发型改变可能需要额外再登记面部,特别是胡须/小胡子长出来或剃掉的时候。
 
ZKLiveFace SDK 主要功能:
 
人脸检测
面部算法 SDK 提供快速、高准确率的人像检测功能。普遍适用于图片与实时视频流,可检出不小于 36*36 像素的人脸。
 
人脸关键点检测
面部算法 SDK 人脸关键点检测可以准确定位面部的关键区域位置,包括眼睛、尖下巴,脸部轮廓等。支持一定程度遮挡的人脸。
 
人脸属性分析
分析目标人脸的性别及年龄。
 
人脸活体检测
提供单帧照片活体检测接口,同时也可以基于人脸姿态估计进行动作配合式活体检测。
 
人脸识别
 
1:1 人脸验证:面部算法 SDK 人脸验证技术可被用于登录验证、身份识别等应用场景。
帮助用户快速判定两张照片是否为同一个人、判定视频中的人脸是否为目标人脸并支持实时识别认证,还可以实现身份和人脸绑定等功能。
 
1:N 人脸识别:面部算法 SDK 人脸识别技术可以自动识别出照片、视频流中的人脸身份,识别速度和精度达到较高水平。
 
5.6ZK人脸识别单目活体检测
 
算法初始化
初始化接口说明
//初始化人脸识别引擎,若成功则返回零。在调用其他函数之前必须先调用该函数,接口详细说明请见目录对应的接口说明。
public static int init(long[] context);
初始化示例程序说明
[示例]
long context[] = new long[1];
int ret = ZKFaceService.init(context);
if (0 == ret)
{
System.out.print("Init succ, context=" + context[0]);
}
else
{
System.out.print("isAuthorized=" + ZKFaceService.isAuthorized());
System.out.print("Init failed, error code=" + ret);
}
探测人脸
通过 Bitmap/NV21 数据探测人脸个数,成功则返回零,并判断 detectedFaces[0]是否大于1。
调用探测人脸接口
见 detectFacesFromNV21/detectFacesFromBitmap函数说明
获取人脸实例
见 getFaceContext
提取模板
调用[4.3] 探测人脸,获取到人脸实例指针
调用 extractTemplate提取人脸特征。
登记人脸
人脸登记接口说明
1、探测人脸数成功后,即可获取单个人脸的实例指针,并根据该人脸实例指针获取提取人脸模板。提取成功后,即可登记。
//获取单个人脸实例指针接口,接口详细说明请见目录对应的接口说明。
public static int getFaceContext(long context, int faceIdx, long[] faceContext);
//提取人脸模板,接口详细说明请见目录 对应的接口说明。
public static int extractTemplate(long faceContext, byte[] template, int[] size, int[] resverd);
2、如果需要进行 1:N 比对则需要将获取到的人脸模板登记到缓存中。接口详细说明请见目录 3.1.20 对应的接口说明。
public static int dbAdd(long context, String faceID, byte[] regTemplate);
人脸登记示例程序说明
1、探测人脸数成功后,获取单个人脸的实例指针并提取人脸模板。
[示例]
//获取单个人脸实例指针(该示例人脸索引为:0),instanceContext 为算法初始化成功后的实例指针
//人脸索引的范围见:detectFaces,0~detectedFaces-1
long[] faceContext = new long[1];
retCode = ZKLiveFaceService.getFaceContext(instanceContext, 0, 
faceContext);
if(0 == retCode )
{
//提取人脸模板(人脸索引为:0 的人脸模板),建议预分配 8192 个字节存放人
脸模板。
byte[] template = new byte[8192];
size = new int[1];
size[0] = 8192;
int[] resverd = new int[1];
// faceContext[0]为之前获取成功后的人脸实例指针,获取成功后即可登记人脸模板,
retCode = ZKLiveFaceService.extractTemplate(faceContext[0], template, size,resverd);……} 
2、如果需要进行 1:N 比对,则需要将获取到的人脸模板登记到 1:N 缓存中。
[示例]
// instanceContext 为算法初始化成功后的实例指针, template 为要添加到 1: N 缓存的人脸模板。"Reg1"为要登记到 1:N 缓存的用户 ID 号。
retCode = ZKLiveFaceService.dbAdd(instanceContext, "Reg1", template);
3、备份登记照片
推荐客户在登记人脸时保存登记照片,算法模型升级时需要重新提取特征。
比对人脸
人脸比对程序说明
1、1:1 人脸比对
//接口详细说明请见目录对应的接口说明。
public static int verify(long context, byte[] regTemplate, byte[] verTemplate, 
int[] score)
2、1:N 人脸比对
//接口详细说明请见目录 3.1.24 对应的接口说明。
public static int dbIdentify(long context, byte[] verTemplate, byte[] faceIDs, 
int[] score, int[] maxRetCount, int minScore, int maxScore)
人脸比对示例程序说明
1、1:1 人脸比对
int score = 0;
// instanceContext 为算法初始化成功后的实例指针, regTemplate、verTemplate
分别为要比对的人脸模板。
int ret = 0;
//存放返回的比对分数
int[] score = new int[1];
ret = ZKLiveFaceService.verify(instanceContext, regTemplate, verTemplate, 
score);
2、1:N 人脸比对(返回单个人脸 ID)
int ret = 0;
int[] score = new int[1]; // 存放返回的比对分数
byte[] faceIDS = new byte[256]; //存放返回的人脸 ID 号
int[] maxRetCount = new int[1]; 
maxRetCount[0] = 1; //只返回 1 个人脸 ID
// instanceContext 为算法初始化成功后的实例指针, verTemplate 为要比对的人脸模板
ret = ZKLiveFaceService.dbIdentify(instanceContext, verTemplate, faceIDS, 
score, maxRetCount, 76, 100);
[备注]
minScore 和 maxScore 参数详细说明:算法对加载到内存数据库的所有模板进行循环比对,在循环比对过程中,当识别人脸与内存数据库中的某一人脸模板相似度达到 maxScore 时,表示识别成功,立即退出循环比对;识别人脸与内存数据库中的某一人脸模板相似度达到 minScore 时,保存当前人脸 ID 号码,继续进行循环比对,直到循环完成所有模板比对后,按照相似度由高到低,返回参数 maxRetCount 设置的所有人脸
ID。3、1:N 人脸比对(返回多个人脸 ID)
int ret = 0;
int[] maxRetCount = new int[1];
maxRetCount[0] = 6; //返回 6 个人脸 ID
int[] score = new int[maxRetCount[0]];//存放返回人脸 ID 对应的比对分数
byte[] faceIDS = new byte[4096];//人脸 ID 多条记录以 分隔
// instanceContext 为算法初始化成功后的实例指针, verTemplate 为要比对的人脸模板
ret = ZKLiveFaceService.dbIdentify(context, verTemplate, faceIDS, score, 
maxRetCount, 76, 100);
[备注]
minScore 和 maxScore 参数详细说明:算法对加载到内存数据库的所有模板进行循环比对,在循环比对过程中,当识别人脸与内存数据库中的某一人脸模板相似度达到 maxScore 时,表示识别成功,立即退出循环比对;识别人脸与内存数据库中的某一人脸模板相似度达到 minScore 时,保存当前人脸 ID 号码,继续进行循环比对,直到循环完成所有模板比对后,按照相似度由高到低,返回参数 maxRetCount 设置的所有人脸ID。
活体识别
探测人脸数成功后,获取单个人脸的实例指针调用活体识别接口,判断是否假脸。
[示例]
//获取单个人脸实例指针(该示例人脸索引为:0),instanceContext 为算法初始化成功后的实例指针
//人脸索引的范围见:detectFaces,0~detectedFaces-1
long[] faceContext = new long[1];
retCode = ZKLiveFaceService.getFaceContext(instanceContext, 0, 
faceContext);
if(0 == retCode )
{
int[] score = new int[1];
retCode = ZKLiveFaceService.getLiveness(faceContext[0], score);
if (0 == retCode && score[0] < 75) {
//疑似假脸
} }
程序结束
结束程序说明
//释放人脸识别引擎。接口详细说明请见目录 3.1.8 对应的接口说明。
public static int terminate(long context);
[备注]
如果用使用到 1:N 对应的接口,在调用接口 terminate 前应先调用接口 dbClear
清空 1:N 缓存。
结束示例程序说明
//清空 1:N 缓存(有使用 1:对应的接口),instanceContext 为算法初始化成功后的实例指针。
ret = ZKLiveFaceService.dbClear(instanceContext);
//释放资源,instanceContext[0]为算法初始化成功后的实例指针。
ret = ZKLiveFaceService.terminate(instanceContext);

提示

请选择您要拨打的电话: