首页 > 其他分享 >基于深度学习的PCB板缺陷检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

基于深度学习的PCB板缺陷检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

时间:2024-04-05 16:13:53浏览次数:18  
标签:训练 检测 模型 YOLOv8 v5 v7 PCB 缺陷

摘要:本文深入研究了基于YOLOv8/v7/v6/v5的PCB板缺陷检测系统,核心采用YOLOv8并整合了YOLOv7YOLOv6YOLOv5算法,进行性能指标对比;详述了国内外研究现状数据集处理算法原理模型构建与训练代码,及基于Streamlit的交互式Web应用界面设计。在Web网页中可以支持图像、视频和实时摄像头进行PCB板缺陷检测,可上传不同训练模型(YOLOv8/v7/v6/v5)进行推理预测,界面可方便修改。本文附带了完整的网页设计、深度学习模型代码和训练数据集的下载链接。

@

目录

➷点击跳转至文末所有涉及的完整代码文件下载页☇


完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频https://www.bilibili.com/video/BV1NH4y1n71M/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZ2YmJty
YOLOv8和v5项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Ykpdy
YOLOv7项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl5lx
YOLOv6项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl59s

        若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:


1. 网页功能与效果

        (1)开启摄像头实时检测:本系统允许用户通过网页直接开启摄像头,实现对实时视频流中PCB板缺陷的检测。系统将自动识别并分析画面中的PCB板缺陷,并将检测结果实时显示在用户界面上,为用户提供即时的反馈。

        (2)选择图片检测:用户可以上传本地的图片文件到系统中进行PCB板缺陷检测。系统会分析上传的图片,识别出图片中的PCB板缺陷,并在界面上展示带有PCB板缺陷标签和置信度的检测结果,让用户能够清晰地了解到每个PCB板缺陷状态。

        (3)选择视频文件检测:系统支持用户上传视频文件进行PCB板缺陷检测。上传的视频将被系统逐帧分析,以识别和标记视频中每一帧的PCB板缺陷。用户可以观看带有PCB板缺陷检测标记的视频,了解视频中PCB板缺陷的变化。

        (4)选择不同训练好的模型文件:系统集成了多个版本的YOLO模型(如YOLOv8/v7/v6/v5),用户可以根据自己的需求选择不同的模型进行PCB板缺陷检测。这一功能使得用户能够灵活地比较不同模型的表现,以选择最适合当前任务的模型。

        在“网页功能与效果”章节中,我们详细介绍了该PCB板缺陷检测系统的Web界面功能及其对用户如何进行PCB板缺陷识别和分析的支持。首先,我们概述了网页界面的总体设计,强调了其用户友好性和直观性,使用户能够轻松地进行操作和管理。

        实时摄像头检测功能允许用户开启摄像头,实时捕捉视频流并在视频中标记出戴PCB板缺陷的人员,展示了算法在实时环境下的应用效率和准确性。通过图片和视频文件检测功能,用户可以上传图片或视频文件,系统将自动进行PCB板缺陷检测,并显示检测结果,支持多种文件格式和大小。

        系统的核心之一是其模型选择功能,用户可以根据需要选择不同的训练模型(YOLOv8/v7/v6/v5)进行检测,以获得最佳的检测效果。同时,显示设置允许用户根据需求选择检测画面和原始画面的显示方式,并通过下拉框单独标记和显示特定目标的检测结果。

        在管理和优化检测结果方面,我们提供了强大的工具。检测结果管理功能使检测结果以表格形式直观展示,用户可以动态调整检测算法的置信度阈值和IOU阈值,以优化检测效果。为了方便后续分析和报告制作,结果导出功能支持用户将检测结果和标记的图像或视频导出为csv或avi格式文件。

        此外,我们还重点关注了用户交互和体验的优化,通过提供直观的界面布局、快速响应时间和易于导航的界面,确保了用户可以高效地使用所有功能。通过一系列使用示例,我们展示了如何利用这些功能进行有效的PCB板缺陷检测和分析,无论是在实时监控还是事后分析中,都能满足用户的需求。


2. 绪论

2.1 研究背景及意义

        在现代电子制造业中,印刷电路板(PCB)作为电子产品的心脏,其质量直接关系到最终产品的可靠性和稳定性。随着电子技术的迅猛发展,对PCB的质量要求也日益严格,这就使得PCB板缺陷检测成为保证电子产品质量的关键环节。传统的PCB缺陷检测多依赖于人工视觉检查和基于规则的自动化方法,这些方法不仅效率低、成本高,而且在检测精度和可靠性上难以满足日益提高的工业标准。

        近年来,深度学习技术的快速发展为PCB缺陷检测提供了新的解决方案。尤其是YOLO(You Only Look Once)系列算法,以其快速、准确的特点,在实时目标检测领域展现了巨大的潜力。从YOLOv5到最新的YOLOv8,每个版本的更新都在检测速度、准确性和模型轻量化等方面取得了显著进步,为PCB缺陷检测带来了新的可能性。此外,不断更新的数据集、改进的算法结构和优化的训练策略,进一步提高了模型的泛化能力和实用性。

        尽管深度学习技术在PCB缺陷检测中取得了进步,但仍面临一些挑战,如模型的实时性与准确性之间的平衡、不同类型缺陷的识别能力、以及算法在实际生产环境中的稳定性等问题。为了解决这些问题,研究人员持续探索更高效的算法结构,更优的训练策略,以及更适合PCB缺陷特点的数据增强技术。例如,通过引入注意力机制来提升模型对细微缺陷的识别能力,或是开发更为精细的损失函数来优化模型在复杂背景下的检测性能。

        尽管深度学习算法在PCB板缺陷检测领域取得了显著成果,但依然存在一些挑战和局限性。如何在保持高准确率的同时提高检测速度、减少模型大小,以及如何提升模型对小型和微小缺陷的检测能力等问题,都是当前研究的热点。此外,深度学习模型对于数据的依赖性强,如何获取、标注足够多且多样化的PCB缺陷数据集,也是提高模型性能的关键。

2.2 国内外研究现状

        近年来,随着计算能力的提高和深度学习技术的发展,基于深度学习的PCB板缺陷检测方法取得了显著的进步。特别是YOLO系列算法因其高效的检测速度和较高的准确率,在实时缺陷检测领域受到广泛关注。自从YOLOv5被提出以来,其后续版本YOLOv6[1]、YOLOv7[2]、以及YOLOv8[3]均在性能和效率上有所改进,展现出在PCB缺陷检测任务上的巨大潜力。

        在这一领域中,研究者们不断探索算法的改进和优化。例如,一项研究通过对YOLOv5进行改进,引入了空间注意力机制,以增强模型对小型和微小缺陷的检测能力。另一篇论文则利用改进后的YOLOv6[1:1]算法,通过自适应锚框策略和多尺度训练技术,显著提高了在复杂背景下的缺陷检测精度。YOLOv7[2:1]和YOLOv8[3:1]的研究亦表明,通过深度特征融合和高效的网络结构设计,可以进一步提升检测性能,尤其是在处理高密度PCB板上的缺陷时更为有效。

        在深度学习算法方面,除了YOLO系列,还有多种算法在PCB板缺陷检测中被应用和探索。例如,Faster R-CNN因其优秀的检测精度而被广泛应用于需要高准确度检测的场景[4]。SSD (Single Shot MultiBox Detector)则以其快速检测能力,在需要实时检测的应用场景中展示了其优势[5]。此外,Mask R-CNN通过在Faster R-CNN的基础上添加一个用于生成高质量分割掩码的分支,对于精细缺陷的检测表现出色。近期,基于Transformer的算法如DETR (Detection with Transformers)和ViT (Vision Transformer)在一些研究中被探索用于缺陷检测,尤其是它们在处理复杂图像特征和关系时显示出的潜力。

        数据集是深度学习中一个不可或缺的部分。传统的PCB板缺陷检测数据集多依赖于手动标注,这不仅耗时耗力,而且难以覆盖所有类型的缺陷。最新的研究尝试通过自动化生成标签的方式来构建数据集,以此提高数据集的质量和多样性。此外,为了提高模型的泛化能力,一些研究通过合成图像或引入噪声、模糊等数据增强技术来扩充数据集。

        尽管深度学习技术在PCB板缺陷检测中取得了显著的进步,但仍存在一些技术挑战需要解决。首先,实时性与准确性的平衡是一个持续存在的挑战。尽管YOLO系列和SSD等算法能够实现较快的检测速度,但在极为复杂的PCB板缺陷检测任务中,如何在保持高准确度的同时实现实时检测仍然是一个难题。其次,小型和微小缺陷的检测对算法的性能提出了更高要求。这些缺陷往往难以被传统算法准确识别,需要算法能够更好地理解图像的细节。最后,模型泛化能力的提升也是未来研究的重点。如何让训练好的模型能够适应不同生产环境中的PCB板,而不受光照、背景等因素的影响,是提高检测系统实用性的关键。

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        要解决的问题与解决方案针对的是基于YOLOv8/v7/v6/v5的PCB板缺陷检测系统,该系统面临的挑战和提出的解决策略如下:

  1. PCB板缺陷检测的准确性和速度
    对于PCB板缺陷检测系统来说,关键挑战在于如何实现对各类缺陷的高准确度识别与实时处理。鉴于PCB板的复杂性以及缺陷类型的多样性(包括焊点缺陷、刮擦、短路等),系统需要精确识别出细微的缺陷特征。此外,生产线上的实时检测要求系统具备快速响应能力,以适应高速的生产流程。

  2. 环境适应性和模型泛化能力
    PCB板缺陷检测在不同的生产环境中可能面临光照、背景复杂度以及PCB板材料差异等问题,这些因素都可能影响识别准确率。因此,系统需要具备优秀的环境适应性和模型泛化能力,确保在多变的生产条件下都能维持较高的检测性能。

  3. 用户交互界面的直观性和功能性
    系统的用户界面设计对于确保生产人员能有效利用PCB板缺陷检测系统至关重要。界面需直观易懂,降低操作难度。同时,应支持多种功能,如实时检测、历史记录查询、模型切换等,以满足不同用户的需求。

  4. 数据处理能力和存储效率
    考虑到系统将处理大量的图像数据,需要具备强大的数据处理能力和高效的存储机制。这关系到检测的实时性和长期数据的管理。同时,对于企业而言,数据的安全性和隐私保护也十分重要。

  5. 系统的可扩展性和维护性
    PCB板缺陷类型和生产技术的发展可能要求系统未来支持更多缺陷类型的检测或集成新技术以提高检测性能。因此,系统设计时需考虑到可扩展性和维护性,以适应未来的发展需求。

        为了克服这些挑战,我们将采用最新的YOLO版本进行模型训练和优化,利用PyTorch框架的灵活性和效率进行深度学习模型的开发,同时,通过Streamlit构建的Web应用将为用户提供一个直观、功能丰富的操作界面。我们的目标是开发一个既高效又易用的PCB板缺陷检测系统,为提升工作场所的安全管理贡献力量。

