基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的布匹缺陷检测系统(Python+PySide6界面+训练代码)
摘要:本文介绍了一种基于深度学习的布匹缺陷检测系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的布匹缺陷。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于PySide6的用户界面(UI)。该系统实现了对图像中布匹缺陷的准确识别和分类,并包含了基于SQLite的登录注册管理、一键更换YOLOv5/v6/v7/v8模型以及界面自定义修改等功能。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考,完整代码资源文件以及数据集可以在文末的下载链接中获取。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1LS421P7ui/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuZl5Zv
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk5ty
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZlp9w
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZl5Zr
前言
在当今快速发展的纺织工业中,高品质的布匹生产已经成为企业在激烈市场竞争中立足的关键。布匹缺陷检测系统的出现,正是为了满足行业对高效率、高精度检测技术的迫切需求。在过去,布匹缺陷的检测主要依赖于人工视觉,这不仅效率低下,而且检测结果受到操作员疲劳度、经验和主观判断的影响,难以保证长期的一致性和准确性。随着人工智能和机器视觉技术的进步,布匹缺陷检测系统的开发成为了提升生产质量和效率的关键技术创新。
深度学习技术在布匹缺陷检测领域的应用已经取得了显著的进步。随着计算能力的提升和算法的不断优化,基于深度学习的方法能够更加准确和高效地识别各种类型的布匹缺陷。尤其是YOLO(You Only Look Once)[1]系列算法,在实时图像处理和缺陷检测方面展示了其强大的性能。
YOLOv5[2]作为一个在速度和准确性之间取得了良好平衡的算法,已被广泛应用于工业质量检测,包括布匹缺陷检测。研究表明,YOLOv5能够在保持高检测速度的同时,实现较高的缺陷识别准确率。其轻量化的网络结构使得它能够被部署在不同的硬件平台上,包括边缘计算设备,这对于实时布匹检测尤为重要。
YOLOv6[3]进一步优化了模型的性能和效率,通过引入更加高效的特征提取和融合机制,显著提升了检测的准确性和速度。这一版本在处理复杂纹理和不规则缺陷方面表现出了更好的鲁棒性,这对于布匹缺陷检测来说是一个重要的进步。YOLOv7在继承前代优点的基础上,通过改进的训练策略和网络结构调整,进一步提高了在各种尺寸缺陷检测上的性能。特别是在小缺陷检测方面,YOLOv7展现了优于前几代算法的能力,这对于提高布匹检测的全面性和准确性至关重要。随后,YOLOv6[3:1]和YOLOv7[4]的发布,通过改进网络结构和训练策略,进一步提高了检测的准确率和速度。最新的YOLOv8[5]进一步突破了性能限制,通过引入更先进的网络架构和训练技术,实现了在布匹缺陷检测上的新高度。研究显示,YOLOv8不仅在检测速度上有所提升,而且在处理极其细微或难以识别的缺陷方面具有更高的精度。这标志着深度学习在布匹缺陷检测领域的应用达到了一个新的里程碑。
此外,除了YOLO系列之外,还有其他深度学习模型如Mask R-CNN、Fast R-CNN等也被应用于布匹缺陷检测,这些模型在特定类型的缺陷检测方面也表现出了优异的性能。尽管深度学习技术在布匹缺陷检测领域已取得了显著的进步,但仍存在一些挑战和研究空间。例如,如何进一步提高检测算法的准确性和鲁棒性、如何有效地处理不同类型和背景下的布匹缺陷检测、以及如何减少算法的计算复杂度以适应低功耗设备的需求等。未来的研究需要在算法优化、模型轻量化、数据集丰富性以及跨领域应用等方面进行更深入的探索。
本博客在布匹缺陷检测领域的研究中作出了重要贡献,不仅介绍了最先进的YOLOv8算法的应用,还提供了一套完整的系统实现和深入的技术分析。具体贡献如下:
- 采用最先进的YOLOv8算法进行布匹缺陷检测:本文详细介绍了YOLOv8算法在布匹缺陷检测中的应用,突破了传统深度学习模型在处理速度和精确度上的限制。通过与YOLOv7、YOLOv6、YOLOv5等早期版本的对比分析,本文展现了YOLOv8在布匹缺陷检测方面的优越性能,为该领域提供了一种更高效、更准确的检测方法。
- 利用PySide6实现布匹缺陷检测系统:本文探索了如何使用Python的PySide6库开发一个友好的用户界面,使得布匹缺陷检测过程更加直观和便捷。该系统的设计不仅提高了用户体验,也促进了YOLOv8算法在布匹缺陷检测领域的实际应用和普及。
- 包含登录管理功能,提升系统安全性:通过设计登录管理功能,本文的系统增加了使用门槛,提高了操作的安全性。这一设计为将来系统的扩展提供了可能,比如添加更多个性化功能,满足不同用户的需求。
- 对YOLOv8模型的深入研究:本文不仅应用了YOLOv8算法进行布匹缺陷检测,而且对该算法的性能进行了全面的评估和分析。包括精准度、召回率等关键性能指标的评估,以及在不同条件下的表现分析,为算法的进一步优化和应用提供了坚实的基础。
- 提供完整的数据集和代码资源包:为了便于读者更好地理解和实践,本文提供了一个完整的数据集和代码资源包。这些资源不仅包括用于训练和测试的详尽数据集,还有实现布匹缺陷检测系统的完整代码,使读者能够直接复现实验结果,并在此基础上进行进一步的研究和开发。
1.数据集介绍
在本文中,我们为布匹缺陷检测系统设计的一个详尽且精细的数据集,该数据集专门针对使用先进的YOLOv8算法进行缺陷识别和分类。数据集由10056张图像组成,其中包括8970张训练图像、882张验证图像和204张测试图像。这一规模的数据集不仅为深度学习模型的训练提供了丰富的样本,而且保证了在后续的验证和测试阶段,模型能够在多样化的数据上评估其泛化能力和性能。
在对数据集进行预处理和增强处理方面,我们采取了一系列标准化措施以优化模型的训练效率和最终性能。首先,所有图像均经过自动定向处理,确保图像以统一的方向输入模型,同时去除了可能影响模型训练的EXIF定向信息。其次,图像被统一调整至640x640分辨率,这样的拉伸调整是为了满足YOLOv8算法的输入要求,确保了输入数据的一致性。最后,通过自适应直方图均衡化技术,我们增强了图像的对比度,特别是在局部对比度较低的区域,这有助于算法更准确地识别那些在复杂纹理背景下容易被忽视的缺陷。
数据集中的缺陷类型分布显示,针脚(Stitch)缺陷的样本数量最多,这反映了实际生产过程中最常见的缺陷类型。尽管孔洞(Hole)和接缝(Seam)样本数量较少,但仍然为模型提供了足够的学习样本,以确保能够识别这些较少见的缺陷类型。缺陷位置的分析揭示了一个明显的模式,即缺陷主要集中在图像的中心区域。这种模式可能与布匹的生产和加工方式有关,且对于训练策略的调整至关重要。例如,为了防止模型对中心区域过度拟合,我们可能需要设计特定的数据增强策略,以增加边缘缺陷的识别能力。
缺陷形状的分布进一步为模型设计提供了指导。大多数缺陷在宽度上较窄,而在高度上的分布则相对分散。这些信息对于设计检测框架,尤其是选择适当的先验框大小和比例非常重要。我们可以调整YOLOv8算法中的锚点框,以便更精确地拟合这些常见的缺陷形状。博主使用的标签及其对应的中文名称如下所示:
Chinese_name = {'Hole': "破洞", "Stitch": "缝补", "Seam": "接缝"}
综上所述,我们的数据集不仅在数量上满足了深度学习训练的需求,其详尽的预处理和增强处理也确保了数据的高质量。通过对缺陷类型、位置和形状的详细分析,我们为模型训练和算法调整提供了宝贵的洞察,这将有助于我们开发出既高效又准确的布匹缺陷检测系统。此外,对类别不平衡和中心偏置的考量,以及形状特征的详尽分析,使我们能够优化模型以应对实际应用中的各种挑战。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行布匹缺陷检的图片或视频,或者启动摄像头进行实时检测。在进行布匹缺陷检时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法是目标检测领域的最新突破,继承并优化了其前代YOLO系列算法的架构。YOLOv8的核心原理在于其能够以极高的速度和精度执行图像中的目标检测任务。下面,我们将详细解读YOLOv8的关键技术和架构特点。
YOLOv8采用了精心设计的深度神经网络,其结构包括多个关键的模块:Backbone(主干网络)、Neck(颈部网络)和Head(头部网络)。Backbone负责从输入图像中提取特征,Neck用于特征融合和优化,而Head则是直接进行目标检测。
在Backbone部分,YOLOv8继承了YOLO系列特有的CSP(Cross Stage Partial)结构,这是一种创新的设计,通过分离特征图并在网络的不同阶段进行合并,以减少计算量并保持性能。CSP结构能够减轻网络负担,提高特征提取的效率。同时,YOLOv8在此基础上融入了SPP(Spatial Pyramid Pooling)模块,进一步提升了特征的尺度不变性和感受野范围。
YOLOv8算法的特征提取非常强大,它使用了SLU(Sigmoid Linear Unit)作为激活函数,以替代传统的ReLU函数。SLU通过结合Sigmoid和线性单元的特点,提高了梯度流动和网络的非线性表示能力。这种激活函数有助于网络学习更加复杂的特征,同时避免了ReLU在面对负输入值时的“死亡ReLU”问题。
在特征融合方面,YOLOv8引入了CSP bottleneck结构,它使用两个卷积层快速提取特征,并在CSP模块中进行融合。通过CSP的设计,YOLOv8实现了特征的跨阶段融合,提高了特征的利用率,并且有效减少了参数量和计算复杂度。
在目标检测阶段,YOLOv8保留了YOLO系列的anchor-based策略。头部网络(Head)采用了多尺度检测策略,通过在不同分辨率的特征图上检测目标,YOLOv8能够同时识别小目标和大目标。通过这种多尺度检测,算法能够适应目标在图像中的不同尺寸。
YOLOv8在算法优化方面也做出了显著的进步。例如,算法内部采用了BN(Batch Normalization)和CIoU(Complete Intersection over Union)损失函数,这些技术都是为了提高模型训练的稳定性和检测的准确性。BN通过标准化特征图来加速学习过程,而CIoU损失函数则针对目标的位置和形状提供了一种更加精确的回归策略。
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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
首先,我们使用QtFusion.path的abs_path函数来获取数据集配置文件fabric.yaml的绝对路径。这个YAML文件包含了训练所需的所有数据集信息,包括类别、图像路径和标注信息。我们还将路径转换为UNIX风格以确保兼容性。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
接下来,代码读取YAML文件并检查是否包含path项。如果存在,将其更新为包含数据集的目录路径。这是确保模型能够正确找到训练数据所必需的步骤。之后,更新后的数据被写回到YAML文件中。我们使用ultralytics库中的YOLO类来加载预训练的YOLOv8模型。使用预训练权重yolov5nu.pt是为了快速启动训练过程并利用之前学习到的特征。随后,我们调用model.train()方法开始训练过程,指定了多个参数,包括数据路径、设备、工作进程数、图像大小、训练周期数和批次大小。
if __name__ == '__main__': # 确保该模块被直接运行时才执行以下代码
data_path = abs_path('datasets/Fabric/fabric.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 = "Fabric"
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='cpu', # 指定使用CPU进行训练
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='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=120, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
通过上述代码,我们展示了如何配置和训练YOLOv8模型以检测布匹缺陷。整个过程涉及到配置文件的读取和修改、模型参数的设定以及训练过程的执行。这些步骤确保了训练过程的顺利进行,同时使我们能够得到一个经过充分训练、用于实际生产环境中检测布匹缺陷的强大模型。
在深度学习模型的训练过程中,损失函数的变化以及精确度指标的改进是衡量模型性能的关键。通过仔细分析YOLOv8模型训练时的损失函数和性能指标图表,我们能够获得模型训练过程的深入洞察,从而优化模型以实现更好的性能。首先,训练损失图表显示了训练过程中的box损失、分类损失和目标损失(train/box_loss, train/cls_loss, train/obj_loss)随着时间的递减。这些损失的下降表明模型在识别目标位置、分类目标类别以及预测目标存在的置信度方面正在逐渐改善。特别是,box损失的显著下降意味着模型越来越擅长定位图像中的目标,这对于目标检测任务至关重要。分类损失的下降则表示模型在区分不同类别的目标上变得更为准确。
然而,在验证阶段,我们观察到box损失(val/box_loss)和目标损失(val/obj_loss)的曲线出现了波动,尤其是在训练初期,这可能是由于模型还在学习过程中,或是验证数据集的多样性引起的。随着训练的进行,损失曲线趋于平稳,说明模型在验证数据上的泛化能力得到了提升。
查看精度指标,我们可以看到训练和验证阶段的精确度(precision)和召回率(recall)随着训练的进行而逐步提高,这表明模型的预测越来越符合标注数据。精确度的提高说明模型在预测目标时越来越少犯错,而召回率的提高则意味着模型能够检测到更多的正样本。
最为重要的是,模型的平均精度均值(mAP@0.5和mAP@0.5-0.95)持续增长,这是衡量目标检测模型性能的关键指标之一。mAP@0.5指标反映了在IoU(交并比)阈值为0.5时模型的性能,而mAP@0.5-0.95则表示模型在一系列更严格的IoU阈值下的平均性能。这两个指标的增长表明模型不仅在简单情况下表现良好,即使在更为严格的条件下也能保持高性能。
在我们的布匹缺陷检测模型评估中,F1分数与置信度阈值的关系提供了模型性能的重要视角。F1分数是精确度和召回率的调和平均,它是一个综合指标,用于评价模型的整体性能。理想情况下,我们希望F1分数尽可能高,表示模型在精确度和召回率之间达到了良好的平衡。
从所提供的F1-置信度曲线图中可以观察到,不同类别的缺陷检测性能有明显差异。具体来说,“Hole”类别的F1分数在所有置信度阈值下都相对较高,这表明模型对于检测“Hole”类别缺陷的能力较强。相反,“Seam”类别的F1分数整体较低,尤其是在高置信度阈值下,这可能指出模型对“Seam”类别的检测存在一些困难。而“Stitch”类别的F1分数介于两者之间,表明“Stitch”类别的检测性能适中。
对于所有类别综合起来,最高的F1分数约为0.58,出现在置信度阈值约为0.45时。这个最优点表明,在该置信度水平下,模型对于检测所有类别的布匹缺陷实现了最佳的精确度与召回率的平衡。然而,随着置信度阈值的增加,所有类别的F1分数逐渐下降,这表明当模型过于自信时,它可能会错过一些正确的检测(即降低了召回率),或者它过于保守而不标记为正的实例(即降低了精确度)。
对于所有类别,F1分数在置信度阈值增加到一定程度后出现急剧下降,尤其是在0.8之后。这通常表明模型在这些阈值下过于谨慎,只有非常高的置信度时才会进行标记,导致大量的真实正样本没有被检测到。这种现象在模型应用于实际场景时需要特别注意,因为过高的阈值可能会造成许多漏检。
综合上述分析,我们可以得出结论,模型在“Hole”类别上表现最佳,对“Stitch”和“Seam”类别的检测效果则需要进一步改进。通过调整置信度阈值,我们可以在减少误报和漏报之间找到最佳平衡点。此外,通过细化模型训练过程或提供更多的训练数据,特别是对于“Seam”类别,可能有助于提高模型的整体性能。最终,我们的目标是优化模型,以在各种缺陷类型上都能实现准确且一致的高性能检测。
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.554 | 0.534 | 0.412 | 0.549 |
F1-Score | 0.58 | 0.59 | 0.50 | 0.58 |
(3)实验结果分析:
在进行YOLO系列模型的比较时,我们关注两个关键的度量指标:平均精度均值(mAP)和F1分数。这两个指标为我们提供了关于模型性能的综合信息,其中mAP反映了模型在不同置信度阈值下的整体检测精度,而F1分数则衡量了精确度和召回率的平衡。在同一数据集上对YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n进行比较,可以帮助我们了解各个版本在布匹缺陷检测任务上的性能。
YOLOv5nu在mAP上取得了0.554的分数,这是四个模型中的第二高分。在F1分数上,YOLOv5nu与YOLOv8n并列最高,达到0.58,表明它在精确度和召回率之间达到了较好的平衡。YOLOv5nu的这些指标表明,尽管它是较早的版本,但其性能仍然非常强劲。
YOLOv6n在mAP上的分数稍低,为0.534,而在F1分数上则略高于YOLOv5nu和YOLOv8n,达到0.59。这一结果可能表明YOLOv6n在识别正确的缺陷上更加精确,但在召回所有真正缺陷上可能略有不足,导致mAP稍低。YOLOv7-tiny的性能在这一组对比中是最低的,其mAP为0.412,F1分数为0.50。这个版本的模型是一个“轻量级”的模型,可能更适合于资源受限的环境,但显然在检测性能上有所牺牲。YOLOv8n的表现在mAP上与YOLOv5nu相近,为0.549,而F1分数则与YOLOv5nu并列最高。这表明YOLOv8n在整体检测精度上与YOLOv5nu持平,同时保持了对正负样本的良好判别平衡。
从这些数据中,我们可以得出结论,尽管YOLO系列随着版本更新有所改进,但YOLOv5nu和YOLOv8n在布匹缺陷检测任务上展现了相似且较优的性能。YOLOv6n在F1分数上稍胜一筹,可能在特定的应用场景中更为适用。YOLOv7-tiny作为轻量级模型,在性能上不可避免地有所妥协,但在需要快速运算的环境中仍然有其应用价值。
4.4 代码实现
在这篇博客中,我们将深入探讨如何使用YOLOv8模型,结合Python和OpenCV库,构建一个实时的布匹缺陷检测系统。这项技术不仅为工业自动化提供了新的解决方案,还展示了深度学习在实际应用中的强大潜力。
(1)导入必要的模块和配置
首先,导入必需的模块。random用于生成随机颜色,sys用于访问与Python解释器相关的变量和函数,time则用来记录操作的时间。cv2是OpenCV库的核心,用于图像的读取和处理。而PySide6提供了一套完整的Qt6工具集,用于构建跨平台的GUI应用程序。此外,还引入了自定义的QtFusion和YOLOv8Model模块,分别负责窗口管理和提供YOLOv8目标检测功能。
import random # 导入random模块,用于生成随机数
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于处理时间
from QtFusion.config import QF_Config
import cv2 # 导入OpenCV库,用于处理图像
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建窗口
from QtFusion.utils import cv_imread, drawRectBox # 从QtFusion库中导入cv_imread和drawRectBox函数,用于读取图像和绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库中的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于加载YOLOv8模型并进行目标检测
QF_Config.set_verbose(False)
在代码中,我们使用QtFusion库,这是一个封装了Qt功能的库,它提供了创建现代化窗口和控件的方法。
(2)定义类别和模型
我们接着创建了YOLOv8Detector的实例,并加载了预先训练好的模型权重。这个步骤是实现检测功能的关键,它确保我们的系统具备了直接进行布匹缺陷检的能力。
cls_name = ["破洞", "缝补", "接缝"] # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 为每个目标类别生成一个随机颜色
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/fabric-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
(3)创建主窗口
在MainWindow类中,我们设置了窗口的基本属性,如尺寸和标签,并定义了键盘事件处理,以便用户可以通过按下Q键退出应用程序。这是构建交互式应用程序的标准方法。
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)主程序流程
在主函数中,我们创建了主窗口并处理了图像。使用cv_imread函数从文件中读取图像,并对其进行预处理以适配YOLOv8模型的输入要求。我们计算了模型推理的时间,并打印出来,这对于评估系统的实时性能至关重要。
if __name__ == '__main__': # 如果当前模块是主模块
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
img_path = abs_path("test_media/Fabric_SIXU_A01258.jpg") # 定义图像文件的路径
image = cv_imread(img_path) # 使用cv_imread函数读取图像
image = cv2.resize(image, (850, 500)) # 将图像大小调整为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: # 遍历检测信息
# 获取类别名称、边界框、置信度和类别ID
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_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上显示图像
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
模型预测后,我们使用了drawRectBox函数在图像上绘制了检测到的缺陷的边界框,并在每个边界框上添加了相应的标签,包括缺陷类别和模型的置信度。这些信息的可视化对于用户理解和信任模型预测是非常重要的。最后,我们在GUI窗口中展示了最终的检测结果,并启动了Qt应用程序的事件循环,这是任何基于Qt的GUI应用程序的标准结束流程。
这通过这段代码的深入分析,我们可以看到将深度学习模型与图形用户界面结合是如何提供一个直观的操作环境,同时实现了复杂的图像处理和目标检测任务。通过这样的工具,我们可以更直观地理解YOLOv8模型在实际应用中的表现,并为进一步的研究或应用开发提供坚实的基础。
5. 布匹缺陷检系统实现
在设计交互式布匹缺陷检与识别系统的过程中,我们采取了一个模块化和层次化的方法,以确保系统既高效又易于维护。我们的系统设计思路是围绕用户体验来构建的,旨在提供一个直观、响应迅速的用户界面,同时在后台执行复杂的图像处理和目标检测任务。
5.1 系统设计思路
在我们的系统设计中,我们将详细探讨设计一个交互式布匹缺陷检测系统的思路。我们的目标是创建一个易于使用的GUI应用程序,该应用程序能够利用深度学习模型识别和定位图像中的布匹缺陷。为了实现这一目标,我们采用了一个整合界面、媒体处理和模型预测的全面设计方案。
(1)架构设计
在开发交互式布匹缺陷检与识别系统的过程中,我们着重考虑了用户体验、系统性能和可维护性。我们的目标是创建一个高效、直观且响应迅速的系统,能够准确识别并展示布匹缺陷。为此,我们采用了模块化的设计方法,将系统分为三个主要层次:处理层、界面层和控制层。
在系统设计的核心是我们的MainWindow类。这个类不仅负责处理用户界面(UI)的所有方面,还负责将检测逻辑和UI框架绑定在一起。我们采取模块化的方法,通过对象组合的方式来构建我们的应用程序,这样做的好处是每个组件都可以独立地工作,而且可以很容易地与其他组件集成。例如,图像处理和渲染逻辑被封装在一个模块中,而目标检测模型则位于另一个模块中。这种组合使得维护和扩展变得更加简单。
-
处理层(Processing Layer):处理层是系统的核心,它利用了先进的YOLOv8Detector类,这是一个基于深度学习的对象检测器,能够准确快速地识别出布匹中的各种缺陷。这一层负责图像的接收、预处理、模型推断以及结果的后处理。通过封装这些功能,我们确保了处理流程的稳定性和效率,同时也方便未来对模型进行升级或更换。
-
界面层(UI Layer):界面层则关注于用户交互,我们利用Qt框架构建了一个友好的用户界面。这个界面不仅直观展示了检测结果,还提供了操作简便的控制元素,如按钮和滑块,允许用户轻松调整参数或重新扫描。这一层的设计考虑了不同用户的需求,无论是对技术不太了解的操作员,还是需要更深度交互的技术人员,都能够快速上手并有效使用系统。
-
控制层(Control Layer):控制层则是处理层和界面层之间的桥梁,主要由MainWindow类的槽函数和其他方法组成。它响应用户的操作,控制数据的流动,以及调度处理层的检测任务。此外,通过信号和槽机制,控制层还负责处理用户界面的事件响应,如用户点击按钮或关闭窗口时触发相应的功能。这种设计模式不仅保证了程序的响应性和稳定性,还使得系统的维护和扩展变得更加容易。
总的来说,我们的系统设计通过精心组织的架构和模块化的构建,实现了一个高效、用户友好且可扩展的布匹缺陷检测系统。这种设计不仅提高了检测的准确性和系统的响应速度,还为将来可能的功能升级和扩展提供了便利,使得系统能够适应不断发展的工业需求。
(2)系统流程
在本篇博客中,我们将探讨构建一个高效的布匹缺陷检测系统的流程。我们系统的核心是一个名为MainWindow的类,它作为应用程序的中心枢纽,负责整合用户界面、媒体处理器以及深度学习模型。
-
当用户启动应用程序时,MainWindow类的实例被创建。这个实例初始化应用程序的界面,并设置了一系列参数,为用户提供了一个清晰的操作起点。通过这个界面,用户可以轻松选择输入源,无论是实时摄像头捕捉的图像、视频文件还是从文件系统选择的静态图片。这提供了极大的灵活性,使得系统可以适应不同的使用场景和用户需求。
-
选择了输入源后,系统便会调用相应的媒体处理器来处理这些数据。这包括但不限于配置摄像头、读取视频文件或加载图像文件等步骤。之后,系统会进入一个连续的处理循环,实时分析捕获的帧。
-
在预处理阶段,系统对每一帧图像进行必要的调整,如图像的缩放、色彩空间的转换、归一化等,以确保它们满足YOLOv8模型的输入规格。这一步骤对于后续的检测精度至关重要。
-
检测与识别是系统的核心阶段。经过预处理的图像将被输入到YOLOv8模型中,模型会分析图像并识别出布匹的缺陷。得到的输出包括缺陷的位置和类别,这对于后续的质量控制流程非常关键。随着检测结果的产生,界面将实时更新,展示出检测框和缺陷类别。用户可以看到每个缺陷的位置,还可以在界面上看到检测统计数据,如缺陷的数量和种类分布,这使得数据分析更加直观。
-
我们还在系统中加入了交互操作的功能。用户可以通过界面上的按钮执行多种操作,例如保存检测结果,查看帮助信息,或者是通过下拉菜单筛选特定类型的缺陷结果,进行详细分析。最后,媒体控制功能允许用户对媒体流进行实时控制,比如启动或暂停摄像头捕捉、控制视频播放或停止当前图像的分析。这为用户提供了全面的控制权,可以根据需要随时调整系统的运行状态。
总而言之,我们的布匹缺陷检测系统设计思路以用户为中心,结合先进的图像处理技术和深度学习模型,提供了一个全面且可定制的解决方案。通过这种设计,我们旨在为用户提供一个高效、直观且功能丰富的检测工具,以提升布匹生产过程中的质量控制水平。
5.2 登录与账户管理
在这节中,,我们不仅注重检测技术的精确性和实时性,还重视用户体验的私密性和个性化。因此,我们整合了基于PySide6和SQLite的账户管理系统,确保每位用户都能在安全的环境下使用我们的系统,并且可以个性化地保存和管理他们的检测结果。
一旦用户启动应用程序,他们会首先进入到用户登录界面。这个界面不仅简洁友好,还具备完整的账户管理功能,包括账户注册、密码修改、头像设置等。每位用户都可以创建自己独立的账户,在这个账户下,他们的所有检测记录和个人设置都会被妥善保存。用户在注册过程中可以选择自己的头像,设置一个强密码来保护账户安全,并在需要时修改密码。
一旦登录,用户便可以进入到主界面,开始进行布匹缺陷检测的工作。我们的系统支持多种输入源,包括图片、视频文件、实时摄像头捕捉,甚至批量文件输入,满足不同场景下的需求。系统能够实时识别布匹中的缺陷,并以检测框、类别及置信度等形式直观展示结果。这些结果不仅可以实时显示在界面上,还可以被保存下来,供未来的查询和分析。
我们意识到,在实时目标检测的工作环境中,用户可能需要在不同的时间使用系统,因此设计了账户注销和重新登录的功能。用户可以随时退出自己的账户,确保他们的检测数据和个人信息的安全,然后在需要时再次登录继续工作。
通过上述的系统设计和功能实现,我们的布匹缺陷检测系统不仅具备了高效的检测能力,还提供了丰富的账户管理功能,为用户提供了一个既安全又个性化的使用环境。这些细致入微的设计考虑使我们的系统不仅是一个技术工具,更是一个用户友好的工作伙伴,能够满足用户在实际使用过程中的各种需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1LS421P7ui/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuZl5Zv
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZk5ty
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZlp9w
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZl5Zr
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的布匹缺陷检和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
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. ↩︎
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. ↩︎