基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】有报告

news2024/11/15 23:37:36

目的是利用YOLOV8这一先进的深度学习技术,开发一个自动化的学生上课行为检测系统。通过对上课行为数据集进行深入分析和标注,我们训练了YOLOV8模型,使其能够精确识别学生在课堂上的各种行为状态。这一系统能够实时监控并分析学生的行为,为教师提供即时反馈,帮助他们优化教学方法,提高课堂互动质量。基于此项目,设计了一个使用Pyqt5库来搭建页面展示系统。本系统支持的功能包括训练模型的导入、初始化;置信度与IOU阈值的调节、图像上传、检测、可视化结果展示、结果导出与结束检测;

项目名称

基于YOLO V8的学生上课行为检测系统

项目描述

本项目旨在开发一个学生上课行为检测系统,该系统使用YOLO V8深度学习模型进行行为识别,并通过PyQt5库构建用户界面来展示系统功能。用户可以通过该系统上传图片或视频文件进行检测,也可以使用摄像头进行实时检测。系统支持置信度与IOU阈值的调节,并能够展示检测结果、导出结果以及显示已检测目标的信息和位置。此外,系统还能够显示每次检测的推理用时。

关键功能
  1. 模型导入与初始化

    • 用户可以导入训练好的YOLO V8模型,并进行初始化设置。
  2. 参数调节

    • 允许用户调节检测的置信度阈值和IOU(Intersection over Union)阈值。
  3. 图像检测

    • 用户可以从本地上传图片文件进行行为检测。
    • 展示检测结果,并允许用户导出结果。
  4. 视频检测

    • 用户可以从本地上传视频文件进行行为检测。
    • 展示检测结果,并允许用户导出结果。
  5. 实时检测

    • 用户可以使用摄像头进行实时的行为检测。
    • 展示检测结果,并允许用户结束检测。
  6. 结果展示

    • 展示检测到的目标信息,包括类别、位置等。
    • 显示每次检测的推理用时。
  7. 用户界面

    • 使用PyQt5库构建用户友好的图形界面,方便用户操作。
技术栈
  • YOLO V8:用于行为识别的深度学习模型。
  • Python:项目的主要编程语言。
  • PyQt5:用于构建图形用户界面。
  • OpenCV:用于视频处理和图像处理。
  • Pandas:用于数据处理和结果导出。
关键代码示例

以下是一个简化的代码示例,展示如何使用YOLO V8进行学生上课行为检测,并通过PyQt5构建用户界面。

1. 模型导入与初始化

首先,加载YOLO V8模型,并定义一个函数来进行行为检测。

 
1import torch
2import cv2
3import numpy as np
4from PIL import Image
5import pandas as pd
6
7# 加载YOLO V8模型
8model = torch.hub.load('ultralytics/yolov5', 'custom', path='path/to/student_behavior_detection_model.pt')  # 请替换为你的模型路径
9
10def detect_behavior(image, conf_threshold=0.5, iou_threshold=0.45):
11    results = model(image, size=640)
12    results = results.pandas().xyxy[0]
13    results = results[(results['confidence'] > conf_threshold) & (results['iou'] > iou_threshold)]
14    return results
2. PyQt5用户界面

使用PyQt5构建用户界面,允许用户上传图片或视频文件,使用摄像头进行实时检测,并展示检测结果。

 

python

深色版本

