人脸识别系统
一. 静态人脸识别
1. 人脸提取
1.1. 导入资源包
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import face_recognition
import os
import subprocess
import sys
注:进行人脸识别像目前我们要先进行导入资源包,在python环境和中打开终端,安装命令例如:pip install tkinter。
Filedialog:一个与tkinter一起使用的模块,它提供了打开文件和保存文件的功能。
Messagebox:一个与tkinter一起使用的模块,它提供了显示消息框的功能,如警告、信息、询问等。
PIL (Pillow):一个图像处理库,用于打开、编辑和保存图像。它提供了广泛的图像处理功能,包括缩放、旋转、裁剪、添加文本等。
face_recognition:这是一个用于检测和识别图像中的人脸的库。它使用深度学习模型来执行这些任务,并提供了易于使用的API。
Subprocess:这是一个内置的Python库,用于启动和管理子进程。它允许您运行外部命令和脚本,并将它们的结果返回给Python。
1.2. 图像识别
#定义一个人脸识别的函数
def recognize_faces():
image_path = image_label.cget("text")
if image_path:
# 加载图片
image = face_recognition.load_image_file(image_path)
# 识别图片上所有人脸的位置
face_locations = face_recognition.face_locations(image)
# 读取图片用于PIL显示
img = Image.open(image_path)
# 创建一个可以在PIL中绘制的图像
draw = ImageDraw.Draw(img)
# 在每个人脸周围画框
for face_location in face_locations:
top, right, bottom, left = face_location
draw.rectangle(((left, top), (right, bottom)), outline=(255, 255, 255))
# 如果识别到人脸
if face_locations:
# 裁剪人脸区域
face_imgs = []
for face_location in face_locations:
top, right, bottom, left = face_location
face_img = img.crop((left, top, right, bottom))
face_imgs.append(face_img)
# 显示第一个识别到的人脸
if face_imgs:
face_img = face_imgs[0]
# 调整图片大小以适应窗口
face_img=face_img.resize((400,300), Image.LANCZOS)
# 创建ImageTk对象
face_imgTk = ImageTk.PhotoImage(face_img)
# 更新图像标签
processed_image_label.config(image=face_imgTk)
processed_image_label.image = face_imgTk
else:
# 弹窗提示
messagebox.showinfo("提示", "未识别到人脸,请更换照片")
注:函数recognize_faces的作用是加载一个图片,使用face_recognition库来识别图片中的人脸位置,并在图片上画出这些人脸的矩形框。如果识别到人脸,它还会裁剪出这些人脸区域,调整图片大小以适应窗口,并将裁剪后的图片显示在另一个标签上。如果未识别到人脸,它会弹出一个消息框提示用户更换照片。
1.3.创建返回功能
def return_to_rlsb():
# 获取当前Python解释器的路径
python_exe = sys.executable
# 使用subprocess.Popen启动rlsb.py脚本
subprocess.Popen([python_exe, "C:/Users/HUAWEI/PycharmProjects/pythonProject1/人脸识别/机器学习的人脸识别/rlsb.py"])
# 销毁当前窗口
root.destroy()
注:这段代码定义了一个函数return_to_rlsb,其作用是关闭当前的Tkinter窗口,并启动一个新的Python解释器来运行另一个脚本rlsb.py,用于创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。
1.4.创建人脸提取界面窗口
# 创建主窗口
root = tk.Tk()
root.title('人脸提取')
# 设置窗口大小
root.geometry('700x400')
# 加载背景图
background_image = Image.open('人脸提取background.jpg')
background_image=background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)
# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)
注:这段代码的作用是创建一个Tkinter主窗口,并设置窗口标题和大小。然后,它加载了一个背景图片,调整了图片的大小以适应窗口,并将调整后的图片作为背景添加到窗口中。
背景图片:
1.5.创建按钮
# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=120, y=10)
start_button= tk.Button(root, text='开始提取', command=recognize_faces, width=10, height=1, bg='gray').place(x=530, y=10)
back_button = tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=330, y=365)
# 原始图像标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, padx=10, pady=10)
# 处理后的图像标签
processed_image_label = tk.Label(root, text="", image="")
processed_image_label.pack(side=tk.RIGHT, padx=10, pady=10)
注:这段代码的作用是在Tkinter主窗口中添加三个按钮和一个标签,用于选择图片、开始提取人脸、返回上一个界面,以及显示原始图像和处理后的图像。
1.6.显示窗口
# 显示窗口
root.mainloop()
运行结果:
2.人脸识别
2.1.导入资源包
Import tkinter as tk
from tkinter import filedialog
import face_recognition
import os
from PIL import Image, ImageTk
import subprocess
import sys
注:导入了Tkinter库以及与图像处理和人脸识别相关的其他库,可以帮助我们处理图形界面、图像处理、操作系统交互等多种任务。
2.2.识别图片中人脸的位置
# 人脸识别函数
def recognize_faces(image_path):
# 加载图片
image = face_recognition.load_image_file(image_path)
# 识别图片上所有人脸的位置
face_locations = face_recognition.face_locations(image)
return face_locations
注:函数recognize_faces的作用是加载一个图片,并使用face_recognition库来识别图片中的人脸位置。
2.3.允许用户上传图片,然后显示选中的图像
# 选择图片函数
def select_image():
# 打开文件对话框,让用户选择图像文件
image_path=filedialog.askopenfilename(initialdir="faceimage", filetypes=[("Image Files", "*.png *.jpg *.jpeg *.bmp")])
if image_path:
img = Image.open(image_path)
img = img.resize((300, 250), Image.LANCZOS) # 调整图片大小
img = ImageTk.PhotoImage(img)
image_label.config(image=img)
image_label.image = img # 保留对图像的引用
image_label_path.config(text=image_path)
注:函数select_image的作用是打开一个文件对话框,让用户选择一个图像文件,然后将选中的图像显示在一个标签上。
2.4.开始识别过程并显示识别结果
# 开始识别函数
def start_recognition():
image_path = image_label_path.cget("text")
if image_path:
face_locations = recognize_faces(image_path)
if face_locations:
# 获取图片名字作为人脸信息
image_name = os.path.basename(image_path)
# 更新识别结果文本
recognized_label.config(text=f"检测到人脸!!!")
recognized_label.config(text=f"检测到人脸!!!\n人脸属于:{image_name}")
else:
recognized_label.config(text="未检测到人脸")
注:定义了一个函数start_recognition,其作用是开始人脸识别过程,并在图形用户界面中显示识别结果。
2.5.运行返回功能
def return_to_rlsb():
# 获取当前Python解释器的路径
python_exe = sys.executable
# 使用subprocess.Popen启动rlsb.py脚本
subprocess.Popen([python_exe, "C:/Users/HUAWEI/PycharmProjects/pythonProject1/人脸识别/机器学习的人脸识别/rlsb.py"])
# 销毁当前窗口
root.destroy()
注:创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。
2.6.创建窗口及相应的按钮
# 创建主窗口
root = tk.Tk()
root.title('人脸识别系统')
# 设置窗口大小
root.geometry('700x500')
# 加载背景图
background_image = Image.open('人脸识别background.jpg')
background_image=background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)
# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)
# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=150, y=10)
start_button=tk.Button(root, text='开始识别', command=start_recognition, width=10, height=1, bg='gray').place(x=500, y=10)
back_button=tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=300, y=400)
# 图像路径标签
image_label_path = tk.Label(root, text="")
image_label_path.pack(side=tk.BOTTOM, anchor=tk.CENTER, pady=10)
# 图像显示标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, anchor=tk.CENTER, padx=10)
# 识别结果标签
recognized_label = tk.Label(root, text="", font=("Helvetica", 16))
recognized_label.pack(side=tk.RIGHT, anchor=tk.CENTER, padx=10)
# 显示窗口
root.mainloop()
注:这段代码创建了一个Tkinter主窗口,用于人脸识别系统。它包含一个背景图片、三个按钮、三个标签,以及用于显示图片的标签。
运行结果:
3.特征标注
3.1.导入资源包
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
import face_recognition
import os
import subprocess
import sys
注:
Image模块用于打开、编辑和保存图像。
ImageTk模块用于将PIL的Image对象转换为Tkinter可以使用的PhotoImage对象。
ImageDraw模块用于在图像上绘制形状和文本。
filedialog模块提供了文件对话框的功能,允许用户选择文件或文件夹。
3.2.识别并绘制五官
# 人脸识别函数
def recognize_faces(image_path):
# 加载图片
image = face_recognition.load_image_file(image_path)
# 识别图片上所有人脸的位置
face_locations = face_recognition.face_locations(image)
# 识别图片上所有人脸的五官位置
face_landmarks_list = face_recognition.face_landmarks(image)
# 读取图片用于PIL显示
img = Image.open(image_path)
# 创建一个可以在PIL中绘制的图像
draw = ImageDraw.Draw(img)
# 在每个人脸周围画框并在五官位置画点
forface_location,face_landmarks in zip(face_locations, face_landmarks_list):
top, right, bottom, left = face_location
draw.rectangle(((left, top), (right, bottom)), outline=(255, 0, 0))
# 在五官位置画点
for facial_feature in face_landmarks.keys():
for point in face_landmarks[facial_feature]:
draw.ellipse((point[0], point[1], point[0]+2, point[1]+2), fill=(0, 255, 0))
# 如果没有识别到人脸
if not face_locations:
# 弹窗提示
messagebox.showinfo("提示", "未识别到人脸,请更换照片")
else:
# 调整图片大小以适应窗口
img = img.resize((480, 330), Image.LANCZOS)
# 创建ImageTk对象
imgTk = ImageTk.PhotoImage(img)
# 更新图像标签
image_label.config(image=imgTk)
image_label.image = imgTk
注:函数recognize_faces的作用是加载一个图片,使用face_recognition库来识别图片中的人脸位置和五官位置,并在图片上绘制人脸框和五官点。如果图片中没有人脸,它会弹出一个提示框。
背景颜色:
3.3.打开文件夹选择图片
# 选择图片函数
def select_image():
# 打开文件对话框,让用户选择图像文件
image_path = filedialog.askopenfilename(initialdir="faceimage")
if image_path:
# 确保图像路径正确
if os.path.isfile(image_path):
# 显示图片路径
image_label.config(text=image_path)
# 使用PIL读取图片
img = Image.open(image_path)
# 调整图片大小以适应窗口
img = img.resize((480, 330), Image.LANCZOS)
# 创建ImageTk对象
imgTk = ImageTk.PhotoImage(img)
# 更新图像标签
image_label.config(image=imgTk)
image_label.image = imgTk
else:
messagebox.showerror("错误", "无法打开文件。请确认文件路径正确。")
注:函数select_image的作用是打开一个文件对话框,让用户选择一个图像文件,并确保图像路径正确。如果用户选择了正确的文件,它会显示图片路径并显示图片。如果文件路径不正确,它会弹出一个错误消息框。
3.4.开始识别并显示识别结果
# 开始识别函数
def start_recognition():
#获取图片路径
image_path = image_label.cget("text")
#检查是否选择了文件
if image_path:
调用recognize_faces(image_path)函数以识别人脸五官位置,并在图片上绘制人脸框和五官点
recognize_faces(image_path)
注:函数start_recognition的作用是开始人脸识别过程,并在图形用户界面中显示识别结果。
3.5.返回主界面
def return_to_rlsb():
# 获取当前Python解释器的路径
python_exe = sys.executable
# 使用subprocess.Popen启动rlsb.py脚本
subprocess.Popen([python_exe, "D:/python lesson/机器学习的人脸识别/rlsb.py"])
# 销毁当前窗口
root.destroy()
注:这个函数通常用于创建一个简单的退出或返回功能,允许用户关闭当前窗口并运行其他脚本。在图形用户界面应用程序中,这可能是一个返回按钮的功能,当用户点击该按钮时,它会关闭当前窗口并启动另一个应用程序或脚本。
3.6.创建窗口和按钮
# 创建主窗口
root = tk.Tk()
root.title('特征标注')
# 设置窗口大小
root.geometry('500x400')
# 加载背景图
background_image = Image.open('特征标注background.png')
background_image = background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)
# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)
# 创建按钮并添加到窗口中
select_button = tk.Button(root, text='选择图片', command=select_image, width=10, height=1, bg='gray').place(x=80, y=1)
start_button=tk.Button(root, text='开始识别', command=start_recognition, width=10, height=1, bg='gray').place(x=350, y=1)
back_button = tk.Button(root, text='返回', command=return_to_rlsb, width=10, height=1, bg='gray').place(x=218, y=365)
# 图像路径标签
image_label = tk.Label(root, text="", image="")
image_label.pack(side=tk.LEFT, padx=10, pady=10)
# 显示窗口
root.mainloop()
注:这个代码片段创建了一个Tkinter主窗口,用于进行特征标注。它定义了窗口的标题、大小、背景图片、按钮以及图像路径标签。当用户点击按钮时,相应的函数会被调用。
运行结果:
4.创建人脸识别系统的主界面
4.1.导入资源包
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import Image, ImageTk
import os
注:这个代码片段是Python脚本的导入部分,它导入了多个库和模块,以便在后续的代码中使用它们的功能。
4.2.创建窗口大小
# 创建主窗口
root = tk.Tk()
root.title('人脸识别系统')
注:这个代码片段通常用于创建一个Tkinter窗口,并为其设置一个标题和一个初始大小。在后续的代码中,您可以添加更多的组件,如按钮、标签、图像等,来构建图形用户界面。
4.3.创建按钮和加载背景图片
# 创建标题并居中
title_label = tk.Label(root, text='动态人脸识别', font=('Arial', 16))
title_label.pack(pady=10)
# 加载背景图
background_image = Image.open('rlsbbackground.jpg')
background_image = background_image.resize((700, 500), Image.LANCZOS)
background_image = ImageTk.PhotoImage(background_image)
# 创建背景Label
background_label = tk.Label(root, image=background_image)
background_label.place(relwidth=1, relheight=1)
# 构建人脸识别脚本的相对路径
face_recognition_script = os.path.join('机器学习的人脸识别', '静态人脸识别', '人脸识别.py')
button1 = tk.Button(root, text='人脸识别', command=lambda: [subprocess.Popen(["python", "静态人脸识别/人脸提取.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button1.pack(padx=5, pady=1, anchor='center')
button2 = tk.Button(root, text='人脸提取', command=lambda: [subprocess.Popen(["python", "静态人脸识别/人脸提取.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button2.pack(padx=5, pady=1, anchor='center')
button3 = tk.Button(root, text='特征标注', command=lambda: [subprocess.Popen(["python", "静态人脸识别/特征标注.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button3.pack(padx=5, pady=1, anchor='center')
button4 = tk.Button(root, text='摄像头识别', command=lambda: [subprocess.Popen(["python", "动态人脸识别/摄像头人脸识别/aisb3.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button4.pack(padx=5, pady=1, anchor='center')
button5 = tk.Button(root, text='视频流识别', command=lambda: [subprocess.Popen(["python", "动态人脸识别/视频流人脸识别/视频流.py"]), root.destroy()], bg='gray', fg='black', width=25, height=2)
button5.pack(padx=5, pady=1, anchor='center')
button6 = tk.Button(root, text='退出', command=lambda: on_closing(), width=10, height=2)
button6.pack(padx=5, pady=5, anchor='center')
注:这个代码片段通常用于创建一个具有标题、背景图片和按钮的Tkinter窗口,用户可以选择执行不同的人脸识别任务,如人脸识别、人脸提取、特征标注等。当用户点击“退出”按钮时,窗口会被关闭。
背景图片:
4.4.定义退出程序,可以实现返回功能
# 定义退出程序函数
def on_closing():
if messagebox.askokcancel("退出", "确定要退出吗?"):
root.destroy()
# 设置窗口关闭事件
root.protocol("WM_DELETE_WINDOW", on_closing)
# 显示窗口
root.mainloop()
注:这个代码片段通常用于创建一个具有退出功能的Tkinter窗口,当用户尝试关闭窗口时,会弹出一个确认对话框,询问是否确定要退出。如果用户确认,窗口将被关闭。
运行结果: