杰瑞科技汇

Python人脸识别怎么入门?

Python 人脸识别完整教程:从零开始构建你的第一个应用

目录

  1. 引言:人脸识别是什么?
  2. 技术选型:为什么选择 face_recognition 库?
  3. 环境准备:安装所需库
  4. 实战演练:分步实现人脸识别
    • 步骤 1:准备你的数据集(人脸照片)
    • 步骤 2:编写代码,将人脸编码
    • 步骤 3:实时摄像头人脸识别
  5. 代码解析:理解核心概念
  6. 常见问题与进阶方向

引言:人脸识别是什么?

人脸识别就是让计算机能够像人一样“认出”人脸,这个过程通常分为两步:

Python人脸识别怎么入门?-图1
(图片来源网络,侵删)
  1. 人脸检测:在一张图片或一段视频流中找到人脸的位置,我们通常会用一个矩形框把人脸框出来。
  2. 人脸识别/比对:将检测到的人脸与已知的人脸数据库进行比对,从而判断出“这是谁”。

本教程的核心目标是实现第二步,即人脸识别


技术选型:为什么选择 face_recognition 库?

在 Python 生态中,实现人脸识别有多种选择,例如使用 OpenCV 配合 Dlib 或深度学习模型,但对于初学者来说,这些方案通常过于复杂。

我们选择 face_recognition 库,原因如下:

  • 简单易用:它封装了业界领先的 dlib 库的复杂功能,提供了极其简洁的 Python API。
  • 高精度:其背后使用的是 ResNet 深度学习模型,在标准人脸识别数据集(如 LFW)上达到了极高的准确率。
  • 功能强大:不仅能做人脸识别,还内置了人脸检测、关键点定位(如眼睛、鼻子、嘴巴)等功能。

环境准备:安装所需库

在开始之前,请确保你的电脑已经安装了 Python (推荐 3.6+ 版本),我们需要安装 face_recognition 及其依赖库。

Python人脸识别怎么入门?-图2
(图片来源网络,侵删)

重要提示face_recognition 依赖于一些 C++ 库,安装过程可能会遇到一些问题,请严格按照以下步骤操作:

使用 pip 安装(推荐,但可能需要先安装编译工具)

  1. 安装 dlib:这是最关键的一步,如果你在 macOS 或 Linux 上,可以直接用 pip 安装,在 Windows 上,可能会失败。

    pip install dlib

    如果上述命令失败,你可以尝试从非官方的预编译包安装(例如在 这里 下载 dlib.whl 文件),或者参考官方文档进行编译安装。

    Python人脸识别怎么入门?-图3
    (图片来源网络,侵删)
  2. 安装 face_recognition 和其他库

    pip install face_recognition
    pip install cmake  # dlib 可能需要 cmake
    pip install opencv-python  # 用于处理摄像头和图像
    pip install numpy  # 用于数值计算

使用 Anaconda(更稳定)

conda install -c conda-forge dlib
pip install face_recognition
pip install opencv-python

安装验证: 打开你的 Python 解释器或 Jupyter Notebook,运行以下代码,如果没有报错,说明安装成功。

import face_recognition
import cv2
print("所有库导入成功!")

实战演练:分步实现人脸识别

我们将分两步走:

  1. 静态图片识别:学习如何加载已知人脸并进行编码。
  2. 实时摄像头识别:将静态识别应用到实时视频中。

步骤 1:准备你的数据集

在你的项目文件夹下,创建一个名为 known_faces 的文件夹,这个文件夹将用来存放你希望识别的人的照片。

my_face_recognition_project/
├── known_faces/
│   ├── elon_musk.jpg
│   ├── tim_cook.jpg
│   └── zhang_san.jpg
└── recognize_faces.py  # 我们稍后要创建的Python脚本

注意

  • 每个文件名(如 elon_musk.jpg)将作为这个人的“名字”。
  • 照片最好是清晰、正面、光线良好的单人照,包含完整人脸。

步骤 2:编写代码,将人脸编码

创建一个名为 encode_faces.py 的文件,用于将已知人脸照片转换成计算机可以理解的数字向量(称为“编码”或 encoding)。

# encode_faces.py
import face_recognition
import cv2
import numpy as np
import os
# 1. 加载已知人脸
known_face_encodings = []
known_face_names = []
known_faces_dir = "known_faces"
# 遍历 known_faces 目录下的所有图片
for filename in os.listdir(known_faces_dir):
    if filename.endswith((".jpg", ".jpeg", ".png")):
        # 图片路径
        image_path = os.path.join(known_faces_dir, filename)
        # 加载图片
        image = face_recognition.load_image_file(image_path)
        # 获取图片中的人脸编码
        # 假设每张照片只有一张人脸
        face_encoding = face_recognition.face_encodings(image)[0]
        # 将人脸编码和人名(文件名)添加到列表中
        known_face_encodings.append(face_encoding)
        known_face_names.append(os.path.splitext(filename)[0]) # 去掉文件后缀
print(f"已加载 {len(known_face_names)} 个已知人脸。")
print("已知人脸列表:", known_face_names)
# 2. 保存编码到文件 (可选,但推荐)
# 这样下次就不需要重新计算编码了
import pickle
data = {"encodings": known_face_encodings, "names": known_face_names}
with open("encodings.pickle", "wb") as f:
    pickle.dump(data, f)
print("人脸编码已保存到 encodings.pickle 文件。")

运行这个脚本后,你的项目文件夹下会多出一个 encodings.pickle 文件,它包含了所有已知人脸的“数字身份证”。

步骤 3:实时摄像头人脸识别

创建我们最主要的应用文件 recognize_faces.py,这个脚本会打开你的摄像头,实时识别画面中的人脸。

