使用 Python 的人脸识别系统

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

介绍

人脸识别不同于人脸检测。在人脸检测中,我们只检测了人脸的位置,在人脸识别任务中,我们识别了人的身份。

在本文中,我们将在人脸识别库的帮助下,使用python构建一个人脸识别系统。

市场上有许多用于人脸识别的算法。这一计算机视觉挑战是从视频和图片中检测人脸。许多应用程序可以构建在识别系统之上。许多大公司出于安全和身份验证的目的而采用识别系统。

识别系统用例

人脸识别系统在现代得到广泛应用,许多新的创新系统都建立在识别系统之上。

有几个用例:

  • 寻找失踪者

  • 识别社交媒体上的帐户

  • 识别汽车中的驾驶员

  • 考勤系统

多种实现面部识别的算法取决于其性能和准确性。

传统人脸识别算法

传统的人脸识别算法不符合现代人脸识别标准。它们旨在使用旧的传统算法识别面部。

OpenCV 提供了一些传统的面部识别算法。

  • Eigenfaces:http://www.scholarpedia.org/article/Eigenfaces

  • 尺度不变特征变换 (Scale Invariant Feature Transform,SIFT):https://en.wikipedia.org/wiki/Scale-invariant_feature_transform

  • Fisher faces:http://www.scholarpedia.org/article/Fisherfaces

  • 局部二进制模式直方图 (Local Binary Patterns Histograms,LBPH):https://en.wikipedia.org/wiki/Local_binary_patterns

这些方法在提取图像信息和匹配输入和输出图像的方式上有所不同。

LBPH 算法是一种简单但非常有效的方法,仍在使用中,但与现代算法相比速度较慢。

使用 Python 的人脸识别系统_第1张图片

人脸识别深度学习

有多种基于深度学习的面部识别算法可供使用。

  • DeepFace

  • DeepID series of systems

  • FaceNet

  • VGGFace

一般来说,基于地标的人脸识别器对人脸图像进行拍摄,并试图找到眉毛、嘴角、眼睛、鼻子、嘴唇等基本特征点。有60多个地标。

使用 Python 的人脸识别系统_第2张图片

人脸识别涉及的步骤

  1. 人脸检测:定位人脸,记下每个人脸定位的坐标,并在每个人脸周围绘制一个边界框。

  2. 面部对齐。标准化人脸以获得快速训练。

  3. 特征提取。从面部图片中提取局部特征进行训练,这一步由不同的算法执行不同的操作。

  4. 人脸识别。将输入人脸与我们数据集中的一个或多个已知人脸进行匹配。

使用 Python 的人脸识别系统_第3张图片

本文重点介绍使用库 face_recognition 实现人脸识别,该库基于深度学习技术,并承诺使用单个训练图像的准确率超过 96%。

执行

使用python实现人脸识别系统。使用 face_recognition 库实现基于深度学习的人脸识别系统。

1. 设置人脸识别库:

为了安装人脸识别库,我们需要先安装dlib

  • dlib:它是一个现代 C++ 工具包,包含与机器学习相关的算法和工具。

# installing dlib 
pip install dlib
  • 安装实际的人脸识别库face recognition

# installing face recognition
pip install face recognition
  • Opencv用于一些图像预处理

# installing opencv 
pip install opencv

Note: Sometimes installing dlib throws error in that case install install the C++ development toolkit using vs_code community .

导入库

import cv2
import numpy as np
import face_recognition

2. 加载图片:

我们完成了库的安装和导入。是时候将一些示例图像加载到face_recognition库中了。

face_recognition库仅支持 BGR 格式的图像。在打印输出图像时,我们应该使用 OpenCV 将其转换为 RGB。

Face_recognition仅加载 BGR 格式的图像。

