从虹软开放了2.0版本SDK以来,由于具有免费、离线使用的特点,我们公司在人脸识别门禁应用中使用了虹软SDK,识别效果还不错,因此比较关注虹软SDK的官方动态。近期上线了ArcFace 3.0 SDK版本,确实做了比较大的更新。首先本篇介绍一下关于Android平台算法的更新内容,下一篇将针对Windows平台的算法更新展开介绍。
- 特征比对支持比对模型选择,有生活照比对模型和人证比对模型
- 识别率、防攻击效果显著提升
- 特征值更新,升级后人脸库需重新注册
- Android平台新增64位的SDK
- 图像处理工具类
- 人脸检测同时支持全角度及单一角度
- 新增了一种图像数据传入方式
在实际开发过程中使用新的图像数据结构具有一定的难度,本文将从以下几点对该图像数据结构及使用方式进行详细介绍
- SDK接口变动
- ArcSoftImageInfo类解析
- SDK相关代码解析
- 步长的作用
- 将Camera2回传的Image转换为ArcSoftImageInfo
一、SDK接口变动
在接入3.0版SDK时,发现FaceEngine
类中的detectFaces
、process
、extractFaceFeature
等传入图像数据的函数都有重载函数,重载函数的接口均使用ArcSoftImageInfo
对象作为入参的图像数据,以人脸检测为例,具体接口如下:
原始接口:
public int detectFaces(byte[] data, int width, int height, int format,
List<FaceInfo> faceInfoList)
新增接口:
public int detectFaces(ArcSoftImageInfo arcSoftImageInfo,
List<FaceInfo> faceInfoList)
可以看到,重载函数传入ArcSoftImageInfo
对象作为图像数据进行检测,arcSoftImageInfo
替代了原来的data, width, height, format
。
二、ArcSoftImageInfo类解析
在我实际使用后发现,ArcSoftImageInfo
不只是简单封装一下,它还将一维数组data
修改为二维数组planes
,还新增了一个与planes
对应的步长数组strides
。
步长概念介绍:
步长可以理解为一行像素的字节数。
类结构如下:
public class ArcSoftImageInfo {
private int width;
private int height;
private int imageFormat;
private byte[][] planes;
private int[] strides;
...
}
官方文档中对该类的介绍:
- 成员描述
类型 | 变量名 | 描述 |
---|---|---|
int | width | 图像宽度 |
int | height | 图像高度 |
int | imageFormat | 图像格式 |
byte[ ][ ] | planes | 图像通道 |
int[ ] | strides | 每个图像通道的步长 |
- 组成方式介绍
// arcSoftImageInfo组成方式举例:
// NV21格式数据,有两个通道,
// Y通道步长一般为图像宽度,若图像经过8字节对齐、16字节对齐等操作,需填入对齐后的图像步长
// VU通道步长一般为图像宽度,若图像经过8字节对齐、16字节对齐等操作,需填入对齐后的图像步长
ArcSoftImageInfo arcSoftImageInfo = new ArcSoftImageInfo(width, height,
FaceEngine.CP_PAF_NV21, new byte[][]{
planeY, planeVU}, new int[]{
yStride,
vuStride});
// GRAY,只有一个通道,
// 步长一般为图像宽度,若图像经过8字节对齐、16字节对齐等操作,需填入对齐后的图像步长
arcSoftImageInfo = new ArcSoftImageInfo(width, height,
FaceEngine.CP_PAF_GRAY, new byte[]