# recognize_faces.py
import face_recognition
import cv2
import numpy as np
import pickle
# 1. 加载已知人脸编码
print("正在加载已知人脸数据...")
with open("encodings.pickle", "rb") as f:
    data = pickle.load(f)
    known_face_encodings = data["encodings"]
    known_face_names = data["names"]
# 获取摄像头
video_capture = cv2.VideoCapture(0) # 0 代表默认摄像头
# 2. 初始化一些变量
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True
print("摄像头已启动,开始人脸识别... 按 'q' 键退出。")
while True:
    # 捕获视频帧
    ret, frame = video_capture.read()
    # 为了加快处理速度,我们只处理视频的每一帧
    if process_this_frame:
        # 将图像从 BGR (OpenCV 使用) 转换为 RGB (face_recognition 使用)
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
        rgb_small_frame = small_frame[:, :, ::-1]
        # 在缩小的图像中查找人脸位置和编码
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)
        face_names = []
        for face_encoding in face_encodings:
            # 将当前人脸与已知人脸进行比较
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.5)
            name = "Unknown" # 默认名字
            # 如果找到匹配项,使用第一个匹配的名字
            # if True in matches:
            #     first_match_index = matches.index(True)
            #     name = known_face_names[first_match_index]
            # 更高级的做法:计算最相似的人脸
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = np.argmin(face_distances)
            if matches[best_match_index]:
                name = known_face_names[best_match_index]
            face_names.append(name)
    process_this_frame = not process_this_frame # 切换处理帧,以提高性能
    # 3. 显示结果
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # 因为图像被缩小了,所以坐标需要放大回来
        top *= 4
        right *= 4
        bottom *= 4
        left *= 4
        # 在人脸周围画一个矩形框
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
        # 在人脸下方画一个带名字的标签
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
    # 显示结果图像
    cv2.imshow('Video', frame)
    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头资源
video_capture.release()
cv2.destroyAllWindows()

运行

  1. 确保你的电脑摄像头已连接并正常工作。
  2. 首先运行 encode_faces.py 来生成编码文件。
  3. 然后运行 recognize_faces.py
  4. 一个窗口会弹出,显示你的摄像头画面,当你把脸对准摄像头时,程序应该会识别出你,并显示你的名字。

代码解析:理解核心概念

  • face_recognition.load_image_file(path): 从指定路径加载一张图片,返回 NumPy 数组。
  • face_recognition.face_encodings(image): 输入一张图片,返回其中所有人脸的 128 维向量编码。[0] 表示取第一张人脸的编码。
  • face_recognition.face_locations(image): 输入一张图片,返回所有人脸的位置,格式为 [(top, right, bottom, left)]
  • face_recognition.compare_faces(known_encodings, face_to_check, tolerance=0.5): 核心识别函数。
    • known_encodings: 已知人脸编码列表。
    • face_to_check: 待比对的人脸编码。
    • tolerance: 匹配的阈值,范围 0.0 到 1.0,值越小,要求越严格,误识率越低但漏识率可能越高。5 是一个很好的默认值。
    • 返回一个布尔列表,表示 known_encodings 中的每个编码是否与待比对编码匹配。
  • cv2.VideoCapture(0): 打开默认摄像头。
  • cv2.imshow('Window Name', image): 在一个名为 "Window Name" 的窗口中显示图像。
  • cv2.waitKey(1): 等待 1 毫秒键盘输入,这对于视频循环至关重要,否则窗口会卡住。
  • cv2.rectangle()cv2.putText(): OpenCV 的绘图函数,用于在图像上画框和写文字。

常见问题与进阶方向

常见问题:

  1. 安装失败:最常见的问题是 dlib 安装失败,解决方案通常是:
    • Windows: 安装 Visual Studio C++ Build Tools,然后再用 pip 安装。
    • macOS: 使用 brew install cmakebrew install dlib
    • Linux: 使用 sudo apt-get update && sudo apt-get install build-essential cmake 等命令安装编译依赖。
  2. 识别不准确或识别不出
    • 照片质量问题:确保你的 known_faces 文件夹里的照片清晰、光线好、人脸正对。
    • 角度问题face_recognition 对侧脸和低头/抬头的人脸识别能力会下降。
    • tolerance:尝试调整 compare_faces 函数中的 tolerance 值。
  3. 多个人脸:当前代码已经可以处理一帧图像中的多个人脸。face_locationsface_encodings 会返回所有人的信息,然后通过 zip 循环处理每个人脸。

进阶方向:

  1. 人脸对齐: 在编码前,先将人脸旋转到正对方向,可以提高识别率。
  2. 人脸数据库: 使用 SQLite 或 MySQL 等数据库来存储人脸信息,而不仅仅是文件。
  3. 深度学习模型: 探索使用更先进的模型,如 ArcFace, FaceNet,它们在特定场景下精度更高。
  4. 活体检测: 防止用照片或视频进行欺骗,可以通过眨眼检测、头部运动等方式实现。
  5. Web 应用: 使用 Flask 或 Django 框架,将你的人脸识别系统部署成一个网站。

恭喜你!你已经成功使用 Python 和 face_recognition 库构建了一个基础但功能完整的人脸识别应用。

回顾一下我们做了什么

  1. 选择了 face_recognition 作为核心库,因为它简单且强大。
  2. 安装了所有必要的依赖。
  3. 准备了人脸数据集。
  4. 编写了脚本,将人脸照片转换为机器可读的编码。
  5. 编写了主程序,实现了从摄像头实时捕获画面、检测人脸、并与已知人脸进行比对和显示结果的全过程。

这是一个绝佳的起点,人脸识别是一个充满魅力的领域,希望这个教程能激发你进一步探索的兴趣!

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