import cv2
import numpy as np
import face_recognition
img_bgr = face_recognition.load_image_file('student_images/modi.jpg')
img_rgb = cv2.cvtColor(img_bgr,cv2.COLOR_BGR2RGB)
cv2.imshow('bgr', img_bgr)
cv2.imshow('rgb', img_rgb)
cv2.waitKey

输出→ BGR 与 RGB

使用 Python 的人脸识别系统_第4张图片

3.检测和定位人脸:

face_recognition库可以自行快速定位人脸,我们不需要使用haar_cascade或其他技术。

img_modi=face_recognition.load_image_file('student_images/modi.jpg')
img_modi_rgb = cv2.cvtColor(img_modi,cv2.COLOR_BGR2RGB)
#--------- Detecting Face -------
face = face_recognition.face_locations(img_modi_rgb)[0]
copy = img_modi_rgb.copy()
# ------ Drawing bounding boxes around Faces------------------------
cv2.rectangle(copy, (face[3], face[0]),(face[1], face[2]), (255,0,255), 2)
cv2.imshow('copy', copy)
cv2.imshow('MODI',img_modi_rgb)
cv2.waitKey(0)
使用 Python 的人脸识别系统_第5张图片

4. 样本图像识别:

face_recognition库基于深度学习,它支持单次学习,这意味着它需要一张图片来训练自己检测一个人。

img_modi = face_recognition.load_image_file('student_images/modi.jpg')
img_modi = cv2.cvtColor(img_modi,cv2.COLOR_BGR2RGB)
#------to find the face location
face = face_recognition.face_locations(img_modi)[0]
#--Converting image into encodings
train_encode = face_recognition.face_encodings(img_modi)[0]
#----- lets test an image
test = face_recognition.load_image_file('student_images/modi2.jpg')
test = cv2.cvtColor(test, cv2.COLOR_BGR2RGB)
test_encode = face_recognition.face_encodings(test)[0]
print(face_recognition.compare_faces([train_encode],test_encode))
cv2.rectangle(img_modi, (face[3], face[0]),(face[1], face[2]), (255,0,255), 1)
cv2.imshow('img_modi', img_modi)
cv2.waitKey(0)

上面的代码拍了两张总理的照片,因为两张照片都是同一个人,所以它返回了true。

  • face_recognition.face_encodings(imgelon)[0]→返回传递图像的编码。

  • face_recognition.compare_faces([train_encode],test_encode) 获取经过训练的编码列表和未知图像的测试编码。如果两个测试编码在训练编码中匹配,则返回True ;否则,它会返回False.

了解人脸识别的工作原理

  1. 我们将人的照片和他们的名字传递给模型。

  2. 该模型拍摄每张照片,将它们转换为某种数字编码,并将它们存储在一个列表中,并将所有标签(人名)存储在另一个列表中。

  3. 在预测阶段,当我们传递未知人的图片时,识别模型会将该人的图像转换为编码。

  4. 在将未知人的图像转换为编码后,它会尝试根据距离参数找到最相似的编码。与未知人的编码距离最小的编码将是最接近的匹配。

  5. 在获得最接近的匹配编码后,我们从该列表中获取该编码的索引并使用索引。我们找到检测到的人的名字。

识别系统的挑战

这些都是识别系统面临的重大挑战,需要解决。

  • 姿势:识别系统容易受到人体姿势的影响。面部识别系统将无法预测该人的面部是否不可见。

  • 照明:照明会极大地改变面部轮廓。用于人脸识别的照片应在适当的照明条件下拍摄。

  • 面部表情:不同的面部表情会导致对同一个人的图像的不同预测。

  • 低分辨率:低分辨率图片包含的信息较少,因此不适合人脸识别训练。

结论

本文讨论了如何使用 python 和单次图像训练技术实现人脸识别系统。你可以进一步使用像 python Tkinter 这样的 GUI 来设计基于 GUI 的考勤系统。我们看到了影响识别系统的各种挑战以及如何解决这些挑战。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

你可能感兴趣的:(python,人工智能,计算机视觉,opencv,深度学习)