ArcFace虹软与Dlib人脸识别对比
我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用人脸识别功能。基于这些考虑,我司需要寻找其他的方案。
通过搜索,目前发现,开源或免费支持离线的方案也有不少。目前初步考虑虹软 ArcFace 戳这里查看详情和Dlib。通过官方的demo 和 网上的资料,写了个工程,也可以在这里看。
这里说一下要注意的
- 摄像头是使用了 OpenCV 来处理的,这里可能会涉及到预览图和屏幕方向不一致的情况,我主要是通过一下代码处理
// 转换图片矩阵 这个也是主要使用 <span style="background-color: rgb(255, 255, 255);">OpenCV 来处理的</span>
private Mat rotateMat(Mat srcMat){
int _cameraDisplayRotation = cameraDisplayRotation;
if(mCameraIndex == CAMERA_ID_BACK){ // 后置摄像头
_cameraDisplayRotation = 180 + _cameraDisplayRotation;
}
Point center = new Point(srcMat.cols()/2,srcMat.rows()/2);
Mat dstMat = srcMat;
Mat rotImage = Imgproc.getRotationMatrix2D(center, _cameraDisplayRotation, 1); // 获取旋转矩阵 逆时针旋转。参数说明 center:表示旋转的中心点;angle:表示旋转的角度 ;scale:图像缩放因子
Imgproc.warpAffine(srcMat, dstMat, rotImage, dstMat.size()); // 实现坐标系仿射变换。参数说明 src: 输入源图像;dst: 输出图像;M: 仿射变换矩阵;dsize: 输出图像的尺寸
if(mCameraIndex == CAMERA_ID_FRONT){
Core.flip(dstMat,dstMat,1);//整理表示水平翻转,0表示垂直翻转,负数表示既有水平也有垂直翻转
}
if(rotImage!=null)rotImage.release();
return dstMat;
}
- Dlib 和虹软 ArcFace要做人脸识别前都需要先检测人脸,要不然后续提取不到人脸特征
- 人脸特征比对时,建议将需要识别的人脸特征库预先加载到内存,这样可以加快速度(当然也占用比较大的内存)
- 在使用 Dlib 做人脸检测时要注意,人脸方向和屏幕方向不一致时检测不到人脸(虹软 ArcFace 不存在这个问题),如果不一致,需要将图片的人脸方向转为和屏幕方向一致时再来做人脸检测
- 虹软 ArcFace 做人脸识别时,要注意你下载的凭条 SDK 与 APP_Id、SDK_key 要一致(这个是没懂要搞这么多验证数据)。库的引用直接安装文档操作即可。
- 虹软 ArcFace 做人脸识别时,要使用人脸检测时的人脸角度,要不然提取不到人脸特征,可以参考一下代码说明
// data 图片数据 注意数据格式是NV21的,目前虹软只支持这种格式,可以通过摄像头参数设置,也可以通过相关工具转换得到
// width 图片宽
// height 图片高
// AFD_FSDKEngine.CP_PAF_NV21 图片数据格式 目前虹软只支持这种格式
// faceDB 我的人脸特征库
List<AFD_FSDKFace> result_FD = new ArrayList<>(); // 用来存放检测到的人脸信息列表
AFD_FSDKError error_FD = engine_detection.AFD_FSDK_StillImageFaceDetection(data, width, height, AFD_FSDKEngine.CP_PAF_NV21, result_FD); // 检测人脸
AFR_FSDKFace face = new AFR_FSDKFace(); // 用来存放提取到的人脸信息
AFR_FSDKMatching score = new AFR_FSDKMatching(); //score用于存放人脸对比的相似度值
for(int i=0; i < result_FD.size(); i++){
AFD_FSDKFace item = result_FD.get(i);
Rect itemRect = item.getRect(); // 人脸位置
int degree = item.getDegree(); // 人脸方向 这个比 Dlib 好的地方
AFR_FSDKError error_FR = engine_recognition.AFR_FSDK_ExtractFRFeature(data, width, height, AFR_FSDKEngine.CP_PAF_NV21, itemRect, degree, face); // 提取人脸信息
error_FR = engine_recognition.AFR_FSDK_FacePairMatching(face, item, score);
for(int j=0; j<faceDB.getFaceList().size(); j++ ){
AFR_FSDKFace itemFace = faceDB.getFaceList().get(j);
error_FR = engine_recognition.AFR_FSDK_FacePairMatching(face, itemFace, score); // 人脸对比
if(score.getScore() > myThreshold){ // 找到相似的人脸
。。。
}
}
}
测试结果:
- 原图是1280x960,经压缩处理是320x240,经测试发现虹软的压缩和不压缩图片,效果是差不多的
Dlib测试结果
| 机型 | 一次人脸检测耗时 | 一次一个人脸特征提取耗时 | 一次人脸特征比对耗时 |
| 坚果 U1 | 280毫秒左右 | 6800毫秒左右 | 0.03毫秒左右 |
| 坚果 pro2 | 93毫秒左右 | 1060毫秒左右 | 0.002毫秒左右 |
虹软测试结果
| 机型 | 一次人脸检测耗时 | 一次一个人脸特征提取耗时 | 一次人脸特征比对耗时 |
| 坚果 U1 | 43毫秒左右 | 943毫秒左右 | 0.883毫秒左右 |
| 坚果 pro2 | 20毫秒左右 | 314毫秒左右 | 0.308毫秒左右 |
ArcFace虹软与Dlib人脸识别对比的更多相关文章
- [深度应用]·实战掌握Dlib人脸识别开发教程
[深度应用]·实战掌握Dlib人脸识别开发教程 个人网站--> http://www.yansongsong.cn/ 项目GitHub地址--> https://github.com/xi ...
- [深度学习工具]·极简安装Dlib人脸识别库
[深度学习工具]·极简安装Dlib人脸识别库 Dlib介绍 Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具.它广泛应用于工业界和学术界,包 ...
- arcface和Dlib人脸识别算法对比
我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...
- 基于Arcface Android平台的人脸识别实现
效果图 先上效果,让大家看看如何 现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软 ...
- Android 用虹软SDK做人脸识别
人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec ...
- 【C#】 基于ArcFace 2.0—视频人脸识别Demo
使用的虹软人脸识别技术 啥话不说,不用跪求,直接给下载地址:http://common.tenzont.com/comdll/arcface2demo.zip(话说附件的大小不限制,还是说我的文件太大 ...
- OpenCV 和 Dlib 人脸识别基础
00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...
- python3+dlib人脸识别及情绪分析
一.介绍 我想做的是基于人脸识别的表情(情绪)分析.看到网上也是有很多的开源库提供使用,为开发提供了很大的方便.我选择目前用的比较多的dlib库进行人脸识别与特征标定.使用python也缩短了开发周期 ...
- C# 虹软SDK视频人脸识别和注册
一,准备工作 1.Afoge视频参数类 using AForge.Video.DirectShow; using System; using System.Collections.Generic; u ...
随机推荐
- [Swift]LeetCode99. 恢复二叉搜索树 | Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- [Swift]LeetCode170.两数之和III - 数据结构设计 $ Two Sum III - Data structure design
Design and implement a TwoSum class. It should support the following operations:add and find. add - ...
- [Swift]LeetCode338. 比特位计数 | Counting Bits
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...
- PHP实现用户注册并保存数据到文件
首先我们实现功能时,分析实现的步骤是什么,就这个而言,我们应该接收用户提交的数据并进行校验,然后保存在文件,最后给用户反馈. 这里需要注意的是为了避免嵌套过深,这里使用自定义函数来实现,其代码如下: ...
- Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!
Tomcat相关的面试题出场的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握. 这次整理了Tomcat相关的系统架构,介绍了Server.Service.Connector.Con ...
- 【Impala篇】---Hue从初始到安装应用
一.前述 Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能.基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 是CDH平台首选的PB ...
- EF下lambda与linq查询&&扩展方法
1. linq查询数据 WebTestDBEntities db = new WebTestDBEntities(); 1.1 linq查询所有列数据 var userInfoList = from ...
- C++11 实现生产者消费者模式
代码都类似,看懂一个,基本都能理解了. 共有代码: #include <cstdlib>#include <condition_variable>#include <io ...
- qt cef嵌入web(二)
在qt cef嵌入web文章中已经讲述了怎么把cef页面嵌入到qt程序中,但是这样并不完美,因为如果需要在多个窗口上创建cef浏览器部件的话,在 消息监听部分没有办法做区分多个浏览器事件,在这篇文章中 ...
- 『Two 树的直径求解及其运用』
树的直径 我们先来认识一下树的直径. 树是连通无环图,树上任意两点之间的路径是唯一的.定义树上任意两点\(u, v\)的距离为\(u\)到\(v\)路径上边权的和.树的直径\(MN\)为树上最长路径, ...