南京企业网站搭建,上海市2022进博会,网站关键词方案,公司网站推广如何做引言
人脸识别技术在现代社会中应用广泛#xff0c;从安全监控到智能门锁#xff0c;再到社交媒体中的照片标记功能#xff0c;都离不开这项技术。本文将详细介绍如何使用Python实现基本的人脸识别算法#xff0c;并将其封装为一个类库#xff0c;以便在多个项目中复用。…引言
人脸识别技术在现代社会中应用广泛从安全监控到智能门锁再到社交媒体中的照片标记功能都离不开这项技术。本文将详细介绍如何使用Python实现基本的人脸识别算法并将其封装为一个类库以便在多个项目中复用。
环境准备
安装依赖
首先确保你的环境中安装了以下库
OpenCVdlibface_recognition
你可以使用以下命令安装这些库
pip install opencv-python
pip install dlib
pip install face_recognition代码实现
1. 创建类库文件
我们将创建一个名为 face_recognition_lib.py 的文件内容如下
import cv2
import face_recognition
import numpy as np
from PIL import Image, ImageDrawclass FaceRecognition:def __init__(self, image_paths):初始化FaceRecognition类。:param image_paths: 已知人脸图像的路径列表self.known_face_encodings, self.known_face_names self.load_and_encode_faces(image_paths)def load_and_encode_faces(self, image_paths):加载并编码已知人脸图像。:param image_paths: 已知人脸图像的路径列表:return: 已知人脸的编码和名称known_face_encodings []known_face_names []for image_path in image_paths:# 加载图片image face_recognition.load_image_file(image_path)# 编码人脸face_encoding face_recognition.face_encodings(image)[0]# 获取文件名作为名字name image_path.split(/)[-1].split(.)[0]# 添加到已知人脸列表known_face_encodings.append(face_encoding)known_face_names.append(name)return known_face_encodings, known_face_namesdef real_time_face_recognition(self):实现实时人脸识别。# 打开摄像头video_capture cv2.VideoCapture(0)while True:# 读取一帧ret, frame video_capture.read()# 将帧转换为RGBrgb_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(self.known_face_encodings, face_encoding)name Unknown# 计算欧氏距离face_distances face_recognition.face_distance(self.known_face_encodings, face_encoding)best_match_index np.argmin(face_distances)if matches[best_match_index]:name self.known_face_names[best_match_index]# 在帧上绘制矩形和标签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_DUPLEXcv2.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()# 示例用法
if __name__ __main__:# 已知人脸图像路径image_paths [path/to/known_face_1.jpg,path/to/known_face_2.jpg,# 添加更多已知人脸图像路径]# 初始化FaceRecognition类face_recognition FaceRecognition(image_paths)# 启动实时人脸识别face_recognition.real_time_face_recognition()2. 详细解释
初始化
class FaceRecognition:def __init__(self, image_paths):初始化FaceRecognition类。:param image_paths: 已知人脸图像的路径列表self.known_face_encodings, self.known_face_names self.load_and_encode_faces(image_paths)在类的初始化方法中我们传入已知人脸图像的路径列表并调用 load_and_encode_faces 方法来加载和编码这些图像。
加载和编码已知人脸
def load_and_encode_faces(self, image_paths):加载并编码已知人脸图像。:param image_paths: 已知人脸图像的路径列表:return: 已知人脸的编码和名称known_face_encodings []known_face_names []for image_path in image_paths:# 加载图片image face_recognition.load_image_file(image_path)# 编码人脸face_encoding face_recognition.face_encodings(image)[0]# 获取文件名作为名字name image_path.split(/)[-1].split(.)[0]# 添加到已知人脸列表known_face_encodings.append(face_encoding)known_face_names.append(name)return known_face_encodings, known_face_namesload_and_encode_faces 方法遍历传入的图像路径列表加载每张图像并对其进行编码。编码后的特征向量和对应的名字被存储在两个列表中分别返回。
实时人脸识别
def real_time_face_recognition(self):实现实时人脸识别。# 打开摄像头video_capture cv2.VideoCapture(0)while True:# 读取一帧ret, frame video_capture.read()# 将帧转换为RGBrgb_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(self.known_face_encodings, face_encoding)name Unknown# 计算欧氏距离face_distances face_recognition.face_distance(self.known_face_encodings, face_encoding)best_match_index np.argmin(face_distances)if matches[best_match_index]:name self.known_face_names[best_match_index]# 在帧上绘制矩形和标签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_DUPLEXcv2.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()real_time_face_recognition 方法打开摄像头并读取视频流。对于每一帧我们将其转换为RGB格式检测人脸位置并编码。然后我们将编码后的人脸与已知人脸进行匹配并在帧上绘制矩形和标签。按 q 键可以退出程序。
3. 使用类库
创建一个名为 main.py 的文件内容如下
from face_recognition_lib import FaceRecognition# 已知人脸图像路径
image_paths [path/to/known_face_1.jpg,path/to/known_face_2.jpg,# 添加更多已知人脸图像路径
]# 初始化FaceRecognition类
face_recognition FaceRecognition(image_paths)# 启动实时人脸识别
face_recognition.real_time_face_recognition()4. 运行示例
确保你的环境中安装了所需的库
pip install opencv-python
pip install dlib
pip install face_recognition然后运行 main.py
python main.py5. 代码运行接口
为了使类库更加通用和易于集成我们可以添加一些额外的方法和配置选项。以下是改进后的类库文件 face_recognition_lib.py
import cv2
import face_recognition
import numpy as np
from PIL import Image, ImageDrawclass FaceRecognition:def __init__(self, image_paths, tolerance0.6, modelhog):初始化FaceRecognition类。:param image_paths: 已知人脸图像的路径列表:param tolerance: 人脸匹配的阈值:param model: 人脸检测模型hog 或 cnnself.tolerance toleranceself.model modelself.known_face_encodings, self.known_face_names self.load_and_encode_faces(image_paths)def load_and_encode_faces(self, image_paths):加载并编码已知人脸图像。:param image_paths: 已知人脸图像的路径列表:return: 已知人脸的编码和名称known_face_encodings []known_face_names []for image_path in image_paths:# 加载图片image face_recognition.load_image_file(image_path)# 编码人脸face_encoding face_recognition.face_encodings(image)[0]# 获取文件名作为名字name image_path.split(/)[-1].split(.)[0]# 添加到已知人脸列表known_face_encodings.append(face_encoding)known_face_names.append(name)return known_face_encodings, known_face_namesdef real_time_face_recognition(self, camera_index0):实现实时人脸识别。:param camera_index: 摄像头索引# 打开摄像头video_capture cv2.VideoCapture(camera_index)while True:# 读取一帧ret, frame video_capture.read()# 将帧转换为RGBrgb_frame frame[:, :, ::-1]# 检测人脸位置face_locations face_recognition.face_locations(rgb_frame, modelself.model)# 编码人脸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(self.known_face_encodings, face_encoding, toleranceself.tolerance)name Unknown# 计算欧氏距离face_distances face_recognition.face_distance(self.known_face_encodings, face_encoding)best_match_index np.argmin(face_distances)if matches[best_match_index]:name self.known_face_names[best_match_index]# 在帧上绘制矩形和标签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_DUPLEXcv2.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()# 示例用法
if __name__ __main__:# 已知人脸图像路径image_paths [path/to/known_face_1.jpg,path/to/known_face_2.jpg,# 添加更多已知人脸图像路径]# 初始化FaceRecognition类face_recognition FaceRecognition(image_paths, tolerance0.6, modelhog)# 启动实时人脸识别face_recognition.real_time_face_recognition(camera_index0)6. 详细说明
初始化
def __init__(self, image_paths, tolerance0.6, modelhog):初始化FaceRecognition类。:param image_paths: 已知人脸图像的路径列表:param tolerance: 人脸匹配的阈值:param model: 人脸检测模型hog 或 cnnself.tolerance toleranceself.model modelself.known_face_encodings, self.known_face_names self.load_and_encode_faces(image_paths)我们在初始化方法中增加了 tolerance 和 model 参数以便在实例化类时可以调整人脸匹配的阈值和检测模型。
实时人脸识别
def real_time_face_recognition(self, camera_index0):实现实时人脸识别。:param camera_index: 摄像头索引# 打开摄像头video_capture cv2.VideoCapture(camera_index)while True:# 读取一帧ret, frame video_capture.read()# 将帧转换为RGBrgb_frame frame[:, :, ::-1]# 检测人脸位置face_locations face_recognition.face_locations(rgb_frame, modelself.model)# 编码人脸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(self.known_face_encodings, face_encoding, toleranceself.tolerance)name Unknown# 计算欧氏距离face_distances face_recognition.face_distance(self.known_face_encodings, face_encoding)best_match_index np.argmin(face_distances)if matches[best_match_index]:name self.known_face_names[best_match_index]# 在帧上绘制矩形和标签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_DUPLEXcv2.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()我们在 real_time_face_recognition 方法中增加了 camera_index 参数以便可以选择不同的摄像头。同时我们使用了 tolerance 和 model 参数来调整人脸匹配的阈值和检测模型。
7. 总结
通过上述步骤我们成功实现了基于Python的人脸识别算法并将其封装为一个类库。使用OpenCV和dlib库我们可以轻松地加载和编码已知人脸并在实时视频流中检测和识别人脸。希望这篇文章对你有所帮助