写在前面
  时间过得飞快,时间已经距离我发第一篇文章过去2年多了,也不再从事代码工作,偶然间上到csdn翻看文章经过,看到还是有些人关注人脸识别系统的后续的,我猜大概率是学弟学妹们正在被期末实验折磨中,翻了翻原先的代码还能找到就一并更完了吧,如果抄了我的作业记得来学长的评论区表示一下感谢哦(代码完全照抄必被老师发现,别那么傻)。
  一、作业要求
  基本任务:开发一个人脸识别系统,要求以ORL人脸数据库为实验数据,构造出一个完整的人脸识别系统,要求有界面,可选择输入单张图像并显示该图像,然后实现该图像的识别,并输出对应的识别结果图像。要求数据库中每个人的5张照片作为训练集,另外5张照片作为测试集,并统计其识别正确率。(实验采用的程序语言不限、人脸识别算法不限)
扩展任务:1、实现一个完整的人脸识别系统,照片自己采集,要求30人以上,实现摄像头与照片两种模式作为输入的人脸检测与识别,正确率要求95%以上。2、实现一个完整的多人人脸识别系统,照片自己采集,要求30人以上,实现摄像头与照片两种模式作为输入的多人脸检测与识别,正确率要求95%以上。
  二、算法原理
  基本思路是利用knn算法实现人脸识别,orl数据集的人脸识别系统与自定义数据集的多人人脸识别系统的系统大致逻辑为:模型训练,加载模型查找最邻近解,显示匹配到的信息。
  模型训练过程为利用face_recognition模块识别出人脸位置,加上人脸信息标签后利用sklearn模块进行训练,得到相应的.clf分类器并保存,识别过程为利用保存的分类器进行相邻判断并找到最相邻的解的图像。
  在机器的学习以及图像处理显示方面,调用sklearn、PIL、face_recognition等模块。在界面的展示以及用户的交互上,调用了tkinter模块。
  三、人脸识别系统流程图与步骤说明
  (一)orl数据集的人脸识别系统 流程图:
步骤说明:
(1)选择训练集路径
在使用该系统前,需要先对人脸图像进行训练,所以首先得先指定训练集的路径位置。注意:训练集路径不能为空,且目录结构应大致为./train/s1/img1 img2 … ./train/s2 ./train/s3/img1 im2 …
(2)训练模型
进行模型训练,提示用户会造成系统卡顿,请耐心等待。
注意:①卡顿属于正常现象,是因为在模型训练过程中需要对大量图片进行处理,需要耐心等待。训练后会生成“trained_knn_model_orl.clf”文件,表示训练后形成的Knn分类器。默认保存路径是与该python文件同级目录下的位置。②训练过后系统会自动读取对应目录下的knn分类器,故下次使用时可不必再次训练。
(3)显示识别准确率
在模型训练完成后会自动对orl数据集中200张人像进行识别匹配进而计算正确率并显示。
(4)选择数据集中的待匹配图像
选择数据集中待匹配的图像进行检测,若格式不正确,系统会给予相应的提示。
(5)输出匹配的图像
从对应的训练集中查找到对应人像的照片进行显示。
(二)自定义数据集的多人人脸识别系统 流程图:

步骤说明:
(1)选择训练集路径
在使用该系统前,需要先对人脸图像进行训练,所以首先要先指定训练集的路径位置。注意:目录结构应大致为./train/s1/img1 img2 … ./train/s2 ./train/s3/img1 im2 …(这一步流程与上一个系统要求一致,如:目录结构要合理,训练集目录下有n个文件夹表示n个人的训练数据,文件夹名表示人物的名字,目录内的图片文件只能是这个人的单人的照片,否则不会训练成功)
(2)训练模型
进行模型训练,提示用户会造成系统卡顿,请耐心等待。训练后会在于文件同级目录上保存trained_knn_model_manyface_video.clf文件,这样下次使用时系统就会自动利用上面这个分类器进行图像识别。
(3)本地识别多人像照片
按下按钮后,会打开文件管理器,让用户选择一张照片进行识别。系统会利用trained_knn_model_manyface_video.clf这个分类器找出图像中所有人物的头像并利用knn算法匹配与它最相近的人物。之后系统会打开用户选中的图片并在图片上对人物图像加框和显示匹配到人物的名字。
(4)从摄像头识别多人像照片
按下按钮后,会打开摄像头采集用户当前的场景,对场景中的人物进行最近相邻匹配人物,并加框显示识别结果。

