news 2026/8/6 8:38:31

基于YOLOv8与PyQt5的深度学习密集人群检测与计数系统研究

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于YOLOv8与PyQt5的深度学习密集人群检测与计数系统研究

基于深度学习YOLOv8+PyQt5的密集人群人体检测识别计数系统

文章目录

      • 1. 环境搭建
        • 安装依赖
      • 2. 数据准备
        • 数据集结构
      • 3. 模型训练
        • 训练配置文件
        • 训练模型
      • 4. 界面设计与结果展示
        • 设计界面
        • 主程序代码
      • 5. 运行与测试
      • 推理代码
      • 配置超参数
      • 模型推理
      • 性能评估代码
        • mAP计算
        • 自定义评估脚本

技术栈:目标检测、深度学习、PyTorch、YOLOv8、Python、PyQt5
使用的工具:Anaconda、PyCharm、Qt Designer、Labelimg

识别3类:人体(Person)、骑行者(Rider)、被遮挡的人(ObscuredPerson)

数量9000张标注好的数据集,如何训练?、包含3种目标对象(人体(Person)、骑行者(Rider)、被遮挡的人(ObscuredPerson))

构建一个基于深度学习YOLOv8和PyQt5的密集人群人体检测识别计数系统是一个涉及多个步骤的过程,包括数据准备、模型训练、界面设计和结果展示等。以下是详细的步骤和代码示例。

1. 环境搭建

环境已经安装了必要的库和工具。这里以Anaconda和PyCharm为例。

安装依赖
# 创建并激活虚拟环境conda create-ncrowd_detectionpython=3.8conda activate crowd_detection# 安装YOLOv8和相关库pipinstallultralytics pipinstallPyQt5 pipinstallopencv-python

2. 数据准备

收集和标注9000张包含人体(Person)、骑行者(Rider)和被遮挡的人(ObscuredPerson)的数据集。使用Labelimg进行标注,并将标注文件保存为YOLO格式。

数据集结构
dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/

3. 模型训练

使用YOLOv8进行模型训练。

训练配置文件

创建一个crowd.yaml文件,定义数据集和类别信息。

train:dataset/images/trainval:dataset/images/valtest:dataset/images/testnc:3names:['Person','Rider','ObscuredPerson']
训练模型

使用以下命令进行模型训练。

yolo trainmodel=yolov8s.yamldata=crowd.yamlepochs=100imgsz=640

4. 界面设计与结果展示

使用PyQt5设计用户界面,并展示检测结果。

设计界面

使用Qt Designer设计界面,并导出为.ui文件,然后使用pyuic5转换为Python代码。

pyuic5-xyour_design.ui-oui_design.py
主程序代码
importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QFileDialogfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQTimerimportcv2fromultralyticsimportYOLOimportnumpyasnpfromui_designimportUi_MainWindowclassCrowdDetectionApp(QMainWindow,Ui_MainWindow):def__init__(self):super().__init__()self.setupUi(self)self.model=YOLO('best.pt')# 加载训练好的模型self.loadImageButton.clicked.connect(self.load_image)self.loadVideoButton.clicked.connect(self.load_video)self.startCameraButton.clicked.connect(self.start_camera)self.saveButton.clicked.connect(self.save_results)self.exitButton.clicked.connect(self.close)self.timer=QTimer()self.timer.timeout.connect(self.update_frame)self.cap=Nonedefload_image(self):file_name,_=QFileDialog.getOpenFileName(self,"选择图片文件","","Images (*.png *.xpm *.jpg)")iffile_name:self.detect_and_show(file_name)defload_video(self):file_name,_=QFileDialog.getOpenFileName(self,"选择视频文件","","Videos (*.mp4 *.avi)")iffile_name:self.cap=cv2.VideoCapture(file_name)self.timer.start(30)defstart_camera(self):self.cap=cv2.VideoCapture(0)self.timer.start(30)defupdate_frame(self):ret,frame=self.cap.read()ifret:results=self.model(frame)annotated_frame=results[0].plot()height,width,channel=annotated_frame.shape bytes_per_line=3*width q_img=QImage(annotated_frame.data,width,height,bytes_per_line,QImage.Format_RGB888)self.imageLabel.setPixmap(QPixmap.fromImage(q_img))defdetect_and_show(self,file_path):image=cv2.imread(file_path)results=self.model(image)annotated_image=results[0].plot()height,width,channel=annotated_image.shape bytes_per_line=3*width q_img=QImage(annotated_image.data,width,height,bytes_per_line,QImage.Format_RGB888)self.imageLabel.setPixmap(QPixmap.fromImage(q_img))self.show_results(results)defshow_results(self,results):forresultinresults:boxes=result.boxesforboxinboxes:class_id=int(box.cls[0])confidence=float(box.conf[0])x1,y1,x2,y2=map(int,box.xyxy[0])self.resultTable.insertRow(self.resultTable.rowCount())row=self.resultTable.rowCount()-1self.resultTable.setItem(row,0,QTableWidgetItem(str(class_id)))self.resultTable.setItem(row,1,QTableWidgetItem(f'{confidence:.2f}'))self.resultTable.setItem(row,2,QTableWidgetItem(f'({x1},{y1}) ({x2},{y2})'))defsave_results(self):file_name,_=QFileDialog.getSaveFileName(self,"保存结果","","Text Files (*.txt)")iffile_name:withopen(file_name,'w')asf:forrowinrange(self.resultTable.rowCount()):class_id=self.resultTable.item(row,0).text()confidence=self.resultTable.item(row,1).text()bbox=self.resultTable.item(row,2).text()f.write(f'{class_id}{confidence}{bbox}\n')if__name__=='__main__':app=QApplication(sys.argv)window=CrowdDetectionApp()window.show()sys.exit(app.exec_())

