使用OpenCV内置深度学习人脸模块,几行代码轻松完成人脸检测和识别

使⽤OpenCV内置深度学习⼈脸模块,⼏⾏代码轻松完成⼈脸检测识别
作者:冯远滔(OpenCV China),王成瑞(北京邮电⼤学),钟瑶瑶(北京邮电⼤学)
最新发布的OpenCV 4.5.4版本收录了⼀个基于深度学习神经⽹络的⼈脸模块(以下称“OpenCV DNN Face”),包括⼈脸检测(使⽤模型YuNet,由OpenCV China团队贡献)和⼈脸识别(使⽤模型SFace,由北京邮电⼤学邓伟洪教授课题组贡献)。
使⽤OpenCV DNN Face的API,只需⼏⾏代码便可以完成整个⼈脸检测和⼈脸识别处理,极⼤的⽅便了开发。
# ⼈脸检测
img = cv.imread('path/to/image')
faceDetector = ate('/path/to/model', '', img.shape[:2])
faces = faceDetector.detect(image)
# ⼈脸识别
recognizer = ate(recog_model_path, '' )
aligned_face = recognizer.alignCrop(img, faces[1][0])
feature = recognizer.feature(aligned_face)
cosine_score = recognizer.match(feature1, feature2, 0)
在相应的数据集上对OpenCV DNN Face的两个模型分别进⾏测试:
陶瓷电热水壶⼈脸检测模型YuNet在WIDER Face数据集的验证集中达到了0.856(AP_easy),0.842(AP_medium),0.727(AP_hard);
⼈脸识别模型SFace在LFW数据集上达到了99.60%的准确率(/master/d0/dd4/tutorial_dnn_face.html中有更详细的测试结果,以及此⼈脸模块的⼀些使⽤说明)。
根据OpenCV最新公开的OpenCV Zoo(github/opencv/opencv_zoo)的基准测试结果:
当输⼊图像尺⼨为160x120时,YuNet在i7-5930K@3.50GHz上达到689FPS,在树莓派4B上可达160FPS;
SFace在输⼊图像尺⼨为112x112,同样的平台下分别为115FPS和10FPS。
YuNet仅为337K,SFace为37MB,⼆者均为轻量模型,⾮常适合移动端应⽤。
OpenCV DNN Face的实现代码:
github/opencv/opencv/tree/master/modules/objdetect
C++和Python的例⼦face_detect和face_match:
github/opencv/opencv/tree/master/samples/dnn
固体增塑剂下⾯笔者分别介绍⼀下OpenCV DNN Face中的⼈脸检测和⼈脸识别。
OpenCV基于深度学习的⼈脸检测FaceDetectorYN
⼈脸检测是返回⼀张图像中⼈脸的位置(x1, y1)和⼤⼩(w, h),如下图所⽰(原图⽚来⾃于WIDER Face数据集)。
YuNet是⼴受好评的⼈脸检测库libfacedetection所使⽤的模型。它的⽹络结构设计参考了经典的SSD[1]以及MobileNet[2],其结构⽰意图可以在netron.app/?url=raw.githubusercontent.
com/ain/master/tasks/task1/查看。
YuNet是基于anchor的⼈脸检测器,分别在4种尺度的特征图上⽣成正⽅形anchor,可检测的最⼩⼈脸是10x10,最⼤⼈脸是256x256。参考MobileNet,我们使⽤了Depth-wise卷积代替部分卷积,从⽽减少模型参数和模型体积。我们使⽤⼈脸检测数据集WIDER Face[3]作为训练和测试数据集,使⽤EIoU损失函数[4]作为训练YuNet的损失函数,从⽽提⾼对⼈脸的定位能⼒。除了⼈脸的定位之外,我们还额外标注了⼈脸的5个关键点(左右眼,⿐尖,左右嘴⾓),为模型增加了关键点检测的多任务能⼒。
上图展⽰了FaceDetectorYN的使⽤流程。如果输⼊图像的尺⼨是⼀致的,例如视频输⼊流,那么实例化FaceDetectorYN时指定尺⼨(width, height),即可使⽤detect()⽅法检测⼈脸。如果输⼊图像的尺⼨不⼀致,例如⽹上搜集的图⽚,那么实例化FaceDetectorYN时可任意指定尺⼨,在使⽤detect()⽅法前需要调⽤setInputSize()⽅法先指定正确的输⼊图像尺⼨。
C++下⼈脸检测API(FaceDetectorYN类)的使⽤⽅式:
neor
1// 第⼀步:导⼊相关头⽂件
2#include <opencv2/imgproc.hpp> // cv::imread
3#include <opencv2/objdetect.hpp>  // cv::FaceDetectorYN & cv::FaceRecognizerSF
4using namespace cv;
5
6int main() 7{
8// 第⼆步:读取图像
9Mat img = imread('path/to/image');
10// 第三步:初始化FaceDetectorYN
11Ptr<FaceDetectorYN> faceDetector = FaceDetectorYN::create(modelPath, '', img.size());
12// 第四步:检测⼈脸并将结果保存到⼀个Mat中
13Mat faces;
14faceDetector->detect(image, faces);
15// faces是⼀个nx15的⼆维Mat,每⼀⾏分别是:
16// [x1, y1, w, h, x_re, y_re, x_le, y_le, x_nt, y_nt, x_rcm, y_rcm, x_lcm, y_lcm, score]
17// 其中,x1, y1是⼈脸框左上⾓坐标,w和h分别是⼈脸框的宽和⾼;{x, y}_{re, le, nt, rcm, lcm}分别是⼈脸右眼瞳孔、左眼瞳孔、⿐尖、右嘴⾓和左嘴⾓的坐标;score是该⼈脸的得分。
17// 其中,x1, y1是⼈脸框左上⾓坐标,w和h分别是⼈脸框的宽和⾼;{x, y}_{re, le, nt, rcm, lcm}分别是⼈脸右眼瞳孔、左眼瞳孔、⿐尖、右嘴⾓和左嘴⾓的坐标;score是该⼈脸的得分。18}
Python下⼈脸检测API的使⽤⽅式:
1import numpy as np # 请在import cv2前先import numpy以避免⼀些问题
2import cv2 as cv
3
4img = cv.imread('path/to/image')
5faceDetector = ate('/path/to/model', '', img.shape[:2])
6
7faces = faceDetector.detect(image)
8# 如果没有检测出⼈脸,则faces为NoneType⽽⾮⼀个空的numpy数组。这是由于OpenCV的Python bindings导致的。
9# 如果检测出⼈脸,则faces为⼀个len=2的Tuple,其中faces[1]为nx15的⼆维numpy数组(排列⽅式同上)。
OpenCV基于深度学习的⼈脸识别FaceRecognizerSF
碱性脱漆剂⼈脸识别是利⽤⼈的脸部特征信息进⾏⾝份鉴别的技术。⼴义的⼈脸识别包括⼈脸图像采集与检测、⼈脸图像预处理、⼈脸特征提取、特征⽐对与分类等⼀系列技术。
⼈脸预处理
将检测到的⼈脸输⼊⼈脸识别模型前,通常需要先进⾏⼈脸对齐。⼈脸对齐利⽤检测部分提取到的关键点,与给定关键点之间计算变换矩阵,使⽤仿射变换对⼈脸进⾏变换,以减轻⼈脸尺度、姿态等对⼈脸特征提取的性能的影响。
C++下⼈脸对齐部分API(FaceRecognizerSF类)的使⽤⽅式:
// 初始化FaceRecognizerSF
Ptr<FaceRecognizerSF> faceRecognizer = FaceRecognizerSF::create(recog_model_path, '');
// 在⼈脸检测部分的基础上, 对齐检测到的⾸个⼈脸(w(0)), 保存⾄aligned_face。
Mat aligned_face;
faceRecognizer->alignCrop(image, w(0), aligned_face);
Python下⼈脸对齐部分API的使⽤⽅式:
# 初始化FaceRecognizerSF
recognizer = ate(recog_model_path, '' )
# 在⼈脸检测部分的基础上, 对齐检测到的⾸个⼈脸(faces[1][0]), 保存⾄aligned_face。
aligned_face = recognizer.alignCrop(img, faces[1][0])
⼈脸特征提取
狭义的⼈脸识别模型仅作⽤于⼈脸特征提取过程。近年来,深度学习促进了⼈脸识别的发展,深度⼈脸识别模型也因其优越的性能得到了⼴泛应⽤[5]。深度⼈脸识别模型的训练离不开⼤规模训练集、⾼效的神经⽹络结构和训练损失函数。深度⼈脸识别模型在经过良好训练后,可以将预处理过的⼈脸图像转换为深度⼈脸特征⽤于后续的特征匹配。
OpenCV DNN Face所集成的深度⼈脸识别模型是由超球⾯损失函数监督、在百万名⼈数据集上训练的MobileNet轻量模型。将百万名⼈数据集[6],在使⽤基于元学习的⾃适应标签噪声清洗算法[7]进⾏数据清洗后,⽤于训练⼈脸识别模型,提⾼了⼈脸识别模型的性能。
模型结构使⽤了MobileNet[8],其利⽤深度可分离卷积减⼩了模型体积与计算量,是⼀种适⽤于移动设备的轻量级深度卷积神经⽹络。训练损失函数使⽤了SFace[9], SFace在超球⾯上施加由S型曲线控制的类内和类间约束以有裕度地减⼩类内距离⽽增⼤类间距离,从⽽训练出对训练噪声鲁棒的深度⼈脸模型,提⾼了⼈脸识别模型的性能。
⼈脸识别模型以尺⼨为3*112*112的⼈脸图像对齐作为输⼊,输出维度为128维的⼈脸特征。
C++下特征提取部分API(FaceRecognizerSF类)的使⽤⽅式:
/
/ 在上⽂的基础上, 获取对齐⼈脸的特征feature。cpich
Mat feature;
faceRecognizer->feature(aligned_face, feature);
Python下特征提取部分API的使⽤⽅式:
# 在上⽂的基础上, 获取对齐⼈脸的特征feature。
feature = recognizer.feature(aligned_face)
⼈脸特征⽐对
对于不同⼈脸图像的⼈脸特征,经过⼈脸特征⽐对求出特征之间的距离,以确定不同⼈脸图像是否属于同⼀⾝份。当使⽤consine距离时,值越⼤,则⼈脸越相似⾝份越接近;当使⽤normL2距离时,值越⼩,则⼈脸越相似⾝份越接近。
C++下特征⽐对部分API(FaceRecognizerSF类)的使⽤⽅式:
// 在上⽂的基础上, ⽐对两张⼈脸的特征feature1,feature2以确认⾝份。// 使⽤consine距离作为指标
double cos_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_COSINE);
if(cos_score >= cosine_similar_thresh) {
// the same identity
} else {
// different identities
}
// 使⽤normL2距离作为指标
double L2_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_NORM_L2);
if(L2_score <= l2norm_similar_thresh) {
// the same identity
// the same identity
} else {
// different identities
}
Python下特征⽐对部分API的使⽤⽅式:
# 在上⽂的基础上, ⽐对两张⼈脸的特征feature1,feature2以确认⾝份。# 使⽤consine距离作为指标
cosine_similarity_threshold = 0.363
cosine_score = recognizer.match(feature1, feature2, 0)
if cosine_score >= cosine_similarity_threshold:
# 'the same identity'
else:
# 'different identities'
# 使⽤normL2距离作为指标
l2_similarity_threshold = 1.128
l2_score = recognizer.match(feature1, feature2, 1)
if l2_score <= l2_similarity_threshold:
# 'the same identity'
else:
# 'different identities'
参考⽂献
[1] Liu, Wei, Dragomir, Anguelov, Dumitru, Erhan, Christian, Szegedy, Scott, Reed, Cheng-Yang, Fu, and Alexander C, Berg. 'Ssd: Single shot multibox detector.' . In ECCV, 2016.
[2] Howard, Andrew G, Menglong, Zhu, Bo, Chen, Dmitry, Kalenichenko, Weijun, Wang, Tobias, Weyand, Marco, Andreetto, and Hartwig, Adam.
'Mobilenets: Efficient convolutional neural networks for mobile vision applications'. In arXiv:1704.04861, 2017.
[3] Yang, Shuo, Ping, Luo, Chen Change, Loy, and Xiaoou, Tang. 'WIDER FACE: A Face Detection Benchmark.' . In CVPR, 2016.
[4] Peng, Hanyang, and Shiqi, Yu. 'A Systematic IoU-Related Method: Beyond Simplified Regression for Better Localization'. In TIP, 2021.
[5] Mei Wang and Weihong Deng. Deep face recognition: A survey. In Neurocomputing, 2021.
[6] Yandong Guo, Lei Zhang, Yuxiao Hu, Xiaodong He, and Jianfeng Gao. Ms-celeb-1m: A dataset and benchmark for large-scale face recognition. In ECCV, 2016.
[7] Yaobin Zhang, Weihong Deng, Yaoyao Zhong, Jiani Hu, Xian Li, Dongyue Zhao, and Dongchao Wen. Adaptive Label Noise Cleaning with Meta-Supervision for Deep Face Recognition. In ICCV, 2021.
[8] Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto and Hartwig Adam. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. In arXiv:1704.04861, 2017.
[9] Yaoyao Zhong, Weihong Deng, Jiani Hu, Dongyue Zhao, Xian Li, and Dongchao Wen. SFace: sigmoid-constrained hypersphere loss for robust face recognition. In TIP, 2021.
>锚固件

本文发布于:2024-09-25 14:19:51,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/144029.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   深度   识别   检测   训练   特征
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议