文末获取完整源码+数据集+源码说明+配置跑通说明+配套论文+远程操作跑通程序等

在这里插入图片描述
在这里插入图片描述


效果展示

基于深度学习YOLOv8+PyQt5的人脸检测识别系统设计

在这里插入图片描述

各文件说明

在这里插入图片描述


随着人工智能技术的飞速发展,深度学习在图像处理领域取得了显著的成就,尤其是在人脸检测方面。人脸检测作为计算机视觉领域的一个重要分支,其应用广泛,包括但不限于安全监控、人机交互、智能视频分析等。本文提出了一种基于深度学习的人脸检测系统,该系统采用最新的YOLOv8算法作为核心检测模型,并利用PyQt5框架构建了用户友好的图形用户界面(GUI)。YOLOv8算法以其高效的检测速度和较高的准确率在实时人脸检测领域具有明显优势,而PyQt5则为系统提供了一个直观、交互性强的操作界面。

本文首先介绍了人脸检测技术的发展历程和深度学习在该领域的应用,并对YOLO系列算法进行了综述。接着,详细阐述了系统的设计方案,包括系统架构、数据预处理、模型设计以及界面设计。在系统实现部分,描述了环境搭建、模型训练、界面实现以及系统测试的过程。通过实验,验证了所提系统在不同场景下的人脸检测性能,包括检测精度、速度和模型的泛化能力。实验结果表明,该系统在保持较高检测准确率的同时,能够实现快速的检测速度,满足实时人脸检测的需求。最后,本文总结了研究成果,并对未来的研究方向进行了展望。该研究不仅为实时人脸检测提供了一种有效的解决方案,也为深度学习在计算机视觉领域的应用提供了新的视角。

在这里插入图片描述

系统开发流程图

在这里插入图片描述

数据集

在这里插入图片描述
处理完成的数据集规模相当庞大,总共有13624张图片用于模型的训练阶段,而为了评估模型的泛化能力,还特别划分了1587张图片用于验证集,以及1607张图片用于测试集。这些图片涵盖了人脸数据集中的复杂场景,包括了白天、夜间、室内、室外、公众场所等多种环境,图片中既有单人也有多人,确保了数据集的多样性和复杂性。在这些图片中,检测的类别专注于“face”(人脸),数据集中包含了超过169538个人脸目标,这为训练一个精准的人脸检测模型提供了丰富的样本。通过分析图3.3左上角的图表,我们可以看到face类别的样本数量非常充足,这有助于模型学习到不同情况下的人脸特征。而图3.3右上角的图表则展示了训练集中边界框的大小分布以及相应数量,这有助于我们了解人脸目标在图片中的尺寸变化,以及不同尺寸目标的频率。这些信息对于模型在处理不同大小的人脸时的准确性至关重要。图3.3左下角的图表描述了边界框中心点在图像中的位置分布情况,这有助于我们了解人脸在图片中的位置分布,是否均匀分布,或者倾向于集中在图片的某个区域。这对于模型在不同位置都能准确检测到人脸非常关键。最后,图3.3右下角的图表反映了训练集中目标高宽比例的分布状况,了解人脸目标的高宽比例分布对于模型的准确性至关重要,因为不同角度和姿态的人脸可能会导致不同的高宽比。
在这里插入图片描述
另外,数据集中存在许多较小的目标,占比约为97.68%,而中小型目标占比则达到了99.65%,各尺寸目标大小定义及具体数量如图3.4所示,横坐标为目标尺寸,纵坐标为目标的数量。在这种情况下,可以通过增加专门的小目标检测头,以增强模型对细小目标的识别能力,或者添加注意力机制,增强了模型对小目标的关注,提高了检测精度等。总之,在解决目标检测问题时,需要针对数据集中的具体情况进行相应的处理和优化,以提高模型的检测准确率和性能。
在这里插入图片描述

模型指标

在这里插入图片描述
在这里插入图片描述

系统功能结构

主要包括文件导入模块、检测模块、检测结果选择模块、检测结果表格模块和操作模块,共五大模块。文件导入模块负责让用户选择检测源,用户可以跟进需求选择检测图片、视频或开启视像头实时检测。检测模块则是核心模块,其通过加载训练好的深度学习模型对预处理过的检测源进行推理,在检测源上绘制目标推理框,并在系统界面的中心区域显示出来供用户参考。检测结果模块则是考虑到推理结果可能包含多个目标,用户可以通过该模块快速选择并定位到该目标,查看该推理目标的类型、置信度、位置坐标信息等,除此之外,该模块还统计了模型对本次检测源检测用时和检测结果中目标数量。检测结果表格模块则是以表格的形式记录了每个检测源的文件路径和每个目标的置信度等信息。用户通过点击操作模块中的“保存”,可以将本次检测结果保存至该项目目录下的Save_data文件夹里;“关闭”则是将该系统关闭。
在这里插入图片描述
在这里插入图片描述