四、部分核心代码

训练模型的算法:
#模型训练,得到分类器,即同级目录下的.clf文件
def train_model(train_dir):#指定KNN算法训练后分类器的文件名model_save_path = "trained_knn_model_orl.clf"X = []y = []#flag变量用于判断训练集的有效性flag=False# 对训练集中每个人的目录进行遍历,如C:/Users/Haifeng/OneDrive/桌面/face_identity_orl/knn_examples_orl2/train\s1..s2..s3....for class_dir in os.listdir(train_dir):#判断当前路径是目录,若s1 s2 s3 不是目录是文件则抛弃if not os.path.isdir(os.path.join(train_dir, class_dir)):continue#对图像进行格式转换,转成jpg格式的图像,便于训练bmpTojpg(os.path.join(train_dir, class_dir))# 对每个人的图像进行遍历for img_path in image_files_in_folder(os.path.join(train_dir, class_dir)):# 将图片导入到numpy数组中image = face_recognition.load_image_file(img_path)# 查找图片中人脸(上下左右)的位置,图像中可能有多个人脸  face_locations的值类似[(135,536,198,474),()]face_bounding_boxes = face_recognition.face_locations(image)#若训练集中的图像只存在一张人脸,说明这是张合格的训练集,则加入集合进一步处理if len(face_bounding_boxes) == 1:#只要有一张脸被训练到,即为训练成功flag=True# 将现在图像的脸部编码加载到训练集中X.append(face_recognition.face_encodings(image, known_face_locations=face_bounding_boxes)[0])y.append(class_dir)# X加的是这个图像和人脸的位置Y加的是图像外面的文件夹名字# 创建并训练KNN分类器knn_clf = neighbors.KNeighborsClassifier(n_neighbors=2, algorithm='ball_tree', weights='distance')knn_clf.fit(X, y)# 以保存路径的格式要求保存分类器if model_save_path is not None:with open(model_save_path, 'wb') as f:pickle.dump(knn_clf, f)#人脸预测匹配,根据传入的图像路径,进行人脸的匹配,返回匹配到人物的名字,以及原图像中相应的人脸坐标,以及是否存在匹配的人脸
def predict(X_img_path):#读入knn_clf模型if knn_clf is None:with open(model_path, 'rb') as f:knn_clf = pickle.load(f)# 加载图像和找到脸的位置X_img = face_recognition.load_image_file(X_img_path)X_face_locations = face_recognition.face_locations(X_img)# 如果在图像中没有找到脸,则返回一个空集if len(X_face_locations) == 0:return []# 将待测图片进行编码faces_encodings = face_recognition.face_encodings(X_img, known_face_locations=X_face_locations)# 使用knn模型对最优的解进行匹配closest_distances = knn_clf.kneighbors(faces_encodings, n_neighbors=1)are_matches = [closest_distances[0][i][0] <= distance_threshold for i in range(len(X_face_locations))]# 返回相应格式的类,分别为[[name1,name2],(上下左右位置坐标),人脸位置]return [(pred, loc) if rec else ("unknown", loc) for pred, loc, rec in zip(knn_clf.predict(faces_encodings), X_face_locations, are_matches)]

五、界面展示

orl数据集的人脸识别系统


自定义数据集的多人人脸识别系统


