人脸识别(基于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);
}
欢迎关注我的微信公众号:安卓圈

人脸识别(基于ArcFace)的更多相关文章
- 离线人脸识别 ArcFaceSharp -- ArcFace 2.0 SDK C#封装库分享
ArcFaceSharp ArcFaceSharp 是ArcSoft 虹软 ArcFace 2.0 SDK 的一个 C# 封装库,为方便进行 C# 开发而封装.欢迎 Start & Fork. ...
- 人脸识别(基于Caffe)
人脸识别(基于Caffe, 来自tyd) 人脸识别(判断是否为人脸) LMDB(数据库, 为Caffe支持的分类数据源) mkdir face_detect cd face_detect mkdir ...
- 【Python+OpenCV】人脸识别基于环境Windows+Python3 version_3(Anaconda3)+OpenCV3.4.3安装配置最新版安装配置教程
注:本次安装因为我要安装的是win10(64bit)python3.7与OpenCV3.4.3教程(当下最新版,记录下时间2018-11-17),实际中这个教程的方法对于win10,32位又或是64位 ...
- java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对
java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...
- paper 97:异质人脸识别进展的资讯
高新波教授团队异质人脸图像识别研究取得新突破,有望大大降低刑侦过程人力耗费并提高办案效率 近日,西安电子科技大学高新波教授带领的研究团队,在异质人脸图像识别研究领域取得重要进展,其对香 ...
- Python Face Recognition 实现人脸识别
一.Face Recognition软件包 我们的人脸识别基于face_recognition库.face_recognition基于dlib实现,用深度学习训练数据,模型准确率高达99.38%. 人 ...
- OpenCV学习(38) 人脸识别(3)
前面我们学习了基于特征脸的人脸识别,现在我们学习一下基于Fisher脸的人脸识别,Fisher人脸识别基于LDA(线性判别算法)算法,算法的详细介绍可以参考下面两篇教程内容: ...
- Python3利用Dlib19.7实现摄像头人脸识别的方法
0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,提取人脸特征,通过计算欧氏距离来和预存的人脸特征进行对比,达到人脸识别的目的: 可以自动从摄像头中抠取人脸图片存储到本地,然后提取构建 ...
- 基于Arcface Android平台的人脸识别实现
效果图 先上效果,让大家看看如何 现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软 ...
- 【C#】 基于ArcFace 2.0—视频人脸识别Demo
使用的虹软人脸识别技术 啥话不说,不用跪求,直接给下载地址:http://common.tenzont.com/comdll/arcface2demo.zip(话说附件的大小不限制,还是说我的文件太大 ...
随机推荐
- React源码 React.Component
React中最重要的就是组件,写的更多的组件都是继承至 React.Component .大部分同学可能都会认为 Component 这个base class 给我们提供了各种各样的功能.他帮助我们去 ...
- XSS简单练习
xss平台: https://xss.haozi.me题解: https://blog.csdn.net/AlexYoung28/article/details/82315538 对在xss.haoz ...
- PAT 乙级 1001.害死人不偿命的(3n+1)猜想 C++/Java
1001 害死人不偿命的(3n+1)猜想 (15 分) 题目来源 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复 ...
- 【转】如何在 Linux 中查看可用的网络接口
原文:https://www.cnblogs.com/qianpangzi/p/10563979.html 查看ubuntu系统当前的可用的网络接口.方法如下 -------------------- ...
- javascript---call,apply,bind
对于这三个函数,估计大家都还是很模糊,具体是用来干什么?简而言之,是用来对象冒充的. 首先这三个方法是每个函数都包含的非继承的的方法. 我来搬砖一下,此文引用 http://www.cnblogs.c ...
- 图论 - Bellman-Ford算法
Bellman-Ford Dijkstra算法虽好,但是不能解决带有负边权的图. 而利用Bellman-Ford可以完美的解决最短路和负边权的问题 朴素Bellman-Ford算法 w[i] 权值 u ...
- Echo团队Beta冲刺随笔集合
班级:软件工程1916|W 作业:项目Beta冲刺(团队) 团队名称:Echo 作业目标:完成项目Beta冲刺 凡事预则立 Day 0: 凡事预则立 冲刺随笔 Day 1: Beta冲刺第一天 Day ...
- Ofbiz项目学习——阶段性小结——插入数据
一.通用插入操作 /** * * 编写一个服务createUomOneDemo, * 该服务的作用是在表Uom中增加一条记录,其中: * 字段uomId的值为“BaseLineProduct”. * ...
- OpenCV 学习笔记(7)vs2015+ffmpeg开发环境配置
参考教程 https://blog.csdn.net/HUSTLX/article/details/51014307 1.在http://ffmpeg.zeranoe.com/builds/ 下载最 ...
- Numpy | 13 位运算
NumPy "bitwise_" 开头的函数是位运算函数.本章都是按二进制来操作的. NumPy 位运算包括以下几个函数: 函数 描述 bitwise_and 对数组元素执行位与操 ...