OpenCV-Python 4.5.4 人脸识别应用

OpenCV-Python 4.5.4 人脸识别应用,第1张

OpenCV-Python 4.5.4 人脸识别应用

最近在做人脸识别黑盒攻击算法,首先要构建一个人脸识别算法,目前用的比较多的就是这几个了:FaceNet、CosFace、SphereFace、ArcFace,因为不是专门研究人脸识别,就想到有没有一种最简单的方式来做,精度和速度、简洁度都能达标的,自然没什么比opencv-python更合适的了。

1. 环境:
  1. Win10 + Pycharm
  2. opencv-python 4.5.4
  3. python 3.9
2. 安装

安装opencv-python 4.5.4即可,非常简单

pip install opencv-python==4.5.4.58
3. 原理和文件:

实现: 人脸检测 + 对齐 + 提取特征 + 匹配
OpenCV4.5.4发布中包含了一个新的人脸识别算法支持,算法来自北邮邓伟洪教授团队贡献,SFace模型大小为37MB,属于轻量级的人脸识别模型,输出特征维度是128维。

参考了贾志刚老师的公众号文章:OpenCV4.5.4人脸识别详解与代码演示
该代码是用C++写的,改写成python略有不同,具体请参考下面的代码。

需要下载的文件:
检测模型: yunet.onnx
识别模型:face_recognizer_fast.onnx
下载地址请参考:https://gitee.com/opencv_ai/opencv_tutorial_data/tree/master/models/face_detector

4. 代码
# -*- coding:utf-8 -*-
# 开发人员 : csu·攀-_-||
# 开发时间 : 2021/11/22 9:51
# 文件名称 : faceTest.py
# 开发工具 : PyCharm
# 功能描述 : OpenCV 4.5.4 人脸识别应用

import cv2
import time

# 定义输入和变量
img1 = cv2.imread('face_img/012.jpg')
img2 = cv2.imread('face_img/013.jpg')

new_shape = (300, 300)   # 统一缩放为 300*300
cos_thresh = 0.363       # cos阈值,距离越大越接近
L2_thresh = 1.128        # L2阈值,距离越小越接近
img1 = cv2.resize(img1, new_shape)
img2 = cv2.resize(img2, new_shape)

start = time.time()
# 初始化模型:
faceDetector = cv2.FaceDetectorYN.create('face_model/yunet.onnx', '', new_shape)
faceRecognizer = cv2.FaceRecognizerSF.create('face_model/face_recognizer_fast.onnx', '')

# 检测、对齐、提取特征:
# detect输出的是一个二维元祖,其中第二维是一个二维数组: n*15,n为人脸数,
# 15为人脸的xywh和5个关键点(右眼瞳孔、左眼、鼻尖、右嘴角、左嘴角)的xy坐标及置信度
faces1 = faceDetector.detect(img1)  
aligned_face1 = faceRecognizer.alignCrop(img1, faces1[1][0])    # 对齐后的图片
feature1 = faceRecognizer.feature(aligned_face1);               # 128维特征

faces2 = faceDetector.detect(img2)
aligned_face2 = faceRecognizer.alignCrop(img2, faces2[1][0])
feature2 = faceRecognizer.feature(aligned_face2);

cv2.imwrite('face_img/aligned1.jpg',aligned_face1)
cv2.imwrite('face_img/aligned2.jpg',aligned_face2)

# 人脸匹配值打分:
cos_score = faceRecognizer.match(feature1, feature2, 0)
L2_score = faceRecognizer.match(feature1, feature2, 1)

# 输出结果:
print('cos_score: ', cos_score)
print('L2_score: ', L2_score)

if cos_score > cos_thresh:
    print('the same face')
else:
    print('the diffrent face')

if L2_score < L2_thresh:
    print('the same face')
else:
    print('the diffrent face')

end = time.time()
print('all last time:{:.2f} ms'.format(1000*(end - start)))

5. 结果

找了两组比较有难度的人脸来做实验,第一组为汤姆克鲁斯不同时期、表情和角度的照片,第二组为和汤姆克鲁斯比较相似的一名男星。从结果来看,SF人脸识别模型能够比较好的识别出来同一个人脸和不同人脸,效果还是不错的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5593131.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存