最近在做人脸识别黑盒攻击算法,首先要构建一个人脸识别算法,目前用的比较多的就是这几个了: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://download.csdn.net/download/qq_36563273/56347506

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人脸识别模型能够比较好的识别出来同一个人脸和不同人脸,效果还是不错的。

6. 结语

本文参考了贾志刚老师的介绍文章,将C++代码改写成了python,基于opencv-python 4.5.4搭建一个最简单但效果还不错的人脸识别系统,后续可以通过加入界面和人脸注册功能扩展成一个完整的程序。

由于水平有限,写得不到位的地方敬请批评指正,觉得有所帮助的不妨点个赞~~拥抱开源,共同成长

OpenCV-Python 4.5.4 人脸识别应用相关推荐

  1. 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较

    OpenCV图像处理入门学习教程系列,上一篇第五篇:基于背景差分法的视频目标运动侦测 一.网络爬虫简介(Python3) 网络爬虫,大家应该不陌生了.接下来援引一些Jack-Cui在专栏<Pyt ...

  2. 用Python实现简单的人脸识别,10分钟(附源码)

    前言 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的.这里介绍的是准确 ...

  3. 10分钟手把手教你运用Python实现简单的人脸识别

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 前言:让我的电脑认识我 我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现高大上的人脸识别技术! Python里,简单的 ...

  4. python人脸识别毕业设计-Python基于Dlib的人脸识别系统的实现

    之前已经介绍过人脸识别的基础概念,以及基于opencv的实现方式,今天,我们使用dlib来提取128维的人脸嵌入,并使用k临近值方法来实现人脸识别. 人脸识别系统的实现流程与之前是一样的,只是这里我们 ...

  5. 基于Python的百度AI人脸识别API接口(可用于OpenCV-Python人脸识别)

    基于Python的百度AI人脸识别API接口(可用于OpenCV-Python人脸识别) 资源: download.csdn.net/download/weixin_53403301/43644312 ...

  6. gpu训练cnn人脸识别准确率_opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别

    opencv+mtcnn+facenet+python+tensorflow 实现实时人脸识别 Abstract:本文记录了在学习深度学习过程中,使用opencv+mtcnn+facenet+pyth ...

  7. python人脸深度识别_基于Python的深度学习人脸识别方法

    基于 Python 的深度学习人脸识别方法 薛同来 ; 赵冬晖 ; 张华方 ; 郭玉 ; 刘旭春 [期刊名称] <工业控制计算机> [年 ( 卷 ), 期] 2019(032)002 [摘 ...

  8. 【毕业设计_课程设计】基于opencv、dilb的员工人脸识别考勤系统

    文章目录 0 项目说明 1 需求分析 2 总体设计 3 详细设计 4 效果展示 5 实验心得 6 项目源码 7 最后 0 项目说明 基于opencv.dilb的员工人脸识别考勤系统 提示:适合用于课程 ...

  9. 基于opencv tensorflow2.0开发的人脸识别锁定与解锁win10屏幕实战

    基于opencv tensorflow2.0开发的人脸识别锁定与解锁win10屏幕实战 基于opencv tensorflow2.0开发的人脸识别锁定与解锁win10屏幕 前言 运行python环境 ...

  10. OpenCV中视频操作及人脸识别案例

    目录 OpenCV中视频操作及人脸识别案例 视频操作 视频读写 从文件中读取视频并播放 保存视频 小结 视频追踪 meanshift Camshift 算法总结 小结 案例:人脸案例 人脸识别基础 实 ...

最新文章

  1. 项目总结--基于Cortex-A9平台的米兰花智能培育系统
  2. eclipse关联本地maven仓库和配置
  3. 一个SAP顾问2018年的回顾
  4. Linux 如何查看命令所在位置/查看命令文件所在位置
  5. DenyHosts 加固centos系统安全
  6. Centos安装php提示virtual memory exhausted: Cannot allocate memory
  7. redis java 发布订阅_Redis之发布订阅(Java)
  8. 线性系统和非线性系统
  9. 基于web的库存管理系统
  10. mysql 两表关联查询 group by having
  11. oracle数据透明加密,oracle数据透明加密-TDE
  12. CutefishOS 0.6 Beta 发布
  13. 杨氏集团出品:打怪小游戏
  14. linux生成表格的后缀,使用XSSFWork创建的xlsx后缀Excel文件无法打开
  15. 经验,初创公司如何做到完美地招人、挖人
  16. case/casez/casex 区别与综合
  17. ubuntu换阿里源
  18. 二叉树(树,森林,二叉树互转)
  19. 是否允许应用获取设备信息_手机权限获取弹窗不断,隐私安全如何确保,这些权限需谨慎...
  20. 根据当前请求的特征,判断该请求是否来自手机终端

热门文章

  1. 常用知识总结(二) 之 电容谐振频率点和阻抗
  2. 第七张纯新能源牌照诞生,江西江铃正式进军乘用车市场
  3. 考研北京理工计算机科学与技术,北京理工大学2021考研大纲:计算机科学与技术专业基础综合...
  4. ubuntu配置阿里源 vim全选复制粘贴
  5. 周报告工作总结计算机,计算机实训工作总结报告
  6. Canal组件简介与vivo账号实践
  7. 杜绝生产过程"黑箱",MES助力制造业实现精益化生产
  8. iOS实现平铺的几种简单方式
  9. html字符串解析显示,解析HTML格式的字符串问题,帮忙
  10. 【Python茴香豆系列】之 如何逆序一个列表