部分源码

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(QMainWindow, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.initMain()
        self.signalconnect()

        # 加载css渲染效果
        style_file = 'UIProgram/style.css'
        qssStyleSheet = QSSLoader.read_qss_file(style_file)
        self.setStyleSheet(qssStyleSheet)

    def signalconnect(self):
        self.ui.PicBtn.clicked.connect(self.open_img)
        self.ui.comboBox.activated.connect(self.combox_change)
        self.ui.VideoBtn.clicked.connect(self.vedio_show)
        self.ui.CapBtn.clicked.connect(self.camera_show)
        self.ui.SaveBtn.clicked.connect(self.save_detect_video)
        self.ui.ExitBtn.clicked.connect(QCoreApplication.quit)
        self.ui.FilesBtn.clicked.connect(self.detact_batch_imgs)

    def initMain(self):
        self.show_width = 770
        self.show_height = 480

        self.org_path = None

        self.is_camera_open = False
        self.cap = None

        # self.device = 0 if torch.cuda.is_available() else 'cpu'

        # 加载检测模型
        self.model = YOLO(Config.model_path, task='detect')
        self.model(np.zeros((48, 48, 3)))  #预先加载推理模型
        self.fontC = ImageFont.truetype("Font/platech.ttf", 25, 0)

        # 用于绘制不同颜色矩形框
        self.colors = tools.Colors()

        # 更新视频图像
        self.timer_camera = QTimer()

        # 更新检测信息表格
        # self.timer_info = QTimer()
        # 保存视频
        self.timer_save_video = QTimer()

        # 表格
        self.ui.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)
        self.ui.tableWidget.verticalHeader().setDefaultSectionSize(40)
        self.ui.tableWidget.setColumnWidth(0, 80)  # 设置列宽
        self.ui.tableWidget.setColumnWidth(1, 200)
        self.ui.tableWidget.setColumnWidth(2, 150)
        self.ui.tableWidget.setColumnWidth(3, 90)
        self.ui.tableWidget.setColumnWidth(4, 230)
        self.ui.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)  # 设置表格整行选中
        self.ui.tableWidget.verticalHeader().setVisible(False)  # 隐藏列标题
        self.ui.tableWidget.setAlternatingRowColors(True)  # 表格背景交替


    def open_img(self):
        if self.cap:
            # 打开图片前关闭摄像头
            self.video_stop()
            self.is_camera_open = False
            self.ui.CaplineEdit.setText('摄像头未开启')
            self.cap = None

        # 弹出的窗口名称:'打开图片'
        # 默认打开的目录:'./'
        # 只能打开.jpg与.gif结尾的图片文件
        # file_path, _ = QFileDialog.getOpenFileName(self.ui.centralwidget, '打开图片', './', "Image files (*.jpg *.gif)")
        file_path, _ = QFileDialog.getOpenFileName(None, '打开图片', './', "Image files (*.jpg *.jepg *.png)")
        if not file_path:
            return

        self.ui.comboBox.setDisabled(False)
        self.org_path = file_path
        self.org_img = tools.img_cvread(self.org_path)

        # 目标检测
        t1 = time.time()
        self.results = self.model(self.org_path)[0]
        t2 = time.time()
        take_time_str = '{:.3f} s'.format(t2 - t1)
        self.ui.time_lb.setText(take_time_str)

        location_list = self.results.boxes.xyxy.tolist()
        self.location_list = [list(map(int, e)) for e in location_list]
        cls_list = self.results.boxes.cls.tolist()
        self.cls_list = [int(i) for i in cls_list]
        self.conf_list = self.results.boxes.conf.tolist()
        self.conf_list = ['%.2f %%' % (each*100) for each in self.conf_list]

        now_img = self.results.plot()
        self.draw_img = now_img
        # 获取缩放后的图片尺寸
        self.img_width, self.img_height = self.get_resize_size(now_img)
        resize_cvimg = cv2.resize(now_img,(self.img_width, self.img_height))
        pix_img = tools.cvimg_to_qpiximg(resize_cvimg)
        self.ui.label_show.setPixmap(pix_img)
        self.ui.label_show.setAlignment(Qt.AlignCenter)
        # 设置路径显示
        self.ui.PiclineEdit.setText(self.org_path)

        # 目标数目
        target_nums = len(self.cls_list)
        self.ui.label_nums.setText(str(target_nums))

        # 设置目标选择下拉框
        choose_list = ['全部']
        target_names = [Config.names[id]+ '_'+ str(index) for index,id in enumerate(self.cls_list)]
        # object_list = sorted(set(self.cls_list))
        # for each in object_list:
        #     choose_list.append(Config.CH_names[each])
        choose_list = choose_list + target_names

        self.ui.comboBox.clear()
        self.ui.comboBox.addItems(choose_list)

        if target_nums >= 1:
            self.ui.type_lb.setText(Config.CH_names[self.cls_list[0]])
            self.ui.label_conf.setText(str(self.conf_list[0]))
        #   默认显示第一个目标框坐标
        #   设置坐标位置值
            self.ui.label_xmin.setText(str(self.location_list[0][0]))
            self.ui.label_ymin.setText(str(self.location_list[0][1]))
            self.ui.label_xmax.setText(str(self.location_list[0][2]))
            self.ui.label_ymax.setText(str(self.location_list[0][3]))
        else:
            self.ui.type_lb.setText('')
            self.ui.label_conf.setText('')
            self.ui.label_xmin.setText('')
            self.ui.label_ymin.setText('')
            self.ui.label_xmax.setText('')
            self.ui.label_ymax.setText('')

        # # 删除表格所有行
        self.ui.tableWidget.setRowCount(0)
        self.ui.tableWidget.clearContents()
        self.tabel_info_show(self.location_list, self.cls_list, self.conf_list,path=self.org_path)

点击下方小卡片,那边对话框发送“资源”两个字

获取完整源码+数据集+源码说明+配置跑通说明+配套论文+远程操作跑通程序等

更多推荐