人脸识别深度学习项目 Python Dlib+ResNet+PyQt5 毕业设计✅
博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅
1、项目介绍
技术栈:Python语言、PyQt5图形界面、OpenCV、ResNet深度卷积神经网络、Dlib库
研究背景:人脸识别已广泛应用于安防、门禁、身份核验等场景,传统手工特征提取方式在复杂光照与姿态下鲁棒性差。利用ResNet提取128维深度特征,结合Dlib人脸关键点对齐与PyQt5可视化界面,可在本地实现毫秒级、高准确率的“检测-对齐-比对”全流程,为智能门禁与考勤系统提供轻量级解决方案。
研究意义:系统支持图片、视频、摄像头三种输入模式,集成人脸录入、识别、记录管理功能,代码开源、模型本地,适合作为“计算机视觉”“深度学习”课程与毕业设计模板,推动人脸识别技术在教学与产业中的快速落地。
2、项目界面
(1)人脸识别—图片识别
(2)人脸识别–视频识别
(3)录入人脸
(4)摄像头实时人脸识别
(5)摄像头实时人脸识别2
(6)系统首页界面
(7)人脸识别记录管理
3、项目说明
系统基于PyQt5构建图形界面,集成OpenCV与Dlib完成人脸检测与关键点对齐,利用ResNet预训练模型提取128维深度特征,通过欧式距离与设定阈值(0.4)实现1:1与1:N比对,支持图片、视频、摄像头三种输入模式,检测速度>30FPS,识别准确率>99%。
人脸检测采用Dlib HOG+SVM检测器快速定位人脸;对齐阶段使用GBDT回归树级联预测68点关键点,完成旋转与尺度归一化;特征提取调用ResNet-34结构预训练模型,输出128维特征向量;匹配阶段计算欧式距离,距离小于阈值即判定为同一人,否则陌生人。
人脸录入支持图片与摄像头两种采集方式,自动裁剪并生成特征向量写入本地SQLite数据库;记录管理模块可查看识别时间、截图、相似度,支持一键导出CSV报表。系统全程本地运行,无需联网,既保护隐私又降低延迟;代码注释详尽,配套模型文件与部署教程,适合作为“人脸识别”“深度学习”课程与毕业设计模板,推动AI在安防与门禁领域的教学落地与产业应用。
4、核心代码
# -*- coding: utf-8 -*-
# 人脸识别与管理系统:本程序用于图片、视频及摄像头中人脸识别
import csv
import glob
import os
import re
import shutil
import time
import warnings
from os import getcwd
import cv2
import dlib
import numpy as np
import pandas as pd
from PIL import Image, ImageDraw, ImageFont
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QMovie
from PyQt5.QtWidgets import QFileDialog, QTableWidgetItem, QAbstractItemView
from PyQt5.QtCore import Qt
import datetime
from FaceRecognition_UI import Ui_MainWindow
# 忽略警告
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"
warnings.filterwarnings(action='ignore')
class Face_MainWindow(Ui_MainWindow):
def __init__(self, MainWindow):
self.path_face_dir = "../data/database_faces/"
self.fontC = ImageFont.truetype("./Font/platech.ttf", 14, 0)
self.cap_video = None # 视频流对象
self.path = getcwd()
self.video_path = getcwd()
self.timer_camera = QtCore.QTimer() # 定时器
self.timer_camera_load = QtCore.QTimer() # 载入相机定时器
self.timer_video = QtCore.QTimer() # 视频定时器
self.flag_timer = "" # 用于标记正在进行的功能项(视频/摄像)
self.CAM_NUM = 0 # 摄像头标号
self.cap = cv2.VideoCapture(self.CAM_NUM) # 屏幕画面对象
self.cap_video = None # 视频流对象
self.current_image = None # 当前的画面
self.current_face = None # 当前的人脸
self.setupUi(MainWindow) # 界面生成
self.retranslateUi(MainWindow) # 界面控件
self.resetUi()
self.slot_init() # 槽函数
self.count = 0
self.count_face = 0
self.col_row = []
# Dlib 正向人脸检测器
self.detector = dlib.get_frontal_face_detector()
self.predictor = dlib.shape_predictor('../data/data_dlib/shape_predictor_68_face_landmarks.dat')
self.face_reco_model = dlib.face_recognition_model_v1("../data/data_dlib"
"/dlib_face_recognition_resnet_model_v1.dat")
self.face_feature_exist = [] # 用来存放所有录入人脸特征的数组
self.face_name_exist = [] # 存储录入人脸名字
# 用来存储上一帧和当前帧 ROI 的质心坐标
self.last_centroid = []
self.current_centroid = []
# 用来存储上一帧和当前帧检测出目标的名字
self.last_face_name = []
self.current_face_name = []
# 上一帧和当前帧中人脸数的计数器
self.last_face_cnt = 0
self.current_face_cnt = 0
# 存储当前摄像头中捕获到的所有人脸的坐标名字
self.current_face_position = []
# 存储当前摄像头中捕获到的人脸特征
self.current_face_feature = []
self.reclassify_cnt = 0
self.reclassify_interval = 20
# 前后帧的距离
self.last_current_distance = 0
# 用来存放识别的距离
self.current_face_distance = []
self.exist_flag = None
def resetUi(self):
# 设置表格形式
self.tableWidget_rec.horizontalHeader().setVisible(True)
self.tableWidget_mana.horizontalHeader().setVisible(True)
self.tableWidget_rec.setColumnWidth(0, 80)
self.tableWidget_rec.setColumnWidth(1, 200)
self.tableWidget_rec.setColumnWidth(2, 150)
self.tableWidget_rec.setColumnWidth(3, 200)
self.tableWidget_rec.setColumnWidth(4, 120)
self.tableWidget_mana.setColumnWidth(0, 80)
self.tableWidget_mana.setColumnWidth(1, 350)
self.tableWidget_mana.setColumnWidth(2, 150)
self.tableWidget_mana.setColumnWidth(3, 150)
self.tableWidget_mana.setSelectionBehavior(QAbstractItemView.SelectRows)
self.tabWidget.setCurrentIndex(0)
self.tabWidget.setTabVisible(0, True)
self.tabWidget.setTabVisible(1, False)
self.tabWidget.setTabVisible(2, False)
# 设置初始取图和录入按钮不可用
self.toolButton_get_pic.setEnabled(False)
self.toolButton_load_pic.setEnabled(False)
self.toolButton_file_2.setEnabled(False)
self.toolButton_camera_load.setEnabled(False)
# 设置界面动画
self.gif_movie()
def gif_movie(self):
# 设置界面动画
gif = QMovie(':/newPrefix/images_test/face_rec.gif')
self.label_display.setMovie(gif)
self.label_display.setScaledContents(True)
gif.start()
def ini_value(self):
self.face_feature_exist = [] # 用来存放所有录入人脸特征的数组
self.face_name_exist = [] # 存储录入人脸名字
# 用来存储上一帧和当前帧 ROI 的质心坐标
self.last_centroid = []
self.current_centroid = []
# 用来存储上一帧和当前帧检测出目标的名字
self.last_face_name = []
self.current_face_name = []
# 上一帧和当前帧中人脸数的计数器
self.last_face_cnt = 0
self.current_face_cnt = 0
# 存储当前摄像头中捕获到的所有人脸的坐标名字
self.current_face_position = []
# 存储当前摄像头中捕获到的人脸特征
self.current_face_feature = []
self.reclassify_cnt = 0
self.reclassify_interval = 20
# 前后帧的距离
self.last_current_distance = 0
# 用来存放识别的距离
self.current_face_distance = []
def slot_init(self):
self.toolButton_run_load.clicked.connect(self.change_size_load)
self.toolButton_run_rec.clicked.connect(self.change_size_rec)
self.toolButton_run_manage.clicked.connect(self.change_size_mana)
self.toolButton_new_folder.clicked.connect(self.new_face_doing)
self.toolButton_file_2.clicked.connect(self.choose_file)
self.toolButton_get_pic.clicked.connect(self.get_img_doing)
self.toolButton_load_pic.clicked.connect(self.load_img_doing)
self.toolButton_file.clicked.connect(self.choose_rec_img)
self.toolButton_runing.clicked.connect(self.run_rec)
self.toolButton_camera.clicked.connect(self.button_open_camera_click)
self.timer_camera.timeout.connect(self.show_camera)
self.toolButton_video.clicked.connect(self.button_open_video_click)
self.timer_video.timeout.connect(self.show_video)
self.toolButton_camera_load.clicked.connect(self.button_open_camera_load)
self.timer_camera_load.timeout.connect(self.show_camera_load)
self.toolButton_mana_update.clicked.connect(self.do_update_face)
self.tableWidget_mana.cellPressed.connect(self.table_review)
self.toolButton_mana_delete.clicked.connect(self.delete_doing)
def choose_rec_img(self):
self.flag_timer = ""
# 选择图片或视频文件后执行此槽函数
self.timer_camera.stop()
self.timer_video.stop()
if self.cap:
self.cap.release()
if self.cap_video:
self.cap_video.release() # 释放视频画面帧
# 清除UI上的label显示
self.label_plate_result.setText("未知人脸")
self.label_score_fps.setText("0")
self.label_score_num.setText("0")
self.label_score_dis.setText("0")
# 清除文本框的显示内容
self.textEdit_camera.setText("实时摄像已关闭")
self.textEdit_camera.setStyleSheet("background-color: transparent;\n"
"border-color: rgb(0, 170, 255);\n"
"color: rgb(0, 170, 255);\n"
"font: regular 12pt \"华为仿宋\";")
self.textEdit_video.setText('实时视频已关闭')
self.textEdit_video.setStyleSheet("background-color: transparent;\n"
"border-color: rgb(0, 170, 255);\n"
"color: rgb(0, 170, 255);\n"
"font: regular 12pt \"华为仿宋\";")
self.label_display.clear()
# self.label_display.setStyleSheet("border-image: url(:/newPrefix/images_test/ini-image.png);")
self.gif_movie()
self.label_pic_newface.clear()
# 使用文件选择对话框选择图片
fileName_choose, filetype = QFileDialog.getOpenFileName(
self.centralwidget, "选取图片文件",
self.path, # 起始路径
"图片(*.jpg;*.jpeg;*.png)") # 文件类型
self.path = fileName_choose # 保存路径
if self.path != '':
self.flag_timer = "image"
self.textEdit_file.setText(self.path + '文件已选中')
self.textEdit_file.setStyleSheet("background-color: transparent;\n"
"border-color: rgb(0, 170, 255);\n"
"color: rgb(0, 170, 255);\n"
"font: regular 12pt \"华为仿宋\";")
image = self.cv_imread(self.path) # 读取选择的图片
# image = cv2.imread("../LicensePlateRecognition/test3.jpeg") # 读取选择的图片
image = cv2.resize(image, (500, 500)) # 设定图像尺寸为显示界面大小
if len(image.shape) < 3:
self.path = ''
self.label_display.setText("需要正常彩色图片,请重新选择!")
self.label_display.setStyleSheet("border-image: url(:/newPrefix/images_test/ini-image.png);")
self.gif_movie()
return
self.current_image = image.copy()
show = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# show = image.copy()
showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
a = QtGui.QPixmap.fromImage(showImage)
self.label_display.setPixmap(a)
self.label_display.setScaledContents(True)
QtWidgets.QApplication.processEvents()
else:
# 选择取消,恢复界面状态
self.flag_timer = ""
self.textEdit_file.setText('图片文件未选中')
self.textEdit_file.setStyleSheet("background-color: transparent;\n"
"border-color: rgb(0, 170, 255);\n"
"color: rgb(0, 170, 255);\n"
"font: regular 12pt \"华为仿宋\";")
def change_table(self, path, res, time_now, distance):
# 更新表格记录
self.count += 1 # 每识别出结果增加一条记录
if self.count > 6:
self.tableWidget_rec.setRowCount(self.count)
newItem = QTableWidgetItem(str(self.count)) # 在表格中记录序号
newItem.setTextAlignment(Qt.AlignCenter)
self.tableWidget_rec.setItem(self.count - 1, 0, newItem)
newItem = QTableWidgetItem(path) # 在表格中记录车牌路径
newItem.setTextAlignment(Qt.AlignVCenter)
self.tableWidget_rec.setItem(self.count - 1, 1, newItem)
newItem = QTableWidgetItem(res) # 记录识别出的车牌在表格中
newItem.setTextAlignment(Qt.AlignCenter)
self.tableWidget_rec.setItem(self.count - 1, 2, newItem)
self.tableWidget_rec.setCurrentItem(newItem)
newItem = QTableWidgetItem(time_now) # 记录识别出的车牌位置在表格中
newItem.setTextAlignment(Qt.AlignCenter)
self.tableWidget_rec.setItem(self.count - 1, 3, newItem)
self.tableWidget_rec.setCurrentItem(newItem)
newItem = QTableWidgetItem(str(round(distance, 4))) # 记录识别出的车牌置信度在表格中
newItem.setTextAlignment(Qt.AlignCenter)
self.tableWidget_rec.setItem(self.count - 1, 4, newItem)
self.tableWidget_rec.setCurrentItem(newItem)
🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅
点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻
更多推荐


所有评论(0)