基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的铁轨缺陷检测系统(Python+PySide6界面+训练代码)
摘要:开发铁轨缺陷检测系统对于物流行业、制造业具有重要作用。本篇博客详细介绍了如何运用深度学习构建一个铁轨缺陷检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间的性能指标,如mAP、F1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码、训练数据集,并集成了一个基于PySide6的界面。
系统能够精准检测铁轨缺陷,支持通过图片、图片文件夹、视频文件及摄像头进行检测,包含柱状图分析、标记框类别、类别统计、可调Conf、IOU参数和结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换和UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1LK421x7J5/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/ZZyUmpZv
YOLOv8/v5项目完整资源下载:https://mbd.pub/o/bread/ZZubmp5w
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/ZZucmp1y
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/ZZyUk5ls
前言
在当今社会,铁路运输作为一种高效、环保的陆地运输方式,在全球范围内扮演着至关重要的角色。随着经济的快速发展和城市化进程的加快,铁路运输需求日益增长,安全问题也随之成为社会关注的焦点。铁轨作为铁路系统的基础设施,其安全状况直接关系到列车的安全运行和人民生命财产的安全。然而,铁轨在长时间的使用过程中易出现裂纹、断裂、腐蚀等缺陷,若不及时发现和修复,可能导致列车脱轨、翻覆等严重事故,造成重大的人员伤亡和财产损失。因此,开发一种高效、准确的铁轨缺陷检测系统,对于保障铁路运输安全、提升铁路运输效率具有重要的研究意义和实用价值。
随着人工智能和机器视觉技术的迅猛发展,基于深度学习的图像处理技术已经被广泛应用于铁轨缺陷检测中,特别是YOLO[1](You Only Look Once)系列算法因其高效的检测速度和较高的准确率,成为该领域的研究热点。YOLO算法作为一种实时对象检测系统,能够在单次遍历图像的同时进行目标检测和分类,相比传统的图像处理技术和机器学习方法,大大提高了检测的效率和准确性。此外,随着YOLO算法的不断迭代更新,从YOLOv1到最新的YOLOv8,每个版本的算法都在性能上有所提升,能够更好地适应不同的应用场景和需求,为铁轨缺陷检测提供了更加强大和灵活的技术支持。
YOLOv3提高了模型的泛化能力和多尺度检测性能,而YOLOv4[2]则在保持高速度的同时进一步提升了检测精度。YOLOv5[3],尽管存在关于其正式版本的争议,其易用性和灵活性仍然受到了社区的广泛欢迎。随后的YOLOv6、YOLOv7[4]和YOLOv8等版本,更是在模型结构、训练策略和性能优化等方面进行了全面的改进,不断推动着铁轨缺陷检测技术的发展边界。
Transformer模型,特别是Vision Transformer(ViT),通过引入自注意力机制,改变了传统依赖卷积层进行特征提取的框架,提供了一种新的视角来理解图像数据。ViT通过将图像切割成多个小块并将其视为序列数据来处理,这种方法使得模型能够捕捉到图像内部的长距离依赖关系,增强了模型对复杂场景的理解能力,为铁轨缺陷检测带来了新的可能性。
MMDetection作为一个开源的目标检测工具箱,提供了丰富的预训练模型和检测框架,支持快速部署和测试。它不仅整合了YOLO、Faster R-CNN、Mask R-CNN等多种经典目标检测算法,还包括了最新的研究成果,如Cascade R-CNN、Hybrid Task Cascade等。MMDetection的灵活性和高效性使其成为进行铁轨缺陷检测研究的有力工具,特别是在处理大规模数据集和实验不同算法组合时显示出了巨大的优势。
基于Mask R-CNN的方法在某些特定的缺陷检测任务中表现出了比YOLO更高的精确度,尤其是在对缺陷的精确分割方面。此外,Transformer模型,尤其是其在计算机视觉领域的应用,如ViT(Vision Transformer),也为处理铁轨图像提供了新的思路。
铁轨缺陷检测的关键之一在于如何获取并利用高质量的数据集。传统的铁轨缺陷数据集往往规模较小、种类单一,难以满足深度学习模型训练的需求。近年来,随着铁路行业和研究机构的合作加深,一些大规模、多样性的铁轨缺陷数据集开始逐渐出现。这些数据集不仅涵盖了多种类型的铁轨缺陷,如裂纹、腐蚀、断轨等,而且还包括了不同光照、天气和背景条件下的铁轨图像,为深度学习模型提供了丰富的训练和测试资源。然而,数据集的标注仍是一个耗时且成本高昂的过程,如何有效利用未标注或半标注的数据成为了一个研究热点。
本博客所做的工作是基于YOLOv8[5]算法构建一个铁轨缺陷检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法:本博客通过采用当前最先进的YOLOv8算法构建铁轨缺陷检测系统,展示了YOLOv8在实际应用中的强大性能。相较于先前版本如YOLOv7、YOLOv6、YOLOv5等,YOLOv8展现出了更高的检测效率和精确度,尤其是在处理复杂背景和小目标检测方面的卓越能力。通过对比分析,我们详细阐述了YOLOv8算法相较于其他版本在铁轨缺陷检测任务中的优势,为铁轨安全检测提供了新的研究方向和技术支持。
- 利用PySide6实现友好的系统界面:为了提高铁轨缺陷检测系统的用户体验,本文利用Python的PySide6库开发了一个美观、友好的用户界面。这一界面设计不仅使得操作更加直观便捷,还大大降低了用户在使用过程中的学习成本,从而有助于YOLOv8算法及铁轨缺陷检测技术的普及和应用。
- 包含登录管理功能:为了增强系统的安全性和可扩展性,我们在系统中集成了登录管理功能。用户需要通过登录验证后,才能访问系统的各项功能。这一设计不仅保护了数据的安全,也为将来根据用户需求添加更多个性化功能提供了便利。
- 对YOLOv8模型的深入研究:本文不仅介绍了YOLOv8算法的应用,更对该算法的性能进行了深入的分析和评估。通过对模型在不同环境和条件下的表现进行系统的测试,我们详细分析了YOLOv8算法的精确度、召回率等关键性能指标,为该算法的进一步优化和应用提供了宝贵的数据支持和理论基础。
- 提供完整的数据集和代码资源包:为了促进学术交流和技术共享,本文提供了完整的数据集和代码资源包。这些资源不仅包括用于训练和测试的详尽数据集,还有实现铁轨缺陷检测系统的完整代码。通过分享这些资源,我们希望能够帮助读者更容易地复现实验结果,激发更多的研究者和开发者对铁轨缺陷检测技术的兴趣和热情。
1. 数据集介绍
在本次博客中,我们将深入介绍铁轨缺陷检测的关键环节——数据集构建及其特性分析。数据集作为机器学习模型训练的基石,其质量和构成直接决定了最终模型的性能。我们的数据集涵盖了2234张铁轨场景的高分辨率图像,其中1888张用于训练、173张用于验证和173张用于测试。这一细致的分配确保了模型在学习期间能够接触到大量的样本,在评估阶段能对其性能进行准确的验证。
在预处理阶段,我们对图像数据执行了自动定向校正,以消除由于设备拍摄角度不同而引入的方向差异,这一步骤是通过剥离图像的EXIF信息中的方向数据完成的。进一步地,我们将每张图像调整至统一的尺寸——416x416像素,采用的拉伸方法确保了模型输入的一致性,即使这可能在一定程度上改变了原始图像的宽高比。这种标准化是必要的,因为它为训练提供了规则化的数据,同时优化了模型在不同图像上的表现能力。
从数据集分布的分析中,我们得到了一系列富有洞见的发现。首先是类别分布的不均衡性,数据集中的“fastener”类别实例数目远超其他类别,这提示我们在训练时可能需要引入特定的策略来防止模型对此类别过拟合,同时确保模型对其他较少出现的缺陷类别,如“trackbed_stuff”,保持敏感。这种类别不平衡的问题在实际应用中是必须解决的,以避免模型在检测少数类别时性能不佳。
对于边界框分布的分析,我们发现大多数缺陷在图像中心区域较为集中,这可能反映了在现实世界中,铁轨中部是缺陷出现的高发区。这一现象对于指导实际的铁路维护工作具有重要意义,同时也为模型的检测策略提供了指导。而缺陷尺寸的分布表明,数据集中存在大量小尺寸的缺陷,这强调了模型需要能够精准识别小尺寸目标的能力。同时,较小的缺陷集中分布也提示了在实际应用中,对于小尺寸缺陷的检测可能需要更高的精度和敏感度。博主使用的类别代码如下:
Chinese_name = {"fastener": "紧固件", "fastener-2": "紧固件-2", "fastener2_broken": "紧固件2_损坏",
"fastener_broken": "紧固件_损坏", "missing": "缺失", "trackbed_stuff": "轨床杂物"}
通过以上详细的数据集介绍和分析,我们可以看出,本数据集为铁轨缺陷检测的深度学习模型提供了一个坚实的训练基础。它不仅具有挑战性,涵盖了多种缺陷和环境条件,而且经过了周密的预处理,以适应模型训练的需求。通过对这个数据集的分析,我们也识别出了可能的问题和挑战,为未来的研究工作指明了方向。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行铁轨缺陷检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法是目标检测领域的一次重大进步,它在前几代YOLO算法的基础上做了许多创新和优化。在本节中,我们将详细探讨YOLOv8的原理和其构成的主要部分:Backbone、Neck、Head。
首先是Backbone部分,也就是网络的主干结构。YOLOv8继承并优化了YOLO系列的传统结构,选择Darknet-53作为基础框架,并引入了更加高效的模块,如CSP(Cross Stage Partial)层和C2F(CSPlayer_2Conv)结构,进一步增强了特征提取的能力。CSP结构通过在网络的不同stage中进行特征的分割和重组,提高了模型学习特征的能力,同时也减少了计算量。C2F结构通过在不同的层级上混合使用卷积层,进一步增强了网络提取细粒度特征的能力,这对于检测各种尺寸的目标至关重要。
接下来是Neck部分,它负责从Backbone提取的特征进一步提炼和加工,以便更好地进行目标的检测。YOLOv8采用了PANet(Path Aggregation Network)结构,这是一种特征金字塔网络(FPN)的变种,用于增强模型在不同尺度上的特征学习和融合能力。PANet通过加强不同层级间的特征传递路径,优化了特征的聚合过程,这在处理多尺度的目标检测时显得尤为重要。此外,YOLOv8对于传统的YOLOv5设计进行了升级,引入了SPPF(Spatial Pyramid Pooling Fusion)模块,以替代之前的SPP。SPPF通过对多个不同尺度的特征进行融合,能够提高网络在捕捉上下文信息方面的能力,特别是对于空间分辨率高的图像,它能够更有效地保留重要的空间信息。
最后是Head部分,它是YOLOv8网络的最后阶段,直接负责产生检测结果。YOLOv5的Head部分是基于Anchor的设计,而YOLOv8则采用了Anchor-Free的方法,摒弃了传统的Anchor Box机制,减少了模型需要学习的参数数量,使模型变得更加轻量和灵活。在损失函数上,YOLOv8引入了DFL(Distribution Focal Loss),这是一种新的损失函数,它注重于改善模型对于各种难易程度目标的识别能力,尤其是对于小目标和模糊目标。DFL通过调整损失权重,使得模型在训练过程中更加关注那些难以检测和分类的实例。
总体来说,YOLOv8的设计集成了多项前沿技术,其创新点在于优化了特征提取网络的深度和广度,增强了特征融合的能力,以及提升了目标检测的灵活性和准确性。通过这些优化,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/1a.jpg")
image = cv_imread(img_path)
在读取了图像文件之后,将图像大小调整为850x500,并对图像进行预处理,就可以使用模型进行预测了。
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
在本博客中,我们将探讨如何利用PyTorch和YOLOv8进行铁轨缺陷检测的模型训练。我将带领大家一步一步通过实际的代码段,理解构建一个高效的目标检测模型的过程。
我们从导入必要的库开始。os和torch是Python编程中不可或缺的工具,前者让我们能够与操作系统交互,后者是一个强大的深度学习框架。同时,我们引入yaml库,这是因为我们的数据集配置存储在一个YAML文件中,这种格式便于人们阅读和写入配置信息。此外,引入了专为YOLO模型定制的ultralytics库,这是一个现成的库,提供了YOLO模型的实现以及便于加载和训练模型的函数。我们通过检测当前环境中是否存在可用的GPU,来决定模型应该在哪个设备上训练。
import os
import torch
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
device = "cuda:0" if torch.cuda.is_available() else "cpu"
然后,我们设置了workers为1,这意味着在数据加载时我们只使用一个工作进程,这通常是出于内存和CPU资源考虑。批处理大小batch被设置为16,代码中定义了数据集的名称,并使用自定义的abs_path函数,这个函数的作用是生成数据集配置文件的绝对路径。
workers = 1
batch = 8
data_name = "RailwayDefect"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
directory_path = os.path.dirname(unix_style_path)')
之后,代码读取YAML配置文件,并可能对其中的path项进行修改,这通常是为了确保路径设置正确无误,符合当前运行环境的目录结构。
# 读取YAML文件,保持原有顺序
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
# 修改path项
if 'path' in data:
data['path'] = directory_path
# 将修改后的数据写回YAML文件
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
接下来是模型训练的关键部分。我们使用YOLO类创建了一个模型实例,加载了预训练权重,并设置了任务类型为'detect'。然后调用model.train函数,开始训练过程。在这里,我们设置了许多重要的训练参数,如工作进程数、输入图像大小、训练周期(epochs)、批次大小和训练任务的名称。
model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 加载预训练的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 加载预训练的YOLOv8模型
# Training.
results = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device=device, # 自动选择进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v5_' + data_name # 指定训练任务的名称
)
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device=device, # 自动选择进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
整体而言,我们的代码不仅是实现了从数据准备到模型训练的全过程,而且展现了如何在实际项目中应用深度学习和计算机视觉的最新技术。通过细致的步骤和详尽的代码解释,我们希望读者能够更好地理解。
在深度学习模型的训练过程中,损失函数的变化趋势是评估模型性能的重要指标之一。从提供的图像中,我们可以对YOLOv8模型在铁轨缺陷检测任务上的训练过程进行详细的分析。图中展示了三种损失函数:定位损失(box_loss)、分类损失(cls_loss)和分布式焦点损失(dfl_loss),以及几个关键的性能指标,包括精度(precision)、召回率(recall)、平均精度均值(mAP50)和更加严格的mAP50-95。
首先观察到的是,训练和验证过程中的边界框损失(box_loss)、分类损失(cls_loss)以及分布焦点损失(dfl_loss)都随着训练周期的增加而逐渐下降。这是一个积极的信号,表明模型正在有效地学习如何更准确地定位物体、分类以及更好地理解目标的形状和大小。特别是在边界框损失上,我们看到验证损失在经历初始波动后趋于稳定,并保持在一个较低的水平,这表明模型对物体定位的泛化能力较强。
然而,值得注意的是,分类损失在训练和验证阶段均呈现出持续的下降趋势,但在验证过程中,损失的波动略大于边界框损失。这可能意味着模型在区分不同类别的铁轨缺陷方面,还有进一步提升的空间。对于分布焦点损失,训练损失的稳定下降也预示着模型在学习目标分布的过程中取得了进步,特别是在对难以区分或模糊不清的目标进行检测时。
从评价指标的角度来看,我们可以观察到模型的精确度(precision)、召回率(recall)、平均精确度均值(mAP50)和在多个IoU阈值下的平均精确度均值(mAP50-95)都在训练过程中逐渐提高。精确度和召回率趋于稳定并在较高水平上波动,这表明模型在区分正负样本上表现良好,且能够保持对真正缺陷的高识别率。同时,mAP的提高说明了模型对于不同大小、形状的缺陷具有较好的检测能力。
在本博客中,我们将深入分析我评估模型后的精度-召回率(Precision-Recall,PR)曲线图。PR曲线是衡量目标检测模型性能的重要工具之一,它揭示了模型在不同召回率水平下的精度表现。在目标检测任务中,我们追求高精度与高召回率的平衡,这意味着我们希望模型不仅能够准确地检测出尽可能多的正样本,同时保持较低的误报率。
从曲线图中可以看到,我们的模型在各个类别上都表现出了极高的精确度和召回率,这是模型优秀性能的明确指标。精确度(Precision)指的是模型识别为正样本中实际为正样本的比例,而召回率(Recall)则是指模型正确识别的正样本占所有实际正样本的比例。理想情况下,我们希望这两个指标都尽可能高,这意味着模型能够准确地识别出尽可能多的真正的缺陷,同时减少误判。
在我们的模型中,“fastener”和“fastener_broken”类别的精确度达到了0.995,这显示了模型几乎能够完美地区分出这些类别的缺陷。而“trackbed_stuff”类别的精确度稍低,为0.970,虽然略低于其他类别,但仍然表现出了很高的精确度。这可能意味着“trackbed_stuff”类别的缺陷在特征上更加复杂多变,或者与其他类别的缺陷有更多的相似之处,使得模型在识别时面临更大的挑战。
整体上,PR曲线几乎接近坐标图的右上角,表明模型在绝大多数情况下都能给出正确的判断。此外,整体的平均精确度(mAP@0.5)为0.990,这是一个非常高的数值,表明在IoU阈值为0.5的情况下,模型具有极高的检测性能。这是铁轨缺陷检测系统的一个很好的指标,因为在实际应用中,我们需要模型既要有很高的识别能力,又能最大限度地减少漏检和误检。
尽管模型的整体表现非常令人满意,但我们仍需注意“trackbed_stuff”类别相对较低的精确度。在实际应用中,我们可以通过进一步的数据增强、更精细的类别标注或者调整模型结构来尝试提高这一类别的识别精度。通过这样的分析,我们不仅能够评价和理解当前模型的性能,还可以为未来的研究方向提供明确的指导,进一步优化铁轨缺陷检测系统的性能。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
本实验旨在评估和比较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.992 | 0.978 | 0.877 | 0.990 |
F1-Score | 0.98 | 0.96 | 0.87 | 0.97 |
(3)实验结果分析:
在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在铁轨缺陷检测任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。
首先来看mAP,即平均精确度均值,它衡量的是模型在不同置信度阈值下检测准确性的平均值,通常用于目标检测任务的性能评估。在我们的实验中,YOLOv5nu以0.992的mAP得分排在首位,显示出了极佳的整体检测性能,而YOLOv8n紧随其后,得分为0.990,这表明在算法迭代进化的过程中,YOLOv8保持了优越的性能水平。YOLOv6n的表现稍逊一些,得分为0.978,但相比之下,YOLOv7-tiny的mAP显著低于其他三者,仅为0.877,这可能是因为“tiny”版本更加轻量化,牺牲了一部分检测精度以换取更快的运行速度。
转向F1-Score,这是精确度和召回率的调和平均数,它是一个更加综合的性能评价指标,因为它同时考虑到了模型的精确度和召回率。YOLOv5nu再次以0.98的F1-Score表现最优,这反映了其在识别正确缺陷和最小化误检方面的强大能力。YOLOv8n以0.97的F1-Score紧随其后,与YOLOv5nu的结果相当接近,显示出YOLOv8的算法优化带来的积极成效。而YOLOv6n的F1-Score为0.96,略低于前两者,但仍然代表了良好的性能。再次地,YOLOv7-tiny以0.87的F1-Score位于末尾,这与它在mAP评分中的相对较低表现相一致。
综合以上数据,我们可以看到YOLOv5nu和YOLOv8n在性能上表现出色,它们在铁轨缺陷检测任务上的精确度和召回率均达到了极高的标准。YOLOv6n虽然性能略逊,但也展现了相对较高的准确性。与此同时,YOLOv7-tiny在追求速度的同时,牺牲了一定的检测性能,这对于需要在较低计算资源下运行的应用场景可能是一个可接受的折中方案。这些对比结果为我们在选择合适的YOLO版本时提供了明确的指南:如果对检测精度的要求极高,应优先考虑YOLOv5nu或YOLOv8n;如果计算资源有限,但可以容忍一定的性能损失,那么YOLOv7-tiny可能是一个更合适的选择。通过对这些不同版本的详细对比分析,我们能够更加明智地做出选择,以适应各种不同的应用需求和环境。
4.4 代码实现
在本篇博客中,我们将详细探讨如何构建一个使用YOLOv8进行实时铁轨缺陷检测的应用。在这个项目中,我们的目标是利用YOLOv8强大的目标检测能力,并将其集成到一个用户友好的界面中,让用户能够轻松地对视频流进行实时分析。为此,我们需要构建一个应用程序,它能够从视频源中读取数据、应用模型进行检测,并在图形界面中展示检测结果。
(1)引入必要的库
首先,我们需要我们引入必要的库,包括sys来处理Python运行时环境的操作,time来处理时间相关操作,以及cv2,即OpenCV库,用于处理图像和视频数据。QtFusion库的组件使得创建和管理GUI元素变得简单,而YOLOv8Model提供了一种进行目标检测的有效方式。
import sys # 导入sys模块,用于处理Python运行时环境的一些操作
import time # 导入time模块,用于处理时间相关的操作
import cv2 # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库中导入MediaHandler类,用于处理媒体数据
from QtFusion.utils import drawRectBox # 从QtFusion库中导入drawRectBox函数,用于在图像上绘制矩形框
from QtFusion.utils import get_cls_color # 从QtFusion库中导入get_cls_color函数,用于获取类别颜色
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI和处理Qt的核心功能
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于进行YOLOv8物体检测
QF_Config.set_verbose(False)
(2)设置主窗口
我们定义了MainWindow类,它继承自QMainWindow,是我们应用程序的主窗口。在其构造函数中,我们设置了窗口的大小,并添加了一个QLabel组件,用于显示图像数据。还定义了一个keyPressEvent函数,以便用户可以通过按Q键来关闭应用程序。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(640, 640) # 设置窗口的大小为850x500
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 640, 640) # 设置QLabel的位置和大小
def keyPressEvent(self, event): # 定义键盘按键事件处理函数
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的是Q键
self.close() # 关闭窗口
(3)图像帧处理
接着,我们定义了frame_process函数,这是视频帧处理的核心。我们首先调整帧的大小,以适应主窗口的QLabel,然后调用YOLOv8模型的preprocess和predict方法来处理图像并获得预测结果。这一部分代码体现了模型推理的过程,即实时地识别和定位视频帧中的缺陷。通过打印推理时间,我们可以了解模型处理每帧所需的时间,从而评估系统的实时性能。最终,我们使用drawRectBox函数来在图像上绘制预测到的缺陷,并使用get_cls_color函数为不同的缺陷类型分配颜色。这些功能增强了最终用户的视觉体验,使他们能够清晰地识别和区分不同类型的缺陷。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 将图像的大小调整为850x500
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred = 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上显示图像
(4)初始化检测模型和设备
最后,我们初始化YOLOv8Detector对象,并加载训练好的模型。然后,我们创建QApplication和MainWindow的实例,并设置视频处理的媒体处理器MediaHandler。在此处理器中,我们通过信号与槽的机制将每个视频帧连接到我们的frame_process函数上,确保每帧都被及时处理。此外,我们还定义了一个filename变量来指定待处理的视频文件路径,并设置了MediaHandler的帧率。通过startMedia方法,我们启动了视频流的处理。最后,我们调用show方法展示主窗口,并通过app.exec()进入主事件循环,这是Qt应用的标准做法,以保持应用运行并响应用户的交互操作。
cls_name = ["紧固件", "紧固件-2", "紧固件2_损坏", "紧固件_损坏", "缺失", "轨床杂物"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/railway-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
filename = abs_path("test_media/24-铁轨缺陷检测.mp4", path_type="current") # 定义视频文件的路径
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename) # 设置视频源
videoHandler.startMedia() # 开始处理媒体
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
这一整套实现流程,展示了从前端的用户界面设计到后端的模型推理的完整应用架构。通过这篇博客,我们希望能够为读者提供一个关于如何实现实时目标检测应用的深入理解,并展示YOLOv8模型在实际应用中的强大功能。
5. 铁轨缺陷检测系统实现
在实现一款实时铁轨缺陷检测系统时,系统设计的核心在于整合高效的目标检测算法与用户友好的交互界面,旨在提供一个直观、高效的工具,以便用户能够轻松地执行铁轨缺陷的检测和分析任务。
5.1 系统设计思路
在系统设计的过程中,我们遵循了清晰的分层架构思想,确保了各个功能部分既可以独立运行,又能够无缝协作。通过精心设计的MainWindow类,我们不仅实现了各个模块之间的数据和信号交换,而且保持了代码的整洁和模块的可维护性。
架构设计
我们构建的架构体现了模块化设计,其中包括处理层、界面层和控制层,每层都有其独立的职责。
- 处理层(Processing Layer):在处理层,我们集成了YOLOv8Detector,这是一个基于最新的YOLOv8算法的预训练模型。它的主要任务是处理输入的媒体数据,执行图像识别和目标检测,将图像中的铁轨缺陷准确地标识出来。此模型不仅具有高精度的检测能力,而且能够在实时视频流中快速定位和识别出各种类型的缺陷。
- 界面层(UI Layer):界面层是用户交互的前端,由各种UI组件构成。在这一层面,我们利用PySide6库构建了一套直观的用户界面,包括视频播放窗口、状态栏以及操作按钮。这个图形界面不仅美观,而且用户友好,它大大降低了用户操作的复杂性,使得即便是非技术人员也能轻松地上手使用本系统。
- 控制层(Control Layer):控制层承担着协调和管理的角色,是整个系统的神经中枢。在这里,MainWindow类通过定义槽函数来处理用户的输入和命令,如启动或停止检测过程、调整配置设定等。同时,它也负责调用处理层的功能,将检测结果反馈给界面层,实现数据的实时展示。通过控制层的精心安排,我们保证了系统的响应速度和处理效率。
交互式铁轨缺陷检测系统的设计思路集成了深度学习的强大功能与人机交互的直观操作。它不仅仅是一个技术产品,更是一个能够帮助铁路维护人员提高工作效率、保障铁路安全的实用工具。通过这种多层次、模块化的设计,我们的系统在提供高效检测能力的同时,还确保了用户体验的舒适和便捷。
系统流程
在本篇博客中,我们将探讨一个高效且用户友好的交互式铁轨缺陷检测系统的设计理念。这一系统的核心在于通过集成先进的YOLOv8目标检测技术,以提供高精度的铁轨缺陷检测功能,并通过一个直观的图形用户界面(GUI),让用户能够轻松地与系统进行交互。
系统的设计是围绕一个中心思想展开的:将强大的目标检测功能嵌入到一个简洁、易用的应用程序中。这意味着我们不仅需要一个强大的检测模型来识别铁轨缺陷,还需要一个设计良好的用户界面,让用户能够无需技术背景即可操作系统。此外,系统的架构设计遵循了经典的MVC(模型-视图-控制器)模式,这有助于分离关注点,增强代码的可维护性和可扩展性。
- 用户在启动应用程序后,会遇到一个功能齐全的主界面,由MainWindow类的实例化过程提供初始化。这个主界面不仅美观,更重要的是,它将系统的所有功能——从源选择到最终的缺陷检测——整合在一起,提供了一个操作的起点。用户可以从多个选项中选择输入源,包括实时视频流、视频文件或是静态图片,确保了系统的灵活性和适用性。
- 一旦输入源被选定,系统则启动媒体处理器,这可能涉及配置摄像头、读取视频文件或加载图像文件。这一过程不仅要确保数据的正确输入,也要保证数据的格式适合后续的处理。处理器将媒体转化为适合模型处理的格式,在这个阶段,例如,对图像的大小、色彩空间进行调整,以确保它们满足模型的输入要求。
- 随着输入源的准备,系统将进入连续的帧处理流程。在这一流程中,每一帧图像都会经历预处理、通过YOLOv8模型进行目标检测与识别,最终在GUI上实时显示检测结果。这些结果不仅包括缺陷的位置和类别,还包括检测框的可视化展示,让用户能够直观地观察到模型的性能。
- 此外,系统还提供了与用户交互的手段,如保存检测结果、访问帮助信息等。这些功能是通过GUI的控制组件实现的,用户可以通过简单的点击和选择来操作这些控件。系统同样提供了媒体控制的功能,让用户能够控制视频的播放,或者暂停和继续图像的分析过程。
整个系统的设计体现了我们对于用户体验的深思熟虑。我们的目标是创建一个既能提供高精度的铁轨缺陷检测功能,又能让用户轻松上手的系统。通过这样的系统设计思路,我们期望铁轨维护工作能够变得更加高效、简便,进而提高铁路的安全性和可靠性。
5.2 登录与账户管理
在本博客中,我们将细致探讨铁轨缺陷检测系统中关键的一环——用户登录与账户管理功能。这一功能是为了满足用户在使用检测系统过程中对个性化服务的需求而精心设计的,它基于PySide6构建的界面和SQLite数据库,为用户提供了一套完整的账户管理解决方案。
系统的账户管理功能涵盖了用户注册、密码设置与修改、头像自定义、账户注销以及重新登录等操作。这不仅为用户提供了方便、直观的交互界面,还确保了用户数据的安全性和隐私性。通过这些功能,用户能够创建并维护属于自己的账户,这是实现个性化设置和保存个人操作记录的基础。
登录界面的设计简洁而不失美观,它引导用户通过简单的步骤完成注册或登录,进而能够使用系统的核心功能——铁轨缺陷检测。注册过程中,用户需要提供基本信息,并设置密码,系统还支持设置个性化头像,这些都是构建用户个性化体验的重要步骤。此外,考虑到用户可能需要对账户信息进行更改,系统也提供了修改密码和头像的选项。
在账户管理方面,系统还包含了账户注销和重新登录的功能,使用户可以轻松管理自己的登录状态。这些功能的加入,不仅增强了系统的用户友好性,还体现了我们对用户体验的细心考虑。用户可以在一个集中的界面内,完成所有与账户相关的操作,而无需跳转至多个不同的界面或模块。
整个铁轨缺陷检测系统的设计,从用户注册、登录到缺陷检测的每个环节,都体现了我们对用户需求的深入理解和对技术实现的严格把控。通过为用户提供安全、私密且易于管理的个人账户,我们旨在提升用户在使用我们的系统时的整体满意度和体验。这些个性化的服务功能,不仅让用户能够更加高效地使用铁轨缺陷检测系统,还能让用户的操作更加便捷,感受到系统的智能化和人性化。用户在登录系统后,可以在主界面上进行铁轨缺陷的实时检测,同时在系统中记录和管理检测历史,这对于日常的维护和后续的数据分析都提供了极大的便利。
此外,我们的系统不仅能够处理图片、视频和实时摄像头输入,还能支持批量文件处理,这在提高铁路检测工作效率方面尤为关键。用户在完成缺陷检测后,系统会自动记录结果,并将其保存在用户的个人账户中。这样的设计,不仅能够帮助用户跟踪和回顾历史检测数据,还可以在需要时快速检索特定的检测事件。
通过上述账户管理和登录功能的设计与实现,我们的铁轨缺陷检测系统具备了导入各类深度学习模型,实现多物体识别和检测的能力。这一系列综合功能的整合,确保了系统不仅能够高效地识别出铁轨缺陷,还能为用户提供一个安全、可靠且易于管理的工作环境,满足现代化铁路检测的多方面需求。在未来,我们将继续优化用户体验,增强系统功能,以确保铁轨缺陷检测系统在铁路安全保障领域中的领先地位。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1LK421x7J5/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/ZZyUmpZv
YOLOv8/v5项目完整资源下载:https://mbd.pub/o/bread/ZZubmp5w
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/ZZucmp1y
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/ZZyUk5ls
在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时铁轨缺陷检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的铁轨缺陷检测结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Huang R, Pedoeem J, Chen C. YOLO-LITE: a real-time object detection algorithm optimized for non-GPU computers[C]//2018 IEEE international conference on big data (big data). IEEE, 2018: 2503-2510. ↩︎
Gai R, Chen N, Yuan H. A detection algorithm for cherry fruits based on the improved YOLO-v4 model[J]. Neural Computing and Applications, 2023, 35(19): 13895-13906. ↩︎
Mathew M P, Mahesh T Y. Leaf-based disease detection in bell pepper plant using YOLO v5[J]. Signal, Image and Video Processing, 2022: 1-7. ↩︎
Yung N D T, Wong W K, Juwono F H, et al. Safety helmet detection using deep learning: Implementation and comparative study using YOLOv5, YOLOv6, and YOLOv7[C]//2022 International Conference on Green Energy, Computing and Sustainable Technology (GECOST). IEEE, 2022: 164-170. ↩︎
Wang G, Chen Y, An P, et al. UAV-YOLOv8: a small-object-detection model based on improved YOLOv8 for UAV aerial photography scenarios[J]. Sensors, 2023, 23(16): 7190. ↩︎