六、源代码(千万不要照抄!千万不要照抄!千万不要照抄!)
(一)orl_face.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-import tkinter as tk
import tkinter.filedialog
from PIL import Image, ImageTk #调用图片处理模块,保证png后缀名可用
import tkinter.messagebox
import pickle
import math
from sklearn import neighbors
import os
import os.path
import pickle
from PIL import Image, ImageDraw
import face_recognition
from face_recognition.face_recognition_cli import image_files_in_folder#设置可支持的图片类型
ALLOWED_EXTENSIONS = {'bmp','png', 'jpg', 'jpeg'}#将该路径下所有.bmp图像转换为.jpg图像
def bmpTojpg(dir_path):for fileName in os.listdir(dir_path):file_path=os.path.join(dir_path,fileName)if os.path.split(file_path)[-1].split(".")[-1] != 'bmp':continuenewFileName = fileName[0:fileName.find(".bmp")] + ".jpg"im = Image.open(file_path)rgb = im.convert('RGB')  # 灰度转RGBrgb.save(dir_path + "\\" + newFileName)os.remove(file_path)# command = "del " + dir_path + "\\*.bmp"# os.system(command)# os.remove(dir_path+"\\*.bmp")#人脸识别核心算法,通过传入数据集图像,通过训练得到的knn分类器进行人脸匹配
def predict(X_img_path, knn_clf=None, model_path=None, distance_threshold=0.6):# 读取knn分类器if knn_clf is None:with open(model_path, 'rb') as f:knn_clf = pickle.load(f)# 加载图像文件X_img = face_recognition.load_image_file(X_img_path)#寻找人脸特征X_face_locations = face_recognition.face_locations(X_img)# 如果没有人脸特征,则返回空集if len(X_face_locations) == 0:return [("unknown", (0,0,0,0))]# 为数据集人脸编码faces_encodings = face_recognition.face_encodings(X_img, known_face_locations=X_face_locations)# 使用knn模型匹配最优的人脸closest_distances = knn_clf.kneighbors(faces_encodings, n_neighbors=1)are_matches = [closest_distances[0][i][0] <= distance_threshold for i in range(len(X_face_locations))]# 返回人脸的位置信息和对应人的姓名并删除不在阈值内的分类return [(pred, loc) if rec else ("unknown", loc) for pred, loc, rec in zip(knn_clf.predict(faces_encodings), X_face_locations, are_matches)]#获取目录
def askdirectory():dir_path=tk.filedialog.askdirectory()path.set(dir_path)#模型训练
def train_model(train_dir):# print(dir_path)# print("Training KNN classifier...")#对训练集路径的合法性进行判断并给出提示if not os.path.isdir(train_dir):tk.messagebox.showerror(title="路径错误", message="训练模型路径不能为空")return#与用户交互if not tk.messagebox.askyesno(title="系统提示", message="模型训练会导致系统卡顿10~15s\n\t请耐心等待"):return#指定KNN算法训练后分类器的文件名model_save_path = "trained_knn_model_orl.clf"X = []y = []#flag变量用于判断训练集的有效性flag=False# 对训练集中每个人的目录进行遍历,如C:/Users/杨海丰/OneDrive/桌面/face_identity_orl/knn_examples_orl2/train\s1..s2..s3....for class_dir in os.listdir(train_dir):#判断当前路径是目录,若s1 s2 s3 不是目录是文件则抛弃if not os.path.isdir(os.path.join(train_dir, class_dir)):continue#对图像进行格式转换,转成jpg格式的图像,便于训练bmpTojpg(os.path.join(train_dir, class_dir))# 对每个人的图像进行遍历for img_path in image_files_in_folder(os.path.join(train_dir, class_dir)):# 将图片导入到numpy数组中image = face_recognition.load_image_file(img_path)# 查找图片中人脸(上下左右)的位置,图像中可能有多个人脸  face_locations的值类似[(135,536,198,474),()]face_bounding_boxes = face_recognition.face_locations(image)#若训练集中的图像只存在一张人脸,说明这是张合格的训练集,则加入集合进一步处理if len(face_bounding_boxes) == 1:#只要有一张脸被训练到,即为训练成功flag=True# 将现在图像的脸部编码加载到训练集中X.append(face_recognition.face_encodings(image, known_face_locations=face_bounding_boxes)[0])y.append(class_dir)# X加的是这个图像和人脸的位置 Y加的是图像外面的文件夹名字#若训练集中一张人脸也没有检测到,则提示用户更换训练集if not flag:tk.messagebox.showerror(title="训练集错误", message="训练集有误,请更换训练集")return# 创建并训练KNN分类器knn_clf = neighbors.KNeighborsClassifier(n_neighbors=2, algorithm='ball_tree', weights='distance')knn_clf.fit(X, y)# 以保存路径的格式要求保存分类器if model_save_path is not None:with open(model_save_path, 'wb') as f:pickle.dump(knn_clf, f)#默认检测正确率时orl未训练的后200张照片位于与train目录同级下的test文件夹中test_dir = os.path.join(os.path.split(train_dir)[0],'test')print(test_dir)# 计算识别的正确率correct=sum=0.0for class_dir in os.listdir(test_dir):# 判断当前路径是目录,若s1 s2 s3 不是目录是文件则抛弃if not os.path.isdir(os.path.join(test_dir, class_dir)):continue# 对图像进行格式转换,转成jpg格式的图像,便于训练bmpTojpg(os.path.join(test_dir, class_dir))for img_path in image_files_in_folder(os.path.join(test_dir, class_dir)):sum=sum+1predictions = predict(img_path, model_path="trained_knn_model_orl.clf")for name, (top, right, bottom, left) in predictions:if name==class_dir:correct=correct+1break;#显示准确率信息tk.Label(window, font=('Arial', 16), text="准确率:{}".format(correct/sum)).grid(row=7, column=4, columnspan=1)#与用户进行交互tk.messagebox.showinfo(title="信息",message="训练已完成,可识别人脸")# print("Training complete!")#人脸识别,利用训练好的knn分类器进行orl人脸的识别
def recog_orl_face(train_path):#打开文件筛选器筛选文件img_path=tk.filedialog.askopenfilename()#判断是否选中的文件为一张图片,如果是则打开并显示,否则与用户进行交互try:img1=Image.open(img_path)photo1 = ImageTk.PhotoImage(img1)img_label1.config(imag=photo1)# tkinter.update()img_label1.image = photo1except:tk.messagebox.showerror(title="图片格式有误", message="图片格式有误,请选择一张图片")return#进行人脸预测,img_path是数据集中人脸的路径,model_path是训练后得到的KNN分类器predictions = predict(img_path, model_path="trained_knn_model_orl.clf")# print(predictions)#对人脸进行识别for name, (top, right, bottom, left) in predictions:# print(name)#如果该照片未找到匹配的图像,则提示用户 匹配失败if(name=="unknown"):tk.messagebox.showerror(title="匹配失败", message="未找到匹配的人脸图像")img_label1.grid_forget()else:try:# 从训练集中找一张对应识别任务的图像打开并显示testphoto_dir = os.path.join(train_path, name)# print(testphoto_dir)testphoto_path = os.path.join(testphoto_dir, os.listdir(testphoto_dir)[0])# print(testphoto_path)img2 = Image.open(testphoto_path)photo2 = ImageTk.PhotoImage(img2)img_label2.config(imag=photo2)# tkinter.update()img_label2.image = photo2except:tk.messagebox.showerror(title="训练集路径有误", message="\t\t匹配成功\n但训练集路径选择错误,导致系统无法显示对应人物图像")break;
#主程序入口
if __name__ == "__main__":# 建立窗口windowwindow = tk.Tk()# 给窗口的可视化起名字window.title('ORL人脸识别系统')# 设定窗口的大小(长 * 宽)window.geometry('400x250')path = tk.StringVar()#添加Label标签tk.Label(window, font=('Arial', 14), text="训练集的路径").grid(row=0, column=1, columnspan=2)#添加Entry输入框,用于显示用户载入的训练集路径entry_dir=tk.Entry(window,textvariable=path)entry_dir.grid(row=0, column=3, columnspan=3)#添加 选择路径、训练模型 2个按钮tk.Button(window, font=('Arial', 12), text="选择路径", command=askdirectory).grid(row=0, column=6)tk.Button(window, font=('Arial', 12), text="训练模型",command=lambda:train_model(entry_dir.get())).grid(row=2, column=4)# 添加2个Label标签用来当做放置图片的位置,一个是显示待识别的图像,一个是显示识别后结果的图像img_label1 = tk.Label(window)img_label1.grid(row=4,column=1,rowspan=3, columnspan=2,padx=4, pady=20)img_label2 = tk.Label(window)img_label2.grid(row=4, column=5, rowspan=3, columnspan=2, padx=4, pady=20)#添加 选择人像并识别的按钮tk.Button(window, font=('Arial', 12), text="选择人像并识别", command=lambda: recog_orl_face(entry_dir.get())).grid(row=5,column=3,columnspan=2)# 主窗口循环显示window.mainloop()

