摘要:本文详细阐述了一个利用深度学习进行PCB板缺陷检测的系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等先前版本进行了性能比较。该系统能够在图像、视频、实时视频流和批量文件中精确地识别和分类PCB板缺陷。文中不仅深入讲解了YOLOv8算法的工作原理,还提供了完整的Python代码实现、专门用于训练的数据集,以及一个基于PySide6的图形用户界面(UI)。此系统不仅能够精确识别图像中的PCB板缺陷,包括了多种PCB缺陷类型,如缺孔、鼠咬、开路、短路、毛刺和假铜等,还具备基于SQLite的用户登录注册功能、支持一键切换YOLOv5/v6/v7/v8模型的能力,以及允许用户自定义修改界面等高级功能,以增强用户体验和系统的灵活性。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考,完整代码资源文件以及数据集可以在文末的下载链接中获取。本文结构如下:
@
目录演示与介绍视频:https://www.bilibili.com/video/BV1Hx4y1r7FS/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZm59t
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZm55x
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZm55y
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZm59p
前言
在当今电子制造业中,印刷电路板(PCB)是所有电子设备不可或缺的基础组成部分,它们的质量直接关系到最终产品的性能和可靠性。随着电子产品向着更高性能、更小体积的方向发展,PCB的设计和生产要求也越来越高,这使得PCB板的缺陷检测成为确保产品质量的关键步骤。然而,传统的人工检测方法不仅效率低下、成本高昂,而且难以满足日益严格的质量标准。因此,开发一种快速、准确的自动化缺陷检测系统显得尤为重要。
近年来,随着深度学习技术的迅猛发展,基于YOLO(You Only Look Once)算法的视觉检测技术已被广泛应用于PCB缺陷检测领域。YOLO算法以其高效的检测速度和良好的实时性能,成为解决PCB板缺陷检测问题的有力工具。从YOLOv5到YOLOv8,每一次迭代更新都在检测精度、速度和模型鲁棒性上有所提升,为PCB缺陷检测带来了新的突破。YOLOv8通过引入更高效的特征提取网络和更精细的锚点策略,显著提高了对小型缺陷的检测能力,同时保持了较高的处理速度,这对于实时检测生产线上的PCB板缺陷至关重要[1]。YOLOv7则通过改进模型结构和训练策略,增强了模型对于复杂背景和多样化缺陷形态的适应性,进一步提升了检测的准确率和鲁棒性[2]。
除了YOLO系列之外,其他深度学习算法也在PCB缺陷检测方面取得了一定的进展。例如,Transformer模型,最初设计用于处理自然语言处理任务,近年来被引入图像识别领域,其自注意力机制特别适合处理图像中的长距离依赖问题。研究者尝试将Transformer应用于PCB缺陷检测,发现其在处理大尺寸PCB图像时,能够有效提升缺陷检测的精确度和召回率[3]。这表明Transformer及其变体在未来PCB缺陷检测系统中可能发挥更重要的作用。
针对PCB缺陷检测的特殊需求,一些研究专注于数据增强、模型蒸馏、小样本学习等技术的应用。数据增强技术通过增加训练样本的多样性,帮助模型学习到更鲁棒的特征表示,从而提高在真实世界复杂环境下的检测性能[4]。模型蒸馏技术通过将大型复杂模型的知识转移到更小更高效的模型中,使得在资源受限的生产环境中也能部署高效的缺陷检测系统[5]。小样本学习则旨在解决PCB缺陷检测中常见的数据不足问题,通过改进学习算法,使模型能够从有限的样本中学习到有效的缺陷特征。
PCB缺陷检测领域的研究正在快速发展,新的算法和技术不断涌现,不仅提升了检测的准确性和效率,也为解决实际应用中的挑战提供了新的思路和工具。随着研究的深入和技术的进步,未来PCB缺陷检测系统将更加智能化、高效化,更好地服务于电子制造业的质量控制和自动化生产。
尽管基于YOLO系列算法的PCB缺陷检测系统已取得了显著成果,但在实际应用中仍面临着多种挑战,如缺陷类型多样化、数据集不平衡、小样本学习困难等问题。
本博客的分享重点在于介绍基于最新YOLOv8算法构建的PCB板缺陷检测系统,其主要贡献可以总结如下:
- 采用最先进的YOLOv8算法:本文不仅详细介绍了YOLOv8算法在PCB板缺陷检测系统中的应用,还将其与早期版本的YOLO算法(YOLOv7、v6、v5)进行了全面的比较与分析。这一对比研究不仅展现了YOLOv8在处理速度、检测精度等方面的优势,也为未来研究提供了重要的参考价值。
- 实现用户友好的系统界面:通过利用PySide6库,本文成功开发了一个具有高度交互性和良好用户体验的PCB板缺陷检测系统界面。这一创新不仅使得缺陷检测过程更加直观和便捷,还大大降低了用户在使用复杂深度学习模型进行缺陷检测时的技术门槛。
- 集成登录管理功能:引入登录管理功能,增强了系统的安全性和可管理性。这一设计思路为后续开发更多高级功能和个性化服务奠定了基础,提升了系统的实用性和专业性。
- 深入研究YOLOv8模型性能:本文通过对YOLOv8算法进行深入研究,全面评估了其在PCB板缺陷检测中的性能,包括精确度、召回率等关键指标的测试。这一研究不仅为理解YOLOv8算法的优势和局限提供了详尽的数据支持,也为进一步优化算法提供了宝贵的参考。
- 提供完整的数据集和代码资源包:本文提供的完整数据集和代码资源包极大地方便了读者复现研究结果,并在此基础上进行进一步的研究和开发。这些资源的分享,无疑加速了PCB板缺陷检测技术的学术交流和技术迭代。
1.数据集介绍
在当今的电子制造领域,印刷电路板(PCB)缺陷检测是保证产品质量的重要环节。为了开发一款能够自动识别和分类PCB上多种缺陷的智能检测系统,我们构建了一个详尽的图像数据集,用于深度学习模型的训练和验证。在本文中,我们将深入介绍这一数据集的构成、特点及其在模型训练中的应用。数据集由9961张图片组成,其中包括6975张用于训练的图片,997张用于测试的图片,以及1989张用于验证模型泛化能力的图片。这一数量的分配确保了模型能够在丰富的样本上学习,并在独立的测试集上进行准确性评估,同时还有足够的验证集支持对模型的调优。
我们的数据集包括了多种PCB缺陷类型,如缺孔、鼠咬、开路、短路、毛刺和假铜等,它们在实际应用中都是常见的问题。我们注意到这些缺陷类型在数据集中的分布是均衡的,这有助于避免训练过程中的类别偏见,并提升模型对所有类型缺陷的识别能力。
为了提高模型的泛化能力,我们对图像进行了一系列预处理和增强操作。每张图片都经过自动定向,以确保图像方向的一致性,并去除了EXIF方向信息,以防训练过程中出现偏差。此外,所有图像都被调整至统一的640x640分辨率,不仅保持了数据一致性,也方便了模型处理。我们选择了拉伸的方式来调整图像大小,而不是裁剪或填充,这样做是为了确保缺陷信息在图像中的完整性。最后,我们通过自适应均衡化增强了图像的对比度,以突出缺陷特征,使得模型更容易学习和识别不同类型的缺陷。
在深入分析了数据集的缺陷分布后,我们发现缺陷在PCB板上的分布没有明显的模式,表明缺陷可以在PCB板的任何位置出现。这对模型的检测能力提出了挑战,因为它必须能够在整个图像区域内准确识别缺陷。此外,缺陷尺寸的分布表明多数缺陷尺寸较小,这要求模型必须能够识别和定位小范围内的缺陷。这一点对于实际应用中的精确检测至关重要,因为即使是微小的缺陷也可能导致电子设备的失败。
我们的数据集不仅具有多样的图像,还提供了详细的类别标签。每张图片都经过了仔细的标注,确保了模型能够在准确性和分类能力上达到较高标准。这些标签对于训练阶段的损失函数计算以及模型评估阶段的性能指标计算都至关重要。博主使用的类别代码如下:
Chinese_name = {'missing_hole': "漏孔", 'mouse_bite': "鼠牙洞", 'open_circuit': "开路", 'short': "短路", 'spur': "毛刺",
'spurious_copper': "杂铜"}
综上所述,我们的数据集设计考虑了多种因素,以确保模型训练的有效性和最终应用的准确性。通过均衡的类别分布、统一的图像处理和增强,以及对缺陷分布和尺寸的深入分析,我们有信心能够培养出一个强大的模型,这个模型将在自动PCB检测中发挥关键作用,显著提高生产效率和产品质量。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行PCB板缺陷检测的图片或视频,或者启动摄像头进行实时检测。在进行PCB板缺陷检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8是目前最新一代的实时对象检测算法,其在前几代YOLO算法的基础上进行了显著的改进和创新。YOLOv8继承了YOLOv3使用的Darknet53作为主干网络,这个网络结构已经证明在对象检测任务中效率和效果俱佳。YOLOv8则在此基础上进一步优化,它引入了从YOLOv5中借鉴的C3模块,并且借鉴了YOLOv7中的有效层级聚合(Efficient Layer Aggregation networks, ELAN)技术,以改善特征提取和增强网络的表征能力。
在YOLOv8中,C3模块由Bottleneck构成,这些Bottleneck模块在提取特征的同时,通过引入残差连接来避免潜在的梯度消失问题,确保了即使在网络较深的情况下,信息也可以有效地传播。这种设计不仅使网络在提取特征时更为高效,而且也有助于网络学习到更复杂的特征表示,这对于提高模型的准确性和鲁棒性至关重要。
YOLOv8还采用了路径聚合网络(Path Aggregation Network, PANet)来进一步增强特征金字塔的连接。这种结构通过增强不同尺度特征之间的连接,以提升模型在检测不同尺度对象时的性能。特别是对于小目标的检测,这种层级的特征聚合可以显著提高检测的准确度。
最后,YOLOv8在锚定机制上也做出了创新,它采用了无锚(None-anchor)机制,这是一种不依赖预设锚点的检测方法。传统的YOLO算法会使用多个预设的锚点来预测对象的位置和尺寸,但这种方法需要大量的手工调整和优化。无锚机制的引入使得模型不再依赖于这些预设的锚点,而是通过网络直接预测对象的边界框,这种方法简化了训练流程,同时有助于提高模型对各种尺寸对象的检测能力。
综上所述,YOLOv8通过引入先进的模块化设计、增强的特征聚合以及创新的无锚检测机制,提供了更为精确和高效的实时对象检测能力。这些技术的结合不仅提升了模型在标准数据集上的表现,更重要的是,它们使模型能够更好地适应实际应用中的多变环境和挑战,为实时对象检测领域带来了新的突破。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行PCB板缺陷检测的代码实现。代码主要分为两部分:模型预测和模型训练。
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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8。
results2 = model.train(
data=data_path,
device='0',
workers=workers,
imgsz=640,
epochs=120,
batch=batch,
name='train_v8_' + data_name
)
首先,让我们考察损失函数的变化趋势。在训练损失图中,在训练损失的图中,我们可以看到box损失、分类损失和df1损失随着迭代次数的增加而逐渐减少。这是模型学习过程中的正常现象,意味着模型在这些特定任务上的表现逐渐改善。例如,box损失的减少表明模型在定位对象方面变得更加准确,而分类损失的减少则意味着模型在识别不同类别的对象上变得更加精确。
同时,验证损失的变化趋势与训练损失类似,也显示了逐步减少的趋势,这表明模型在未见过的数据上也表现出良好的泛化能力。这是评估模型性能时非常重要的一个方面,因为它可以预示模型在实际应用中的表现。
精确度和召回率是衡量分类性能的两个重要指标。精确度是指模型预测为正类的样本中真正为正类的比例,而召回率是指所有真正为正类的样本中被模型正确预测为正类的比例。从图中可以看出,随着训练的进行,模型的精确度和召回率都有所提高,这表明模型在分类对象方面的能力得到了增强。
mAP(mean Average Precision)是一个综合考虑精确度和召回率的性能评估指标,通常用于对象检测模型。mAP50和mAP50-95分别代表了不同的IoU(交并比)阈值下模型的表现。mAP50是在IoU为0.5时的平均精度,而mAP50-95是在IoU从0.5到0.95的范围内的平均精度。这两个指标的提升表明,模型在定位和分类对象方面的整体性能都在提高。
在目标检测系统中,F1分数是精确度和召回率的调和平均,它是评价分类模型性能的重要指标,特别适合于类别分布不平衡的情况。F1分数的范围从0到1,1代表完美的精确度和召回率,而0代表最差的性能。
从曲线图中可以观察到,各类别的F1分数随置信度阈值的提高而显著上升,直到达到一个峰值,之后随着置信度的继续提高而逐渐下降。这是因为当置信度阈值较低时,模型倾向于将更多的样本预测为正类,这可能会增加真正正类的数量,但同时也会增加误报(假正类)。随着置信度阈值的增加,模型变得更加保守,只有当它对预测非常有信心时才会将样本预测为正类,从而降低了误报率,但这也可能会错过一些真正的正类(即减少了召回率)。因此,存在一个置信度阈值,能平衡精确度和召回率,达到最高的F1分数。
图中的蓝色曲线代表所有类别的平均F1分数,可以看出平均F1分数在置信度阈值约为0.364时达到了0.86的高峰值,这表明模型在这一阈值下对于所有类别的综合性能达到了相对较高的水平。这个结果对于实际应用来说是非常有希望的,因为它意味着模型可以在保持较高精确度的同时,还能够较好地识别出真正的正类样本。
在实际应用中,选择合适的置信度阈值取决于特定任务的需求。如果目标是尽可能减少误报,可以选择更高的置信度阈值;如果希望尽可能不错过任何正类,可以选择较低的置信度阈值。但是,从这张图中我们可以得出结论,该模型在0.364的置信度阈值时,对于各类别的缺陷检测都表现出了较好的平衡性能。
总的来说,这个模型展现出了较为出色的性能,尤其是在平衡了精确度和召回率之后。在部署这样的模型前,还需要进一步考虑实际应用中的具体需求,例如对误报和漏报的容忍程度,以及模型的响应时间和计算成本等因素。只有当模型在满足这些实际要求的同时,保持高F1分数时,才能被认为是真正有效的。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在PCB板缺陷目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含PCB板缺陷的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型 | 图像大小 (像素) | 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.810 | 0.808 | 0.813 | 0.814 |
F1-Score | 0.86 | 0.85 | 0.86 | 0.86 |
(3)实验结果分析:
从实验结果来看,各个版本的YOLO模型在mAP指标上表现出高度的一致性,其中YOLOv8n以0.814的得分略微领先。这表明在我们的数据集上,YOLOv8n在维持检测结果准确性的同时,对各个类别的识别具有更好的一致性。YOLOv7-tiny虽然在F1-Score上与YOLOv8n持平,但是在mAP指标上略低,这可能是由于YOLOv7-tiny在处理某些类别时召回率较低,影响了其平均精度。
对于YOLOv5nu和YOLOv6n而言,它们的mAP分别为0.810和0.808,这两个模型在mAP上的差距不大,但在F1-Score上YOLOv5nu以0.86的得分超越了YOLOv6n的0.85。虽然差距不大,但这说明YOLOv5nu在精确度和召回率上可能达到了更好的平衡。
值得注意的是,尽管在数值上差距不大,每个版本的YOLO算法都有其独特的架构和特点,这些差异可能会在不同的应用场景和数据集上体现出显著的性能差异。例如,YOLOv7-tiny作为轻量级模型,其优势在于速度快,适用于需要实时检测的场景,而YOLOv8n则可能在计算资源更充足的环境下表现更佳。
综上所述,如果你的应用场景对检测速度有严格要求,YOLOv7-tiny可能是更好的选择;而如果你追求更高的识别精度和一致性,YOLOv8n可能是更合适的选择。当然,这些结论是基于特定数据集的实验结果,不同的数据集和应用场景可能会得出不同的最优选择。因此,在实际应用中,我们建议对特定的任务和数据集进行详细的模型评估,以便选择最适合的对象检测算法。
4.4 代码实现
在本篇博客中,我们将深入探索一个基于Python和QtFusion框架的实时物体检测应用程序的构建过程。这个应用程序使用了YOLOv8,这是一种最新的深度学习模型,专门用于图像中物体的检测。我们将一步步了解如何通过代码实现从图像采集、预处理、模型推理到结果显示的完整流程。
在实时PCB板缺陷检测系统中,需要结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及PCB板缺陷的检测和标注等功能。
(1)导入必要的模块和配置
首先,我们必须导入必要的模块和库。这包括sys模块以便我们可以与Python解释器交互,time模块用于记录操作的持续时间,OpenCV库(cv2)用于处理图像,以及QtFusion和PySide6库用于创建用户界面。
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类,用于物体检测
from datasets.PCBback.label_name import Label_list
QF_Config.set_verbose(False)
在导入这些模块之后,我们设置QF_Config.set_verbose(False)来关闭冗余日志信息,以便让我们更专注于应用程序的输出。
(2)定义frame_process函数
物体检测的核心功能在frame_process函数中实现。这个函数首先调整图像的尺寸以适应界面,然后使用YOLOv8Detector模型的preprocess方法对输入图像进行预处理。之后,我们记录模型推理的起始时间,执行预测,并记录结束时间,从而计算出整个推理过程所需的时间。如果检测到物体,我们会使用drawRectBox函数在图像上绘制边界框并显示类别名称和置信度。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
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控件上显示图像
(3)创建主窗口
接着,我们定义了MainWindow类,它是我们应用程序的主窗口。这个类扩展了QMainWindow,设置了窗口的尺寸,并且内部包含了一个QLabel对象用于展示图像。此外,我们还定义了keyPressEvent方法,这样用户可以通过按下“Q”键来退出应用程序。
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 = Label_list # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-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. PCB板缺陷检测系统实现
在设计交互式PCB板缺陷检测与识别系统的过程中,我们的目标是构建一个既能实时识别缺陷,又能提供良好用户体验的应用程序。为了实现这一目标,我们采用了一种模块化的设计思路,将界面设计、媒体处理、以及模型推理这三个关键方面紧密集成在一起。
5.1 系统设计思路
在我们的系统设计中,我们的主要目标是创建一个交互式的PCB板缺陷检测与识别系统,它不仅能够实时处理图像并进行目标检测,而且还能提供直观的用户交互界面。我们的系统是围绕MainWindow类构建的,它集成了用户界面、媒体处理和深度学习模型,使得用户可以轻松地加载图像、执行目标检测,并查看结果。
(1)架构设计
我们的系统设计思路基于几个核心原则。首先是模块化:通过将应用程序划分为独立的功能块,我们可以在不影响其他部分的情况下,单独开发和优化每个模块。其次是可扩展性:随着技术的发展,新的检测模型和算法可能会出现,因此设计一个易于集成新模块的系统是至关重要的。最后是用户交互:一个直观且响应迅速的用户界面对于提升用户满意度非常关键。
- 处理层(Processing Layer):处理层是系统的核心,负责图像处理和缺陷检测任务。我们采用YOLOv8Detector,这是一个先进的深度学习模型,它经过预训练能够识别PCB板上的各种缺陷。该模型不仅精确度高,而且能够快速处理图像,这对于实时检测系统来说至关重要。此外,我们还实现了一系列预处理和后处理方法,以确保模型的输入和输出能够适应不同的使用场景。
- 界面层(UI Layer):界面层的设计注重用户体验,通过QtFusion和PySide6等框架构建了用户界面。界面包括视频显示窗口、控制按钮和结果展示区。视频显示窗口实时展示从摄像头捕获的图像,并在检测到缺陷时,以覆盖的形式高亮显示缺陷位置。控制按钮允许用户开始、停止检测过程,以及调整必要的设置。结果展示区则以表格形式显示检测到的每个缺陷的详细信息,如类别、位置和置信度。
- 控制层(Control Layer):控制层负责协调用户界面和处理层之间的交互。这通过Qt的信号和槽机制实现,允许各个组件之间进行松散耦合的通信。例如,当用户点击开始按钮时,控制层会触发媒体处理器开始捕获和处理图像数据。若检测到缺陷,处理层将通过发出信号通知界面层,后者随即更新显示结果。控制层还处理用户的其他输入,比如退出请求或参数调整,确保系统能够灵活响应用户需求。
通过这种分层的设计,我们能够有效地将复杂的深度学习模型和媒体处理逻辑封装在用户友好的界面之后。这不仅使得系统易于操作,而且便于未来根据新的用户需求或技术进步进行升级。最终,我们希望这款PCB板缺陷检测系统能够成为电子制造行业的宝贵工具,帮助提升生产质量和效率。
(2)系统流程
在本篇博客中,我们将探讨构建一个高效PCB板缺陷检测系统的流程。这一系统集成了YOLOv8模型,旨在通过实时分析来识别和标记PCB板上的缺陷,提高制造流程的自动化水平和质量控制的精准度。
-
首先,用户启动应用程序后,界面即刻呈现。这是由MainWindow类的实例化操作完成的,它是用户与系统交互的中心。此实例不仅负责界面的布局,还初始化了系统的核心参数,如摄像头或文件输入路径等。这个阶段,用户面临的第一个选择就是输入源的确定,它可以是摄像头实时捕捉的图像,也可以是预录制的视频文件,甚至是单张的静态图像。系统提供了灵活的输入选项,以适应不同用户的需求。
-
确定输入源之后,系统便调用媒体处理器和方法对输入数据进行处理。这个过程可能包括摄像头的初始化、视频文件的解码或图像文件的读取等,一切都旨在为后续的缺陷检测做好准备。然后,系统进入了一个持续的帧处理循环,这是整个应用程序的核心。
-
在预处理阶段,系统会对每一帧图像执行一系列操作,以满足YOLOv8模型的输入要求。这包括调整图像尺寸、转换色彩空间,以及对图像进行归一化处理。这些步骤对于确保模型准确地识别出图像中的缺陷至关重要。
-
随后,进入检测与识别阶段,这是利用我们提前训练好的YOLOv8模型进行缺陷检测的时刻。模型会分析预处理后的图像,并输出缺陷的位置及其分类信息。得益于YOLOv8模型的高性能,这一阶段可以快速完成,从而实现实时检测。
-
界面更新阶段紧随其后,随着检测结果的产出,GUI实时更新以反映最新的检测情况。用户可以在界面上看到检测到的缺陷位置,并以不同的颜色或标签显示不同类型的缺陷。此外,系统还会在界面上提供统计数据的可视化展示,如表格或图表,用户可以从中获得缺陷检测的概览。
此外,我们的系统设计了一系列交互操作,用户可以通过界面上的按钮执行多种操作,例如保存检测结果、查看版本信息,甚至对检测结果进行筛选和深入分析。这提供了极大的灵活性,允许用户根据自己的需求定制和控制检测过程。最后,系统还提供了媒体控制功能。用户可以控制摄像头的捕捉状态,或者是控制视频的播放和暂停。这一点在需要中断检测或者在特定时刻深入分析时特别有用。
综上所述,我们的PCB板缺陷检测系统是一个多层次、交互式的解决方案,它将先进的YOLOv8模型、实时图像处理能力与用户友好的界面设计结合起来。无论是在生产线上实时检测,还是在后期质量控制中分析预录制的视频,这个系统都能提供高效、准确的缺陷检测服务,
5.2 登录与账户管理
在开发这个先进的PCB板缺陷检测系统时,我们不仅注重其技术能力,也深刻理解到用户体验的重要性。正因为如此,系统被赋予了一个全面的账户管理功能,该功能基于PySide6构建,后端则采用了SQLite数据库,为用户提供了一套完整的个人账户管理解决方案。
在本系统中,用户体验的优化得到了充分的考虑,尤其是在登录和账户管理方面。系统通过结合PySide6的强大功能和SQLite的高效数据库管理,提供了一个安全且用户友好的账户管理界面。用户首次使用系统时,会被引导完成账户的注册,其中包括设置用户名、密码以及上传个人头像,确保了个性化的体验和识别。注册后,用户可通过简洁明了的登录界面进入主操作平台,即PCB板缺陷检测系统。
一旦进入主界面,用户可以享受到系统为PCB板缺陷检测提供的全面服务。系统支持多种输入源,包括图片、视频、实时摄像头捕捉和批量文件处理,能够实时地识别和记录目标信息,这些信息展现在用户界面上,包括检测框、类别标签及置信度等。用户在使用过程中,可以对检测结果进行保存和管理,这得益于系统提供的独立用户空间。用户可以随时返回登录界面,进行密码的修改、头像的重新设置以及账户的注销操作,这些都极大地提升了用户的操作自由度和个性化体验。
此外,账户管理系统还允许用户在注销后重新登录,确保用户能够安全地保持其设置和历史记录。系统的设计考虑到了在实时目标检测场景下用户的多元需求,不仅仅是在技术层面上实现了多物体识别和检测的能力,更在用户操作流程上提供了简便、直观的操作体验。这样的设计使得PCB板缺陷检测系统不仅功能强大,而且易于使用,满足了不同用户群体在操作便利性和个性化服务上的需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Hx4y1r7FS/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuZm59t
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuZm55x
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuZm55y
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuZm59p
在文件夹下的资源显示如下,下面的链接中也给出了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模型的PCB板缺陷检测系统,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的PCB板缺陷检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
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). ↩︎