基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的危险物品检测系统(深度学习模型+PySide6界面+训练数据集+Python代码)
摘要:本文深入介绍了一个采用深度学习技术的危险物品识别系统,该系统融合了最新的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5等早期版本的性能。该系统在处理图像、视频、实时视频流及批量文件时,能够准确识别和分类各种危险物品,例如斧头、大镰刀等。文章不仅详尽阐释了YOLOv8算法的原理,还提供了完整的Python代码实现、专为训练设计的数据集,以及基于PySide6开发的图形用户界面(UI)。
系统可以准确识别图像中的危险物品,还具备基于SQLite的用户注册与登录功能、支持轻松切换YOLOv5/v6/v7/v8模型的功能,以及让用户自定义界面的高级选项,从而提升了用户体验和系统的灵活性。它支持多种输入形式,包括单张图片、图片集、视频文件和实时摄像头捕捉,并且具备热力图分析、识别框标记、类别统计、可调节的置信度和IOU参数、以及结果的图形化展示等功能。本文目的在于为该领域的研究者及初学者提供一份实用的参考资料,文末提供了完整的代码和数据集的下载链接。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1Rt421L7GG/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZZp
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmpdq
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuclZ5t
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyTl5Zq
前言
在当今社会,随着全球恐怖主义活动的增加以及工业化进程的加速,危险物品的检测与识别变得日益重要。危险物品,如爆炸物、易燃液体、有毒化学品等,不仅威胁公共安全,还可能导致重大的人员伤亡和财产损失。因此,开发高效、准确的危险物品检测系统对于加强公共安全、保护人民生命财产安全具有重大的研究意义和实际应用价值。
近年来,基于深度学习的视觉目标检测技术取得了显著进展,特别是在危险物品检测领域。YOLO系列作为目标检测领域的先驱之一,其各个版本的迭代不断推动着检测速度和准确性的提升。例如,YOLOv5通过引入多尺度预测、更深的网络结构和更优的损失函数,大幅提高了在实时应用场景中的表现[1]。进一步,YOLOv6采用了更高效的模型架构和优化算法,进一步提升了检测性能[2]。YOLOv7则通过细粒度的特征融合和注意力机制,显著增强了对小物体的检测能力[3]。最新的YOLOv8,其通过引入先进的自适应计算框架和改进的数据增强技术,不仅进一步提高了检测精度,也大幅降低了对计算资源的需求[4]。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130800772-248448111.jpg)
除了YOLO系列之外,还有其他一些重要的研究成果值得关注。例如,EfficientDet算法通过优化模型的尺度不变性和计算效率,实现了在多个标准数据集上的最先进性能[5]。此外,Transformer模型的引入,如DETR(Detection Transformer),通过直接学习目标的全局关系,为目标检测领域带来了新的思路和可能性。
在数据集方面,随着研究的深入,专门针对危险物品检测的数据集逐渐丰富,为算法的训练和评估提供了更多的资源。这些数据集通常包含了从公共场所如机场、车站等收集的图像,涵盖了各类危险物品,为模型训练提供了实际应用场景下的数据支持。
综上所述,危险物品检测领域正经历着前所未有的技术进步,这得益于深度学习技术的快速发展和大规模数据集的建设。未来的研究将可能集中在提高检测算法的泛化能力、降低对计算资源的依赖以及提升在复杂环境下的鲁棒性等方面。
本博客的分享重点在于介绍基于最新YOLOv8算法构建的危险物品检测系统,其主要贡献可以总结如下:
- 采用最先进的YOLOv8算法进行危险物品检测:本文详细介绍了如何利用目前最先进的目标检测算法——YOLOv8进行高效准确的危险物品检测。通过与先前版本的YOLO算法(YOLOv7、YOLOv6、YOLOv5)的性能对比分析,展示了YOLOv8在处理速度、识别精度和适用性方面的显著优势。这一部分不仅为研究社区提供了新的研究思路,也为从业者提供了实际应用的参考。
- 利用PySide6实现危险物品检测系统:通过Python的PySide6库,我们成功开发了一个用户友好的危险物品检测系统界面。该系统的设计旨在简化用户操作,使得危险物品检测更加直观和便捷。此外,该系统的实现也体现了如何将先进的算法与实际应用相结合,推动技术的广泛应用。
- 包含登录管理功能的设计:系统中集成的登录管理功能不仅增强了系统的安全性,也为将来引入更多个性化服务打下了基础。这一创新点说明了在设计实用工具时,对用户体验和系统安全的重视。
- 对YOLOv8模型的深入研究:本文不仅介绍了YOLOv8算法的基本原理和实现方法,还深入探讨了该算法在危险物品检测领域的应用性能。通过对模型在不同条件下的表现进行评估和分析,为算法的进一步优化和应用提供了重要的实验依据和分析视角。
- 提供完整的数据集和代码资源包:为了促进学术交流和技术传播,本文提供了一套完整的数据集和代码资源包。这一举措不仅方便读者复现和验证实验结果,也为进一步的研究和开发提供了宝贵的资源。
1.数据集介绍
在本文中,我们将深入探讨为危险物品检测任务特别构建的数据集,其特点和结构对于训练高效的目标检测模型至关重要。本数据集共包含5,456张图像,精心划分为4,041张训练图像、730张验证图像和685张测试图像。这样的划分确保了数据集在训练期间提供足够的信息量,同时保留了独立的数据来评估模型的泛化能力。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130809410-530545030.jpg)
数据预处理阶段,我们统一了图像尺寸并进行了归一化,以确保输入到模型中的图像具有相同的规格和值域。这是提高模型收敛速度和稳定性的关键步骤。在训练深度学习模型时,输入数据的一致性直接影响到模型权重的更新和最终的性能表现。
此外,考虑到现实世界中危险物品呈现的多样性和复杂性,我们对数据集应用了丰富的数据增强技术。通过随机旋转、缩放、剪切和颜色抖动等操作,增加了数据的多样性,从而提升了模型对不同环境、角度和光照条件下危险物品的识别能力。这种增强不仅模拟了现实世界中的各种情境,而且也帮助模型学习到更加鲁棒的特征表示。
在下图中,不同类别危险物品的实例数量呈现显著不平衡,以“Knife”类别的实例最多,而“Ax”和“Spear”等类别的实例较少。这种不平衡的现象反映了现实世界中某些危险物品出现的频率远高于其他物品。然而,这也可能导致模型在训练过程中对频繁出现的类别过拟合,而忽略了那些较少见的类别。因此,为了提高模型在所有类别上的检测效果,可能需要采取特定的训练策略,如对少数类进行过采样或在损失函数中施加类别权重。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130815570-2113415535.jpg)
通过对边界框尺寸和形状的分析,我们发现了数据集中物品的尺寸和比例分布。这些信息对于设计和调整目标检测模型的结构和损失函数至关重要。边界框大小的分布图显示了大多数边界框的宽度和高度都处于中等范围,而边界框中心点和宽高比的热力图则揭示了物品在图像中的位置分布和形状多样性。
我们的数据集不仅具有多样的图像,还提供了详细的类别标签。每张图片都经过了仔细的标注,确保了模型能够在准确性和分类能力上达到较高标准。这些标签对于训练阶段的损失函数计算以及模型评估阶段的性能指标计算都至关重要。博主使用的类别代码如下:
Chinese_name = {"Axe": "斧头", "Celurit": "大镰刀", "Cleaver": "切肉刀", "Cutlass": "弯刀",
"Damageable": "破坏器械", "Knife": "刀", "Linggis": "撬棍", "Mace": "狼牙棒", "Spear": "矛", "Wrench": "扳手"}
综上所述,尽管数据集已经经过了详细的标注和增强处理,但实际应用中的复杂环境可能远超数据集中所能模拟的。因此,持续对数据集进行优化和扩展,以覆盖更多的情况,对于提升危险物品检测系统的实用性和可靠性是必不可少的。通过以上介绍,我们希望为读者提供对本文所用数据集深刻的理解,并为未来相关研究提供坚实的基础。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130825441-1903705112.gif)
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行危险物品检测的图片或视频,或者启动摄像头进行实时检测。在进行危险物品检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130830688-453273383.gif)
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130835358-1486261253.gif)
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130847302-1671938068.png)
3. YOLOv8算法原理
YOLOv8是目前最新一代的实时对象检测算法,其在前几代YOLO算法的基础上进行了显著的改进和创新。YOLOv8继承了YOLOv3使用的Darknet53作为主干网络,这个网络结构已经证明在对象检测任务中效率和效果俱佳。YOLOv8则在此基础上进一步优化,它引入了从YOLOv5中借鉴的C3模块,并且借鉴了YOLOv7中的有效层级聚合(Efficient Layer Aggregation networks, ELAN)技术,以改善特征提取和增强网络的表征能力。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130904429-1596735756.png)
在YOLOv8中,C3模块由Bottleneck构成,这些Bottleneck模块在提取特征的同时,通过引入残差连接来避免潜在的梯度消失问题,确保了即使在网络较深的情况下,信息也可以有效地传播。这种设计不仅使网络在提取特征时更为高效,而且也有助于网络学习到更复杂的特征表示,这对于提高模型的准确性和鲁棒性至关重要。
YOLOv8还采用了路径聚合网络(Path Aggregation Network, PANet)来进一步增强特征金字塔的连接。这种结构通过增强不同尺度特征之间的连接,以提升模型在检测不同尺度对象时的性能。特别是对于小目标的检测,这种层级的特征聚合可以显著提高检测的准确度。
最后,YOLOv8在锚定机制上也做出了创新,它采用了无锚(None-anchor)机制,这是一种不依赖预设锚点的检测方法。传统的YOLO算法会使用多个预设的锚点来预测对象的位置和尺寸,但这种方法需要大量的手工调整和优化。无锚机制的引入使得模型不再依赖于这些预设的锚点,而是通过网络直接预测对象的边界框,这种方法简化了训练流程,同时有助于提高模型对各种尺寸对象的检测能力。
综上所述,YOLOv8通过引入先进的模块化设计、增强的特征聚合以及创新的无锚检测机制,提供了更为精确和高效的实时对象检测能力。这些技术的结合不仅提升了模型在标准数据集上的表现,更重要的是,它们使模型能够更好地适应实际应用中的多变环境和挑战,为实时对象检测领域带来了新的突破。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行危险物品检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/test.png")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130916215-961766580.png)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。
以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) |
0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) |
0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) |
0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) |
0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) |
3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) |
16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) |
640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练120个epoch,每个批次的大小为8。
results2 = model.train(
data=data_path,
device='0',
workers=workers,
imgsz=640,
epochs=120,
batch=batch,
name='train_v8_' + data_name
)
在分析YOLOv8模型训练过程中的损失函数和性能指标图像时,我们首先观察到的是三个主要损失函数——box_loss、cls_loss和dfl_loss——在训练集上的表现。box_loss负责预测边界框的精确位置,cls_loss用于分类准确性,而dfl_loss通常关联于模型预测边界框的分布。所有这些损失函数随着训练的进行都呈现出下降趋势,这表明模型在学习过程中不断提高了对目标检测任务的准确性。特别是,在训练的初期,损失迅速减少,这表明模型快速捕捉到了数据的关键特征。随着训练的深入,损失下降速度放缓,这是模型逐步接近其性能极限的正常表现。
在验证集上,我们同样看到了类似的损失下降趋势,这证明了模型具有良好的泛化能力。box_loss在验证集上的表现稍微高于训练集,这是正常现象,因为验证数据未参与训练,模型在这部分数据上的表现通常会略差一些。然而,cls_loss和dfl_loss在验证集上的表现与训练集相近,这说明模型在类别识别和边界框分布预测方面具备稳健的泛化能力。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130927382-579067876.png)
Precision和Recall两个指标为我们提供了模型预测准确性的重要视角。Precision指的是模型预测为正的样本中真正为正的比例,而Recall则是模型正确识别的正样本占所有真正正样本的比例。从图中可以看出,两个指标都随着训练的进行而波动上升,显示了模型在正确识别和分类目标方面的逐步改进。尤其是Recall的显著提升,表明模型在不遗漏正样本方面做得越来越好。
mAP50和mAP50-95是衡量目标检测模型性能的重要指标。mAP50是指在IoU(交并比)阈值为0.5时的平均精度,而mAP50-95是在IoU从0.5到0.95的范围内的平均精度。这两个指标的提高意味着模型在不同程度的边界框重叠条件下都能保持较高的性能。在图中,我们可以看到mAP的稳步提高,尤其是在IoU阈值较高时,mAP的提高显示了模型在预测边界框的位置和形状上的高准确性。
在目标检测系统中,F1分数是精确度和召回率的调和平均,它是评价分类模型性能的重要指标,特别适合于类别分布不平衡的情况。F1分数的范围从0到1,1代表完美的精确度和召回率,而0代表最差的性能。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130932979-1756638835.png)
其次,大多数类别的F1分数随着置信度阈值的增加而先增后减。通常,在较低的置信度阈值下,模型能够识别出更多的正样本,从而提高召回率,但这也可能伴随着较多的误报,导致精确度下降。随着置信度阈值的提高,模型变得更加保守,减少了误报,但同时可能会错过一些正样本,降低召回率。因此,F1分数会在某个点达到峰值,这个点平衡了精确度和召回率。
另一个显著的特点是,所有类别的平均F1分数达到0.78时,对应的置信度阈值为0.502。这个数值为我们提供了一个全局性能指标,表明在大约50%的置信度阈值下,模型对所有类别的整体检测性能达到了较好的平衡点。
在实际应用中,选择最佳的置信度阈值取决于我们对精确度和召回率的重视程度。如果目标是尽量减少漏检,那么可能会选择一个较低的置信度阈值;而如果目标是尽量避免误报,那么可能会选择一个较高的置信度阈值。在评估模型时,我们需要综合考虑不同类别的F1分数和对应的置信度阈值,以确保模型在实际部署中能够达到预期的性能。
总的来说,该危险物品检测模型在大多数类别上表现良好,但在某些类别上仍有改进的空间。通过调整置信度阈值,我们可以在精确度和召回率之间找到一个适当的平衡,从而在保持较高检测性能的同时,满足特定应用场景的需求。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310130947402-2137086576.png)
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在危险物品目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含危险物品的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型 | 图像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 参数数量 (百万) | FLOPs (十亿) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指标:
- F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.779 | 0.808 | 0.629 | 0.798 |
F1-Score | 0.75 | 0.75 | 0.62 | 0.78 |
(3)实验结果分析:
在本次实验中,我们对比了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个版本的目标检测算法在相同数据集上的性能。实验结果显示,YOLOv6n在mAP(平均精度均值)指标上表现最佳,达到了0.808,其次是YOLOv8n和YOLOv5nu,分别为0.798和0.779,而YOLOv7-tiny的表现最差,仅为0.629。这表明YOLOv6n在检测准确性上具有一定的优势,尤其是在处理我们数据集中的对象时。
对于YOLOv5nu和YOLOv6n而言,它们的mAP分别为0.810和0.808,这两个模型在mAP上的差距不大,但在F1-Score上YOLOv5nu以0.86的得分超越了YOLOv6n的0.85。虽然差距不大,但这说明YOLOv5nu在精确度和召回率上可能达到了更好的平衡。
在F1-Score这一综合指标上,YOLOv8n以0.78的得分领先,表明其在精确度和召回率之间达到了最佳平衡。YOLOv5nu和YOLOv6n的F1-Score相同,均为0.75,而YOLOv7-tiny的F1-Score则显著低于其他三个版本,只有0.62,这可能是由于其“tiny”版本在模型复杂度和性能上的妥协。
综合mAP和F1-Score两个指标,YOLOv8n在本次实验中总体上呈现出最佳性能。虽然YOLOv6n在mAP上略胜一筹,但从F1-Score来看,YOLOv8n提供了更均衡的性能表现。YOLOv7-tiny由于其简化的模型结构,在复杂的数据集上可能会受到限制。YOLOv5nu则表现出较为稳健的性能,虽然不是最优,但也是相对可靠的选择。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310131000104-789079227.png)
4.4 代码实现
在本篇博客中,我们将深入探索一个基于Python和QtFusion框架的实时物体检测应用程序的构建过程。这个应用程序使用了YOLOv8,这是一种最新的深度学习模型,专门用于图像中物体的检测。我们将一步步了解如何通过代码实现从图像采集、预处理、模型推理到结果显示的完整流程。
在实时危险物品检测系统中,需要结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及危险物品的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们导入了必要的Python模块,例如sys用于与Python解释器交互,time用于测量处理帧的时间,以及cv2用于图像处理。我们还使用了QtWidgets和QtCore模块来创建GUI。
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于获取当前时间
import cv2 # 导入OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 从QtFusion库导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库导入MediaHandler类,用于处理媒体流
from QtFusion.utils import drawRectBox, get_cls_color # 从QtFusion库导入drawRectBox函数,用于在图像上绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块导入YOLOv8Detector类,用于物体检测
QF_Config.set_verbose(False)
在导入这些模块之后,我们设置QF_Config.set_verbose(False)来关闭冗余日志信息,以便让我们更专注于应用程序的输出。
(2)定义frame_process函数
物体检测的核心功能在frame_process函数中实现。在这个函数中,我们首先调整图像大小以适应窗口,然后使用YOLOv8Detector模型来进行物体检测。我们测量了处理每一帧的时间并打印了这些信息。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred, superimposed_img = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间
use_time = t2 - t1 # 计算预测所用的时间
print("推理时间: %.2f" % use_time) # 打印预测所用的时间
det = pred[0] # 获取预测结果
# 如果有检测信息则进入
if det is not None and len(det):
det_info = model.postprocess(pred) # 对预测结果进行后处理
for info in det_info: # 遍历检测信息
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info[
'class_id'] # 获取类名、边界框、置信度和类别ID
label = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类名和置信度
# 画出检测到的目标物
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制矩形框,并添加标签和颜色
window.dispImage(window.label, image) # 在窗口的label控件上显示图像
(3)创建主窗口
接着,我们定义了MainWindow类,它是我们应用程序的主窗口。我们定义了一个窗口来显示视频流和检测结果。我们设置了窗口的尺寸并初始化了一个用于显示图像的QLabel控件。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel对象的几何形状
def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的键是Q键
self.close() # 关闭窗口
(4)主程序流程
在主函数中,我们首先实例化了YOLOv8Detector对象,加载了预训练的模型权重。然后,我们创建了MainWindow和MediaHandler对象,并连接了frame_process函数以便每当有新的视频帧准备好时,就进行处理。通过设置MediaHandler的设备为0,我们指定了使用默认摄像头作为视频输入。最后,我们启动了媒体流的处理,并展示了主窗口,进入了Qt应用程序的主循环。
cls_name = ["斧头", "大镰刀", "切肉刀", "弯刀", "破坏器械", "刀", "撬棍", "狼牙棒", "矛", "扳手"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/weapon-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0) # 设置设备为0,即默认的摄像头
videoHandler.startMedia() # 开始处理媒体流
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
整个应用程序展示了如何将深度学习模型与桌面应用程序接口相结合,实现了一个可以实时检测和识别图像中物体的系统。通过这个例子,开发者可以学习到如何利用Python中的各种库来构建复杂的应用程序,并在实际项目中将人工智能技术应用到实际问题中去。
5. 危险物品检测系统实现
在设计交互式危险物品检测与识别系统的过程中,我们的目标是构建一个既能实时识别缺陷,又能提供良好用户体验的应用程序。为了实现这一目标,我们采用了一种模块化的设计思路,将界面设计、媒体处理、以及模型推理这三个关键方面紧密集成在一起。
5.1 系统设计思路
在我们的系统设计中,我们的主要目标是创建一个交互式的危险物品检测与识别系统,它不仅能够实时处理图像并进行目标检测,而且还能提供直观的用户交互界面。我们的系统是围绕MainWindow类构建的,它集成了用户界面、媒体处理和深度学习模型,使得用户可以轻松地加载图像、执行目标检测,并查看结果。
(1)架构设计
在我们的系统设计思路中,目标是构建一个集成了高效检测算法和直观界面的交互式危险物品检测系统。此系统不仅需要在技术上精确识别各类危险物品,还要保证用户能够轻松地与之交互。为了实现这一目标,我们采用了一种将界面、媒体处理与模型集成于一体的设计思路。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310131016924-357982860.png)
- 处理层(Processing Layer):处理层是系统的核心,涉及的是物体检测的整个流程。我们利用YOLOv8Detector类,一个封装了YOLOv8算法的预训练模型,以实现快速而准确的物品检测功能。该模型不仅能够识别图像中的物体,还能以边界框的形式标注出它们,为用户提供直观的视觉反馈。
- 界面层(UI Layer):界面层是用户与系统交互的平台。在这层中,我们设计了一系列直观的UI元素,允许用户轻松控制系统并获取实时反馈。使用PySide6构建的界面不仅美观现代,还保证了用户操作的简便性。界面上的按钮、标签和图像显示区域等元素都是为了提高用户体验而精心设计的。
- 控制层(Control Layer):控制层是整个系统的指挥中心,它将用户输入转化为系统动作。控制层中的MainWindow类通过一系列槽函数响应用户的操作,如启动和停止视频流、处理键盘事件等。此外,控制层还负责协调处理层和界面层的交互,确保系统的各个部分能够协同工作。
系统的这种层次划分确保了各个组件的独立性和可维护性,同时,通过信号和槽的机制,实现了跨组件的数据传递和事件处理,这对于构建一个响应迅速且用户友好的交互式系统至关重要。用户的每一次操作都会被系统捕捉并作出相应的处理,无论是调整检测参数,还是处理实时视频流中的图像数据,用户都能获得即时的反馈。通过这种设计,我们旨在为用户提供一个强大而直观的危险物品检测工具,使他们能够在保证安全的同时,享受到先进技术带来的便利。
(2)系统流程
在本篇博客中,我们将探讨构建一个高效危险物品检测系统的流程。这一系统集成了YOLOv8模型,旨在通过实时分析来识别和标记危险物品,提高制造流程的自动化水平和质量控制的精准度。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310131028084-428178380.png)
-
当用户启动应用程序时,系统会立即创建一个MainWindow类的实例。这个实例是整个应用的核心,它负责初始化应用程序的界面和相关设置。一切从这里开始,用户通过这个界面可以轻松地访问所有的功能和选项。
-
应用程序的界面经过精心设计,以确保用户可以不费力地选择他们想要分析的媒体类型。无论是实时的摄像头视频流、本地视频文件还是静态图片,用户都可以通过简单的操作来选择输入源。这种灵活性确保了系统能够广泛适用于各种不同的应用场景和需求。
-
一旦输入源被选定,系统便会启动媒体处理器和相关方法来处理这些数据。这个过程可能涉及到配置摄像头、读取视频文件或加载图像文件等多个步骤。这个阶段是为了确保所有输入数据都能被正确处理,以满足后续检测算法的需求。
-
随着媒体输入源的准备就绪,系统便进入了一个持续的帧处理循环。首先是预处理阶段,系统会对每一帧图像执行一系列预处理操作,这些可能包括调整图像尺寸、转换色彩空间以及归一化等,以确保它们满足YOLO模型的输入规格。
-
接下来,在检测与识别阶段,经过预处理的图像被送入YOLOv8模型进行分析,模型会识别出图像中的危险物品,并输出它们的位置信息。这一步是系统的核心,它利用深度学习算法准确识别和定位图像中的各种物品。
-
而在界面更新阶段,随着检测结果的产生,GUI会实时更新以反映最新的信息。检测到的物品会以边界框的形式展示在界面上,并标注出相应的类别。此外,界面还会显示检测统计数据,如检测到的物品数量,这些信息可以通过表格或图表的形式展现。
-
最后,在媒体控制方面,用户可以根据需要控制媒体的播放状态。他们可以启动或停止摄像头捕捉、控制视频的播放或暂停图像分析,这些功能增加了系统的灵活性和用户的控制能力。
此外,用户还可以通过界面进行多种交互操作。他们可以保存检测结果以供后续分析,查询系统的版本信息,甚至通过下拉菜单筛选特定类别的物品,以便进行深入分析。
综上所述,我们设计的系统不仅在技术层面上实现了高效准确的危险物品检测,还在用户体验上下了大量工夫,确保了操作的便捷性和结果的直观性。这样的系统能够广泛应用于安全监控、工业检测等领域,为用户提供一个强大的安全保障工具。
5.2 登录与账户管理
在构建一个交互式的危险物品检测系统时,用户体验是至关重要的一环。因此,我们专门设计了一个用户登录界面,它不仅提供基本的身份验证功能,还支持账户的个性化管理,比如密码修改、头像设置等。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310131251565-1949004465.png)
登录界面是使用PySide6框架构建的,这是一个强大的库,允许我们创建现代化且功能丰富的GUI。此外,为了安全地存储用户信息,我们采用了SQLite数据库。这是一个轻量级的数据库系统,非常适用于桌面应用程序,它允许我们在本地安全地保存用户数据。
用户首次使用系统时,可以轻松完成账户注册过程,创建自己的个人账户。一旦注册成功,用户即可利用自己的账户进行登录,并访问系统的主要功能,包括进行危险物品的检测和查看历史检测记录。账户管理不仅限于基本的登录操作,用户还可以在需要时修改密码,保障账户的安全性。除此之外,用户还可以上传和修改个人头像,增加了系统的亲和力和个性化体验。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310131308644-1916706692.png)
账户管理功能的加入,为每个用户提供了一个独立且安全的空间,在这里,他们可以存储自己的检测结果和个人设置。这样做的好处是显而易见的,它不仅提升了系统的安全性,也增强了用户的个性化体验。此外,账户注销和重新登录的选项允许用户在多设备之间灵活切换,无论是在家还是在工作地点,都能轻松地接入和使用系统。
系统主界面是实时目标检测的操作平台,用户可以在这里进行图片、视频、实时摄像头的输入和批量文件处理,系统能够实时识别危险物品,并将检测结果以检测框、类别和置信度等信息的形式直观展示。检测系统的这些功能都是为了满足用户在快节奏、高要求的现代安全监控场景下的需求。
通过这些综合的设计和实现,我们的危险物品检测系统不仅能够导入并利用各类深度学习模型来实现高效的多物体识别和检测,还提供了易于使用的用户登录和管理界面,满足了用户在实时目标检测场景下对便捷性和个性化的需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240223172556334-254454142.png)
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Rt421L7GG/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZZp
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmpdq
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuclZ5t
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyTl5Zq
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8模型的危险物品检测系统,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的危险物品检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ↩︎
Bochkovskiy, A., Wang, C.-Y., & Liao, H.-Y. M. "YOLOv7: Optimal Speed and Accuracy of Object Detection." arXiv preprint arXiv:2004.10934 (2020). ↩︎
Dosovitskiy, A., et al. "An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale." Proceedings of the International Conference on Learning Representations (ICLR), 2021. ↩︎
Shorten, C., & Khoshgoftaar, T. M. "A survey on Image Data Augmentation for Deep Learning." Journal of Big Data, vol. 6, no. 1, 2019. ↩︎
Hinton, G., Vinyals, O., & Dean, J. "Distilling the Knowledge in a Neural Network." arXiv preprint arXiv:1503.02531 (2015). ↩︎