(二)multi_face.py

#!/usr/bin/env pythonimport tkinter as tk
import tkinter.filedialog
from PIL import Image, ImageTk#调用图片处理模块,保证png后缀名可用
import tkinter.messagebox
import pickle
import math
from sklearn import neighbors
import os
import os.path
import pickle
from PIL import Image, ImageDraw
import face_recognition
from face_recognition.face_recognition_cli import image_files_in_folder
import cv2
import numpy as np#将该路径下所有.bmp图像转换为.jpg图像
def bmpTojpg(dir_path):for fileName in os.listdir(dir_path):file_path=os.path.join(dir_path,fileName)if os.path.split(file_path)[-1].split(".")[-1] != 'bmp':continuenewFileName = fileName[0:fileName.find(".bmp")] + ".jpg"im = Image.open(file_path)rgb = im.convert('RGB')  # 灰度转RGBrgb.save(dir_path + "\\" + newFileName)os.remove(file_path)
# 使得识别结果可视化,即将图像以图片形式打开,且在人像上加框
def show_prediction_labels_on_image(img_path, predictions):pil_image = Image.open(img_path).convert("RGB")draw = ImageDraw.Draw(pil_image)for name, (top, right, bottom, left) in predictions:# 利用pillow模块在图片上画一个矩形draw.rectangle(((left, top), (right, bottom)), outline=(255, 0, 0),width=3)#字符编码设置为utf-8name = name.encode("UTF-8")text_width, text_height = draw.textsize(name)draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(0,0,0),outline=(255, 0, 0),width=3)draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 255))# 从内存中移除pillow库del draw# 显示结果pil_image.show()#模型训练
def train_model(train_dir):# print(dir_path)# print("Training KNN classifier...")#对训练集路径的合法性进行判断并给出提示if not os.path.isdir(train_dir):tk.messagebox.showerror(title="路径错误", message="训练模型路径不能为空")return#与用户交互if not tk.messagebox.askyesno(title="系统提示", message="模型训练会导致系统卡顿10~15s\n\t请耐心等待"):return#指定KNN算法训练后分类器的文件名model_save_path = "trained_knn_model_manyface_video.clf"X = []y = []#flag变量用于判断训练集的有效性flag=Falseprint(train_dir)# 对训练集中每个人的目录进行遍历,如C:/Users/杨海丰/OneDrive/桌面/face_identity_orl/knn_examples_orl2/train\s1..s2..s3....for class_dir in os.listdir(train_dir):#判断当前路径是目录,若s1 s2 s3 不是目录是文件则抛弃if not os.path.isdir(os.path.join(train_dir, class_dir)):continue#对图像进行格式转换,转成jpg格式的图像,便于训练bmpTojpg(os.path.join(train_dir, class_dir))# 对每个人的图像进行遍历for img_path in image_files_in_folder(os.path.join(train_dir, class_dir)):# 将图片导入到numpy数组中image = face_recognition.load_image_file(img_path)# 查找图片中人脸(上下左右)的位置,图像中可能有多个人脸  face_locations的值类似[(135,536,198,474),()]face_bounding_boxes = face_recognition.face_locations(image)#若训练集中的图像只存在一张人脸,说明这是张合格的训练集,则加入集合进一步处理if len(face_bounding_boxes) == 1:#只要有一张脸被训练到,即为训练成功flag=True# 将现在图像的脸部编码加载到训练集中X.append(face_recognition.face_encodings(image, known_face_locations=face_bounding_boxes)[0])y.append(class_dir)# X加的是这个图像和人脸的位置 Y加的是图像外面的文件夹名字#若训练集中一张人脸也没有检测到,则提示用户更换训练集if not flag:tk.messagebox.showerror(title="训练集错误", message="训练集有误,请更换训练集")return# 创建并训练KNN分类器knn_clf = neighbors.KNeighborsClassifier(n_neighbors=2, algorithm='ball_tree', weights='distance')knn_clf.fit(X, y)# 以保存路径的格式要求保存分类器if model_save_path is not None:with open(model_save_path, 'wb') as f:pickle.dump(knn_clf, f)tk.messagebox.showinfo(title="信息",message="训练已完成,可进行人脸识别")# print("Training complete!")
#人脸预测
def predict(X_img_path, knn_clf=None, model_path=None, distance_threshold=0.6):#读入knn_clf模型if knn_clf is None:with open(model_path, 'rb') as f:knn_clf = pickle.load(f)# print(X_img_path)# 加载图像和找到脸的位置X_img = face_recognition.load_image_file(X_img_path)X_face_locations = face_recognition.face_locations(X_img)# 如果在图像中没有找到脸,则返回一个空集if len(X_face_locations) == 0:return []# 将待测图片进行编码faces_encodings = face_recognition.face_encodings(X_img, known_face_locations=X_face_locations)# 使用knn模型对最优的解进行匹配closest_distances = knn_clf.kneighbors(faces_encodings, n_neighbors=1)are_matches = [closest_distances[0][i][0] <= distance_threshold for i in range(len(X_face_locations))]# 返回相应格式的类,分别为[[name1,name2],(上下左右位置坐标),人脸位置]return [(pred, loc) if rec else ("unknown", loc) for pred, loc, rec in zip(knn_clf.predict(faces_encodings), X_face_locations, are_matches)]
#获取目录
def askdirectory():dir_path=tk.filedialog.askdirectory()path.set(dir_path)
#从照片识别多人人脸
def recog_many_face():img_path = tk.filedialog.askopenfilename()# 判断是否选中的文件为一张图片,如果是则打开并显示,否则与用户进行交互try:img1 = Image.open(img_path)except:tk.messagebox.showerror(title="图片格式有误", message="图片格式有误,请选择一张图片")return# 进行人脸预测,img_path是数据集中人脸的路径,model_path是训练后得到的KNN分类器predictions = predict(img_path, model_path="trained_knn_model_manyface_video.clf")# print(predictions)# 对人脸进行识别show_prediction_labels_on_image(img_path, predictions)#从摄像头进行认脸
def recog_from_video(train_dir,knn_clf=None):#读入knn训练模型model_path = "trained_knn_model_manyface_video.clf"if knn_clf is None:with open(model_path, 'rb') as f:knn_clf = pickle.load(f)# 开启摄像头camera = cv2.VideoCapture(0)while True:# 抽一帧作为检测人脸的图像ret, frame = camera.read()# 将图像转换为rgb图像rgb_frame = frame[:, :, ::-1]# 处理得到所有人脸的位置与编码信息face_locations = face_recognition.face_locations(rgb_frame)faces_encodings = face_recognition.face_encodings(rgb_frame, face_locations)#异常处理,如果得到的人脸为空,则跳出取下一张if faces_encodings == []:continue#求与多人脸相对应最优的匹配人脸closest_distances = knn_clf.kneighbors(faces_encodings, n_neighbors=1)are_matches = [closest_distances[0][i][0] <= 0.53 for i in range(len(face_locations))]#显示人脸信息,name表示该人的名字,第二个参数是检测到人脸的位置信息,rec表示是否有匹配到的最优解,如果不为空,则必有人脸被匹配到for name, (top, right, bottom, left), rec in zip(knn_clf.predict(faces_encodings), face_locations, are_matches):if not rec:name = "unknown"print(name)print(name)#画框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, 0.8, (255, 255, 255), 1)cv2.imshow('multi_face_recognition', frame)# 按q键退出人脸检测if cv2.waitKey(1) & 0xFF == ord('q'):breakcamera.release()cv2.destroyAllWindows()
if __name__ == "__main__":# 建立窗口windowwindow = tk.Tk()# 给窗口的可视化起名字window.title('多人脸识别系统')# 设定窗口的大小(长 * 宽)window.geometry('450x180')path = tk.StringVar()#添加Label标签tk.Label(window, font=('Arial', 14), text="训练集的路径").grid(row=0, column=1, columnspan=2)#添加Entry输入框,用于显示用户载入的训练集路径entry_dir=tk.Entry(window,textvariable=path)entry_dir.grid(row=0, column=3, columnspan=3)#添加 选择路径、训练模型 2个按钮tk.Button(window, font=('Arial', 12), text="选择路径", command=askdirectory).grid(row=0, column=6)tk.Button(window, font=('Arial', 12), text="训练模型",command=lambda:train_model(entry_dir.get())).grid(row=2, column=4)#添加 选择人像并识别的按钮tk.Button(window, font=('Arial', 12), text="本地识别多人像照片", command=lambda: recog_many_face()).grid(row=5,column=1,columnspan=2)tk.Button(window, font=('Arial', 12), text="从摄像头识别多人人像", command=lambda: recog_from_video(entry_dir.get())).grid(row=5,column=5,columnspan=2)tk.Label(window, font=('Arial', 14)).grid(row=3)tk.Label(window, font=('Arial', 14)).grid(row=4)# 主窗口循环显示window.mainloop()

