人脸识别听起来可能很复杂,但其实并不难。今天我们会带你一步步用Python和OpenCV实现一个基础的2D人脸识别程序。只要按照步骤操作,你很快就能搞定。当然,如果你对更高级的技术感兴趣,我们还可以探索3D、4D人脸识别,甚至使用深度学习模型处理动态识别。不过,打好基础最重要,从这里开始,你就已经踏出了迈向AI世界的重要一步。
在开始之前,我们需要准备好一些工具:
安装指南:在终端运行以下命令,安装所需库:
pip install opencv-python
pip install dlib
在正式进行识别之前,我们需要先注册一些已知的人脸信息。这样,当程序遇到这些脸时,就能准确识别出来。
首先,导入OpenCV、dlib和NumPy库:
import cv2 # 导入OpenCV库
import dlib # 导入dlib库
import numpy as np # 导入NumPy,用于数值计算
接下来,加载dlib的各类模型,包括人脸检测器、特征点检测器和识别模型。
# 加载dlib的人脸检测器
detector = dlib.get_frontal_face_detector()
# 加载dlib的人脸特征点检测器
predictor = dlib.shape_predictor('../Model/shape_predictor_68_face_landmarks.dat')
# 加载dlib的人脸识别模型
face_rec_model = dlib.face_recognition_model_v1('../Model/dlib_face_recognition_resnet_model_v1.dat')
定义一个函数来注册已知的人脸。这个函数会读取图片、检测人脸、提取特征点,并计算出128维的特征向量。
# 初始化已知人脸的特征向量和名字列表
known_face_encodings = []
known_face_names = []
# 定义一个注册人脸的函数
def register_face(image_path, name):
image = cv2.imread(image_path) # 读取图片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将图片转为灰度图
faces = detector(gray) # 检测人脸
for face in faces:
shape = predictor(gray, face) # 提取人脸特征点
face_encoding = np.array(face_rec_model.compute_face_descriptor(image, shape)) # 计算128D人脸特征向量
known_face_encodings.append(face_encoding) # 保存特征向量
known_face_names.append(name) # 保存名字
接下来,调用这个函数来注册一些已知人脸。
# 注册已知人脸
register_face('../Images/known_face_1.jpg', 'Person 1')
register_face('../Images/known_face_2.jpg', 'Person 2')
有了已知人脸信息后,我们可以用摄像头进行实时人脸识别。这个过程将实时检测并识别图像中的人脸。
首先,打开摄像头捕捉视频流:
# 打开摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
进入实时检测模式,对每一帧视频进行人脸检测和识别。
while True:
# 读取摄像头的每一帧
ret, frame = cap.read()
if not ret:
print("无法读取帧")
break
# 将图像转换为灰度
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = detector(gray)
for face in faces:
shape = predictor(gray, face) # 提取人脸特征点
face_encoding = np.array(face_rec_model.compute_face_descriptor(frame, shape)) # 计算人脸特征向量
# 进行人脸匹配:看看是谁来了
matches = [np.linalg.norm(face_encoding - known_face) for known_face in known_face_encodings]
name = "Unknown"
if min(matches) < 0.6: # 如果匹配度小于0.6,则识别为已知人脸
index = np.argmin(matches)
name = known_face_names[index]
# 获取人脸位置
x, y, w, h = face.left(), face.top(), face.width(), face.height()
# 绘制矩形框和名字
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(frame, name, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 显示帧
cv2.imshow('Camera', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
完成识别任务后,释放摄像头资源并关闭所有窗口。
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
通过这次教程,你已经掌握了如何使用OpenCV和dlib进行基础的人脸识别。你现在可以注册已知人脸、加载图片、检测人脸、提取特征点,并通过摄像头实时识别人脸。接下来,试着把这些技能应用到更复杂的项目中,比如自动化门禁系统或人脸表情识别。继续学习,你会发现AI的世界比你想象中更有趣也更接近你。