我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用人脸识别功能。基于这些考虑,我司需要寻找其他的方案。

通过搜索,目前发现,开源或免费支持离线的方案也有不少。目前初步考虑虹软 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人脸识别对比的更多相关文章

  1. [深度应用]·实战掌握Dlib人脸识别开发教程

    [深度应用]·实战掌握Dlib人脸识别开发教程 个人网站--> http://www.yansongsong.cn/ 项目GitHub地址--> https://github.com/xi ...

  2. [深度学习工具]·极简安装Dlib人脸识别库

    [深度学习工具]·极简安装Dlib人脸识别库 Dlib介绍 Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具.它广泛应用于工业界和学术界,包 ...

  3. arcface和Dlib人脸识别算法对比

    我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...

  4. 基于Arcface Android平台的人脸识别实现

    效果图 先上效果,让大家看看如何 现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软 ...

  5. Android 用虹软SDK做人脸识别

    人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec ...

  6. 【C#】 基于ArcFace 2.0—视频人脸识别Demo

    使用的虹软人脸识别技术 啥话不说,不用跪求,直接给下载地址:http://common.tenzont.com/comdll/arcface2demo.zip(话说附件的大小不限制,还是说我的文件太大 ...

  7. OpenCV 和 Dlib 人脸识别基础

    00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...

  8. python3+dlib人脸识别及情绪分析

    一.介绍 我想做的是基于人脸识别的表情(情绪)分析.看到网上也是有很多的开源库提供使用,为开发提供了很大的方便.我选择目前用的比较多的dlib库进行人脸识别与特征标定.使用python也缩短了开发周期 ...

  9. C# 虹软SDK视频人脸识别和注册

    一,准备工作 1.Afoge视频参数类 using AForge.Video.DirectShow; using System; using System.Collections.Generic; u ...

随机推荐

  1. SUSE12SP3-Mysql5.7安装

    1.将以下安装包复制到服务器 mysql-community-client-5.7.24-1.sles12.x86_64.rpm mysql-community-server-5.7.24-1.sle ...

  2. Vue(day2)

    一.过滤器 Vue中可以自定义过滤文本插值的过滤器.目前有两个地方可以使用: 插值文本{{ var }}中使用. 在v-bind中使用.( 2.1.0+ ) 用法:使用管道连接符 | 将需要过滤的文本 ...

  3. [Swift]LeetCode433. 最小基因变化 | Minimum Genetic Mutation

    A gene string can be represented by an 8-character long string, with choices from "A", &qu ...

  4. [Swift]LeetCode479. 最大回文数乘积 | Largest Palindrome Product

    Find the largest palindrome made from the product of two n-digit numbers. Since the result could be ...

  5. [Swift]LeetCode661. 图片平滑器 | Image Smoother

    Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...

  6. Java-SSM框架页面时间格式转换

    在JSP中,列表查询绑定时间时,会出现以下的时间格式,那样看起来的话,感觉... 那如何转换成“yyyy-MM-dd HH:mm:ss”格式呢?--很简单,在JSP头顶加上 <%@ taglib ...

  7. 【mysql】mysql 调优之 ——执行计划 explain

    1.what is explain(explain 是个什么东东) explain(解释),在 Mysql 中 作为一个关键词,用来解释 Mysql 是如何执行语句,可以连接 select .dele ...

  8. 2.Django路由规则

    路由规则 1.基于正则的url 在templates目录下创建index.html.detail.html文件 (1)index.html <!DOCTYPE html> <html ...

  9. http缓存与离线缓存

    一.http协议实现缓存 1. 缓存头部 通用缓存.条件缓存.缓存控制三大类 头部名称 说明 请求/响应 通用缓存头部 控制客户端是否向服务器发送请求或者是服务端响应请求   cache-contro ...

  10. Python爬虫入门教程 21-100 网易云课堂课程数据抓取

    写在前面 今天咱们抓取一下网易云课堂的课程数据,这个网站的数据量并不是很大,我们只需要使用requests就可以快速的抓取到这部分数据了. 你第一步要做的是打开全部课程的地址,找出爬虫规律, 地址如下 ...