代码可能未能完全实现全部功能,交差是没问题的,但是具体什么问题也忘记了,训练和测试数据集本想一并上传,但gitee的ssh安全配置出了点问题上报不了,如果还有机会到时候会贴在评论区。
  写在最后:大学四年是一段美好而短暂的时光,原先没有疫情的学习生活可能会更加多彩,但这丝毫不影响这四年的轻松与愉悦。工作后常常会想起在大学的时光,那时至少没有生活的压力,不知道屏幕前的你是什么感受,好好珍惜,仅以此篇为早以结束的大学生活画上再一个句号。

人工智能大作业——人脸识别系统(最终)相关推荐

  1. 人工智能人脸识别系统,人工智能应用人脸识别

    手机人脸识别的原理是什么? . 不同品牌机型采用的面部识别技术方案不同,面部识别效果也会不一样:目前vivo/iQOO系列手机,仅NEX双屏版采用3D人脸识别技术,其余机型均采用FaceWake面部识 ...

  2. 小区安装人脸识别系统,先回答五大安全问题

    为谁而装?为何而装?小区人脸识别系统的安装需求来源.目的 众多小区开始安装人脸识别系统,甚至有小区强推人脸识别系统,导致很多不愿意接受人脸识别系统的住户不能回家.如此这般操作,小区住户非但没有体验到安 ...

  3. 北京:2100名号贩子信息已录入医院人脸识别系统

    央视新闻客户端2月22日报道,记者日前从北京市卫健委获悉,北京市已将2100多名号贩子信息录入北京各大医院人脸识别系统. 北京目前已有30余家医疗机构配备了人脸识别系统,重点医院将共享2017年以来, ...

  4. 【人工智能】人脸识别系统【实验报告与全部代码】(QDU)

    写在前面,防止有傻乎乎的同学直接全文复制出现问题. 说实话,实现的比较水,就是调用了 dlib 库的函数实现的人脸检测和人脸识别: 唯一的难点,也确实比较难,就是实现双线程控制,详见报告: ResNe ...

  5. linux的系统监视器图片_用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统 - 人工智能遇见磐创...

    作者|Adam Geitgey 编译|Flin 来源|medium 新的Nvidia Jetson Nano 2GB开发板(今天宣布!)是一款单板机,售价59美元,运行带有GPU加速的人工智能软件. ...

  6. 大数据早报:合肥公证机构启用人脸识别系统;阿里AI时尚助手进驻全国13家门店 (11.16)

    数据早知道,上乐投网看早报! 『融资』众盟数据完成3亿元B轮系列融资,以线下数据资产化赋能新零售 近日,国内最大的线下数据服务平台ZMT众盟(简称众盟数据)宣布完成1.8亿元B+轮融资,本轮融资由云锋 ...

  7. Python与人工智能入门实践——简易人脸识别系统

    Python与人工智能入门实践--简易人脸识别系统 写在前面: 笔者在寒假期间进行了一些简短的实训,主要内容包括简单的爬虫和简单的人脸识别算法,由于时间有限,对于python也是第一次详细学习,功能较 ...

  8. 删除10亿人脸数据,Meta关闭了Facebook的人脸识别系统

    来源:机器之心 本文约1700字,建议阅读5分钟 本文为你介绍了Meta在人脸识别系统上的最新动态. 选择一劳永逸,Meta 再不想为 Facebook 的人脸识别系统「买单」了. 在近期召开的 Fa ...

  9. 开源大佬面对面:InsightFace带你打造开箱即用的人脸识别系统

    导读 提到人工智能和人脸识别开源技术,相信很多业内的同行对于InsightFace应该不陌生,其中的Arcface论文被引用超过2100+,自从2018年开源以来,在GitHub上的增长也保持着强劲的 ...