1import sys
2from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QFileDialog, QLineEdit, QSlider, QSpinBox, QTableWidget, QTableWidgetItem, QCheckBox
3from PyQt5.QtGui import QImage, QPixmap
4from PyQt5.QtCore import QTimer, Qt
5
6class BehaviorDetectionApp(QMainWindow):
7    def __init__(self):
8        super().__init__()
9        self.setWindowTitle('Student Behavior Detection System')
10        self.setGeometry(100, 100, 1200, 800)
11        
12        self.central_widget = QWidget()
13        self.setCentralWidget(self.central_widget)
14        
15        self.layout = QVBoxLayout()
16        self.central_widget.setLayout(self.layout)
17        
18        self.image_label = QLabel()
19        self.layout.addWidget(self.image_label)
20        
21        self.result_table = QTableWidget()
22        self.result_table.setColumnCount(4)
23        self.result_table.setHorizontalHeaderLabels(['Class', 'Confidence', 'Position', 'Inference Time'])
24        self.layout.addWidget(self.result_table)
25        
26        self.conf_slider = QSlider(Qt.Horizontal)
27        self.conf_slider.setMinimum(0)
28        self.conf_slider.setMaximum(100)
29        self.conf_slider.setValue(50)
30        self.conf_slider.valueChanged.connect(self.conf_slider_changed)
31        self.layout.addWidget(self.conf_slider)
32        
33        self.iou_slider = QSlider(Qt.Horizontal)
34        self.iou_slider.setMinimum(0)
35        self.iou_slider.setMaximum(100)
36        self.iou_slider.setValue(45)
37        self.iou_slider.valueChanged.connect(self.iou_slider_changed)
38        self.layout.addWidget(self.iou_slider)
39        
40        self.image_button = QPushButton('Upload Image')
41        self.image_button.clicked.connect(self.upload_image)
42        self.layout.addWidget(self.image_button)
43        
44        self.video_button = QPushButton('Upload Video')
45        self.video_button.clicked.connect(self.upload_video)
46        self.layout.addWidget(self.video_button)
47        
48        self.camera_button = QPushButton('Use Camera')
49        self.camera_button.clicked.connect(self.use_camera)
50        self.layout.addWidget(self.camera_button)
51        
52        self.export_button = QPushButton('Export Results')
53        self.export_button.clicked.connect(self.export_results)
54        self.layout.addWidget(self.export_button)
55        
56        self.cap = None
57        self.timer = QTimer()
58        self.timer.timeout.connect(self.update_frame)
59        
60    def conf_slider_changed(self):
61        self.conf_threshold = self.conf_slider.value() / 100.0
62        
63    def iou_slider_changed(self):
64        self.iou_threshold = self.iou_slider.value() / 100.0
65        
66    def update_frame(self):
67        ret, frame = self.cap.read()
68        if ret:
69            results = detect_behavior(frame, self.conf_threshold, self.iou_threshold)
70            for index, row in results.iterrows():
71                x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
72                cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 2)
73                self.result_table.insertRow(self.result_table.rowCount())
74                self.result_table.setItem(self.result_table.rowCount()-1, 0, QTableWidgetItem(row['name']))
75                self.result_table.setItem(self.result_table.rowCount()-1, 1, QTableWidgetItem(str(row['confidence'])))
76                self.result_table.setItem(self.result_table.rowCount()-1, 2, QTableWidgetItem(f"({x1}, {y1}) - ({x2}, {y2})"))
77                self.result_table.setItem(self.result_table.rowCount()-1, 3, QTableWidgetItem(str(row['time'])))
78
79            # 将OpenCV图像转换为QPixmap以便在QLabel中显示
80            height, width, channel = frame.shape
81            bytes_per_line = 3 * width
82            q_img = QImage(frame.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped()
83            pixmap = QPixmap.fromImage(q_img)
84            self.image_label.setPixmap(pixmap)
85    
86    def upload_image(self):
87        file_name, _ = QFileDialog.getOpenFileName(self, 'Open Image File', '', 'Image Files (*.jpg *.jpeg *.png)')
88        if file_name:
89            img = cv2.imread(file_name)
90            results = detect_behavior(img, self.conf_threshold, self.iou_threshold)
91            for index, row in results.iterrows():
92                x1, y1, x2, y2 = int(row['xmin']), int(row['ymin']), int(row['xmax']), int(row['ymax'])
93                cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
94                self.result_table.insertRow(self.result_table.rowCount())
95                self.result_table.setItem(self.result_table.rowCount()-1, 0, QTableWidgetItem(row['name']))
96                self.result_table.setItem(self.result_table.rowCount()-1, 1, QTableWidgetItem(str(row['confidence'])))
97                self.result_table.setItem(self.result_table.rowCount()-1, 2, QTableWidgetItem(f"({x1}, {y1}) - ({x2}, {y2})"))
98                self.result_table.setItem(self.result_table.rowCount()-1, 3, QTableWidgetItem(str(row['time'])))
99
100            height, width, channel = img.shape
101            bytes_per_line = 3 * width
102            q_img = QImage(img.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped()
103            pixmap = QPixmap.fromImage(q_img)
104            self.image_label.setPixmap(pixmap)
105    
106    def upload_video(self):
107        file_name, _ = QFileDialog.getOpenFileName(self, 'Open Video File', '', 'Video Files (*.mp4 *.avi)')
108        if file_name:
109            self.cap = cv2.VideoCapture(file_name)
110            self.timer.start(30)  # 每30毫秒更新一次图像
111    
112    def use_camera(self):
113        self.cap = cv2.VideoCapture(0)  # 使用默认摄像头
114        self.timer.start(30)  # 每30毫秒更新一次图像
115    
116    def export_results(self):
117        results = []
118        for row in range(self.result_table.rowCount()):
119            class_name = self.result_table.item(row, 0).text()
120            confidence = self.result_table.item(row, 1).text()
121            position = self.result_table.item(row, 2).text()
122            inference_time = self.result_table.item(row, 3).text()
123            results.append([class_name, confidence, position, inference_time])
124        df = pd.DataFrame(results, columns=['Class', 'Confidence', 'Position', 'Inference Time'])
125        df.to_csv('detection_results.csv', index=False)
126    
127    def closeEvent(self, event):
128        if self.cap is not None:
129            self.cap.release()
130        self.timer.stop()
131        event.accept()
132
133if __name__ == '__main__':
134    app = QApplication(sys.argv)
135    window = BehaviorDetectionApp()
136    window.show()
137    sys.exit(app.exec_())

说明

  1. YOLO V8模型:确保已经加载了预训练的YOLO V8模型,并且该模型已经被训练用于识别学生上课行为。
  2. PyQt5 GUI:构建了一个用户友好的界面,允许用户选择使用摄像头或上传图片/视频文件进行检测。界面中包含一个用于显示摄像头流或上传文件的图像区域,一个用于展示检测结果的表格区域,以及用于调节置信度和IOU阈值的滑块。
  3. 视频处理:当用户选择使用摄像头或上传视频文件后,程序会读取视频流并通过YOLO V8模型进行行为检测。检测结果会在图像中标注出来,并在界面上展示。
  4. 结果导出:用户可以选择导出检测结果,结果将保存为CSV文件。

总结

此学生上课行为检测系统通过结合YOLO V8深度学习模型和PyQt5构建的GUI,实现了对学生上课行为的实时或离线检测。系统提供了用户友好的界面,使得用户可以方便地选择使用摄像头或上传图片/视频文件进行检测,并查看检测结果。该系统适用于多种应用场景,如教育监控、行为分析等。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从词到句,可以让你快速无忧看日文的翻译软件

不知道你喜欢看日漫吗,可能是身边的氛围吧,打小身边就很多这类的书籍。但是因为语言的问题基本都是把它当小人书了。但是现在看书就方便多了,有不少支持日语翻译的工具可以帮我们解决这个语言问题。 1.福昕在线翻译 链接直达>>https:…

『功能项目』事件中心【43】

我们打开上一篇42怪物的有限状态机的项目, 本章要做的事情是利用事件中心(和观察者模式相仿)将Update()函数中写的GameObject.Find()这些语句替换掉,因为在Update()函数中每帧的执行频率非常快,如果在Update()函数中写…

Centos入门必备基础知识

CentOS(Community ENTerprise Operating System)是一个开源的Linux发行版,基于Red Hat Enterprise Linux(RHEL)源代码构建。以下是CentOS入门必备的一些基础知识: 前言 本文由浪浪云赞助发布,…

设计模式 桥接模式(Bridge Pattern)

文章目录 桥接模式简绍桥接模式的核心概念包括以下几个部分:桥接模式的工作流程桥接模式优缺点桥接模式优点桥接模式缺点 UML图代码示例适用场景 桥接模式简绍 桥接模式(Bridge Pattern)是对象结构型设计模式中的一种,它将抽象与…

艾丽卡的区块链英语小课堂

系列文章目录 IT每日英语(三) 文章目录 系列文章目录前言1.principle2.efficient3.implement4.accumulated5,occupation6.phases7.validator8.nominated9.commissions10.significantly 前言 欢迎来到艾丽卡的区块链英语小课堂,在这里&…

650人微软员工被裁,动视暴雪制作团队调整,游戏行业风云再起

易采游戏网9月14日消息:微软宣布将裁员650人,这一消息在游戏行业引起了广泛的关注和讨论。此次裁员主要集中在微软的子公司动视暴雪,涉及到《魔兽大作战》和《使命召唤:战争地带》这两个备受瞩目的游戏团队。尽管裁员让很多玩家感…

基于python+django+vue的二手电子设备交易平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的二…

wget不管用的情况下,如何在centos中手动安装yum

wget不管用的情况下,如何在centos中手动安装yum 1、卸载python和yum2、手动下载需要的包3、更换yum源4、清理yum缓存,并生成新的缓存5、更新yum6、最后试试安装wget 问题背景,我在使用yum遇到了问题,想着重新安装一下,…

生成式人工智能(AIGC)对职业院校“云课堂”的赋能路径与价值边界

一、前言 随着教育技术的快速发展,生成式人工智能(Artificial Intelligence General Content, AIGC)正在成为推动教育改革的重要力量。生成式人工智能(AIGC)技术的应用,为职业院校的“云课堂”提供了新的教…

Oracle数据库软件的下载与安装步骤(适用于初学者)

目录 背景: 安装过程: 验证是否安装成功: 背景: Oracle,全程Oracle Corporation(甲骨文公司),是全球领先的企业级软件公司,其最著名的产品是Oracle数据库,Oracle数据库是一款关系型数据库系统(RDBMS)&am…

世界主要国家跨境数据流动的政策法规及其启示

文章目录 前言一、主要国家加强跨境数据流动的监管措施二、全球跨境数据流动的关键问题三、中国跨境数据流动治理的不足与对策前言 随着数据成为全球经济发展的战略资源,各国政府正积极构建安全有效的治理体系,以扩大数据的社会和经济效益,探讨世界主要国家跨境数据流动的政…

LeetCode题练习与总结:翻转二叉树--226

一、题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1…

可维护性例题2

答案:C 解析: 选项A 维护性是软件质量的重要指标 选项B 软件开发受软件开发文档因素影响,因此受开发文档影响 选项C 维护占软件开发的比较长的时期 选项D 说法正确

【Python爬虫系列】_020.异步协程asyncio

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈…

水壶问题00

题目链接 水壶问题 题目描述 注意点 1 < x, y, target < 1000 解答思路 首先想到的是深度优先遍历&#xff0c;对于任意一个状态&#xff0c;可以有以下六种操作&#xff1a; 将x水壶中的水倒空将y水壶中的水倒空将x水壶灌满将y水壶灌满将x水壶中的水倒给y水壶&…

Leetcode3275. 第 K 近障碍物查询

Every day a Leetcode 题目来源&#xff1a;3275. 第 K 近障碍物查询 解法1&#xff1a;大根堆 维护前 k 小元素&#xff0c;可以用最大堆。 遍历数组 queries&#xff0c;计算点 (x,y) 到原点的曼哈顿距离 d∣x∣∣y∣。 把 d 入堆&#xff0c;如果堆大小超过 k&#xff…

OpenAI o1来是来了,但...

北京时间昨天凌晨&#xff0c;OpenAI正式发布了o1&#xff0c;这次来是来了&#xff0c;但...结合前一阵的思考和环境&#xff0c;说一下自己的感想吧&#xff1a; Ⅰ. 感觉OpenAI要有朝着Close一条道走到黑的趋势了..且看起来Close的很蹩脚(原因见下)&#xff0c;在这种Close下…

杂七杂八-部署框架

杂七杂八-部署框架 docker docker dockerhub&#xff1a;Docker发布/上传镜像到dockerhub&&下载/拉取镜像&&删除dockerhub镜像 仅个人笔记使用&#xff0c;感谢点赞关注 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注与支持&…

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b

ModuleNotFoundError: No module named ‘transformers_modules.chatglm2-6b 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武…

基于python+django+vue的农业管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的农…