基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的金属锈蚀检测系统(Python+PySide6界面+训练代码)
摘要:开发金属锈蚀检测系统对于建筑、交通、制造业等多个领域具有重要作用。本篇博客详细介绍了如何运用深度学习构建一个金属锈蚀检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间的性能指标,如mAP、F1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码、训练数据集,并集成了一个基于PySide6的界面。
系统能够精准检测金属锈蚀情况,支持通过图片、图片文件夹、视频文件及摄像头进行检测,包含柱状图分析、标记框类别、类别统计、可调Conf、IOU参数和结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换和UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1Py421q7UF/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmpps
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuclJ5s
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZucm5pv
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUlpdt
前言
在当今社会,金属作为重要的工业材料,在建筑、交通、制造业等多个领域发挥着不可替代的作用。然而,金属锈蚀作为一种普遍存在的自然现象,对金属材料的性能产生了极大的负面影响。金属锈蚀不仅降低了材料的使用寿命和结构稳定性,而且还会导致安全事故和巨大的经济损失。因此,开发一套高效、准确的金属锈蚀检测系统具有重要的研究意义和应用价值。传统的锈蚀检测方法,如目视检查和手工测量,不仅耗时耗力,而且结果的准确性和可靠性也难以保证。随着计算机视觉和深度学习技术的快速发展,基于图像处理的锈蚀检测方法成为了研究热点。
近年来,基于YOLO[1](You Only Look Once)系列算法的锈蚀检测研究取得了显著进展。YOLO算法以其高效的检测速度和良好的实时性能,在实时图像处理领域获得了广泛应用。从YOLOv5[2]到YOLOv8[3],每一个版本的更新都在检测速度、准确性和模型鲁棒性上有所提升。此外,随着数据集的不断丰富和优化,以及新型算法的不断涌现,金属锈蚀检测的性能得到了显著提高。例如,通过引入注意力机制和深度可分离卷积等技术,进一步优化了模型的检测能力和效率。
改进的卷积神经网络(CNN)架构在金属锈蚀检测中得到了广泛应用。这些改进的CNN模型通过引入更深层次的网络结构和新型的激活函数来提高特征提取的能力,从而提升检测的准确性。例如,一种基于改进ResNet模型的方法通过增加残差块的数量和调整连接方式,有效提高了对复杂锈蚀图像的识别能力。
其次,注意力机制被引入到锈蚀检测模型中,以提高模型对锈蚀特征的识别准确度。通过对重要特征区域赋予更高的权重,这些模型能够更加关注于图像中的锈蚀区域,从而提高检测的精度和效率。例如,一种基于Transformer结构的模型通过利用自注意力机制,显著提升了对金属表面细微锈蚀特征的检测能力。
此外,生成对抗网络(GAN)也在金属锈蚀检测中发挥了作用。通过对抗训练,GAN能够生成更加真实的锈蚀图像,用于增强训练数据集,这对于提高模型在实际应用中的泛化能力和鲁棒性是非常有益的。一些研究通过结合GAN和CNN,提出了一种新的锈蚀检测框架,该框架不仅能够有效检测锈蚀,还能在一定程度上评估锈蚀的严重程度。
在数据集方面,随着数据采集技术的进步和公开数据集的增多,训练更加准确和鲁棒的模型成为可能。一些最新的研究工作专注于构建专门针对金属锈蚀的大规模、高质量数据集,这些数据集包括了不同类型、不同程度的锈蚀图像,为模型训练提供了丰富的数据资源。
本博客所做的工作是基于YOLOv8算法构建一个金属锈蚀检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法进行金属锈蚀检测:本文详细介绍了YOLOv8算法在金属锈蚀检测领域的应用,并与YOLOv7[4]、YOLOv6[5]、YOLOv5等早期版本进行了性能比较。通过对比分析,展示了YOLOv8在检测速度、精准度以及模型鲁棒性方面的显著优势,为金属锈蚀检测提供了更为高效和准确的技术方案。
- 利用PySide6实现友好的用户界面:本文探索了如何使用Python的PySide6库来开发一个直观且用户友好的金属锈蚀检测系统界面。这一创新不仅提升了系统的操作便利性,也促进了YOLOv8算法在实际应用中的普及和应用,有助于技术从实验室走向实际生产应用。
- 系统集成登录管理功能:通过设计并实现一个登录管理功能,本文为系统增加了安全性和可扩展性。这一特性不仅保障了系统使用的安全性,也为将来根据用户需求添加更多个性化功能奠定了基础。
- 对YOLOv8模型进行深入研究:本文不仅应用了YOLOv8算法,还对其进行了深入的性能研究,包括精确度、召回率等关键性能指标的评估,以及在不同环境条件下的表现分析。这些研究成果不仅加深了对YOLOv8算法性能的理解,也为进一步的算法优化提供了宝贵的参考。
- 提供完整的数据集和代码资源包:为了促进技术的学习和进一步研究,本文提供了一套完整的数据集和代码资源包。这些资源不仅便于读者复现实验结果,还为基于YOLOv8以及其他版本的金属锈蚀检测研究和开发提供了实用的工具和数据基础。
1. 数据集介绍
在金属锈蚀检测系统的开发过程中,构建一个高质量的数据集是实现高效检测模型的基石。本研究所使用的数据集是经过精心策划和组织的,包含总计5218张图像,分为4177张训练图像、782张验证图像和259张测试图像。这一细致的划分确保了模型在训练过程中能够学习到丰富的特征,并在验证和测试阶段公正地评估其性能。
在预处理阶段,所有图像都被统一调整至640x640像素。这一操作是为了满足YOLOv8算法输入的需求,同时保证了数据在网络中的一致性。我们选择了拉伸图像的方式进行大小调整,虽然这可能会引入一定的形变,但实验表明,YOLOv8算法对此类变化表现出了良好的容忍度,这为我们在处理实际应用中不可避免的形变问题时提供了信心。
为了进一步提升模型的泛化能力,我们对图像进行了多种数据增强处理,包括随机旋转、翻转、缩放以及亮度和对比度调整等,这些处理模拟了真实世界中的各种条件,确保了模型能够在不同的环境下保持其检测能力。通过这样的增强,模型对金属锈蚀的识别变得更加鲁棒,从而能够适应更广泛的应用场景。
每张图像都经过了精确的边界框标注,标签详细指明了锈蚀区域的位置和大小。这些精细的标注是模型学习和后续检测准确性的关键。我们的标注工作围绕锈蚀区域进行,确保了高质量的训练数据,为模型提供了学习的基础。博主使用的类别代码如下:
Chinese_name = {'rust': "锈蚀"}
通过对数据集分布的分析,我们发现锈蚀区域在图像中心的分布相对集中,这可能是由于数据采集时相机的固定拍摄方式所导致。同时,锈蚀区域在图像上的相对位置分布均匀,表明锈蚀可能出现在金属表面的任何位置。尺寸分布分析表明,大多数锈蚀区域倾向于较小尺寸,提示我们在未来的工作中可能需要增加大尺寸锈蚀样本,以提高模型对不同尺寸锈蚀的检测能力。
总结来说,我们的数据集在金属锈蚀检测领域具有重要价值,不仅因为其庞大的规模,还因为其高质量的图像和精确的标注。预处理和增强处理的详尽考量,以及对数据分布的深入分析,为开发一个高效且准确的金属锈蚀检测模型提供了坚实的基础。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行金属锈蚀检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8作为一款先进的目标检测算法,代表了YOLO系列算法的最新进展。它继承了YOLO(You Only Look Once)系列算法的核心理念——即在单次推断中同时进行目标的定位和分类。YOLOv8对YOLO系列的架构进行了进一步的优化和改进,提高了在各种场景下检测对象的准确性和速度。
YOLOv8的架构继承了YOLO系列算法的三个主要组成部分:Backbone(主干网络)、Neck(颈部网络)和Head(头部网络)。在Backbone部分,YOLOv8采用了CSP(Cross Stage Partial networks)结构,该结构通过部分跳过连接来减少计算量并提升信息流动效率。CSP结构的关键在于它将网络层次分割,允许部分特征在深层网络中传递,从而提升了特征的利用效率和网络的学习能力。
在Neck部分,YOLOv8引入了SPP(Spatial Pyramid Pooling)和CFP(Coarse-to-fine)结构,这些结构使得网络能够捕捉不同尺度的特征,增强了模型对于不同尺寸目标的检测能力。SPP通过不同尺度的最大池化来聚合上下文信息,而CFP结构则进一步细化了特征,使得特征在多尺度上都能够有效地被网络学习和利用。
YOLOv8的Head部分则是整个网络的决策中心,它负责产生最终的预测结果。在Head部分,YOLOv8继续使用了YOLO系列的多尺度检测策略,能够在不同的特征图上检测不同大小的目标。这种多尺度策略使得YOLOv8在检测小目标和大目标时都表现出色,特别是在复杂场景中,能够有效区分接近的多个小目标,提高了整体的准确性。
在Backbone部分,YOLOv8采用了CSP结构。通过将网络层分割并跨阶段连接,实现了计算负荷的减少和特征信息的增强。这种设计允许部分特征直接传递到网络的深层部分,减少了冗余计算并提高了特征的利用效率。特别是在处理高维度特征时,CSP结构能够更有效地维护特征的丰富性,为后续的特征提取和识别提供了更为鲁棒的基础。
YOLOv8的另一大创新是其对训练过程的优化。利用AutoML技术,算法能够自动地进行超参数调整,这一点对于提升模型在不同数据集上的通用性和最终性能至关重要。此外,YOLOv8在网络结构的设计上也进行了自动化调整,利用神经网络架构搜索(Neural Architecture Search, NAS)技术,来发现最优的模型结构。这一过程利用大规模计算资源,如Cloud TPU或大型GPU集群,以确保搜索过程能够覆盖广泛的网络结构空间,找到最适合特定任务的最佳模型。
最后,YOLOv8在提高模型性能的同时,也考虑到了在实际应用中的效率和速度。它在模型的设计中采取了多种措施来减少计算负担,比如通过模型剪枝和量化技术,来减少不必要的计算和参数,同时保持检测性能。这些优化使得YOLOv8能够在资源有限的设备上运行,同时提供高速和高精度的检测能力。
综合上述技术,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/1.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 模型训练
在本博客中,我们将深入探讨如何使用Python和PyTorch框架来训练一个先进的目标检测模型——YOLOv8。训练深度学习模型是一个涉及多个步骤的过程,包括环境设置、数据准备、模型选择和训练执行等。在本次分享中,我们将逐步介绍这一过程的每个关键部分。
首先,我们需要准备编程环境。这包括导入必要的库和模块,如os模块用于处理文件路径,torch提供了PyTorch深度学习框架的功能,而yaml用于读取数据集的配置文件。我们还从ultralytics包中导入了YOLO模型,这是实现YOLOv8的关键组件。在这里,我们使用torch.cuda.is_available()检查CUDA是否可用,以确定是否可以在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"
接着,我们设定了一些基本的训练参数,如工作进程数和批次大小。这些参数会影响数据加载和模型训练的速度。然后,我们定义数据集的名称,并获取数据集配置文件的绝对路径。使用abs_path函数将相对路径转换为绝对路径,并确保路径格式符合UNIX风格,这对于跨平台的兼容性是有益的。
workers = 1
batch = 8
data_name = "MetalCorrosion"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
directory_path = os.path.dirname(unix_style_path)')
在准备好数据路径之后,我们读取YAML配置文件,这个配置文件包含了训练数据的相关信息。如果文件中包含路径(path)项,我们会更新它以确保路径正确。读取和写入YAML文件时,我们保持了文件中的顺序,这有助于保持配置的清晰和可读性。
# 读取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类创建一个模型实例,并加载预训练权重。最后,我们调用model.train()方法来开始训练过程,指定了数据路径、设备、工作进程数、图像大小、训练周期和批次大小等参数。我们为训练任务指定了一个唯一的名称,以便于区分不同的训练实验。
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=120, # 指定训练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=120, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
在深度学习模型的训练过程中,损失函数的变化趋势是评估模型性能的重要指标之一。从提供的图像中,我们可以对YOLOv8模型在金属锈蚀检测任务上的训练过程进行详细的分析。
首先,损失函数图展示了在训练和验证过程中的三种损失:边框损失(box_loss)、分类损失(cls_loss)和目标损失(obj_loss),分别对应于模型预测的边界框精度、类别预测准确性以及目标检测的确信度。在训练损失图中,我们可以看到随着训练进度的增加,即随着epoch数的增加,所有类型的损失都呈现下降趋势,这表明模型在不断学习和改进其对金属锈蚀检测的能力。损失函数的平滑曲线显示,训练过程稳定,无明显的波动,这通常意味着训练过程健康,没有遇到大的训练障碍如过拟合或梯度消失。
在验证损失图中,我们同样观察到损失随着时间下降的趋势,这意味着模型在训练集上学到的特征和规律能够很好地泛化到未见过的验证数据集上。这是模型泛化能力强的一个重要迹象。不过,需要注意的是,验证损失相比于训练损失略高,这是正常现象,因为模型在验证集上的表现通常略低于训练集。
接下来,我们关注性能指标图,包括精确度(precision)、召回率(recall)以及平均精度(mAP)。精确度和召回率是目标检测任务中评价模型性能的两个核心指标,精确度高意味着模型产生的假阳性少,而召回率高则表示模型漏检的情况少。从图中可以看到,随着训练进程的推进,模型的精确度和召回率都逐渐提高,这表明模型在识别金属锈蚀时越来越“精准”和“完整”。特别是,mAP(平均精度)的提升,体现了模型在各个IoU(交并比)阈值下的平均表现,从mAP@0.5到mAP@0.5-0.95的提升说明模型在不同严格度的IoU评价标准下均有良好表现。
在深度学习模型的评估过程中,F1分数是一个非常重要的指标,它在精确度(Precision)和召回率(Recall)之间提供了一个平衡,特别是在类别分布不均的数据集中。这里我们看到的是一个F1与置信度阈值(Confidence)的关系曲线,通过这个曲线图,我们可以对模型的性能进行深入的分析。
从上图中可以看出,在置信度阈值大约为0.34时,F1分数达到了0.79的峰值,这意味着在这个阈值下,模型在识别锈蚀时达到了精确度和召回率之间的最佳平衡。一般来说,F1分数越高,模型的性能就越好,因为它意味着模型在减少假阳性和假阴性的情况下,成功识别出更多的真阳性样本。在此模型中,F1分数达到0.79表示模型具有较高的锈蚀检测能力。
此外,F1分数随置信度阈值的变化呈现出先上升后下降的趋势,这是因为当阈值太低时,虽然模型能够检测出更多的锈蚀(高召回率),但同时会增加误检的可能性(低精确度);而当阈值太高时,模型虽然在确定检测出的锈蚀时更加“自信”(高精确度),但却可能遗漏一些真实的锈蚀(低召回率)。因此,选择一个合适的置信度阈值对于实际应用中模型的性能至关重要。
综合来看,这个F1分数曲线图为我们优化模型提供了重要的信息。它不仅显示了模型在当前状态下的性能,还指明了在不同置信度阈值下性能的变化趋势。通过这种分析,我们可以针对特定的应用场景调整阈值,以达到最优的检测效果。例如,在对准确性要求极高的场合,我们可能会选择一个较高的置信度阈值,而在希望尽可能不遗漏任何潜在锈蚀的场景中,我们则可能选择一个较低的阈值。
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.800 | 0.743 | 0.853 | 0.813 |
F1-Score | 0.78 | 0.74 | 0.84 | 0.79 |
(3)实验结果分析:
在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在金属锈蚀检测任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。
从提供的实验数据中我们可以看出,四种不同版本的YOLO算法在mAP和F1-Score上表现出了一定的差异。YOLOv5nu的mAP达到了0.800,F1-Score为0.78,这表明该版本在检测精度上表现良好,但在平衡召回率和精度方面仍有提升空间。YOLOv6n的mAP为0.743,F1-Score为0.74,两者数值相近,显示了该版本的综合性能相对平均。YOLOv7-tiny在这组数据中表现最优,mAP高达0.853,F1-Score也是最高的0.84,这说明它在识别锈蚀方面有着较好的综合性能,特别是在检测准确性方面。YOLOv8n的mAP和F1-Score虽然未能超过YOLOv7-tiny,但也达到了0.813和0.79的不俗成绩,证明了它在精度和召回率上的均衡表现。
通过这些数据,我们可以推断YOLOv7-tiny在处理金属锈蚀检测的数据集时具有较高的效果,可能是因为它在处理小型模型时的优化设计。而YOLOv8n虽然在性能上略逊一筹,但考虑到它是一个全新的版本,可能在其他方面(如速度、实时性能)有所改进。在选择适用的YOLO版本时,需要根据实际的应用场景和需求来做出选择。如果对检测速度要求较高,可能会选择YOLOv8n;而如果对检测精度要求更高,则YOLOv7-tiny可能是更好的选择。
总的来说,不同的YOLO版本适用于不同的应用场景和需求。实验数据为我们提供了一个直观的性能比较,但最终的选择应当基于全面的评估,包括模型的速度、资源消耗、易用性和适用性等因素。
4.4 代码实现
在本篇博客中,我们将揭示如何使用Python及其丰富的生态系统构建一个基于YOLOv8的金属锈蚀检测系统。我们的目标是创建一个能够实时处理视频流并在用户界面中显示检测结果的应用程序。
(1)引入必要的库
首先,我们导入了一系列必要的库。sys模块让我们能够与Python解释器进行交互,time模块帮助我们记录操作所需时间,而OpenCV库则是处理图像和视频数据的强大工具。QtFusion提供的QMainWindow用于构建应用程序的主窗口,而MediaHandler类则负责处理媒体流。此外,drawRectBox和get_cls_color函数用于在图像上绘制识别结果,并为不同的类别分配颜色。
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)
(2)设置主窗口
接着,我们定义了MainWindow类,这是我们GUI的核心。它不仅设置了窗口的大小,还包含了一个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函数,它是系统处理每一帧视频流的核心。该函数首先调整帧大小以适配GUI窗口,然后调用YOLOv8模型进行预测。我们通过计算并打印推理时间来评估性能。如果模型在当前帧中检测到目标,我们将使用drawRectBox函数在图像上绘制矩形框,并添加相关的信息标签。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
image = cv2.resize(image, (640, 640)) # 将图像的大小调整为850x500
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上显示图像
(4)初始化检测模型和设备
最后,我们初始化了YOLOv8Detector,这是我们检测模型的关键,负责加载预训练的YOLOv8模型。此外,我们创建了MediaHandler对象来从摄像头读取视频流,并将frame_process函数连接到新帧准备好时的信号。视频处理通过调用startMedia方法启动,此时,主窗口已经准备好显示实时视频并展示检测结果。
cls_name = ["锈蚀"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/metal-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())
通过这种方式,我们不仅展示了如何将深度学习模型与图形用户界面结合,还演示了如何在实际应用中实时处理和展示模型的预测结果。
5. 金属锈蚀检测系统实现
在实现一款实时金属锈蚀检测系统时,我们旨在创建一个直观、高效并且用户友好的应用程序。这个系统的核心是MainWindow类,它不仅承载了用户界面,同时也是各个组件相互作用的枢纽。我们的设计哲学基于“关注分离”原则,将处理逻辑、用户界面和控制流程区分开来,以确保代码的清晰和系统的可维护性。
5.1 系统设计思路
MainWindow类的主要目标是提供一个用户友好的交互式金属锈蚀检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。
架构设计
我们构建的架构体现了模块化设计,其中包括处理层、界面层和控制层,每层都有其独立的职责。
- 处理层(Processing Layer):处理层是系统的大脑,由YOLOv8Detector类实现,它负责加载预训练的深度学习模型,执行图像处理和锈蚀检测任务。这一层的算法优化了检测过程,使我们能够在不牺牲精度的前提下快速识别出锈蚀区域。
- 界面层(UI Layer):界面层则是用户与系统交互的前端,我们通过Qt设计工具构建了一套直观的界面。它由各种控件组成,如实时视频显示窗口、状态栏和控制按钮,提供了丰富的视觉反馈和便捷的操作方式。通过这些控件,用户可以实时观看视频流,同时看到系统识别出的锈蚀区域,即时了解检测结果。
- 控制层(Control Layer):控制层是连接处理层和界面层的桥梁。在MainWindow类中,我们定义了响应用户交互的事件处理函数,如开始、停止检测的槽函数等。它通过调用处理层提供的接口来控制检测流程,并将结果反馈到界面层显示。这一层的设计允许我们灵活地扩展功能,如添加新的控件或调整检测参数,而不会影响到其他层。
总之,我们的系统设计采用了一种结构清晰、各层职责明确的方式。这不仅有助于提升开发效率和后期维护,也为用户提供了一种易用和直观的操作体验。通过这种方式,我们希望将先进的深度学习技术以一种非专业用户也能轻松掌握的形式提供给终端用户,从而推动技术的普及和应用。
系统流程
本博客将详细介绍我们开发的交互式金属锈蚀检测系统的工作流程,这一系统能够实时检测视频流中的金属锈蚀,为用户提供直观的监控和操作界面。
- 用户在启动应用程序后会遇到一个直观的界面,这个界面是他们与系统互动的门户。这里,用户可以选择他们的输入源——无论是实时的摄像头视频流、一个视频文件,还是一张静态图片。每一种选择都由后台的媒体处理器和方法支持,确保无论用户的选择是什么,系统都能够顺利处理这些输入。
- 当输入源确定后,系统就开始了它的连续帧处理循环。首先是预处理阶段,系统对输入的每一帧图像进行必要的处理,以确保它们满足YOLO模型的输入规格。这包括但不限于调整图像大小、转换色彩空间,以及对图像进行归一化处理。预处理之后,图像将送入YOLOv8模型中进行检测和识别。这个强大的模型能够在图像中精确地标出锈蚀区域,并识别其类型。
- 一旦检测完成,用户界面会实时更新以展示检测结果。这不仅包括在图像上绘制检测框,而且还有在界面上实时显示检测统计数据的功能。用户可以互动地通过界面操作多种功能,比如保存检测结果、查询帮助文档,或是通过筛选功能深入分析特定的检测数据。此外,媒体控制也被纳入了用户的控制范围之内,用户可以根据需要开始或停止视频的播放,或是控制图像分析的过程。
整个系统的设计考虑了用户体验的流畅性和操作的直观性。我们的目标是将先进的YOLOv8锈蚀检测技术与用户友好的界面结合起来,使技术易于接触和使用,同时也保证了处理流程的高效性和准确性。
5.2 登录与账户管理
在我们的金属锈蚀检测系统中,为了提供更加安全和个性化的用户体验,我们引入了用户账户管理功能,这一功能的加入极大地增强了系统的实用性和个人隐私保护。通过利用PySide6强大的界面构建能力以及SQLite的轻量级数据库特性,我们为用户提供了一套完整的账户管理解决方案。
从用户第一次使用系统开始,便会接触到精心设计的登录界面。用户可以在此进行新账户的注册,这一过程简单快捷,仅需填写基本信息即可完成。注册后,用户拥有了一个私人空间,在这里,他们可以自由地保存检测结果和个人设置,如修改密码、更新个人头像,甚至注销账户。这些细节的处理体现了我们对用户体验的重视,每一项功能都旨在确保用户能够方便、安全地使用我们的系统。
进入主界面后,用户便可以开始金属锈蚀检测的任务。我们的系统不仅能够实时显示检测结果,包括锈蚀区域的检测框、类别和置信度,还能处理来自图片、视频、实时摄像头以及批量文件的多种输入方式。此外,系统的设计允许导入各类深度学习模型,实现复杂场景下的多物体识别和检测。无论用户需要检测的是单一图片中的锈蚀还是需要从连续视频流中实时识别锈蚀,我们的系统都能提供准确和及时的反馈。
结合账户管理和金属锈蚀检测的功能,我们的系统不仅提高了检测工作的效率,也为用户提供了一种全新的工作方式。通过个性化的设置,用户可以根据自己的需求调整系统,而这些调整会被关联到用户的个人账户,即便在不同的设备上登录,也能立即同步到个人化的环境配置。这种设计思路不仅满足了专业用户在实时目标检测场景下的复杂需求,也为一般用户提供了易于上手的操作路径。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Py421q7UF/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmpps
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuclJ5s
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZucm5pv
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUlpdt
在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时金属锈蚀检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的金属锈蚀检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ↩︎
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