人脸识别技术已经广泛应用于各种场景,如安全监控、智能家居、社交网络、金融支付等。Python 是开发人脸识别系统的流行语言之一,得益于丰富的机器学习库和工具。在这篇教程中,我们将使用 Python 3.12face_recognition 库来实现一个简单的人脸识别系统。

1. 安装依赖

首先,确保你已经安装了 Python 3.12 及其相关依赖。然后我们需要安装 face_recognition 和其他必需的库。

1.1 安装依赖

pip install face_recognition opencv-python numpy
  • face_recognition:用于人脸识别的主要库。
  • opencv-python:用于加载、显示和处理图片。
  • numpy:用于处理矩阵运算和图像数组。

安装完这些依赖后,我们可以开始编写代码。

2. 人脸识别基础概念

face_recognition 库封装了许多人脸识别的复杂操作,使得我们可以非常方便地识别人脸、提取面部特征和进行人脸比对。下面是一些关键概念:

  • 人脸检测:从图像中识别出所有的人脸。
  • 人脸编码:将人脸图像转换为一个数值向量(特征编码),这个向量可以用于比较人脸的相似度。
  • 人脸匹配:比较两个人脸编码是否相似,从而判断两张脸是否属于同一个人。

3. 基本使用:检测人脸并标记

3.1 加载和显示图像

首先,我们来实现一个简单的功能:加载图像并标记其中的人脸。

import cv2
import face_recognition

# 读取图像
image = cv2.imread('path_to_image.jpg')

# 转换为RGB格式(OpenCV默认读取BGR格式)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 查找所有的人脸位置
face_locations = face_recognition.face_locations(rgb_image)

# 在图像中标记人脸位置
for (top, right, bottom, left) in face_locations:
    # 绘制矩形框标记人脸
    cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 3)

# 显示图像
cv2.imshow('Face Recognition', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 代码解析

  • cv2.imread():读取图像文件。
  • face_recognition.face_locations():检测图像中的人脸,并返回一个包含人脸位置的列表。每个位置是一个元组 (top, right, bottom, left),表示矩形框的四个角坐标。
  • cv2.rectangle():在图像中绘制矩形框,标记出人脸区域。
  • cv2.imshow():显示图像窗口。

运行这段代码后,你会看到一个带有矩形框标记人脸的图像。

4. 人脸编码:提取人脸特征

接下来,我们将提取图像中人脸的特征编码。特征编码是一个128维的向量,可以唯一标识一个人脸。通过比较人脸编码,我们可以进行人脸匹配。

import face_recognition
import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')

# 转换为RGB格式
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 查找人脸编码
face_encodings = face_recognition.face_encodings(rgb_image)

if len(face_encodings) > 0:
    # 取第一个人脸的编码
    face_encoding = face_encodings[0]
    print(f"Face encoding: {face_encoding}")
else:
    print("No face found in the image")

4.1 代码解析

  • face_recognition.face_encodings():提取图像中所有人脸的特征编码。返回的是一个包含每个人脸编码的列表。如果没有检测到人脸,则返回空列表。
  • 每个人脸编码是一个128维的向量,能够唯一表示人脸的特征。

运行代码后,你将会看到输出的人脸编码向量。

5. 人脸匹配:比对两张人脸是否相同

我们可以使用人脸编码来比较两张图像中的人脸是否相似。通过计算两个编码之间的欧几里得距离,若距离小于某个阈值,则认为两张人脸属于同一个人。

import face_recognition

# 加载两张图片
image1 = face_recognition.load_image_file('image1.jpg')
image2 = face_recognition.load_image_file('image2.jpg')

# 获取两张图片的人脸编码
encoding1 = face_recognition.face_encodings(image1)[0]
encoding2 = face_recognition.face_encodings(image2)[0]

# 比较两张人脸编码
results = face_recognition.compare_faces([encoding1], encoding2)

if results[0]:
    print("The two faces are the same person!")
else:
    print("The two faces are different people.")

5.1 代码解析

  • face_recognition.load_image_file():加载图片文件并将其转换为可以处理的人脸数据格式。
  • face_recognition.compare_faces():比较两个人脸的特征编码,返回一个布尔值,表示两张人脸是否相同。

通过运行此代码,你可以轻松地比较两张人脸是否属于同一个人。

6. 高级功能:识别多张人脸并标记名字

我们可以扩展功能,让程序同时识别多张人脸,并标记每个人的名字。我们将利用预先录入的人脸图像来为检测到的人脸进行匹配。

import face_recognition
import cv2

# 加载已知人物图像和编码
known_image = face_recognition.load_image_file('known_person.jpg')
known_encoding = face_recognition.face_encodings(known_image)[0]

# 加载待识别图像
unknown_image = cv2.imread('unknown.jpg')

# 转换为RGB格式
rgb_image = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB)

# 查找图像中的人脸
face_locations = face_recognition.face_locations(rgb_image)
face_encodings = face_recognition.face_encodings(rgb_image, face_locations)

# 将已知人脸编码添加到一个列表中
known_encodings = [known_encoding]

# 对每个识别出的人脸进行比对
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
    matches = face_recognition.compare_faces(known_encodings, face_encoding)
    
    name = "Unknown Person"
    
    if True in matches:
        first_match_index = matches.index(True)
        name = "Known Person"
    
    # 绘制矩形框并标记姓名
    cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2)
    font = cv2.FONT_HERSHEY_DUPLEX
    cv2.putText(unknown_image, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)

# 显示图像
cv2.imshow('Face Recognition', unknown_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.1 代码解析

  • 我们首先加载一个已知的图像,并提取其中的编码。
  • 然后我们加载一个待识别的图像,对图像中的每一张人脸进行编码。
  • 使用 compare_faces() 来检查每张待识别的人脸与已知人脸编码是否匹配。
  • 最后,在图像中绘制矩形框,并标注人名。

7. 总结

本文介绍了如何使用 Python 和 face_recognition 库进行人脸识别。我们从最基础的人脸检测、编码提取到人脸匹配,再到如何识别和标记多张人脸。你可以利用这些功能来构建强大的智能人脸识别应用。

关键点回顾:

  • 使用 face_recognition 提供的简单接口进行人脸检测和识别。
  • 提取人脸编码,并使用这些编码进行人脸匹配。
  • 结合 OpenCV 来展示结果和进行图像处理。

这些功能可以广泛应用于安全监控、自动化考勤、身份验证等领域。希望你能够基于本文的示例,进一步探索更多的人脸识别应用场景!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