2.3.2 解决方案

        针对PCB板缺陷检测系统面临的挑战,我们设计了一套综合解决方案,旨在通过最新的YOLO版本和先进的技术框架,实现一个既准确又快速、用户友好且可扩展的系统。以下是我们的主要方法:

  1. 深度学习模型的选择和优化
  • 模型架构:选择YOLOv8作为核心深度学习模型,考虑到其在速度和准确度之间的优秀平衡。针对PCB板缺陷检测的特定需求,我们还将考虑集成YOLOv7[2:2]、YOLOv6[1:2]和YOLOv5,以便根据不同的使用场景和性能需求选择最合适的模型。
  • 数据增强:为了提升模型在多变环境下的泛化能力,将采用多种数据增强技术,如随机裁剪、旋转、色彩调整等,以模拟不同的光照和背景条件下的PCB板图像。
  • 迁移学习:利用在大规模图像数据集上预训练的模型作为基础,通过迁移学习对其进行微调,专注于PCB板缺陷的特定特征,从而加快模型训练速度并提高识别准确率。
  1. 技术框架和开发工具
  • PyTorch框架:使用PyTorch作为开发深度学习模型的框架,其灵活的编程环境和强大的GPU加速能力非常适合本项目的需求。
  • Streamlit网页设计:选择Streamlit构建交互式Web界面,以提供用户友好的操作体验。Streamlit能够快速部署数据科学和机器学习项目,使得用户能够轻松上传图像、视频,以及实时监控摄像头捕获的内容进行缺陷检测。
  • PyCharm IDE:采用PyCharm作为开发工具,它提供了优秀的代码管理、调试和项目管理功能,有利于提高开发效率和代码质量。
  1. 功能实现和系统设计
  • 多输入源支持:设计系统以支持图像、视频流和实时摄像头捕获等多种输入源,以适应生产线上的不同检测需求。
  • 模型切换功能:实现动态模型切换功能,允许用户根据实际需求选择不同版本的YOLO模型(v5至v8),增加系统的灵活性和适用性。
  • 直观美观的用户界面:利用Streamlit和CSS技术,设计一个既直观又美观的用户交互界面,简化操作流程,提升用户体验。
  1. 数据处理和存储策略
  • 高效数据处理:利用PyTorch的高效数据加载和预处理功能,确保实时性能,满足生产线上的实时检测需求。
  • 智能数据存储:设计高效且安全的数据存储方案,不仅便于管理和查询检测结果和历史数据,还要确保数据的安全性和隐私保护。

        通过实施上述方法,我们开发的PCB板缺陷检测系统能够在不同环境下准确、快速地进行PCB板缺陷的检测与计数,同时提供友好的用户体验和强大的数据处理能力。

2.4 博文贡献与组织结构

        本文系统地介绍了基于YOLOv8/v7/v6/v5的PCB板缺陷检测系统的设计与实现,涵盖了从任务定义、文献综述、数据集处理、算法选择与优化,到用户界面设计、实验结果分析及系统部署等多个方面。通过全面的研究与实践,本文的主要贡献可以概括为以下几点:

  1. 综合性的文献综述:本文提供了一个全面的文献综述,详细介绍了PCB板缺陷检测领域的研究现状,包括最新的目标检测算法如YOLOv8/v7/v6/v5及其在缺陷检测任务中的应用。这一部分不仅涵盖了算法的选择和优化,还对比了不同算法在PCB板缺陷检测中的效果,为读者提供了宝贵的研究资源和启示。

  2. 数据集的详细处理方法:详细介绍了PCB板缺陷检测所需数据集的处理方法,包括数据收集、预处理、增强技术等,确保了模型训练的高效性和准确性。这一部分对于希望在该领域开展研究的学者和工程师具有重要的参考价值。

  3. 先进算法的应用与对比:文章详尽地介绍了YOLOv8/v7/v6/v5等深度学习模型在PCB板缺陷检测系统中的应用,并对这些算法进行了深入的对比分析,展示了各自的优势和局限,为选择最适合的模型提供了科学依据。

  4. 基于Streamlit的界面设计:介绍了如何采用Streamlit设计一个美观且用户友好的Web应用界面,使得用户能够轻松地进行图像上传、模型选择和缺陷检测。这一创新的界面设计大大提高了系统的可用性和灵活性。

  5. 完整的资源分享:文章提供了完整的数据集和代码资源下载链接,包括模型预测与训练的代码,这为研究人员复现实验结果、进行进一步研究或基于本系统进行扩展提供了便利。

        后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在PCB板缺陷检测中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在PCB板缺陷检测任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的PCB板缺陷检测系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。


3. 数据集处理

        在我们的研究中,我们详细介绍了用于PCB板缺陷检测的全面数据集。该数据集经过细致的构建和标注,总共包括9961张图像,其中包括6975张训练图像、1989张验证图像以及997张测试图像。这些图像涵盖了广泛的PCB板类型,图像清晰度高,缺陷特征明显,为模型提供了优质的学习素材。博主使用的类别如下:

Chinese_name = {'missing_hole': "漏孔", 'mouse_bite': "鼠牙洞", 'open_circuit': "开路", 'short': "短路", 'spur': "毛刺",
                'spurious_copper': "杂铜"}

        我们的数据集聚焦于多样性和实用性,其中包括六种常见的PCB缺陷类型,如缺失孔、鼠咬、开路、短路、毛刺以及多余铜片,每种类型的缺陷都以2000多个实例呈现,确保了在训练深度学习模型时具有统计上的代表性。缺陷的标注信息包括类别和位置,以矩形框的形式精确标出,为训练和测试阶段提供了清晰的参照。

        在数据处理方面,我们对这些图像进行了一系列的预处理操作,包括尺寸调整、归一化处理,以及为了适应不同模型输入需求的格式转换。此外,为了提高模型在真实世界条件下的泛化能力,我们采用了多种数据增强技术。这些技术模拟了多变的光照条件、背景噪声,以及PCB板在生产过程中可能遇到的其他视觉扰动,极大地丰富了数据集的多样性。

        数据集的详尽分析揭示了其独特的特征。分布图展示了不同缺陷类型的实例数量,我们可以看到一个相对均衡的分布,这表明我们的数据集在不同缺陷类型之间达到了良好的覆盖度。位置分布的热力图显示了缺陷在PCB板上的分布情况,显示了一个全面的缺陷位置布局,这有助于模型学习在整个PCB板上检测缺陷。尺寸分布图则揭示了大多数缺陷倾向于较小的尺寸,这对设计高精度检测算法提出了特别的挑战。

        综上所述,我们的数据集是针对PCB板缺陷检测任务精心设计的,它不仅有助于深度学习模型的开发和优化,同时也为计算机视觉和自动化检测领域的研究人员提供了丰富的实验资源。通过公开这些数据和标注信息,我们期望能够推动相关技术的进步,同时为工业界提供有力的支持,以提升PCB制造的质量和效率。


4. 原理与代码介绍

4.1 YOLOv8算法原理

        YOLOv8是一种前沿的目标检测算法,它是YOLO系列算法的最新迭代版本,继承并优化了之前版本的诸多特性,以实现更高的检测速度和准确性。YOLOv8在结构上继续沿用了YOLO系列的整体设计哲学,主要包括三个组成部分:Backbone(主干网络)、Neck(颈部网络)和Head(头部网络)。这三部分协同工作,以实现对输入图像中目标的快速而准确的检测。

        在Backbone部分,YOLOv8采用了CSP(Cross Stage Partial networks)结构,这种结构能够有效减少计算资源的消耗,同时保证网络能够学习到丰富的特征表示。CSP的核心思想是将特征图分割成两部分,一部分直接通过网络传递,另一部分则经过一系列的卷积操作。这种设计使得网络在训练时能够更好地传播梯度,从而提升模型的学习效率。

        Neck部分主要负责特征金字塔的构建,通过对Backbone提取的特征进行多尺度融合,YOLOv8能够有效地检测不同尺寸的对象。这个过程中通常使用的是FPN(Feature Pyramid Networks)或PAN(Path Aggregation Network)等结构,它们能够将低层的高分辨率信息和高层的语义信息进行有效融合,提高模型对小目标的检测能力。

        Head部分则是模型的输出部分,它负责将Neck部分融合后的特征图映射到具体的目标检测任务上,包括类别预测和边界框回归。YOLOv8在Head部分采用了锚点机制(Anchor mechanism),这一机制通过预定义一系列不同尺寸和比例的锚点框来预测边界框,减少模型从头学习预测框所需的工作量。

        YOLOv8还引入了AutoML技术,进一步提升了算法性能。AutoML的引入使得模型能够自我优化和调整,这意味着模型结构和超参数不再是静态固定的,而是可以根据任务的需求和数据的特征进行自适应调整。这种自动化的优化流程大大提升了模型的实用性和灵活性,使得YOLOv8能够在多变的应用场景中保持出色的性能。

        总的来说,YOLOv8通过综合利用SPP、FPN结构优化特征提取,采用自适应标签分配增强目标检测精度,并通过AutoML技术提升模型的自适应调整能力,为目标检测任务提供了一种高效且精准的解决方案。这些创新使得YOLOv8能够在保持YOLO系列一贯的高速检测能力的同时,提供更为精确和稳定的检测结果,满足了不同领域对于高性能目标检测系统的需求。

4.2 模型构建

        在我们的PCB板缺陷检测项目中,代码的编写旨在创建一个能够快速准确检测图像中是否存在未佩戴PCB板缺陷人员的系统。此部分代码介绍将侧重于模型的构建和检测过程,这是系统核心功能的直接体现。

        首先,我们引入必要的Python库和模块,这些库提供了图像处理、深度学习模型加载和运行设备选择等功能。例如,cv2库来自OpenCV,是处理图像和视频的强大工具;torch是PyTorch深度学习框架的核心库,它提供了构建和运行深度学习模型所需的所有功能。

import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device

        在代码中,我们设置了设备类型,并初始化了模型和图像处理的一些基本参数。这些参数包括物体的置信度阈值、非极大值抑制(NMS)的IOU阈值以及类别过滤器。

device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
    'device': device,
    'conf': 0.25,
    'iou': 0.5,
    'classes': None,
    'verbose': False
}

        为了数出每个类别的实例数量,我们定义了一个函数count_classes。它利用了一个字典来存储每个类别的计数,并通过遍历检测信息来更新这个计数。这为我们提供了一个清晰的视图,了解哪些PCB板缺陷类别最常见,哪些比较罕见。