最新文章

  1. vue/require-v-for-key]Elements in iteration expect to have ‘v-bind:key‘ directives
  2. PHP5 加速模块OPcache
  3. springboot项目输入打印日志文件到本地
  4. 3.以太坊之秘钥文件
  5. matlab gui打开fig文件,求助gui打开word文件及打开fig格式图片
  6. buu Cipher
  7. extern __shared__
  8. 2020版北大中文核心期刊目录_收藏备用最新版:《中文核心期刊要目总览》北大中文核心期刊目录...
  9. java spring boot 注解验证_如何理解Java原生注解和Spring 各种注解?
  10. centos6.5+jexus5.6.3+mono 3.10实践,让asp.net在linux上飞一会儿
  11. jsp和mysql答辩_jsp+servletmysql 毕业论文答辩理系统(带远程指导)
  12. Java中Int转byte分析
  13. AC日记——[NOI2006]最大获利 bzoj 1497
  14. JenkinsDay18-查看服务器有哪些JOB
  15. Atitit 扩大个人影响力和宣传目录1. 发文舆论阵地 11.1. 简书 知乎 csdn等 11.2. Ifttt出发同步 11.3. 问答平台 知乎 quaro 11.4. Tik
  16. java3d室外场景构建_3dmax里怎么渲染室外场景
  17. c语言左移函数_corl_,crol(crol函数怎么左移)
  18. 如何下载fatjar
  19. Min Difference
  20. 物理层、数据链路层间的PHY、MAC、MII、RMII、SMII、GMII、RGMII以及I2S总线、SFP接口

热门文章

  1. 【软件简史】怎样理解 Alan Kay 曾在1984 年写道:“我们希望像以前编辑文档一样编辑我们的工具” 这句话 —— LLM 将如何影响软件的创建?
  2. xshell工具将服务器文件下载到本地
  3. Learn UML with JUDE转
  4. 【论文精读】KD-MVS
  5. python儿童编程培训班-儿童编程培训班有用吗
  6. 用c语言写生成 mif文件的软件,MIF文件生成(.MIF File Generator Utility)
  7. 数据预处理(纯干货,适合小白学习)
  8. 20190820美团视频一面面经
  9. Description 一个笼子里关了若干鸡和兔子,鸡有2只脚,兔子有4只脚,没有例外。已知笼子里脚的 总数a,问笼子里至少有多少只动物,至多有多少只动物? Input 第一行是测试数据的组数n,后面
  10. 支持向量机(SVM)--小样本