虹软人脸识别 - faceId及IR活体检测的介绍
虹软人脸识别 - 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
虹软人脸识别 - faceId及IR活体检测的介绍的更多相关文章
- 虹软人脸识别 - faceId及IR活体检测的更新介绍
虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...
- 虹软人脸识别 - Android Camera实时人脸追踪画框适配
在使用虹软人脸识别Android SDK的过程中 ,预览时一般都需要绘制人脸框,但是和PC平台相机应用不同,在Android平台相机进行应用开发还需要考虑前后置相机切换.设备横竖屏切换等情况,因此在人 ...
- 虹软人脸识别—版本升级接口修改说明(C#)
自虹软发布了免费.离线版本人脸识别SDK,在Github上陆续分享了各个版本对应的 C# Demo.因为公司项目一直在使用虹软的SDK,因此每当虹软官网有新版本发布,我都会进行了解,并结合Demo进行 ...
- 虹软人脸识别SDK接入Milvus实现海量人脸快速检索
一.背景 人脸识别是近年来最热门的计算机视觉领域的应用之一,而且现在已经出现了非常多的人脸识别算法,如:DeepID.FaceNet.DeepFace等等.人脸识别被广泛应用于景区.客运.酒店.办公室 ...
- 记C# 调用虹软人脸识别 那些坑
上一个东家是从事安防行业的,致力于人工智能领域,有自主人脸识别.步态识别的算法.C++同事比较称职有什么问题都可以第一时间反馈,并得到合理的处理,封装的DLL 是基于更高性能的GPU算法,可支持更多线 ...
- Android打开相机进行人脸识别,使用虹软人脸识别引擎
上一张效果图,渣画质,能看就好 功能说明: 人脸识别使用的是虹软的FreeSDK,包含人脸追踪,人脸检测,人脸识别,年龄.性别检测功能,其中本demo只使用了FT和FR(人脸追踪和人脸识别),封装了开 ...
- 虹软人脸识别SDK在网络摄像头中的实际应用
目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容 ...
- 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)
前言 大家应该都知道几个很常见的例子,比如在张学友的演唱会,在安检通道检票时,通过人像识别系统成功识别捉了好多在逃人员,被称为逃犯克星:人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以 ...
- 虹软人脸识别ArcFace2.0 Android SDK使用教程
一.获取SDK 1.进入ArcFace2.0的申请地址 https://ai.arcsoft.com.cn/product/arcface.html 2.填写信息申请并提交 申请通过后即可下载SDK, ...
随机推荐
- Java集合(十)实现Map接口的HashMap
Java集合(十)继承Map接口的HashMap 一.HashMap简介(基于JDK1.8) HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ...
- return break 和continue在for循环中的不同作用
平时自己经常在函数里见到return,在switch语句中使用break,而continue则用的不多. 其实这三者都能在for循环中发挥不同的作用,让代码更加灵活. 先说return return是 ...
- Springboot之actuator未授权访问
copy 子杰的哈,懒的写了 0x01 未授权访问可以理解为需要授权才可以访问的页面由于错误的配置等其他原因,导致其他用户可以直接访问,从而引发各种敏感信息泄露. 0x02 Spring Boot ...
- Java分层经验
在学习和使用Java的过程中,我们时常要用到各种工具与技术,它们在某些时候可以大幅度地简化编程,利用好它们,可以让代码更强壮.下面的表格是我总结的关于java开发可能会用到的工具与它们在项目中扮演的角 ...
- URL跳转与钓鱼
从登录页跳转到另一个页面就叫做URL跳转. 1.URL跳转 URL跳转一般分为两种,(1)客户端跳转:(2)服务端跳转.对用户来说,两种跳转都是透明的,都是指向或者跳转到另一个页面,页面发生了改变.但 ...
- Java实现 LeetCode 764 最大加号标志(暴力递推)
764. 最大加号标志 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1.网格中包含 1 的最大的轴对齐加号 ...
- Java实现 蓝桥杯VIP 基础练习 Huffuman树
基础练习 Huffuman树 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Hu ...
- Java实现 蓝桥杯VIP 算法提高 特殊的质数肋骨
算法提高 特殊的质数肋骨 时间限制:1.0s 内存限制:256.0MB 问题描述 农民约翰母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是 ...
- Java实现 LeetCode 64 最小路径和
64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], ...
- Java实现行列递增矩阵的查找
1 问题描述 在一个m行n列的二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列.现在输入这样的一个二维数组和一个整数,请完成一个函数,判断数组中是否含有该整数. 2 ...