人脸识别(基于ArcFace)

我们先来看看效果

上面是根据图片检测出其中的人脸、每个人脸的年龄还有性别,非常强大

第一步:

登录https://ai.arcsoft.com.cn/,注册开发者账号,身份认证,注册应用,得到APPID和SDKKEY

第二步:

阅读SDK接入文档https://ai.arcsoft.com.cn/manual/arcface_android_guideV2.html

其中重要的是下面

Step1:调用FaceEngine的active方法激活设备,一个设备安装后仅需激活一次,卸载重新安装后需要重新激活。

Step2:调用FaceEngine的init方法初始化SDK,初始化成功后才能进一步使用SDK的功能。

Step3:调用FaceEngine的detectFaces方法进行图像数据或预览数据的人脸检测,若检测成功,则可得到一个人脸列表。(初始化时combineMask需要ASF_FACE_DETECT)

Step4:调用FaceEngine的extractFaceFeature方法可对图像中指定的人脸进行特征提取。(初始化时combineMask需要ASF_FACE_RECOGNITION)

Step5:调用FaceEngine的compareFaceFeature方法可对传入的两个人脸特征进行比对,获取相似度。(初始化时combineMask需要ASF_FACE_RECOGNITION)

Step6:调用FaceEngine的process方法,传入不同的combineMask组合可对Age、Gender、Face3Dangle、Liveness进行检测,传入的combineMask的任一属性都需要在init时进行初始化。

Step7:调用FaceEngine的getAge、getGender、getFace3Dangle、getLiveness方法可获取年龄、性别、三维角度、活体检测结果,且每个结果在获取前都需要在process中进行处理。

Step8:调用FaceEngine的unInit方法销毁引擎。在init成功后如不unInit会导致内存泄漏。

引擎一定要先激活,只需激活一次,然后初始化,接着就选择你需要的方法调用,step3-step7选择其中一个调用即可,最后的最后一定要销毁引擎

贴出核心代码:

/**
 * 激活引擎
 */
public void activeEngine() {
    if (!checkPermissions(NEEDED_PERMISSIONS)) {
        ActivityCompat.requestPermissions(this, NEEDED_PERMISSIONS, ACTION_REQUEST_PERMISSIONS);
        return;
    }
    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            faceEngine = new FaceEngine();
            int activeCode = faceEngine.active(MainActivity.this, Constants.APP_ID, Constants.SDK_KEY);
            emitter.onNext(activeCode);
        }
    })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Integer>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(Integer activeCode) {
                    if (activeCode == ErrorInfo.MOK) {
                        showToast(getString(R.string.active_success));
                    } else if (activeCode == ErrorInfo.MERR_ASF_ALREADY_ACTIVATED) {
                        showToast(getString(R.string.already_activated));
                    } else {
                        showToast(getString(R.string.active_failed, activeCode));
                    }
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });
}
/**
  * 初始化引擎
  **/
private void initEngine() {
    faceEngineCode = faceEngine.init(this, FaceEngine.ASF_DETECT_MODE_IMAGE, FaceEngine.ASF_OP_0_HIGHER_EXT,
            16, 10, FaceEngine.ASF_FACE_RECOGNITION | FaceEngine.ASF_FACE_DETECT | FaceEngine.ASF_AGE | FaceEngine.ASF_GENDER | FaceEngine.ASF_FACE3DANGLE | FaceEngine.ASF_LIVENESS);
    VersionInfo versionInfo = new VersionInfo();
    faceEngine.getVersion(versionInfo);

    if (faceEngineCode != ErrorInfo.MOK) {
        showToast(getString(R.string.init_failed, faceEngineCode));
    }
}
//bitmap转bgr
byte[] bgr24 = ImageUtil.bitmapToBgr(bitmap);

if (bgr24 == null) {
    clearDialog();
    showToast("图片转化失败");
    return;
}

/**
 * 2.成功获取到了BGR24 数据,开始人脸检测
 */
List<FaceInfo> faceInfoList = new ArrayList<>();
faceEngine.detectFaces(bgr24, width, height, FaceEngine.CP_PAF_BGR24, faceInfoList);
if (faceInfoList.size() == 0) {
    clearDialog();
    showToast("没有检测到人脸");
    startActivity(new Intent(this, MainActivity.class));
}
if (faceInfoList.size() > 1) {
    clearDialog();
    showToast("请不要同时出现多个人脸");
    startActivity(new Intent(this, MainActivity.class));
}
if (faceInfoList.size() == 1) {
    clearDialog();
    FaceInfo faceInfo = faceInfoList.get(0);
    //得到人脸的宽和高
    final int faceWidth = faceInfo.getRect().width();
    final int faceHeight = faceInfo.getRect().height();
    makeFace();
}

我这里只做了识别人脸,其他的功能可以参考官网的Demo

多次调用ImageView.setImageResource方法,我在开发过程中遇到了OOM,因为这些加载图片的方法最终都是通过java层的createBitmap来完成的,需要消耗很多内存

可以采用BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source。decedeStream最大的秘密在于其直接调用JNI>>nativeDecideAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间