def count_classes(det_info, class_names):
    count_dict = {name: 0 for name in class_names}
    for info in det_info:
        class_name = info['class_name']
        if class_name in count_dict:
            count_dict[class_name] += 1
    count_list = [count_dict[name] for name in class_names]
    return count_list

        代码中定义了一个YOLOv8v5Detector类,它是基于Detector类的子类,这表明我们的检测器是在一个更一般的检测器基础上定制的。这样做的好处是我们可以重用Detector类中的许多功能,并在此基础上添加我们特定模型的细节。load_model方法是加载预训练模型的核心。它首先使用select_device函数选择合适的设备,然后加载YOLO模型,并确保所有类名都转换为中文,以方便后续的理解和显示。这对于确保我们的系统在本地化环境中可用非常重要。preprocess方法在这里没有进行复杂的处理,仅保存原始图像。这为未来可能的图像处理步骤预留了空间。predict方法是系统执行预测的地方,它调用YOLO模型的推理函数,并将处理后的图像传递给模型进行预测。

class YOLOv8v5Detector(Detector):
    def __init__(self, params=None):
        super().__init__(params)
        self.model = None
        self.img = None
        self.names = list(Chinese_name.values())
        self.params = params if params else ini_params
	def load_model(self, model_path):
	    self.device = select_device(self.params['device'])
	    self.model = YOLO(model_path)
	    names_dict = self.model.names
	    self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]
	    self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))
	def preprocess(self, img):
	    self.img = img
	    return img
	
	def predict(self, img):
	    results = self.model(img, **ini_params)
	    return results
	
	def postprocess(self, pred):
	    results = []
	    for res in pred[0].boxes:
	        for box in res:
	            class_id = int(box.cls.cpu())
	            bbox = box.xyxy.cpu().squeeze().tolist()
	            bbox = [int(coord) for coord in bbox]
	            result = {
	                "class_name": self.names[class_id],
	                "bbox": bbox,
	                "score": box.conf.cpu().squeeze().item(),
	                "class_id": class_id,
	            }
	            results.append(result)
	    return results
	    
    def set_param(self, params):
        self.params.update(params)

        postprocess方法处理模型的输出。对于每个预测结果,我们从输出中提取类别、边界框和置信度分数,并将它们格式化为更易于理解和处理的形式。我们也将类别ID转换为对应的中文名称,再次强调易于理解。最后,set_param方法允许动态更新参数,使我们的检测器在运行时可以调整配置,以适应不同的检测需求。

        这部分代码是PCB板缺陷检测系统中至关重要的组成部分,它不仅封装了模型的加载、预测和结果处理,而且还提供了足够的灵活性,使系统可以适应多种运行条件。通过这种设计,我们的系统能够在保持高性能的同时,也能为用户提供直观和本地化的输出结果。

4.3 训练代码

        在我们的PCB板缺陷检测系统中,训练一个高效、准确的模型是实现目标检测的关键。我们使用的训练脚本是构建这一系统的核心,它涉及多个重要步骤,每个步骤都经过精心设计以确保最终模型的性能。以下是训练模型的详细代码介绍。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数 设置 说明
