OpenCV4.5.4 DNN人脸识别模块使用介绍--如何快速搭建一个人脸识别系统
点击下方卡片,关注“OpenCV与AI深度学习”
视觉/图像重磅干货,第一时间送达
导读
本文主要介绍OpenCV4.5.4中人脸识别模块的使用和简易人脸识别系统的搭建,供大家参考。
背景介绍
前几天刚刚更新的OpenCV4.5.4版本将基于DNN的人脸检测和人脸识别添加到modules/objdetect中,具体更新介绍如下:
OpenCV4.5.4更新了!看看都有哪些新功能?
人脸检测使用的是于仕琪老师团队开源的人脸检测库,具体使用可参考往期文章,检测速度和准确率都很不错。
OpenCV DNN人脸检测模块使用步骤演示(基于OpenCV4.5.4)
效果如下:
同时OpenCV4.5.4 新增了DNN人脸识别模块,人脸识别部分的模型是由下面几位贡献者训练提供:
在不同数据集下的准确率和推荐阈值设置:
人脸识别模块使用介绍
DNN人脸识别例程位置:
OpenCV4.5.4_Release\opencv\sources\samples\dnn\face_match.cpp
使用步骤:
① 下载模型文件:
人脸检测模型下载地址:https://github.com/ShiqiYu/libfacedetection.train/tree/master/tasks/task1/onnx
人脸识别模型下载地址:
https://drive.google.com/file/d/1ClK9WiB492c5OZFKveF3XiHCejoOxINW/view
下载好了就是下面两个文件:
② 人脸检测(对人脸图片1和人脸图片2分别做人脸检测):
String det_onnx_path = "./yunet.onnx";
// Initialize FaceDetector
Ptr<FaceDetectorYN> faceDetector;
faceDetector = FaceDetectorYN::create(det_onnx_path, "", image1.size(), score_thresh, nms_thresh, top_k);
Mat faces_1;
faceDetector->detect(image1, faces_1);
if (faces_1.rows < 1)
{
std::cerr << "Cannot find a face in " << image1_path << "\n";
return -1;
}
faceDetector = FaceDetectorYN::create(det_onnx_path, "", image2.size(), score_thresh, nms_thresh, top_k);
Mat faces_2;
faceDetector->detect(image2, faces_2);
if (faces_2.rows < 1)
{
std::cerr << "Cannot find a face in " << image2_path << "\n";
return -1;
}
人脸检测效果(获得人脸区域和5点landmark):
③ 人脸裁剪对齐+提取特征:
// Initialize FaceRecognizerSF
String reg_onnx_path = "./face_recognizer_fast.onnx";
Ptr<FaceRecognizerSF> faceRecognizer = FaceRecognizerSF::create(reg_onnx_path, "");
Mat aligned_face1, aligned_face2;
faceRecognizer->alignCrop(image1, faces_1.row(0), aligned_face1);
faceRecognizer->alignCrop(image2, faces_2.row(0), aligned_face2);
Mat feature1, feature2;
faceRecognizer->feature(aligned_face1, feature1);
feature1 = feature1.clone();
faceRecognizer->feature(aligned_face2, feature2);
feature2 = feature2.clone();
④ 比对人脸特征相似度,判断是否为同一个人:
double cos_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_COSINE);
double L2_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_NORM_L2);
if(cos_score >= cosine_similar_thresh)
{
std::cout << "They have the same identity;";
}
else
{
std::cout << "They have different identities;";
}
std::cout << " Cosine Similarity: " << cos_score << ", threshold: " << cosine_similar_thresh << ". (higher value means higher similarity, max 1.0)\n";
if(L2_score <= l2norm_similar_thresh)
{
std::cout << "They have the same identity;";
}
else
{
std::cout << "They have different identities.";
}
std::cout << " NormL2 Distance: " << L2_score << ", threshold: " << l2norm_similar_thresh << ". (lower value means higher similarity, min 0.0)\n";
人脸特征相似度度量有normL2和cosine方法,对应的判断是否为同一人的阈值分别为1.128和0.363,normL2方法小于阈值1.128判定为同一人,cosine方法大于阈值0.363判定为同一人。
float score_thresh = 0.9f;
float nms_thresh = 0.3f;
double cosine_similar_thresh = 0.363;
double l2norm_similar_thresh = 1.128;
int top_k = 5000;
依照上面步骤,我们很快就可以搭建一个类似下面的人脸对比应用程序:
OpenCV DNN人脸识别匹配应用效果展示
匹配准确率已足以应对一般应用,比OpenCV原有的FisherFaceRecognizer、LBPHFaceRecognizer和EigenFaceRecognizer准确率都要好。
人脸识别系统搭建
上面介绍的是搭建一个人脸比对应用,那么如何搭建一个人脸识别系统?步骤又是什么?
我们首先要知道人脸识别一般分为1:1和1:N人脸识别。
1:1人脸识别核心就是人脸比对,比如典型的刷卡人脸识别系统,需要在刷卡(比如工牌,包含姓名等信息)后做人脸识别,其实就是去找对应路径下的人脸图片或人脸特征和当前的人脸特征做比对,来校验卡和人是否一致,常用于公司的考勤打卡系统。这种系统相对来说比较简单,前期数据录入是也只需要采集员工信息和图片就可以完成,用上面的人脸比对思路就可以做一个。
1:N人脸识别相较而言就要复杂一些,对算法的准确率和速度都有很高的要求。在拍照的同时,需要完成数据库内大量人脸特征的对比,如果用上述OpenCV DNN人脸比对方法可能有些困难,检测时间问题可以尝试多线程和硬件加速方法。1:N人脸识别常见于小区门禁的人脸识别系统,目前商用系统已较为成熟。
下面是使用OpenCV DNN人脸识别模块做的一个简单视频人脸识别应用,截取舌战群儒片段,选择张昭和诸葛亮图片先提取特征,然后每一帧取比对,判断相似度,标注识别结果:
OpenCV DNN人脸识别实例之舌战群儒
OpenCV DNN人脸识别之舌战群儒
源码素材与其他应用内容讨论,如有需要可加入知识星球中获取。
同时欢迎大家加入OpenCV与AI深度学习官方微信群一起学习交流:
—THE END—
OpenCV4.5.4 DNN人脸识别模块使用介绍--如何快速搭建一个人脸识别系统相关推荐
- 智能媒体管理产品文档转换/预览功能介绍(4)--快速搭建
摘要: 智能媒体管理提供了 Cloud Native 架构的文档转换/预览服务,本文介绍快速搭建的示例,让您用 DIY 的体验方式实现文档预览功能. 一.导语 智能媒体管理 提供了 Cloud Nat ...
- php new httprequest,php安装HTTP_Request2及引用介绍(通过HTTP_Request创建微软人脸识别的群组 为例)...
// This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents ...
- 开源人脸识别系统compareface介绍
Exadel CompreFace是一种免费的open-source人脸识别服务,无需事先具备机器学习技能,即可轻松集成到任何系统中.CompreFace为人脸识别.人脸验证.人脸检测.里程碑检测.年 ...
- STM32驱动K210人脸识别模块经验汇总
本次是基于HLK-KT210 AI人脸识别模块和STM32单片机进行设计的人脸识别项目.主要是人脸识别功能的分析和使用. 1 模块连接 本次使用了海凌科生产的DEMO板,但是由于板子的客观因素,TTL ...
- Python人脸识别的简要介绍(附实例、Python代码)
介绍 你是否意识到,每当你上传照片到Facebook上,平台都会用人脸识别算法来识别图片中的人物?目前还有一些政府在用人脸识别技术来识别和抓捕罪犯.此外,最常见的应用就是通过自己的脸部解锁手机. 计算 ...
- 人脸识别的简要介绍(附实例、Python代码)
作者:Guest Blog:翻译:王雨桐:校对:蒋雨畅: 本文约2500字,建议阅读10分钟. 本文将介绍人脸识别的基本思路和对代码进行简要分析. 介绍 你是否意识到,每当你上传照片到Facebook ...
- dlib库包的介绍与使用,opencv+dlib检测人脸框、opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类、dlib视频目标跟踪
文章目录: 1 dlib库介绍 2 dlib人脸检测:绘制出人脸检测框 2.1 dlib人脸检测源码 2.2 opencv + dlib 人脸检测 2.3 dlib人脸检测总结 3 dlib人脸关键点 ...
- 人脸离线识别模块_人脸识别模块做到市场份额60%,这家AI公司如何用狼性在安防杀开一条血道?...
导读 "我们是行业内的隐形冠军,只是很少对外说自己的成绩,但事实是我们从2014年就开始做人脸识别模组,市场上非常有名的门禁系统厂商基本都是我们的客户." 瑞为技术安防事业部总经理 ...
- OpenCV3.3人脸识别模块的API的变化
OpenCV3.3人脸识别模块的API的变化 1. 前言 开始用最新版的OpenCV进行人脸识别的小伙伴也许已经发现了,人脸识别的最新API变化了.这也正是人脸识别等contrib模块没有放到主仓库的 ...
最新文章
- 企业级工作流解决方案(十五)--集成Abp和ng-alain--Abp其他改造
- keepalive的 nopreempt 非抢占
- linux C 列出目录中的文件列表 包含文件的相关信息
- 收集整理的非常有用的PHP函数
- httrack 拷贝网站到本地(好东西,但是发现考的不全)
- 32 岁大佬阿里二面,他答 JVM 题的姿势,令面试官很想不通。。。
- 老黄历小程序源码前端实例(亲测可用)
- urllib的实现---请求响应and请求头处理
- java面对对象 关键字this super
- bzoj 3036: 绿豆蛙的归宿(Dp)
- 浅谈Empty、Nothing
- 运动目标检测发展概述
- Canvas 自由落体
- 最小二乘法平面方程拟合计算, 点云法向量估算
- android sdk引入 微信分享_Android分享 ShareSDK微信分享详解
- ubuntu16.04 安装拼音输入法
- 可靠传输的原理:停止等待协议、ARQ协议;TCP协议的可靠传输
- asp.net报错:ConnectionString 属性尚未初始化
- ffmpeg的api里av_free和av_freep的区别
- 1018 锤子剪刀布python3无超时
热门文章
- wireshark抓包分析http报文
- 用户通过什么和计算机交换信息,人和计算机进行信息交换是通过计算机的输入、输出设备实现的。( )——青夏教育精英家教网——...
- python+pytest接口自动化(5)-requests发送post请求
- matlab 矩阵角标,MATLAB中的矩阵索引
- 用CSS两分钟实现打字机效果
- Python 小甲鱼教程 乌龟吃鱼游戏
- 从2022年自动驾驶融资情况看行业风向标
- Python实现接收企业微信接收消息
- pytorch环境配置
- 十个最火的HTML5框架与移动应用框架的比较