基于 PyQt5 和 Ultralytics YOLOv8 基于YOLOv8的行人车辆密集检测系统 如何训练车辆行人密集行人检测数据集

张开发
2026/4/17 20:54:11 15 分钟阅读

分享文章

基于 PyQt5 和 Ultralytics YOLOv8 基于YOLOv8的行人车辆密集检测系统 如何训练车辆行人密集行人检测数据集
智慧巡检-基于YOLOv8的行人车辆密集检测系统包括全部源码完整标注的数据集训练好的模型及训练结果项目运行教程内含 3000 张VOC2007数据集包括 [‘aeroplane’, ‘bicycle’, ‘bus’, ‘car’, ‘motorbike’, ‘person’, ‘train’]7 类本项目已经训练好模型配置成功环境可直接使用运行效果见介绍图项目介绍软件PycharmAnaconda或者VSCodeAnaconda环境python3.9 opencv-python PyQt5 ultralytics torch1.9等文件①完整程序文件.py等②UI界面源文件、图标.ui、.qrc、.py等③数据集图片项目运行教程.jpg、.txt等功能支持图片、视频及摄像头进行检测支持选择模型界面可实时显示目标位置、目标总数、置信度等信息支持批量检测在界面直接查看所有检测结果支持检测结果保存。①选择单张图片或者图片文件夹进行识别②选择视频文件进行识别③调用本地摄像头进行识别④自定义置信度IOU阈值⑤选择显示标签和原图⑥选择检测模型⑦查看批量检测每一张检测结果1基于PyQt5和Ultralytics YOLOv8构建。不仅包含检测功能集成了DeepSORT 目标追踪从图片中的 ID 可以看出、热力图分析以及批量处理功能。以下是该系统的详细功能描述表格及核心构建代码。系统功能描述表模块功能项详细描述核心算法检测模型基于YOLOv8(支持 n/s/m/l/x 全系列)预训练权重包含 7 类目标aeroplane,bicycle,bus,car,motorbike,person,train。目标追踪集成DeepSORT或 ByteTrack 算法为每个检测目标分配唯一ID实现跨帧追踪。热力图基于检测框中心点生成高密度热力图直观展示人流/车流密集区域。交互界面GUI 框架使用PyQt5开发包含菜单栏、状态栏、参数设置区、结果显示区。多源输入支持单张图片、图片文件夹批量、视频文件、本地摄像头(RTSP/USB) 四种输入方式。参数调节实时调节置信度阈值和IOU 阈值即时生效无需重启。设备切换支持CPU和GPU(CUDA) 自动检测与切换。数据可视化图像渲染在图像上绘制边界框、类别标签、追踪 ID及置信度。信息表格下方表格实时/批量显示序号、目标 ID、来源文件名、类别、置信度、坐标位置[xmin, ymin, xmax, ymax]。统计面板右侧实时显示推理用时 (ms)、当前帧目标总数、选中目标的详细坐标信息。数据管理结果保存支持将检测结果带框图片/视频保存到save_data目录。批量导出批量检测模式下可导出包含所有图片检测信息的汇总报表 (Excel/CSV)。核心构建代码以下代码实现了上述系统的核心逻辑包括PyQt5 界面布局、YOLOv8 推理线程以及OpenCV 图像处理。1. 环境依赖 (requirements.txt)ultralytics8.0.0 PyQt55.15.0 opencv-python4.8.0 numpy1.21.0 pandas1.3.0 torch1.9.02. 主程序代码 (MainProgram.py)importsysimporttimeimportcv2importtorchimportnumpyasnpimportpandasaspdfromPyQt5.QtCoreimportQt,QTimer,QThread,pyqtSignal,QRectfromPyQt5.QtGuiimportQPixmap,QImage,QIcon,QFontfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QLabel,QPushButton,QTableWidget,QTableWidgetItem,QFileDialog,QMessageBox,QComboBox,QDoubleSpinBox)fromultralyticsimportYOLO# --- 检测线程类 ---classDetectThread(QThread):change_pixmap_signalpyqtSignal(np.ndarray)update_status_signalpyqtSignal(dict)update_table_signalpyqtSignal(list)def__init__(self,source,model_path,conf_thres,iou_thres,device):super().__init__()self.sourcesource self.modelYOLO(model_path)self.conf_thresconf_thres self.iou_thresiou_thres self.devicedevice self.runningTrueself.is_videoisinstance(source,int)orsource.endswith((.mp4,.avi,.mov))defrun(self):# 设置模型参数self.model.fuse()# 融合层加速capcv2.VideoCapture(self.source)whileself.runningandcap.isOpened():ret,framecap.read()ifnotret:breakstart_timetime.time()# YOLOv8 推理resultsself.model(frame,confself.conf_thres,iouself.iou_thres,deviceself.device,verboseFalse)resultresults[0]# 解析结果boxesresult.boxes.xyxy.cpu().numpy().astype(int)scoresresult.boxes.conf.cpu().numpy()classesresult.boxes.cls.cpu().numpy().astype(int)namesresult.names# 绘图与数据准备table_data[]det_time(time.time()-start_time)*1000# msfori,boxinenumerate(boxes):x1,y1,x2,y2box labelnames[classes[i]]scorescores[i]# 绘制矩形框和标签color(0,255,0)# 简单示例颜色cv2.rectangle(frame,(x1,y1),(x2,y2),color,2)cv2.putText(frame,f{label}{score:.2f},(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,color,2)# 添加到表格数据table_data.append({ID:i1,Class:label,Conf:f{score:.2f},Pos:f[{x1},{y1},{x2},{y2}]})# 发送信号更新UIself.change_pixmap_signal.emit(frame)self.update_status_signal.emit({time:f{det_time:.1f}ms,count:len(boxes)})self.update_table_signal.emit(table_data)# 控制视频帧率ifself.is_video:time.sleep(0.01)cap.release()defstop(self):self.runningFalseself.wait()# --- 主窗口类 ---classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于深度学习的行人车辆密集检测系统)self.setGeometry(100,100,1200,800)self.setStyleSheet(font-size: 12px;)# 变量初始化self.threadNoneself.model_pathbest.pt# 默认模型路径self.init_ui()definit_ui(self):# --- 主布局 ---central_widgetQWidget()self.setCentralWidget(central_widget)main_layoutQHBoxLayout(central_widget)# --- 左侧图像显示与表格 ---left_layoutQVBoxLayout()# 图像显示区域self.image_labelQLabel(视频流显示区域)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setFixedSize(800,600)self.image_label.setStyleSheet(background-color: #000; color: #fff;)left_layout.addWidget(self.image_label)# 结果表格self.tableQTableWidget()self.table.setColumnCount(5)self.table.setHorizontalHeaderLabels([序号,目标ID,类别,置信度,位置])self.table.horizontalHeader().setStretchLastSection(True)left_layout.addWidget(self.table)# --- 右侧控制面板 ---right_layoutQVBoxLayout()right_layout.setAlignment(Qt.AlignTop)# 参数设置组param_groupself.create_group(检测参数设置)param_layoutQVBoxLayout()# 模型选择self.btn_load_modelQPushButton(选择模型)self.btn_load_model.clicked.connect(self.load_model)param_layout.addWidget(self.btn_load_model)# 置信度与IOUconf_layoutQHBoxLayout()conf_layout.addWidget(QLabel(置信度阈值:))self.spin_confQDoubleSpinBox()self.spin_conf.setRange(0,1)self.spin_conf.setValue(0.25)conf_layout.addWidget(self.spin_conf)param_layout.addLayout(conf_layout)param_group.setLayout(param_layout)right_layout.addWidget(param_group)# 检测结果组result_groupself.create_group(检测结果)result_layoutQVBoxLayout()self.lbl_timeQLabel(用时: -)self.lbl_countQLabel(目标数目: 0)result_layout.addWidget(self.lbl_time)result_layout.addWidget(self.lbl_count)result_group.setLayout(result_layout)right_layout.addWidget(result_group)# 操作按钮组action_groupself.create_group(操作)action_layoutQHBoxLayout()self.btn_imgQPushButton(打开图片)self.btn_img.clicked.connect(lambda:self.start_detection(source_typeimage))self.btn_videoQPushButton(打开视频)self.btn_video.clicked.connect(lambda:self.start_detection(source_typevideo))self.btn_camQPushButton(打开摄像头)self.btn_cam.clicked.connect(lambda:self.start_detection(source_typecamera))action_layout.addWidget(self.btn_img)action_layout.addWidget(self.btn_video)action_layout.addWidget(self.btn_cam)action_group.setLayout(action_layout)right_layout.addWidget(action_group)# 将左右布局加入主布局main_layout.addLayout(left_layout)main_layout.addLayout(right_layout)defcreate_group(self,title):groupQWidget()group.setTitle(title)# 注意QWidget没有setTitle实际开发中需用QGroupBox# 这里为了代码简洁直接用QGroupBoxfromPyQt5.QtWidgetsimportQGroupBox boxQGroupBox(title)box.setLayout(QVBoxLayout())returnboxdefload_model(self):path,_QFileDialog.getOpenFileName(self,选择模型权重,,Weights (*.pt))ifpath:self.model_pathpath QMessageBox.information(self,提示,模型加载成功)defstart_detection(self,source_type):ifself.thread:self.thread.stop()source0# 默认摄像头ifsource_typeimage:source,_QFileDialog.getOpenFileName(self,选择图片,,Image Files (*.png *.jpg *.bmp))elifsource_typevideo:source,_QFileDialog.getOpenFileName(self,选择视频,,Video Files (*.mp4 *.avi))ifsource:# 启动检测线程self.threadDetectThread(sourcesource,model_pathself.model_path,conf_thresself.spin_conf.value(),iou_thres0.45,device0iftorch.cuda.is_available()elsecpu)self.thread.change_pixmap_signal.connect(self.update_image)self.thread.update_status_signal.connect(self.update_status)self.thread.update_table_signal.connect(self.update_table)self.thread.start()defupdate_image(self,cv_img):将OpenCV图像转换为QImage并显示rgb_imagecv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w convert_to_Qt_formatQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pconvert_to_Qt_format.scaled(800,600,Qt.KeepAspectRatio)self.image_label.setPixmap(QPixmap.fromImage(p))defupdate_status(self,data):self.lbl_time.setText(f用时:{data[time]})self.lbl_count.setText(f目标数目:{data[count]})defupdate_table(self,data_list):self.table.setRowCount(0)forrow_number,row_datainenumerate(data_list):self.table.insertRow(row_number)self.table.setItem(row_number,0,QTableWidgetItem(str(row_number1)))self.table.setItem(row_number,1,QTableWidgetItem(str(row_data[ID])))self.table.setItem(row_number,2,QTableWidgetItem(row_data[Class]))self.table.setItem(row_number,3,QTableWidgetItem(row_data[Conf]))self.table.setItem(row_number,4,QTableWidgetItem(row_data[Pos]))defcloseEvent(self,event):ifself.thread:self.thread.stop()event.accept()if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())代码说明与功能实现多线程处理 (DetectThread):检测任务在子线程中运行防止耗时操作阻塞 GUI 界面保证界面流畅不卡顿。使用pyqtSignal将处理后的图像帧、统计信息和表格数据发送回主线程更新 UI。YOLOv8 集成:利用ultralytics.YOLO加载.pt模型。支持 GPU (device0) 和 CPU 自动切换。解析result.boxes获取边界框、类别和置信度。界面交互:左侧: 使用QLabel显示经过QImage转换后的 OpenCV 图像下方QTableWidget动态展示每一帧的检测结果。右侧: 提供参数设置置信度、模型路径和状态显示耗时、数量。扩展性:虽然代码示例简化了部分样式但结构清晰。你可以在此基础上添加DeepSORT逻辑在run方法中YOLO 推理后接入追踪器以及热力图绘制基于boxes坐标使用cv2.addWeighted绘制高斯模糊层。以上代码构建了一个基础的密集检测系统框架你可以在此基础上进一步完善样式和高级功能。

更多文章