学习率(lr0 0.01 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
学习率衰减(lrf 0.01 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
动量(momentum 0.937 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
权重衰减(weight_decay 0.0005 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
热身训练周期(warmup_epochs 3.0 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
批量大小(batch 16 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
输入图像大小(imgsz 640 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

        环境设置与模型加载:首先,我们导入了os和torch库以及yaml解析库,它们是文件操作和模型训练不可或缺的工具。ultralytics库提供了YOLO模型的接口,QtFusion.path则是用来处理文件路径。

import os
import torch
import yaml
from ultralytics import YOLO  # 用于加载YOLO模型
from QtFusion.path import abs_path  # 用于获取文件的绝对路径

        接下来,我们定义device变量来指定训练时使用的设备,如果检测到可用的GPU,就使用第一块GPU("0"),否则使用CPU。

device = "0" if torch.cuda.is_available() else "cpu"

        数据集准备:我们设置了数据加载所需的工作进程数量和批次大小,这两个参数有助于加速数据的加载过程和提高批次处理的效率。workers参数定义了多少个子进程被用来加载数据,而batch则决定了每次输入模型的数据量。我们还需要定义和读取训练数据集的配置文件。这个文件包含了训练和验证数据集的路径,以及分类的名称和类别。我们通过转换路径格式确保了它在不同操作系统间的兼容性。

workers = 1  # 工作进程数
batch = 8  # 每批处理的图像数量
data_name = "Helmet"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')

        之后,我们通过读取并可能修改YAML配置文件来确保数据集的路径是正确的。如果需要,我们会将路径更新为正确的目录路径:

directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
    data = yaml.load(file, Loader=yaml.FullLoader)

if 'path' in data:
    data['path'] = directory_path
    with open(data_path, 'w') as file:
        yaml.safe_dump(data, file, sort_keys=False)

        训练模型:最后,我们加载预训练的YOLO模型,并开始训练流程。模型训练开始。我们指定了许多训练参数,包括训练数据的配置文件路径、选择的设备、工作进程数、输入图像大小、训练周期数和每批次的大小。这些参数被细心调整,以确保模型能够充分学习数据集中的特征,而不会发生过拟合。

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  # 指定训练任务的名称
)

        通过这个训练过程,我们期望训练出一个能够准确识别PCB板缺陷的模型,不仅在我们的验证集上表现良好,而且在实际的应用场景中也能保持高准确率。


5. 实验结果与分析

5.1 训练曲线

        在我们的PCB板缺陷检测项目中,我们使用了YOLOv8模型并对其训练过程进行了深入分析。从训练损失图中可以观察到,模型的三个主要损失组成部分——边界框损失(box_loss)、分类损失(cls_loss)和目标函数损失(dfI_loss)——随着训练周期的增加呈现出下降趋势,这表明模型的性能在逐渐改进。训练损失的平滑线显示了一致的下降,证明训练过程稳定,没有出现明显的过拟合或欠拟合的情况。

        边界框损失(box_loss)和目标函数损失(dfI_loss)对于检测任务尤为关键,它们直接影响着模型识别和定位缺陷的能力。随着这两项损失的降低,我们可以推断模型在定位缺陷的准确性上有显著提升。类别损失(cls_loss)的下降同样重要,它表明模型在区分不同类型的PCB板缺陷方面变得更加准确。

        转向验证集的损失,我们看到了与训练集类似的下降趋势,这进一步证实了模型的泛化能力。在实际应用中,这意味着模型不仅能够学习训练数据的特征,还能有效地应用于未见过的数据。验证集损失的平稳下降也表明了我们选择的超参数设置和数据增强策略的有效性。
        精度和召回率是衡量模型性能的另外两个关键指标。在训练过程中,模型的精度随着迭代次数的增加而提高,稳定在较高水平,这表明模型能够准确识别出大多数的缺陷。召回率的提升则意味着模型能够检测到更多的真正缺陷,减少了漏检的情况。两个指标的提升相辅相成,对于实际生产线上的PCB板缺陷检测任务至关重要。

        最后,平均精度(mAP)是整体衡量目标检测模型性能的重要指标,它综合考虑了精度和召回率。从mAP50和mAP50-95两个指标可以看出,模型在不同IoU阈值下都表现出良好的性能,特别是mAP50的值接近0.8,显示了模型在IoU为0.5时的强大检测能力。mAP50-95的稳步上升则展示了模型在更严格条件下也具有不错的检测性能。

        通过对YOLOv8模型在PCB板缺陷检测任务上的训练损失和性能指标的综合分析,我们可以得出结论,模型的训练过程稳健,且在不同的评估指标上都取得了显著的性能提升。这样的结果为我们后续在实际生产环境中部署模型提供了信心,并为进一步的优化和调整奠定了坚实的基础。

5.2 混淆矩阵

        在我们的PCB板缺陷检测研究中,混淆矩阵是评估模型性能的关键工具之一。它不仅展示了模型在每个类别上的识别能力,还揭示了识别过程中的潜在误差。我们所展示的混淆矩阵是标准化后的版本,使得每个类别的预测结果与实际标签的对比更为清晰。

        在我们的PCB板缺陷检测研究中,混淆矩阵是评估模型性能的关键工具之一。它不仅展示了模型在每个类别上的识别能力,还揭示了识别过程中的潜在误差。我们所展示的混淆矩阵是标准化后的版本,使得每个类别的预测结果与实际标签的对比更为清晰。

        对于spur的预测,我们可以看到其准确率为0.74,这也是一个相对较高的值。然而,混淆矩阵同样显示了一些误分类的情况,特别是在将其他缺陷误分类为background上。例如,missing_hole有0.24的概率被误分类为background,而spurious_copper被误分类为background的概率为0.25。这可能指示模型对于边界区域的缺陷与背景之间的区分能力仍有提升空间。

        重要的是要注意,尽管所有类型的缺陷都能够以合理的准确度被检测出来,但存在一定程度的误分类,这通常是因为某些缺陷特征之间存在相似性,或者由于数据集中的不平衡导致模型对于某些类别的识别能力不足。模型在missing_hole与background之间的分辨中表现出了最大的挑战,这提示我们可能需要进一步调整模型,或者在数据集上实施更多的平衡策略。

        总体而言,混淆矩阵提供了一个清晰的视图来评估我们的模型在各个类别上的性能。模型展现了在多个缺陷类型上的强大识别能力,特别是对于missing_hole、mouse_bite和spurious_copper三种类型。未来的工作可以聚焦于减少模型的误分类率,特别是减少将缺陷误识别为background的情况。通过改进训练数据的质量、增加样本的多样性或调整模型架构,我们有望进一步提升PCB板缺陷检测模型的整体性能。

5.3 YOLOv8/v7/v6/v5对比实验

(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 作为衡量模型性能的重要指标,尤其在处理类别分布不均的数据集时显得尤为关键。它通过结合精确率与召回率,提供了一个单一的度量标准,能够全面评价模型的效能。精确率衡量的是模型在所有被标记为正例中真正属于正例的比例,而召回率则关注于模型能够识别出的真正正例占所有实际正例的比例。F1-Score通过两者的调和平均,确保了只有当精确率和召回率同时高时,模型的性能评估才会高,从而确保了模型对于正例的预测既准确又完整。
  • mAP(Mean Average Precision):在目标检测任务中,Mean Average Precision(mAP)是评估模型性能的重要标准。它不仅反映了模型对单个类别的识别精度,而且还考虑了所有类别的平均表现,因此提供了一个全局的性能度量。在计算mAP时,模型对于每个类别的预测被单独考虑,然后计算每个类别的平均精度(AP),最后这些AP值的平均数形成了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)实验结果分析

       在我们的研究中,我们对PCB板缺陷检测任务使用了YOLO系列的四个不同版本:YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n,进行了一系列的对比实验。实验的设计旨在评估和对比这些模型在同一数据集上的性能表现。我们的目的是确定在特定的PCB板缺陷检测任务上,哪个版本的模型最为适合,考虑到各个模型的结构复杂度和预期用例。实验设置保持了所有模型训练过程中的条件一致,以确保结果的公正性和可比性。

       在性能评估中,我们采用了F1-Score和mAP(mean Average Precision)这两个度量指标。F1-Score是精度和召回率的调和平均,提供了单一的性能衡量标准。而mAP则综合评估了在不同置信度阈值下模型的表现,它在目标检测任务中是衡量模型性能的重要指标。

       实验结果揭示了四个模型都展现出了优异的性能。具体来说,YOLOv5nu在mAP指标上达到了0.810,而在F1-Score上为0.86。YOLOv6n在mAP上略低于YOLOv5nu,为0.808,F1-Score为0.85。YOLOv7-tiny在mAP上以0.813的成绩超越了YOLOv5nu和YOLOv6n,F1-Score则与YOLOv5nu相同,为0.86。最后,YOLOv8n以0.814的mAP成绩领先,F1-Score同样为0.86。

       在模型间的对比中,尽管各模型间的性能表现相差不大,但YOLOv8n显示出了略微的优势,可能得益于其进一步优化的网络结构和更精细的特征提取能力,这对于处理PCB板上细小和复杂的缺陷特别有帮助。YOLOv7-tiny展现了与YOLOv8n相近的mAP表现,这表明在计算资源受限的场景下,YOLOv7-tiny可以作为一个高效的备选。相比之下,YOLOv5nu和YOLOv6n虽然在mAP上略低,但仍然保持了较高的F1-Score,表明这些模型在精确性和召回率之间取得了良好的平衡。

       此外,实验结果也可能受到各种因素的影响,包括模型的深度、宽度、以及使用的优化算法等。YOLOv5nu和YOLOv6n较低的mAP可能是因为在处理某些特定类型的缺陷时,模型的泛化能力有限。同时,YOLOv7-tiny和YOLOv8n的结构可能更适应该数据集的特性,例如通过更细粒度的特征学习来提升性能。

       总结来说,每个模型的选择应根据实际应用场景和需求来定。如果计算资源丰富,YOLOv8n可能是最优选择,考虑到其略高的性能表现。而在对计算效率要求较高的场景下,YOLOv7-tiny可能是一个更合适的备选方案。我们的实验结果为未来在PCB板缺陷检测领域选择合适的目标检测模型提供了有力的指导和参考。


6. 系统设计与实现

6.1 系统架构概览

        我们的系统主要由三大模块组成:数据处理模块、模型训练模块和缺陷检测模块。每个模块都承担着不同的功能,共同工作以实现高效准确的PCB板缺陷检测。以下是我们系统架构设计的核心组成部分:

1. 数据处理模块(DataPreprocessor)

  • 功能:负责原始数据的预处理工作,包括图像的读取、缩放、标准化以及增强等。此模块确保输入到模型中的数据格式正确且有助于提高模型训练的效率和准确性。

  • 关键类和方法

    • ImageLoader:加载原始PCB板图像数据。
    • ImageResizer:调整图像尺寸以符合模型输入要求。
    • DataAugmenter:应用不同的图像增强技术,如旋转、翻转、变形等,以增加数据多样性。
    • DataNormalizer:对图像进行标准化处理,确保模型训练的数值稳定性。

2. 模型训练模块(ModelTrainer)

  • 功能:使用处理过的数据集对YOLO模型进行训练,包括前向传播、损失计算、反向传播和参数更新等过程。此模块支持多版本的YOLO算法,以便于根据具体需求选择最合适的版本。

  • 关键类和方法

    • YOLOTrainer:核心训练类,负责模型的训练循环。
    • LossCalculator:计算模型的损失值,支持不同版本的YOLO算法的特定损失函数。
    • Optimizer:负责模型的优化算法,如SGD、Adam等。
    • ModelSaver:用于保存训练过程中的模型参数,便于后续的模型评估和部署。

3. 缺陷检测模块(DefectDetector)

  • 功能:将训练好的模型部署到实际的生产线上,对流水线上的PCB板进行实时检测。此模块负责接收图像输入,执行模型推理,并输出检测结果。

  • 关键类和方法

    • ModelLoader:加载训练好的YOLO模型。
    • ImagePreprocessor:对实时捕获的PCB板图像进行预处理。
    • YOLODetector:执行模型推理,检测图像中的缺陷。
    • ResultVisualizer:将检测结果(包括缺陷位置和类型)以图形化的方式展示出来,便于操作人员快速识别和处理。

    通过这样的设计,我们的系统不仅能够实现高效精准的PCB板缺陷检测,而且具备良好的可扩展性和易于维护的特性。重要的是,这套系统架构允许我们轻松地在不同版本的YOLO算法之间进行切换,以适应不同的应用需求和硬件环境。

6.2 系统流程

        在基于YOLOv8/v7/v6/v5的PCB板缺陷检测系统中,整个工作流程可以被概括为以下几个关键步骤。以下内容将为您详细介绍这一流程:

1. 数据准备阶段

  1. 原始图像数据加载:使用ImageLoader类从数据集中加载原始PCB板图像数据。
  2. 图像预处理:调用ImageResizer对每张图像进行尺寸调整,确保图像尺寸符合模型输入要求。
  3. 数据增强:通过DataAugmenter应用一系列图像增强技术(如旋转、翻转等),以提高模型的泛化能力。
  4. 数据标准化:使用DataNormalizer对图像数据进行标准化处理,保证数据输入的一致性和数值稳定性。

2. 模型训练阶段

  1. 模型初始化:根据选择的YOLO版本(v8/v7/v6/v5),初始化对应的深度学习模型结构。
  2. 训练循环开始:通过YOLOTrainer类进行模型的训练,这一过程包括多个周期(Epochs)的迭代。
  3. 前向传播和损失计算:在每次迭代中,模型对输入数据进行前向传播,并通过LossCalculator计算损失值。
  4. 反向传播和参数更新:根据损失值,执行反向传播算法更新模型参数。这一步骤通常由Optimizer负责管理。
  5. 模型保存:定期或在训练结束时,通过ModelSaver保存训练好的模型及其参数,以供后续使用。

3. 缺陷检测阶段

  1. 加载训练好的模型:使用ModelLoader加载经过训练的YOLO模型。
  2. 实时图像捕获:在生产线上实时捕获PCB板图像。
  3. 图像预处理:对捕获的图像再次应用ImagePreprocessor进行预处理,包括尺寸调整和标准化等。
  4. 模型推理:将预处理后的图像输入到YOLODetector进行缺陷检测。此步骤会输出图像中的缺陷位置和类别。
  5. 结果可视化:通过ResultVisualizer将检测结果以可视化的形式展示给操作人员,以便快速识别和处理PCB板上的缺陷。

    通过以上流程,我们的系统能够实现从原始数据的处理到模型训练,最终到缺陷的检测与可视化的完整工作流。这种流程不仅确保了检测系统的高效性和准确性,而且通过模块化设计使得每一步骤都可被优化和调整,以满足不同生产需求和环境的变化。


代码下载链接

         如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:

        资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷

演示与介绍视频https://www.bilibili.com/video/BV1NH4y1n71M/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZ2YmJty
YOLOv8和v5项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Ykpdy
YOLOv7项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl5lx
YOLOv6项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Yl59s

完整安装运行教程:

        这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:

  1. Pycharm和Anaconda的安装教程https://deepcode.blog.csdn.net/article/details/136639378

        软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:

  1. Python环境配置教程https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
  2. 离线依赖包的安装指南https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);

        如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。


7. 结论与未来工作

    本文通过深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在PCB板缺陷检测领域的应用,成功开发了一个结合了这些先进算法的PCB板缺陷检测系统。通过对多个版本的YOLO模型进行细致的比较和优化,本研究不仅提升了PCB板缺陷检测的准确率和实时性,还通过Streamlit创建了一个直观、美观且易于使用的Web应用,使用户能够轻松地进行缺陷识别,从而在实际应用中发挥重要作用。

    经过一系列实验验证,本文所提出的方法在缺陷检测的准确性和处理速度上都达到了令人满意的水平。同时,我们还提供了完整的数据集处理流程、模型训练和预测的代码,以及基于Streamlit的系统设计和实现细节,为后续的研究者和开发者复现和参考提供了方便。尽管取得了一定的成果,但PCB板缺陷检测作为一个复杂多变的任务,仍然面临着许多挑战和改进空间。在未来的工作中,我们计划从以下几个方向进行探索:

  • 模型优化:继续探索更深层次的网络结构和优化策略,如神经网络架构搜索(NAS)技术,以进一步提升模型的性能和效率。
  • 多模态融合:考虑结合光学、热成像等其他模态信息,采用多模态学习方法进行缺陷检测,以更全面地理解PCB板的状态。
  • 跨域适应性:研究不同PCB板材质、不同生产批次的缺陷检测,通过领域自适应技术提高模型在不同类型PCB板和生产环境中的泛化能力。
  • 用户交互体验:进一步优化系统的用户界面和交互设计,使其更加人性化、智能化,以满足更广泛用户的需求。
  • 实际应用拓展:探索PCB板缺陷检测在更多实际应用场景中的应用,如智能制造、自动化测试设备、质量控制等,以发挥其最大的社会和经济价值。

    总之,PCB板缺陷检测技术正处于快速发展之中,随着技术的不断进步和应用场景的不断拓展,我们相信在不久的将来,基于深度学习的PCB板缺陷检测将在制造业质量控制、产品可靠性提升等领域发挥更加重要的作用。


  1. 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. ↩︎ ↩︎ ↩︎

  2. Zhao, Dewei, et al. "A Small Object Detection Method for Drone-Captured Images Based on Improved YOLOv7." Remote Sensing 16.6 (2024): 1002. ↩︎ ↩︎ ↩︎

  3. Qiu, Shi, et al. "Automated detection of railway defective fasteners based on YOLOv8-FAM and synthetic data using style transfer." Automation in Construction 162 (2024): 105363. ↩︎ ↩︎

  4. Qin, Han, et al. "An Improved Faster R-CNN Method for Landslide Detection in Remote Sensing Images." Journal of Geovisualization and Spatial Analysis 8.1 (2024): 2. ↩︎

  5. Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//Computer Vision–ECCV 2016: 14th European Conference, Amsterdam, The Netherlands, October 11–14, 2016, Proceedings, Part I 14. Springer International Publishing, 2016: 21-37. ↩︎

标签:训练,检测,模型,YOLOv8,v5,v7,PCB,缺陷
From: https://www.cnblogs.com/deeppython/p/18102154

相关文章