/**
 * 此方法是为了防止内存溢出
 */
private BitmapDrawable getBitmap(int resId) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    options.inPurgeable = true;
    options.inInputShareable = true;
    InputStream is = getResources().openRawResource(resId);
    Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);
    try {
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return new BitmapDrawable(getResources(), bitmap);
}

欢迎关注我的微信公众号:安卓圈

原文地址:https://www.cnblogs.com/anni-qianqian/p/10945166.html

时间: 2024-10-12 02:46:13

人脸识别(基于ArcFace)的相关文章

Java 离线人脸识别 基于ArcFace 2.0 Demo

源代码传送:https://github.com/itboyst/ArcSoftFaceDemo 开发环境准备:###开发使用到的软件和工具: Jdk8.mysql5.7.libarcsoft_face.dll(so).libarcsoft_face_engine.dll(so).libarcsoft_face_engine_jni.dll(so).idea注:libarcsoft_face.dll(so).libarcsoft_face_engine.dll(so).libarcsoft_fa

人脸识别---基于深度学习和稀疏表达的人脸识别算法

介绍 基于深度学习和稀疏表达的人脸识别算法 1 利用VGGFace提取人脸特征 2 PCA对人脸特征进行降维 3 稀疏表达的人脸匹配 Code 1 介绍 本文将介绍一种基于深度学习和稀疏表达的人脸识别算法.首先,利用深度学习框架(VGGFace)提取人脸特征:其次,利用PCA对提取的特征进行降维:最后,利用稀疏表达分类实现特征匹配.我采用CMC曲线评价在AR数据库上的识别性能.最后我还提供了整个过程的code. 2 基于深度学习和稀疏表达的人脸识别算法 2.1 利用VGGFace提取人脸特征 下

基于百度媒体云人脸识别

基于百度媒体云人脸识别 基于百度媒体云人脸识别安卓版 下载地址:http://www.devstore.cn/code/info/1128.html 运行截图: 热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.

C#30分钟完成百度人脸识别

一.前言   距离上次入门篇时隔两个月才出这进阶篇,小编惭愧,对不住关注我的卡哇伊的小伙伴们,为此小编用这篇博来谢罪. 前面的准备工作我就不说了,注册百度账号api,创建web网站项目,引入动态链接库引入. 不了解的可以花费10分钟移步学习:<C# 10分钟完成百度人脸识别—入门篇>. 如果要学习的童鞋最好下载本demo源码,因为有信息入库功能,BLL.DAL.数据库就在源码里面. 一般情况下笔记本自带的可见光摄像头就可以进行人脸识别,但是这种摄像头不能很好的进行活体检测,可能会被照片和视频骗

C#实现基于ffmpeg加虹软Arcface的人脸识别demo

对开发库的C#封装,屏蔽使用细节,可以快速安全的调用人脸识别相关API.具体见github地址.新增对.NET Core的支持,在Linux(Ubuntu下)测试通过.具体的使用例子和Demo详解,参见博客地址. 更新: 增加对V1.1两个新功能的支持. 关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenCV和商业库虹软(中小型规模免费). 百度的人脸

人脸识别算法虹软arcface和Dlib对比

我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用人脸识别功能.基于这些考虑,我司需要寻找其他的方案.通过搜索,目前发现,开源或免费支持离线的方案也有不少.目前初步考虑虹软 ArcFace和Dlib.通过官方的demo 和 网上的资料,写了个工程,也可以在这里看.这里说一下要注意的摄像头是使用了 OpenCV 来处理的,这里可能会涉及到预览图和屏幕

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO

基于QT和OpenCV的人脸识别系统

1 系统方案设计 1.1 引言 人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控.出入口控制.视频会议以及人机交互等领 域都有着广泛的应用前景,因此是模式识别和计算机视觉领域持续的研究热点. 本系统在 FriendlyARM Tiny6410 开发板基础上,利用 OpenCV 计算机视觉库和 QT 图形库,通 过普通的 USB 摄像头实现了自动人脸识别,准确率较高,方便易用. 1.2 系统总体架构 "人脸识别&quo

基于 OpenCV 的人脸识别

基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影. OpenCV 起始于 1999 年 Intel 的一个内部研究项目.从那时起,它的开发就一直很活跃.进化到现在,它已支持如 OpenCL 和 OpenGL 的多种现代技术,也支持如 iOS

人脸识别(基于OpenCV)

描述 人脸识别包括四个步骤 人脸检测:定位人脸区域,只关心是不是脸: 人脸预处理:对人脸检测出来的图片进行调整优化: 收集和学习人脸:收集要识别的人的预处理过的人脸,然后通过一些算法去学习如何识别: 人脸识别:识别当前人脸与数据库里的哪个人脸最相似. 人脸检测 OpenCV集成了基于PCA LDA 和LBP的人脸检测器,源文件自带很多各种训练好的检测器.下表是常用的XML文件 上面的XML文件可以检测正面人脸.眼睛或鼻子.检测人脸我采用的是第一个或第二个Harr人脸检测器.识别率比较好. 第一步