晟辉智能制造

简单实现人脸识别技术

这里的“简单”指的是使用现有的、成熟的第三方库,而不是从零开始编写复杂的机器学习算法,对于初学者和大多数应用场景来说,这是最实际、最高效的方法。

简单实现人脸识别技术-图1
(图片来源网络,侵删)

我们将使用 Python 语言和两个非常流行的库:

  1. OpenCV (opencv-python):用于图像和视频处理,比如打开摄像头、检测人脸。
  2. face_recognition:这是一个基于 dlib 的强大库,它封装了复杂的深度学习模型,能非常简单地实现人脸检测和人脸识别(特征编码和比对)。

第一步:安装必要的库

你需要安装这些库,打开你的终端或命令行工具,运行以下命令:

# 安装 OpenCV
pip install opencv-python
# 安装 face_recognition 库
pip install face_recognition
# (可选) face_recognition 的底层依赖 dlib,如果安装 face_recognition 时失败,可能需要单独安装
# Windows: 可能需要下载预编译的 wheel 文件
# macOS: brew install dlib
# Linux: sudo apt-get install build-essential cmake libboost-python-dev python3-dev
pip install dlib

第二步:准备数据

人脸识别系统需要一个“已知人员”的数据库,这个数据库通常包含:

  1. 一张或多张每个人的清晰正面照片。
  2. 照片中人脸的“特征编码”(Embedding),这是一个数学向量,可以代表人脸的独特特征。

我们先来创建一个简单的数据库,在你的项目文件夹下,创建一个名为 known_faces 的文件夹,并在里面放入几张不同人的照片,

简单实现人脸识别技术-图2
(图片来源网络,侵删)
  • known_faces/elon_musk.jpg
  • known_faces/tim_cook.jpg
  • known_faces/sundar_pichai.jpg

重要提示:确保照片中的人脸清晰、正面,光照良好,并且只包含一张人脸,这样效果最好。


第三步:编写代码

我们将分两步来写代码:

  1. 初始化阶段:加载已知照片,计算并存储人脸特征编码。
  2. 实时识别阶段:打开摄像头,实时捕获画面,检测人脸,并与已知数据库进行比对。

创建一个 Python 文件,face_recognition_app.py,并粘贴以下代码:

import cv2
import face_recognition
import numpy as np
# --- 1. 初始化阶段:加载已知人脸 ---
# 创建一个字典来存储已知人脸的编码和名字
known_face_encodings = []
known_face_names = []
# 指定已知人脸图片的文件夹路径
known_faces_path = "known_faces/"
# 遍历文件夹中的所有图片
for filename in os.listdir(known_faces_path):
    if filename.endswith((".jpg", ".jpeg", ".png")):
        # 加载图片
        image_path = os.path.join(known_faces_path, filename)
        image = face_recognition.load_image_file(image_path)
        try:
            # 获取图片中第一个人脸的编码(假设每张图只有一张人脸)
            face_encoding = face_recognition.face_encodings(image)[0]
            # 使用文件名(不带扩展名)作为人名
            name = os.path.splitext(filename)[0]
            known_face_encodings.append(face_encoding)
            known_face_names.append(name)
            print(f"已加载人脸: {name}")
        except IndexError:
            print(f"警告: {filename} 中未检测到人脸,已跳过。")
# --- 2. 实时识别阶段:打开摄像头进行实时检测 ---
# 打开默认摄像头 (0)
# 如果你的摄像头是别的编号,可以尝试 1, 2, ...
video_capture = cv2.VideoCapture(0)
while True:
    # 读取摄像头的一帧画面
    ret, frame = video_capture.read()
    if not ret:
        print("无法获取摄像头画面,退出。")
        break
    # 将 BGR 格式的 OpenCV 图像转换为 RGB 格式,因为 face_recognition 使用 RGB
    rgb_frame = frame[:, :, ::-1]
    # 在当前帧中查找所有人脸的位置
    # 返回人脸的边界框列表
    face_locations = face_recognition.face_locations(rgb_frame)
    # 获取当前帧中所有人脸的编码
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
    # 遍历当前帧中的每一张人脸
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # 将当前人脸与已知人脸进行比对
        # 返回一个布尔值的列表,表示是否匹配
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.5)
        name = "Unknown" # 默认名字为 "Unknown"
        # 如果找到匹配项
        if True in matches:
            # 找到所有匹配的索引
            matched_indices = [i for i, match in enumerate(matches) if match]
            # 获取第一个匹配的名字(如果有多张照片是同一个人,取第一个)
            name = known_face_names[matched_indices[0]]
        # --- 在画面上绘制结果 ---
        # 画一个矩形框住人脸
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
        # 在人脸下方显示名字
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 255, 0), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (0, 0, 0), 1)
    # 显示结果画面
    cv2.imshow('Face Recognition', frame)
    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头资源并关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()

注意:代码开头需要导入 os 模块,请确保在文件顶部添加 import os

简单实现人脸识别技术-图3
(图片来源网络,侵删)

第四步:运行和测试

  1. 确保你的电脑已连接摄像头。
  2. 将准备好的照片放入 known_faces 文件夹。
  3. 运行你的 Python 脚本:
    python face_recognition_app.py
  4. 一个窗口会弹出,显示你的摄像头画面,当你把脸对准摄像头时,程序会检测到你的脸,并在下方标注出它认识的人的名字("elon_musk"),如果它不认识,就会显示 "Unknown"。

q 键可以退出程序。


代码详解与扩展

  1. face_recognition.face_encodings(image)

    • 这是核心步骤,它使用一个深度学习模型(ResNet-based)将人脸图像转换成一个 128 维的向量(编码)。
    • 这个向量可以看作是这张脸的“数学指纹”,相似的人脸,其向量在空间中的距离也相近。
  2. face_recognition.compare_faces(known_encodings, face_encoding, tolerance)

    • 这个函数会比较当前人脸编码和所有已知编码。
    • 它通过计算欧氏距离来判断是否为同一个人。tolerance 参数是阈值,值越小越严格,容错率越低,0.5 是一个不错的起点。
  3. cv2.rectangle()cv2.putText()

    这是 OpenCV 的基本绘图功能,用于在视频帧上画出矩形框和文字,让结果可视化。

如何扩展这个简单实现?

  • 处理多张照片:在上面的代码中,我们假设每张已知照片只有一张人脸,如果你想为同一个人提供多张照片以提高识别率,可以在初始化阶段收集所有照片的编码,并在 compare_faces 时,如果当前人脸与这个人的任意一张照片匹配,就认为是他。
  • 保存和加载编码:每次启动程序都重新计算已知人脸的编码会很慢,你可以将计算出的编码和名字保存到一个文件(如 jsonpickle)中,下次启动时直接加载,跳过计算步骤。
  • 处理不同光照和角度:为了提高鲁棒性,可以在初始化时对图片进行一些预处理,如调整大小、转换为灰度图(虽然 face_recognition 内部处理了,但可以尝试其他方法),或者使用更多的人脸角度照片。
  • 人脸对齐:更高级的系统会先进行人脸对齐,确保检测到的人脸是标准化的,这能显著提升识别准确率。

这个“简单实现”已经涵盖了人脸识别的核心逻辑,通过它,你可以快速搭建一个基础的人脸识别应用,并在此基础上进行更复杂的功能开发。

分享:
扫描分享到社交APP
上一篇
下一篇