基于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/BV1wS421w7EU/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuakppq
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakplw
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakplv
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakplx
前言
在现代工业生产中,钢材作为一种基础且关键的材料,广泛应用于建筑、汽车、造船等多个领域。高质量的钢材是确保结构强度和安全性的前提,因此,钢材表面缺陷检测成为了一个重要的研究领域。钢材表面的缺陷,如裂纹、划痕、锈蚀等,不仅影响材料的外观质量,更重要的是会严重削弱钢材的物理性能,甚至导致结构性故障。因此,早期发现并准确识别这些表面缺陷对于保障工业产品的质量和安全至关重要。
随着人工智能技术的快速发展,尤其是深度学习在图像处理领域的广泛应用,基于YOLO系列算法的钢材表面缺陷检测研究取得了显著进展。YOLO算法因其高效的实时检测能力而受到广泛关注,自YOLOv5以来,YOLO系列在性能、速度和精确度方面经历了多次迭代改进,到YOLOv8的最新版本,这些算法不仅在钢材缺陷检测的准确率和检测速度上有了大幅提升,也在处理复杂背景和多样化缺陷类型方面显示出更强的鲁棒性。
国内外的研究者在不断推进YOLO算法及其它深度学习模型的优化和应用。近期的研究包括算法结构的创新优化、训练策略的改进、数据增强技术的应用以及特定于钢材缺陷检测的定制化模型开发等方面。这些进展不仅提高了模型的检测性能,也为实际生产环境中的应用提供了更为可行和高效的解决方案。
YOLOv5[1]作为一种流行的目标检测框架,已被证明在多个领域中有效,包括钢材表面缺陷检测。通过对网络架构和训练策略的优化,研究者已经显著提高了模型在复杂工业环境下的准确性和鲁棒性。接着,YOLOv6[2]引入了更加高效的特征提取和融合机制,进一步提升了检测速度和准确率,使其在实时检测应用中更为出色。
随后,YOLOv7[3]通过引入新的注意力机制和改进的损失函数,有效地提高了模型对小尺寸和低对比度缺陷的识别能力。这对于钢材表面缺陷检测尤为重要,因为这些缺陷往往难以被传统方法准确识别。而YOLOv8[4]进一步优化了模型架构和训练流程,通过更深更广的网络设计,实现了更高的检测性能和更好的泛化能力。
尽管当前基于深度学习的钢材表面缺陷检测技术已取得了显著进展,但仍面临一些技术挑战,如高度复杂多变的工业环境下的适应性问题、不同类型和尺度缺陷的精准识别问题,以及模型的通用性和可迁移性问题等。针对这些挑战,研究的趋势包括算法的深度优化、跨领域数据集的构建和利用、以及基于迁移学习和少样本学习的模型训练策略等。
在本博客中,我们深入探索了基于最先进YOLOv8算法的钢材表面缺陷检测系统的开发与实现,旨在为工业质量控制领域提供一个高效、准确的自动化解决方案。本文的主要贡献体现在以下几个方面:
- 采用最先进的YOLOv8算法进行钢材表面缺陷检测:本文通过引入YOLOv8,这一目前最为先进的目标检测算法,对钢材表面缺陷进行识别与检测。与先前广泛使用的模型如YOLOv5、YOLOv6、YOLOv7以及其他深度学习模型相比,YOLOv8展现出了更高的检测效率和精确度。我们详细介绍了YOLOv8算法的原理、架构及其在钢材缺陷检测中的应用过程,提供了一种新的视角和方法论,供学术界和工业界的研究者及从业人员参考。
- 利用PySide6实现友好的用户界面:通过运用Python的PySide6库,本文成功开发了一个用户友好的界面,使得钢材表面缺陷检测变得更加直观和便捷。这一系统设计不仅提高了YOLOv8算法的可接入性和实用性,而且促进了钢材表面缺陷检测技术的广泛应用。
- 集成登录管理功能,增强系统安全性:我们在系统中设计并实现了登录管理功能,确保了使用者在进行钢材表面缺陷检测之前需要进行身份验证,这一措施大大提升了系统的安全性,并为将来引入更多个性化功能奠定了基础。
- 对YOLOv8模型进行深入研究:本文不仅介绍了YOLOv8算法的基本原理和应用,还对其性能进行了全面的分析和评估,包括精确度、召回率以及在不同环境和条件下的表现。这些分析为未来针对算法的优化和改进提供了坚实的理论和实验基础。
- 提供完整的数据集和代码资源包:为了促进YOLOv8及其前版本在钢材表面缺陷检测领域的研究和应用,本文提供了一套完整的数据集和代码资源包。这些资源不仅包括用于算法训练和测试的详尽数据集,还有实现钢材表面缺陷检测的完整代码,使得读者能够轻松复现实验结果,并在此基础上进行进一步的探索和开发。
1.数据集介绍
在本研究中,我们专注于钢材表面缺陷检测的自动化,这一任务对于确保产品质量和安全性至关重要。为此,我们构建并分析了一个包含3037张图像的数据集,旨在通过深度学习技术,特别是利用YOLOv8算法,来识别和分类不同类型的钢材表面缺陷。数据集分为1862张训练图像,592张测试图像,以及583张验证图像,这样的划分保证了模型在各个阶段都有充足的数据来进行学习和评估。
图像预处理是数据集准备工作中的重要一环,我们对所有图像实施了自动定向处理并剥离了EXIF方向信息,这一步骤确保了图像在输入模型前具有正确的朝向,从而消除了由于图像方向不一致导致的潜在偏差。此外,所有图像均被调整至640x640像素的统一尺寸,采用了拉伸方法以符合YOLOv8算法的输入要求。虽然这可能会对缺陷的视觉表现产生一定影响,但它保证了模型训练和推断时计算的高效性,这对于构建一个实时的钢材表面缺陷检测系统至关重要。
通过对数据集的深入分析,我们得以洞察钢材表面缺陷在实际生产环境中的分布情况。缺陷实例的统计分布揭示了腐蚀缺陷在数据集中的主导性,这对于训练模型来说是一个有利因素,因为它意味着模型能够从大量的样本中学习到腐蚀缺陷的复杂特征。此外,焊接缺陷和孔洞缺陷的数量也相对较多,而裂纹缺陷较少,这提示我们可能需要对数据进行再平衡,以避免模型在训练过程中对某些类型缺陷产生偏见。
缺陷的位置分布图显示了一个集中趋势,表明大多数缺陷出现在钢材表面的中心位置。这一信息对于设计模型时的注意力机制和感受野的调整至关重要,因为它可以指导模型更加关注那些缺陷出现频率更高的区域。而缺陷大小的分布图则提供了对缺陷形状和尺寸的进一步了解。我们观察到大部分缺陷宽度较窄,这可能反映了钢材表面缺陷的一个普遍特性,即很多缺陷呈现为细长的形状。此外,博主使用的类别代码如下:
Chinese_name = {'Cacat_Korosi': "腐蚀缺陷", 'Cacat_Las': "焊接缺陷", 'Cacat_Lubang': "孔洞缺陷", 'Cacat_Retak': "裂纹缺陷"}
综上所述,我们的数据集不仅在数量上足以支持深度学习模型的训练和验证,在质量和多样性上也能满足钢材表面缺陷检测的复杂需求。通过精心的预处理和详细的分析,我们确保了数据集能够为研究提供坚实的基础,并为未来的工业应用奠定了基石。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行钢材表面缺陷检测的图片或视频,或者启动摄像头进行实时检测。在进行钢材表面缺陷检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8继承并发展了YOLO系列的核心原理,即“只看一次”(You Only Look Once)的快速目标检测方法。与前代模型相比,YOLOv8实现了显著的性能提升,这归功于其在网络结构、损失函数和标签分配策略上的若干创新。
首先,YOLOv8保留了YOLO系列特有的单次推理过程,这意味着模型在检测图像中的对象时,只需要一次前向传播。它避免了传统目标检测方法中重复区域提议和特征提取的步骤,从而极大提高了检测速度。此外,YOLOv8在网络架构上继续采用了YOLOv7中引入的CSPDarknet53作为骨干网络,这是一个通过重复使用特征图以减少计算量的策略,进一步提高了模型在处理图像时的效率。
YOLOv8在损失函数方面采用了更先进的策略,以优化模型对不同尺寸目标的检测能力。它通过精细化的标签分配机制——TaskAlignedAssigner——来确保标签与模型预测之间的对齐更加精确。这一改进使模型在训练过程中对每个目标的大小、形状和位置有了更敏感的反应,从而提升了模型对各类目标的识别能力。此外,YOLOv8通过引入Distribution Focal Loss来解决类别不平衡问题,这是一种对不同类别样本数量差异性给予不同权重的方法,它帮助模型在训练时更有效地学习那些较少出现的类别。
此外,YOLOv8在训练策略上也进行了创新。它采用自适应训练样本选择机制来优化模型性能,这种机制允许模型在训练过程中更聚焦于难以检测的目标,从而更有效地提高模型对这些目标的检测能力。这种自适应的训练方法使得YOLOv8能够在保持高速检测的同时,进一步提高模型的准确率和泛化能力。
整体来看,YOLOv8通过这些改进,在保持YOLO系列快速检测特性的同时,提高了模型的准确性和鲁棒性。它对不同大小的目标进行了更细致的区分,并且优化了损失函数来应对类别不平衡的挑战。这些特点使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/test.png")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在最新的博客文章中,我们探讨了如何使用YOLOv8算法来训练一个钢材表面缺陷检测模型。YOLOv8,作为目标检测领域的一项先进技术,已被证明在速度和准确性上具有显著优势。我们的代码示例展示了从加载数据集配置到模型训练的完整过程。
我们的模型训练过程开始于导入必要的库和模块。使用ultralytics库中的YOLO类,我们能够轻松地访问和使用YOLOv8模型。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
接下来,我们设置了训练模型时使用的基本参数。这包括使用的工作进程数workers和每个批次的大小batch。这些参数是深度学习训练过程中的关键配置,影响数据加载的效率和批处理的速度。我们首先获取这个YAML文件的绝对路径,并对路径字符串进行处理,确保它符合Unix风格的路径标准,因为不同操作系统间的路径表示有所差异。
if __name__ == '__main__': # 确保该模块被直接运行时才执行以下代码
data_path = abs_path('datasets/SteelDefect/steeldefect.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
directory_path = os.path.dirname(unix_style_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)
workers = 1
batch = 8
data_name = "SteelDefect"
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='0', # 指定使用CPU进行训练
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='0', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
在读取YAML配置文件后,我们对其进行了必要的路径修改,以确保训练时能够正确地找到数据集的位置。这是一个常见的预处理步骤,以确保配置文件与实际数据存储位置一致。然后,我们加载了预训练的YOLOv8模型,并开始了训练过程。这里使用YOLO类创建模型实例,并通过train方法启动训练过程。在训练中,我们指定了图像大小、训练周期数、批次大小以及训练任务的名称。这些参数将指导模型的训练过程,从而对模型进行优化。
在我们的YOLOv8模型训练过程中,损失函数和性能指标的监测对于理解模型的学习进度和行为至关重要。通过深入分析训练和验证阶段的损失函数图像,我们可以对模型的性能做出细致的评估。
从损失函数的图像中,我们可以看到模型在训练过程中的表现。损失函数的下降趋势表示模型正在学习识别钢材表面缺陷的能力。具体来说,训练集的边界框损失(train/box_loss)和类别损失(train/cls_loss)以及目标函数损失(train/obj_loss)随着训练周期的增加而稳步下降。这表明模型在定位缺陷位置、识别缺陷类别以及预测缺陷存在的可能性方面都取得了进步。同样,验证集上的损失(val/box_loss, val/cls_loss, val/obj_loss)也呈下降趋势,这进一步证明了模型在未见数据上的泛化能力。
精度和召回率是评估模型性能的两个重要指标。精度(metrics/precision)指的是模型正确识别缺陷的能力,而召回率(metrics/recall)则是模型识别出所有实际缺陷的能力。在图表中,我们看到精度和召回率在训练过程中波动较大,这可能是因为模型在学习如何平衡这两个指标。在理想情况下,我们希望两者都能够高,但在实践中,提高一个往往会影响到另一个。
mAP(mean Average Precision)是衡量模型整体性能的重要指标。图中的mAP50和mAP50-95展示了模型在不同IoU(Intersection over Union)阈值下的平均精度。mAP50是在IoU为0.5时的平均精度,而mAP50-95则是在IoU从0.5到0.95的范围内的平均值。我们看到mAP指标在训练过程中有所提高,尤其是mAP50的提升更为显著,这意味着模型在较宽松的IoU阈值下性能较好。mAP50-95的提升幅度相对较小,表明在更严格的IoU阈值下,模型的性能提升有限,这可能是由于模型对小缺陷或边界不明显的缺陷检测仍有改进空间。
F1分数是精度和召回率的调和平均值,它为我们提供了一个衡量模型分类准确性的综合指标。在这幅图中,每条曲线代表了不同钢材表面缺陷类别在各个置信度阈值上的F1分数,而最厚的蓝色线代表了所有类别的平均F1分数。下图为博主训练钢材表面缺陷检测的F1曲线图。
通过曲线,我们可以观察到,在置信度较低时,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.634 | 0.632 | 0.515 | 0.664 |
F1-Score | 0.66 | 0.68 | 0.55 | 0.740 |
(3)实验结果分析:
在我们的钢材表面缺陷检测研究中,对比了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个版本的YOLO模型的性能。通过在相同数据集上的实验,我们评估了这些模型的F1-Score和mAP(mean Average Precision),这些指标对于衡量模型准确性和可靠性非常关键。
首先,我们注意到在mAP值上,YOLOv8n以0.664的结果领先,显示出了较高的平均精度,这意味着YOLOv8n在各个IoU(Intersection over Union)阈值下保持了较高的检测准确率。YOLOv5nu和YOLOv6n的mAP值相当,分别为0.634和0.632,这表明这两个模型在钢材表面缺陷检测任务上具有相似的性能表现。而YOLOv7-tiny的mAP值为0.515,相较于其他模型有显著的下降,这可能是由于"tiny"版本的模型为了减少计算复杂度和提升速度,而牺牲了一定的准确性。
从F1-Score的角度来看,YOLOv8n以0.740的分数位于榜首,这一结果表明它在精确性和召回率之间取得了最佳的平衡。YOLOv6n的F1-Score也表现不俗,达到了0.68,略低于YOLOv8n,但仍优于YOLOv5nu的0.66。YOLOv7-tiny的F1-Score为0.55,这与其较低的mAP值相对应,进一步证实了在"tiny"版本中为了速度做出的性能妥协。
这些实验结果揭示了YOLO系列算法随着版本更新,在性能上的进步。特别是,YOLOv8n在钢材表面缺陷检测的任务上表现出较其前辈更优的性能。这可能得益于YOLOv8n在架构上的优化、更高效的特征提取方式以及改进的损失函数,这些改进提升了模型对复杂缺陷图像的识别能力。然而,也要注意到,高版本的YOLO模型通常需要更多的计算资源和训练时间,这是在选择模型时需要权衡的因素之一。
4.4 代码实现
在本篇博客文章中,我们将将详细介绍如何使用YOLOv8模型和QtFusion库来构建一个实时钢材表面缺陷检测应用。该应用结合了深度学习和图形用户界面(GUI)技术,能够实现高效、直观的缺陷检测。
(1)导入必要的模块和配置
我们的代码首先导入了必要的模块,包括sys和time,它们分别用于访问与Python解释器相关的变量和函数以及执行与时间相关的操作。OpenCV库(cv2)是我们处理图像和视频的工具。我们还使用了QtFusion库,这是一个包含了多个模块的库,提供了创建用户界面和处理媒体数据的功能。YOLOv8Model模块中的YOLOv8Detector类是我们进行目标检测的核心。
import random # 用于生成随机颜色
import sys # 用于访问Python解释器相关的功能
import time # 用于记录操作所需的时间
from QtFusion.config import QF_Config
import cv2 # OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 用于创建GUI窗口
from QtFusion.utils import cv_imread, drawRectBox # 辅助函数,用于图像读取和绘制
from PySide6 import QtWidgets, QtCore # 构建图形用户界面
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # YOLOv8模型,用于目标检测
QF_Config.set_verbose(False)
这一部分通过导入必要的库来处理Python运行时环境、时间、图像处理以及GUI创建等相关操作。使用OpenCV库进行图像处理是实现这一功能的关键。同时,PySide6库支持创建一个图形用户界面,使得操作更为友好。
(2)定义类别和模型
我们进一步初始化了YOLOv8检测器,加载了针对钢材表面缺陷检测优化的预训练模型。每个类别的缺陷都有一个相应的颜色编码,这使得在视频帧中检测到的不同类型的缺陷可以用不同的颜色标识出来,提高了可视化的直观性。
cls_name = ["腐蚀缺陷", "焊接缺陷", "孔洞缺陷", "裂纹缺陷"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/steel-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
我们设置了应用程序的主窗口,定义了MainWindow类并设置了窗口的大小。同时,在主窗口中包含了一个用于显示图像的标签,这为后续在GUI中展示实时检测结果提供了基础。
class MainWindow(QMainWindow): # 自定义主窗口类
def __init__(self): # 构造函数
super().__init__() # 调用父类构造函数
self.resize(850, 500) # 设置窗口大小
self.label = QtWidgets.QLabel(self) # 创建标签用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置标签位置和大小
def keyPressEvent(self, event): # 键盘事件处理
if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q键时
self.close() # 关闭窗口
(4)主程序流程
接着,我们构建了帧处理函数frame_process,它是实时检测的核心。函数中,每一帧图像被调整大小,通过预训练的YOLOv8模型进行预处理和推理,并将检测结果以矩形框的形式绘制在图像上。
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上显示图像
最后,我们设置了视频处理的媒体处理器,并将其与主窗口相连。通过将frame_process函数连接到每个新帧的准备信号上,我们确保了每当有新的视频帧准备好时,都能够被处理并显示在GUI中。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
filename = abs_path("test_media/JapanStreet.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())
通过上述详细介绍,我们可以了解到该项目是如何将复杂的深度学习模型与用户友好的界面结合起来,以创建一个实用且高效的钢材表面缺陷检测系统。这样的系统不仅能够在工业环境中快速部署,而且其直观的图形界面也使得操作人员能够轻松地监测和分析检测结果。
5. 钢材表面缺陷检测系统实现
在构建我们的交互式钢材表面缺陷检测与识别系统时,我们采取了一种集成化的系统设计思路,旨在提供一个高效、直观并且用户友好的操作环境。此系统的设计理念基于模块化的架构,使得界面层、处理层和控制层能够紧密而清晰地协作。
5.1 系统设计思路
在我们的系统设计中,我们的设计理念是以用户体验为中心,旨在创建一个直观、易于使用且功能强大的应用。该系统的设计结合了计算机视觉技术和人机交互设计,致力于提高缺陷检测的准确性和效率,同时确保操作的简便性。
(1)架构设计
系统的核心是MainWindow类,它是用户交互的主要界面。这个类不仅包含了图形界面元素的布局,如显示视频流的标签,还负责协调用户指令与后端处理逻辑之间的交互。这样的设计允许用户通过简单的操作,如按钮点击或键盘输入,就能操控整个检测流程,从视频播放到实时缺陷检测的展示。
为了确保系统的高性能和高准确率,我们整合了YOLOv8Detector,一个基于深度学习的检测器,它预装了针对钢材缺陷检测优化的模型。这个检测器作为处理层的核心,负责分析视频帧,识别出缺陷并以标注框的形式实时呈现。通过高效的图像处理技术,保证了检测过程的速度与准确性。
在用户界面层,我们精心设计了布局和交互逻辑,以使用户能够通过直观的操作来启动检测任务,查看检测结果,并进行必要的配置。通过图形化展示缺陷检测结果,用户可以快速理解模型的检测情况,并对其进行评估。
控制层则作为桥梁,连接用户界面和处理器。它响应界面事件,如视频播放控制和停止检测等操作,并将指令传递给后端处理器执行。此外,控制层还处理来自检测器的数据,将检测结果转化为视觉反馈,展示在用户界面上。
总而言之,通过这三层协调工作,我们的系统不仅在技术上实现了高效的钢材表面缺陷检测,而且在用户体验上也达到了简洁和直观的效果。这种系统设计思路确保了应用的可扩展性和维护性,为未来的功能升级和优化奠定了基础。
(2)系统流程
在我们的最新博客中,我们将详细探讨构建一个交互式钢材表面缺陷检测系统的流程。此系统以用户体验为核心,旨在提供一个高效、直观的缺陷检测平台。从启动应用到展示最终的检测结果,每一步都经过精心设计,确保用户能够轻松、准确地完成钢材表面缺陷的检测任务。
-
系统的运行始于实例化MainWindow类,这个类的实例化过程包括加载用户界面、初始化配置参数,并预备好接收用户的指令。用户界面不仅友好且直观,还提供了丰富的交互功能,如选择输入源—这可以是实时视频流、预录制的视频文件或单个图像文件。这为用户提供了灵活性,可以根据实际需求选择不同的输入方式。
-
选择输入源之后,系统动态调用媒体处理器开始处理数据流。这个过程可能包括设置摄像头参数、解码视频数据或加载图像文件,目的是为检测算法准备数据。一旦输入源准备就绪,系统即进入连续帧处理的阶段。这个环节至关重要,因为它直接关系到检测的实时性和准确性。
-
在预处理阶段,系统对每一帧图像进行标准化处理,包括调整图像尺寸和颜色空间转换,以确保图像数据满足YOLOv8模型的输入要求。紧接着是检测与识别阶段,此时,系统利用先进的YOLOv8模型对预处理后的图像进行深度分析,准确标出钢材表面的缺陷位置,并识别出具体的缺陷类型。
-
随着检测结果的产出,用户界面将被实时更新,新的检测结果以图形化的方式呈现,包括在图像上绘制的检测框和缺陷类别标签。系统还能在界面中显示统计数据和分析图表,为用户提供更深入的结果解读。
-
用户互动是系统设计的一个重要方面。我们提供了多种交互按钮,让用户能够执行诸如保存结果、访问帮助信息以及筛选特定检测结果的操作。此外,媒体控制功能使用户能够根据需要暂停或继续媒体流的处理,为用户提供了完全的控制权。
整个设计流程旨在打造一个集高效率、高精准度和易用性于一体的系统,不仅适用于工业质量检测专家,也适合非专业用户。通过这样的系统设计,我们相信能够为钢材表面缺陷检测领域带来革新,提高检测工作的自动化水平,从而优化生产流程,确保产品质量。
5.2 登录与账户管理
在我们的钢材表面缺陷检测系统系统中,引入了用户账户管理功能,这一设计强化了系统的个性化和安全性。我们使用了PySide6作为GUI开发框架,并结合SQLite数据库来处理用户账户的数据存储和管理,这使得用户可以在私密的环境中使用我们的检测系统。
系统首次使用时,用户将会遇到一个简洁且直观的登录界面。这个界面不仅允许用户通过注册创建新的账户,也支持已有用户通过输入用户名和密码进行登录。账户管理模块提供了一系列功能,包括密码修改、头像设置以及账户注销,允许用户根据个人喜好进行自定义设置,并保护用户的隐私。
注册和登录过程的便捷性为用户打开了通往主界面的大门,在这里,用户可以执行钢材表面缺陷检测等核心任务。用户的所有操作——无论是对检测参数的微调,还是对检测结果的保存和管理——都与其账户挂钩,确保了每位用户的工作环境都是个性化且持续性的。同时,账户信息的安全性得到了加强,每次用户完成工作后都可以选择注销账户,保护其操作和数据不被未授权访问。
这些账户管理功能不仅提供了额外的便利和安全保障,还使得系统可以适应多用户环境,每位用户都可以在不同的工作会话中保持自己的环境设置和历史记录。这样的设计考虑了实际工作场景中的需求,无论是单一用户还是团队,都能高效地管理自己的工作流程。
此外,我们的系统不仅限于静态图像或预录制视频的分析,还支持实时视频流处理,用户可以直接连接摄像头进行实时检测。同时,批量文件输入功能允许用户高效地处理大量数据,系统会自动保存所有识别的结果和记录,为用户提供了一站式的钢材缺陷检测服务。
综上所述,通过精心设计的用户登录和账户管理功能,我们的系统在提供强大的钢材表面缺陷检测功能的同时,也为用户带来了个性化和安全性的双重保障。这些功能的结合,使得系统更加人性化,更能满足不同用户在实时目标检测场景下的多样化需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1wS421w7EU/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuakppq
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakplw
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakplv
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakplx
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的钢材表面缺陷检测结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
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. ↩︎
. 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. ↩︎
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. ↩︎
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. ↩︎