基于Android 虹软人脸、人证对比,活体检测

最近虹软新增了人证识别、活体检测的功能,好像之前的人脸识别也更新过版本,之前一篇文章用虹软Android SDK做人脸识

别,写过虹软人脸识别的用法,最近把人脸识别、人证识别,活体检测功能都简单的封装了一下,使用起来可以更简单一点;

但是由于appkey是和so库绑定的,所以不能直接依赖,需要下载项目换成自己的so库就能使用或者发布了,还是挺方便的

虹软人脸识别库的介绍``
so库和appkey是绑定的

以人脸识别为例,它包括人脸检测、人脸追踪、人脸识别、年龄识别、性别识别这5种引擎,每个引擎都有一个so库和jar包,申请的5种AppKey和APPID是和自己下载的so库是绑定的,不能混淆使用

人脸检测(FD)

用于获取静态图片的人脸的位置和角度,传入格式为NV21的图片数据(byte[]),返回一个AFD_FSDKFace对象的集合,AFD_FSDKFace只储存了一个位置和角度;如果用于视频流里面好像也不报错

public class AFD_FSDKFace {
Rect mRect;
int mDegree;

  

人脸追踪(FT)

和人脸检测一样,也是用来获取人脸的位置和角度,不过只适用于获取视频流的人脸,也就是在相机的onPreviewFrame方法里面使用,返回的是AFT_FSDKFace对象的集合,也只储存了一个位置和角度;如果用于静态图片好像是会报错的

public class AFT_FSDKFace {
Rect mRect;
int mDegree;

  

人脸识别(FR)

用于获取人脸特征和对比人脸特征的
获取人脸特征,需要传入格式为NV21的图片数据(byte[])和人脸的位置、人脸的角度,所以需要先用前面的引擎获取到人脸的信息,返回一个AFR_FSDKFace对象,这个对象也只保存了人脸特征(byte[])
对比人脸,需要传入两个AFR_FSDKFace对象,返回一个AFR_FSDKMatching对象,只保存了相似度

public class AFR_FSDKFace {
public static final int FEATURE_SIZE = 22020;
byte[] mFeatureData;
public class AFR_FSDKMatching {
float mScore = 0.0F;

  

活体检测

活体检测是检测是不是活人的,也是传入人脸的位置、人脸的角度,又是一个新的FaceInfo对象,传入的是FaceInfo的集合,返回LivenessInfo集合,但是目前只支持单人脸我们只管第一个数据,LivenessInfo里面保存的返回的结果,活体、非活体、人脸超过一个、未知错误(经常返回,问题不大)

人证对比

用来对比人脸和身份证的,传入传入格式为NV21的证件照片(byte[])和人脸的照片,还有各自的图片大小和比对阈值;返回一个CompareResult对象,包括相似度、是否成功等信息

public class CompareResult {
private boolean isSuccess;
private double result;

  

人证识别其实是人脸识别的那几个引擎(FD,FT,FR)的集合,所以有同时集成肯定包冲突了,可以使用人脸识别的so库,然后把人脸识别的jar包都删了,使用人证的jar包,人证的激活码使用FR的激活码就行了
![在这里插入图片描述](http://static.zybuluo.com/Tyhj/1y4h9mbk7xlf9urpx18oseeq/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202018-10-11%20%E4%B8%8B%E5%8D%883.41.05.png)
屏幕快照 2018-10-11 下午3.41.05.png-15.5kB

其他的年龄、性别的引擎应该都差不多

封装后的部分功能的展示

初始化AppKey和APPID

new AcrFaceManagerBuilder().setContext(this)
.setFreeSdkAppId(Constants.FREESDKAPPID)
.setFdSdkKey(Constants.FDSDKKEY)
.setFtSdkKey(Constants.FTSDKKEY)
.setFrSdkKey(Constants.FRSDKKEY)
.setLivenessAppId(Constants.LIVENESSAPPID)
.setLivenessSdkKey(Constants.LIVENESSSDKKEY)
.create();
}

  

相机预览追踪人脸位置

//初始化人脸追踪引擎
FaceTrackService faceTrackService = new FaceTrackService();
//设置传入的图片的大小
faceTrackService.setSize(previewSize.width, previewSize.height);
camera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
//获取人脸的位置信息
List<AFT_FSDKFace> fsdkFaces = faceTrackService.getFtfaces(data);
//画出人脸的位置
drawFaceRect(fsdkFaces);
//输出数据进行其他处理
cameraPreviewListener.onPreviewData(data.clone(), fsdkFaces);
...
}
});

  

相机自己实现,获取人脸位置的代码非常简单,就一句代码,画出人脸的位置实现是用了两个surfaceView,一个用于相机画面展示,另一个画出人脸的位置

画出人脸的位置

值得注意的是获取的人脸的位置Rect是传入的图片的相对位置,图片大小是相机预览设置的大小,画的时候是画在了surfaceView上面,surfaceView一般和预览大小是不一样的,而且还要考虑画面是否旋转、相机的位置等,所以需要先进行转换

Rect rect1=DrawUtils.adjustRect(rect, previewSizeX, previewSizeY,canvas.getWidth(), canvas.getHeight(), cameraOri, cameraId);

  

获取人脸特征进行注册

//初始化人脸识别引擎
FaceRecognitionService faceRecognitionService = new FaceRecognitionService();
faceRecognitionService.setSize(width, height);
//获取人脸特征
AFR_FSDKFace afr_fsdkFace =faceRecognitionService.faceData(data, aft_fsdkFace.getRect(), aft_fsdkFace.getDegree());
tv_status.setText("人脸特征为:" + afr_fsdkFace.getFeatureData());

  

aft_fsdkFace为上一步获取的人脸的位置信息

相机获取的人脸和已保存的人脸进行对比

//获取保存的人脸特征
byte[] faceData=faces.get(0).getData();
//对比人脸特征
float socre=faceRecognitionService.faceRecognition(afr_fsdkFace.getFeatureData(),faceData);
tv_status.setText("相似度为:" + sorce);

  

afr_fsdkFace为上一步获取的人脸的特征,faceData为已保存的人脸特征,也有提供一个人脸和多个对比获取相似度最高的一个的方法

活体检测

//激活活体检测
LivenessService.activeEngine(new LivenessActiveListener() {
@Override
public void activeSucceed() {
toast("激活成功");
}

@Override
public void activeFail(String massage) {
LogUtils.log(massage);
toast("激活失败:" + massage);
}
});
LivenessService livenessService = new LivenessService();
//
List<FaceInfo> faceInfos = new ArrayList<>();
faceInfos.add(new FaceInfo(aft_fsdkFace.getRect(), aft_fsdkFace.getDegree()));
//判断是否是活体
boolean isLive=livenessService.isLive(faceInfos,data);
aft_fsdkFace为上一步获取的人脸的位置信息,第一次激活好像需要联网

  

人证对比

//初始化
IdCardVerifyManager.getInstance().init(Constants.IDCARDAPPID, Constants.FRSDKKEY);
//bitmap转NV21数据
byte[] nv21Data = ImageUtils.getNV21(bitmap.getWidth(), bitmap.getHeight(), bitmap);
//传入证件照片
DetectFaceResult result = IdCardVerifyManager.getInstance().inputIdCardData(nv21Data, bitmap.getWidth(), bitmap.getHeight());
//传入相机获取的人脸数据
DetectFaceResult result = IdCardVerifyManager.getInstance().onPreviewData(data, mWidth, mHeight, true);
//对比相似度
CompareResult compareResult = IdCardVerifyManager.getInstance().compareFeature(THRESHOLD);
if (compareResult.isSuccess()) {
tv_status.setText("相似度为:" + compareResult.getResult());
}

  

证件图片是本地的,转成了NV21的格式的byte数组,方法也集成了

图片获取人脸特征

//先把bitmap转NV21格式
byte[] photoData = ImageUtils.getNV21(bitmap1.getWidth(), bitmap1.getHeight(), bitmap1);
//获取人脸位置信息
List<AFD_FSDKFace> afd_fsdkFaces = faceFindService.findFace(photoData);
for (AFD_FSDKFace afdFsdkFace : afd_fsdkFaces) {
//获取每一个人脸的特征
AFR_FSDKFace afr_fsdkFace = faceRecognitionService.faceData(photoData, afdFsdkFace.getRect(), afdFsdkFace.getDegree());
}

  

引擎释放

livenessService.destoryEngine();
faceTrackService.destoryEngine();
faceRecognitionService.destroyEngine();
IdCardVerifyManager.getInstance().unInit();

  

效果都还不错,主要是全部免费,源码下载可以直接运行,可以查看所有功能

屏幕快照 2018-10-11 下午4.50.30.png-32.4kB

demo下载地址:http://oy5r220jg.bkt.clouddn.com/arcface_v1.0.3.apk
项目地址:https://github.com/tyhjh/Arcface

SDK下载地址:https://ai.arcsoft.com.cn/ucenter/user/reg?utm_source=csdn1&utm_medium=referral

原文地址:https://www.cnblogs.com/Zzz-/p/10856142.html

时间: 2024-11-02 23:30:52

基于Android 虹软人脸、人证对比,活体检测的相关文章

Android 虹软人脸识别SDK-人脸对比

准备 : 登录官方网站,获取SDK,进行个人验证后新建项目,获取APP_ID,和SDK_KEY: https://ai.arcsoft.com.cn/ucenter/resource/build/index.html#/ucenter/resource/openPlatform/application 实现 : 激活引擎 : /** * 激活引擎 * * @param view */ public void activeEngine(final View view) { if (!checkPe

[Android]虹软人脸检测与人脸识别集成分享

目前我们的应用内使用了 ArcFace 的人脸检测功能,其他的我们并不了解,所以这里就和大家分享一下我们的集成过程和一些使用心得 集成 ArcFace FD 的集成过程非常简单在 ArcFace FD 的文档上有说明支持的系统为 5.0 及以上系统,但其实在 4.4 系统上也是可以跑的, if (engine == null) { // && Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { try { engine =

uniapp安卓ios百度人脸识别、活体检测、人脸采集APP原生插件

插件亮点 1 支持安卓平板(横竖屏均可),苹果的iPad.2 颜色图片均可更换. 特别提醒 此插件包含 android 端和 iOS 端,考虑到有些同学只做其中一个端的 app,特意分为 2 个插件,减小安装包体积.android 端请点击这里.iOS 端请点击这里. 1.前言 最近在使用 uniapp 开发项目,有刷脸实名认证的需求,最终使用百度人脸识别实现了需求.自己做了个 APP 原生插件,给大家介绍下用法.本插件主要功能是通过动作检测活体,采集人脸返回.其他功能需要自主实现,如刷脸登录,

证件识别,身份证识别,人脸校对,活体检测,OCR身份证识别

在实名制铺天盖地的情况下,为了提高效率.节省成本,同时提升用户体验,身份证识别已迅速被各个企业所应用. 目前,市面上有身份证识别产品的公司大约有七八家,各家特点不一样,在选择身份证识别产品时要综合考量几家的优缺点. 作为后起之秀,译图智讯精于匠心,追求极致,努力将产品打造得更好,其身份证OCR识别具有以下几大特点: 1.快速:识别时间小于1秒 2.精准:识别率高达99% 3.多模式:可图像导入识别.可视频预览识别.也可拍照识别 4.正反面均可识别 5.可支持少数民族身份证识别及部分生僻字识别 6

人脸识别活体检测技术讨论:基于背景人脸相对运动的活体判断方法

活体检测是人脸识别安全性的重要保障,是人脸识别厂商将产品普及应用于各行业的重要竞争力.目前活体判断的方法很多,但很难基于一种方法就能达到理想的效果,往往需要多种算法的交叉判断,本文主要介绍一种简单有效的活体判断方法.在很多情况下,高清照片和真人在某些光线条件下在相机中的成像很接近,这就导致仅仅基于面部的特征很难准确判断活体.在大部分场景下,人手拿着照片,手机或者pad不会完全静止不动,而在有运动时,真人和照片的区别很大:真实人脸运动与背景无相关性,照片,手机或者Pad在运动时,人脸运动与周围背景

人脸识别门禁检测的必要性

人脸识别系统需具备活体检测功能,以判断提交的人脸特征是否来自有生命的真实个体. 人脸活体检测的基本原理 人脸门禁的基本功能是人脸验证(Face Verification),而活体检测属于人脸防伪技术(Face Anti-Spoofing).人脸验证和人脸防伪,两种技术各有侧重. 人脸验证:人脸验证是判断两个人脸图是否为同一个人的算法,即通过人脸比对获得两个人脸特征的相似度,然后与预设的阈值比较,相似度大于阈值,则为同一人,反之则不同.这是近年来一个非常热门的研究方向,也产生了一大批算法模型和损失

虹软人脸识别 - faceId及IR活体检测的介绍

前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: ? VIDEO模式新增faceId(类似于之前文章中提到的trackId)? 新增IR活体检测功能? 新增IR.RGB的活体阈值设置 一.faceId介绍 1. 定义 在连续的视频帧中,当一个人脸进入视频画面直到离开,其faceId不变. 2. 应用场景举例 在门禁应用场景下,若一个人长时间停留在画面中,借助faceId的功能,在此人的人脸特征提取成功后,可不再对此人的后续人脸信息进

结合活体检测,人脸识别在Android、IOS、服务器中的应用

随着深度学习方法的应用,人工智能的发展,人脸识别技术的识别率已经得到质的提升,通过反复开发试验,目前我司的人脸识别技术率已经达到99%.人脸识别技术与其他生物特征识别技术相吃比,在实际应用中具有天然独到的优势:通过摄像头直接获取,在非接触的方式完成识别过程.通过人脸识别与证件识别的比对,目前我司的人脸识别技术已应用在金融.教育.景区.旅运.社保等领域. 人脸识别技术简介 人脸识别技术主要分为两部分: 第一部为前端人脸活体检测技术,主要支持android.ios平台,在前端通过眨眼.张嘴.摇头.点

Android 实现人脸识别教程[运用虹软人脸识别SDK]

基于虹软人脸识别引擎,在Android平台上实现人脸识别功能,即使在离线的情况下依旧运行,不被人采集个人照片的感觉,还是爽爽的.经过整个测试过来,虹软的人脸识别还是很强大的,人脸检测可以控制在20ms之内,人脸识别大概在200ms左右.今天就来分享一下开发经验 项目的目标 我们需要实现一个人脸识别功能.简单来说,就是机的后置摄像头,识别摄像头中实时拍到的人脸信息,如果人库注册过,则显示识别后的人脸信息,如登记的名字:如果不在,提示未注册. 这个功能具有多个应用场景,比如,火车站或者打卡和门禁系统