5. 运行与测试

文字及代码仅供参考。

如何实现推理代码、配置超参数、批量推理以及性能评估。以下是这些方面的详细说明和代码示例。

推理代码

首先,确保你已经训练好了一个YOLOv8模型,并将其保存为best.pt。接下来,我们将编写用于加载模型并进行推理的代码。

fromultralyticsimportYOLOimportcv2# 加载预训练模型model=YOLO('best.pt')# 单张图片推理definfer_image(image_path):results=model(image_path)annotated_frame=results[0].plot()returnannotated_frame# 视频或摄像头推理definfer_video(video_path=0):# 如果是摄像头,video_path设为0cap=cv2.VideoCapture(video_path)whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=model(frame)annotated_frame=results[0].plot()cv2.imshow('YOLOv8 Inference',annotated_frame)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()

配置超参数

在训练过程中,可以通过修改配置文件来设置超参数。以下是一些常见的超参数及其说明:

  • epochs: 训练周期数,默认值通常为100。
  • batch: 批处理大小,默认值取决于你的硬件能力。
  • imgsz: 输入图像尺寸,默认640像素。可以根据需要调整以提高性能或精度。
  • lr0: 初始学习率,默认值通常为0.01。

例如,在命令行中使用如下命令进行训练:

yolo trainmodel=yolov8s.yamldata=crowd.yamlepochs=100imgsz=640batch=16lr0=0.01

模型推理

我们已经在前面提供了基本的推理函数。对于批量推理,可以遍历目录中的所有图片文件,并对每个文件调用infer_image函数。

importosdefbatch_infer_images(directory):forfilenameinos.listdir(directory):iffilename.endswith(".jpg")orfilename.endswith(".png"):image_path=os.path.join(directory,filename)annotated_frame=infer_image(image_path)cv2.imwrite(f"output_{filename}",annotated_frame)

性能评估代码

性能评估主要包括准确率(Precision)、召回率(Recall)、F1分数等指标。YOLOv8可以直接提供一些评估指标,如mAP(mean Average Precision)。

mAP计算

YOLOv8自带评估功能,可以在验证集上计算mAP。

yolo valmodel=best.ptdata=crowd.yamlimgsz=640
自定义评估脚本

如果你想要更详细的评估指标,比如针对特定类别的准确率和召回率,可以编写自定义脚本。

fromsklearn.metricsimportprecision_recall_fscore_supportdefevaluate_model(model,dataset):all_preds=[]all_labels=[]forimages,labelsindataset:preds=model(images)pred_classes=[int(pred.cls[0])forpredinpreds]true_classes=labels.numpy().flatten()all_preds.extend(pred_classes)all_labels.extend(true_classes)precision,recall,f1,_=precision_recall_fscore_support(all_labels,all_preds,average='weighted')print(f'Precision:{precision:.2f}, Recall:{recall:.2f}, F1 Score:{f1:.2f}')

根据实际需求调整上述代码段,可以帮助你更好地完成项目目标。仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 8:37:47

从PCI到CXL:PCIE串行总线演进、架构解析与实战选型指南

1. 从并行到串行:PCIE的诞生背景与核心驱动力 如果你在2000年初组装过电脑,一定对主板上那些长短不一的插槽印象深刻——AGP插槽专供显卡,PCI插槽留给声卡、网卡,还有更古老的ISA插槽。那个时代,每个设备几乎都有自己专…

作者头像 李华
网站建设 2026/8/6 8:34:31

DSP技术解析:从原理到实践,掌握空间多靶点定量分析

1. 项目概述:从“看见”到“看懂”的空间生物学革命如果你在肿瘤研究、神经科学或者免疫学领域深耕过,就会深刻体会到传统组学技术的一个巨大痛点:我们得到了海量的基因或蛋白表达数据,却不知道这些信号具体来自组织样本的哪个位置…

作者头像 李华
网站建设 2026/8/6 8:33:16

基于若依框架的表单开发实战:从CRUD到动态表单与工作流集成

1. 项目概述:为什么选择若依框架来构建表单? 在后台管理系统的日常开发中,表单几乎是每个功能模块的基石。无论是用户注册、数据录入,还是复杂的审批流程,都离不开表单。但每次从零开始,重复编写增删改查、…

作者头像 李华
网站建设 2026/8/6 8:32:24

大模型工程化实战:从RAG、Agent到微调的技术选型与落地指南

最近和几个做技术招聘的朋友聊天,他们提到一个挺有意思的现象:现在面试AI大模型相关岗位,候选人能说出“RAG”、“Agent”、“微调”这些词已经不算加分项了,因为几乎人人都会。真正的分水岭在于,当面试官问“为什么用…

作者头像 李华
网站建设 2026/8/6 8:31:46

IP地址与子网划分实战指南:从ABC类到VLSM的企业网络规划

1. 项目概述:从“门牌号”到“城市规划”的网络基石 刚入行那会儿,我最怕的就是配网络。服务器网卡插上了,系统装好了,一到配IP地址和子网掩码就犯晕,经常把网关填错,导致整个机器“失联”。后来才明白&…

作者头像 李华
网站建设 2026/8/6 8:31:35

Hive生产环境运维实战:从数据倾斜到性能调优的完整指南

1. 从“能用”到“好用”:Hive生产环境运维的实战视角 干了这么多年大数据,从Hadoop 1.x一路跟到现在的云原生数据湖,Hive始终是那个绕不开的“老伙计”。很多团队在测试环境跑得飞起的Hive作业,一上生产就各种幺蛾子:…

作者头像 李华