基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的PCB电子元件识别系统(Python+PySide6界面+训练代码)

摘要:开发PCB电子元件识别系统对于电子制造业的生产效率和产品质量具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个PCB电子元件识别系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7YOLOv6YOLOv5,展示了不同模型间的性能指标,如mAPF1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码训练数据集,并集成了一个基于PySide6的界面。

系统能够精准检测和分类PCB电子元件,支持通过图片图片文件夹视频文件摄像头进行检测,包含柱状图分析标记框类别类别统计、可调ConfIOU参数结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:

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


演示与介绍视频:https://www.bilibili.com/video/BV1uw4m1o7Ms/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/ZZyUmphu
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZubm5hu
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZucm5dy
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZyUlpZx


前言

        在当今数字化时代,印刷电路板(PCB)已成为各类电子设备不可或缺的核心组成部分。从消费电子到高端通信设备,PCB上的电子元件种类繁多、密度高,这对元件的准确识别提出了极高的要求。PCB电子元件识别系统的研发和应用,因而扮演着至关重要的角色,它不仅直接关系到电子制造业的生产效率和产品质量,也是实现智能制造和提升产业自动化水平的关键技术之一。

        随着人工智能技术的快速发展,基于深度学习的图像处理技术已经成为解决PCB电子元件识别问题的强有力工具。特别是YOLO[1](You Only Look Once)系列算法,因其高效性和准确性,已经在众多领域得到了广泛应用。从YOLOv5[2]到YOLOv8[3],每一次更新都带来了性能的显著提升,如识别速度的加快、准确率的提高以及对小尺寸对象的识别能力的增强等。此外,随着数据集的不断丰富和更新,模型训练的准确性和鲁棒性得到了进一步提升。

        除了算法的进步外,数据集的质量和多样性对模型的性能有着至关重要的影响。近年来,为了适应PCB电子元件识别的需求,专门针对此领域的数据集开始出现。这些数据集不仅包含了更多种类的电子元件,也在环境复杂度、元件姿态和遮挡情况上进行了拓展,极大地提升了模型训练的效果和泛化能力。然而,数据集的构建和扩充仍然是一个挑战,因为它需要大量的人力进行标注,且要保证标注的准确性。

        Vision Transformer(ViT)作为一种基于注意力机制的模型,已经在图像分类任务中取得了令人瞩目的成果。近期的研究表明,ViT也在目标检测任务中展现出了巨大的潜力,通过全局注意力机制,ViT能够捕获图像中的长距离依赖,这对于识别和区分PCB板上紧密排列的电子元件极为有利。然而,ViT模型的计算成本较高,如何有效地将其应用于实时的PCB电子元件识别系统中,仍是一个需要解决的问题。

        注意力机制,尤其是自注意力(Self-Attention)和跨注意力(Cross-Attention)的引入,已经成为提升深度学习模型性能的关键。在PCB电子元件识别中,注意力机制可以帮助模型更加聚焦于图像中的关键部分,如特定类型的元件或元件的特定部位,从而提高识别的准确性和鲁棒性。例如,通过对特定元件类型加强注意力,可以有效地提升模型在复杂背景下的识别性能。

        MMDetection作为一个开源的目标检测工具箱,提供了丰富的算法和模型架构,支持快速实验和研究。它包括了多种基于卷积神经网络(CNN)和Transformer的模型,适用于不同的目标检测任务。对于PCB电子元件识别,MMDetection不仅提供了一个强大的实验平台,而且也促进了最新算法的快速验证和部署。

        本博客所做的工作是基于YOLOv8算法构建一个PCB电子元件识别系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:

  1. 采用最先进的YOLOv8算法进行PCB电子元件检测:通过采用当前最先进的YOLOv8算法,本文不仅展示了其在PCB电子元件检测方面的出色性能,也通过与YOLOv7[4]、YOLOv6[5]、YOLOv5等早期版本的对比分析,直观地证明了YOLOv8在效率和精准度上的显著优势。此外,本文还深入探讨了YOLOv8算法的原理和关键技术细节,为相关领域的研究者和技术开发者提供了宝贵的参考和启发。
  2. 利用PySide6实现友好的用户界面:这一创新不仅使得操作更为直观便捷,而且极大地提升了用户体验,有助于促进YOLOv8算法在PCB电子元件识别系统中的广泛应用。
  3. 集成登录管理功能,提升系统安全性:系统中加入的登录管理功能,进一步增强了系统的安全性,并为未来添加更多个性化功能和服务提供了可能,这表明了本文在系统设计上的前瞻性和创新性。
  4. 对YOLOv8模型进行深入研究:我们对YOLOv8模型的深入研究,包括对其性能的全面评估以及在不同环境和条件下的表现分析,不仅增进了我们对该算法的理解,而且为进一步的优化和改进提供了宝贵的数据支持。
  5. 提供完整的数据集和代码资源包:这些资源不仅允许读者直接复现我们的实验结果,更为重要的是,它们为广大研究者和开发者提供了一套实用的工具和数据,支持他们在此基础上进行更深入的研究和开发,推动整个领域向前发展。

1. 数据集介绍

        本文所使用的数据集包含了总计7661张针对PCB电子元件识别任务的图像,其中训练集有6129张,验证集766张,以及测试集也拥有766张图像。这样的数据集划分有助于机器学习模型在各个阶段都能够接触到多样的数据,从而学习更为泛化的特征表示。

        为了确保模型训练的一致性和最终的识别性能,所有图像均经过了精心的预处理和增强处理。具体来说,每张图像都被重置为640x640像素的大小,并且通过拉伸方法来适应新的分辨率,这样做可以确保图像在输入模型之前保持固定的尺寸,从而使得算法可以更专注于学习元件的特征而非图像尺寸的变化。图像的自动定向处理确保了所有的图像都具有统一的方向,这是通过去除图像EXIF中的定向信息来实现的。这样的预处理步骤对于包含多个方向的电子元件图像来说尤为重要,因为它能够帮助识别算法减少由于方向变化而产生的复杂性。

        本数据集的每张图片都附有精确的标签,指示了图像中各个PCB电子元件的位置和类别。这些标签是通过边界框(Bounding Boxes)的形式给出的,它们为元件在图像中的精准定位提供了必要的地面真相(Ground Truth)。同时,这些边界框也是用来训练和评估我们的识别系统的关键信息。

        此外,数据集的元件类别分布信息也是至关重要的,因为它直接关系到模型能否平衡地学习到所有可能出现的元件类型。对于类别的分布是否均衡、是否覆盖了所有关键的元件种类,这些都是在后续模型训练和验证过程中需要仔细考虑的。博主使用的类别代码如下:

Chinese_name = { "Condensator": "电容器", "Diode": "二极管", "Resistor": "电阻器","Transistor": "晶体管"}

        通过上述的数据集构建和预处理步骤,我们确保了在训练和测试PCB电子元件识别模型时,数据的质量和一致性得到了保障。这样高质量的数据集是训练准确、高效的识别模型的基石,并且为开展相关的深度学习研究工作提供了坚实的基础。

2. 系统界面效果

        系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。

(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。

(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行PCB电子元件检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。

(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。

(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。


3. 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. 代码简介

        在本节中,我们将详细介绍如何使用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/12.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框架以及Ultralytics的YOLO库来训练一个PCB电子元件识别模型。在电子制造领域,PCB(印刷电路板)上的元件识别是一个关键任务,这直接影响到产品的质量控制和生产效率。

        首先,我们设置了训练参数,包括单批次图像的数量(batch size)和工作进程数(workers),这些参数直接影响到模型训练的速度和效果。在代码中,我们指定了batch = 8,这意味着每次送入模型的图片数量为8,这个数字是一个在效率和显存消耗之间的权衡;而workers = 1则设置了数据加载过程中的工作线程数。

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"

        接着,我们定义了数据集的路径。利用Ultralytics的YOLO库,我们通过YAML文件配置数据集的路径,这个配置文件包含了训练、验证、测试图像的路径以及类别标签等信息。代码中的data_path存储了这个YAML文件的绝对路径。我们通过Python的os模块处理了文件路径,保证其兼容不同的操作系统。

workers = 1
batch = 8

data_name = "PCBsmd"
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文件,保持原有顺序
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类被用于实例化一个检测任务的模型,而abs_path函数确保了我们提供给模型的权重文件路径是正确的。然后,我们开始了模型的训练过程,通过调用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  # 指定训练任务的名称
)

        在PCB电子元件检测领域,对训练过程的损失函数进行分析是至关重要的。它不仅反映了模型学习的状况,还指示了模型的性能可能存在的问题。

        首先,从训练和验证的损失图中可以看出,训练和验证集上的box_loss(边界框损失),cls_loss(类别损失),和obj_loss(目标损失)随着训练轮次的增加而持续减少,这表明模型在逐渐学习到如何准确地预测目标的位置、类别和存在性。

        边界框损失(box_loss)是目标检测模型中用于度量模型预测的边界框与实际标注框之间差异的重要指标。从图中的下降趋势可以看出,YOLOv8模型在定位元件的位置方面学习得相当有效。同时,类别损失(cls_loss)同样显示出了显著的下降趋势,这表示模型在区分不同类别的元件上也越来越精准。

        在目标检测任务中,精度和召回率是衡量模型性能的关键指标。精度指的是模型预测为正的样本中实际为正的比例,而召回率指的是所有实际为正的样本中被模型预测为正的比例。在我们的案例中,精度(precision)和召回率(recall)都接近于1.0,这说明模型在PCB电子元件识别任务中表现出色,能够准确识别出大部分的元件,并且在识别时几乎没有遗漏。

        进一步的指标,如平均精度均值(mAP),特别是mAP@0.5和mAP@0.5-0.95,分别表示模型在IoU(交并比)为0.5和在IoU从0.5到0.95的所有阈值上的平均精度。在这里,mAP@0.5接近1.0,而mAP@0.5-0.95则在训练过程中持续上升,展现了模型对不同IoU阈值下检测的鲁棒性。mAP@0.5-0.95的提升尤其值得关注,因为它表明模型在检测更加精细的边界框时表现得更好,这对于PCB电子元件识别这样精确度要求极高的任务尤为关键。

        在深度学习模型的评估过程中,精确度-召回率(Precision-Recall,简称PR)曲线是衡量模型性能的重要工具,特别是在目标检测任务中,它能够揭示模型对于不同类别目标检测能力的细致情况。根据提供的PR曲线图,我们可以对YOLOv8模型在PCB电子元件检测任务上的性能进行专业分析。

        曲线几乎是一个直角,这表明模型在各个类别(电容器、二极管、电阻器、晶体管)上都实现了几乎完美的精确度和召回率,这两个指标的值都达到了0.995。通常情况下,模型的精确度和召回率很难同时达到这么高,因为提高召回率通常会以牺牲精确度为代价,反之亦然。然而,我们的模型在这两个指标上都取得了极高的分数,这表明了模型在检测不同类型的PCB电子元件时几乎没有发生误判或遗漏。

        具体来讲,精确度0.995意味着模型在将一个实例判定为正例时的可信度极高,而召回率0.995则意味着模型能够准确地识别出几乎所有的正例。这两个指标在0.995的高值还表明模型在各个类别上都具有非常均衡的性能。同时,整体的mAP@0.5值也达到了0.995,这表示模型在交并比为0.5的情况下具有极高的平均精度,是检测模型性能优秀的标志。

         需要注意的是,尽管这个结果看起来非常完美,但在实际应用中,还需考虑到操作条件、实际应用场景以及数据集的代表性等因素,这些因素都可能对模型的实际性能产生影响。此外,如此高的性能也可能表明模型在一个相对简单或者过于特定的数据集上进行了训练和评估。因此,为了确保模型的泛化能力,还需要在更广泛和复杂的数据集上进一步验证模型的性能。

4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比

(1)实验设计

        本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在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.995 0.996 0.980 0.995
F1-Score 1.00 1.00 0.99 1.00

(3)实验结果分析

        在我们的实验中,我们对比了四个版本的YOLO算法:YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n。这些版本覆盖了YOLO系列从v5到v8的演进,我们将它们在相同数据集上的性能进行了比较,主要关注两个度量指标:平均精度均值(mAP)和F1-Score。

        从实验结果来看,YOLOv6n以0.996的mAP取得了最高分,紧随其后的是YOLOv5nu和YOLOv8n,都达到了0.995的mAP,而YOLOv7-tiny则稍低,为0.980。虽然差异不大,但这表明在我们的数据集上,YOLOv6n在目标检测的准确性上略优于其他版本。这可能得益于YOLOv6版本中针对算法结构的优化,如改进的Backbone或者Neck设计,使得模型能够更好地提取和利用图像特征进行准确的目标定位和分类。

        在F1-Score上,YOLOv5nu、YOLOv6n和YOLOv8n都达到了完美的1.00分,而YOLOv7-tiny稍微落后,为0.99。这说明除了YOLOv7-tiny外,其他三个模型在精确度和召回率上都取得了最佳的平衡,几乎没有任何误检和漏检发生。对于YOLOv7-tiny来说,虽然0.99的F1-Score也是一个非常优秀的成绩,但相较于其他版本,它在一些情况下可能会有一定的误检或漏检,这可能与其“tiny”版本相对较小的模型复杂度有关。

        综合mAP和F1-Score这两个指标,我们可以得出结论,尽管这些YOLO版本的表现都相当出色,但在我们的PCB电子元件识别任务中,YOLOv6n略胜一筹。然而,YOLOv8n的表现也不容小觑,特别是考虑到YOLOv8是最新的版本,它在未来的优化和迭代中可能会表现得更加出色。YOLOv5nu的表现也验证了其作为YOLO系列的强大起点。而YOLOv7-tiny,尽管在性能上略微落后,但由于其较小的模型大小,可能在需要更高效运算的场景中是一个不错的选择。

        以上分析表明,每个版本的YOLO算法都有其特点和适用场景,选择最合适的算法应基于具体的应用需求、资源限制和性能目标来决定。在未来的研究和应用中,深入了解每个版本的优势和局限,以及如何结合它们的特点来解决实际问题,将是一个值得探讨的课题。

4.4 代码实现

        在现代计算机视觉领域,将深度学习模型应用于实时图像处理任务已成为一项重要技术。我们将重点介绍如何利用YOLOv8模型在一个特定的应用场景中进行目标检测——PCB(印刷电路板)电子元件的识别。我们将逐步介绍这一过程中的核心代码,并对其功能和作用进行详细的解释。

(1)引入必要的库
        首先,我们导入必要的库和模块,如random生成目标框颜色、sys管理程序运行的环境、time评估模型运行效率,以及cv2进行图像操作。此外,我们还需要Qt相关的库来构建用户界面。

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模型并进行目标检测
from datasets.PCBsmd.label_name import Label_list

QF_Config.set_verbose(False)

(2)初始化模型
        我们需要加载预训练好的模型权重,这是确保我们能够捕捉到PCB电子元件的关键步骤。代码中使用了YOLOv8Detector类来加载我们训练好的权重文件。这个类的load_model方法接受一个指向模型权重文件的路径,这些权重定义了YOLOv8模型的结构和已学习的参数。

cls_name = Label_list  # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))]  # 为每个目标类别生成一个随机颜色

model = YOLOv8Detector()  # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))  # 加载预训练的YOLOv8模型

(3)设置主窗口
        为了能够有效地与用户交互,我们创建了一个名为MainWindow的类,它继承自QMainWindow。这个类的构造函数中定义了窗口的大小,并初始化了一个用于显示图像的QLabel。此外,还有一个处理键盘事件的函数,允许用户通过按下Q键来退出应用程序。

class MainWindow(QMainWindow):  # 定义MainWindow类,继承自FBaseWindow类
    def __init__(self):  # 定义构造函数
        super().__init__()  # 调用父类的构造函数
        self.resize(640, 640)  # 设置窗口的大小
        self.label = QtWidgets.QLabel(self)  # 创建一个QLabel对象
        self.label.setGeometry(0, 0, 640, 640)  # 设置QLabel的位置和大小

    def keyPressEvent(self, event):  # 定义keyPressEvent函数,用于处理键盘事件
        if event.key() == QtCore.Qt.Key.Key_Q:  # 如果按下的是Q键
            self.close()  # 关闭窗口

(4)主程序流程
        在主函数中,我们初始化了应用程序并创建了MainWindow的一个实例。然后我们读取了一个图像,并使用OpenCV库调整其大小。这个图像将被用作模型的输入。为了提高处理速度,我们对图像进行了预处理,以满足YOLOv8模型的输入要求。

app = QtWidgets.QApplication(sys.argv)  # 创建QApplication对象
window = MainWindow()  # 创建MainWindow对象

img_path = abs_path("test_media/PCBsmd_SIXU_B00574.jpg")  # 定义图像文件的路径
image = cv_imread(img_path)  # 使用cv_imread函数读取图像

image = cv2.resize(image, (850, 500))  # 将图像大小调整为850x500
pre_img = model.preprocess(image)  # 对图像进行预处理

        YOLOv8模型的检测过程是通过调用predict方法来完成的。我们记录了开始和结束时间,以计算模型在单个图像上的推理时间。接着,我们根据预测结果在图像上绘制了边界框和类别标签,最后将处理后的图像显示在GUI界面上。

t1 = time.time()  # 获取当前时间(开始时间)
pred = model.predict(pre_img)  # 使用模型进行预测
t2 = time.time()  # 获取当前时间(结束时间)
use_time = t2 - t1  # 计算预测所用的时间

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])  # 在图像上绘制边界框和标签

print("推理时间: %.2f" % use_time)  # 打印预测所用的时间
window.dispImage(window.label, image)  # 在窗口的label上显示图像
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())

        在这个博客中,我们不仅分享了代码的具体实现,还探讨了代码背后的逻辑和目的。这些代码构成了一个完整的目标检测系统,它能够识别并标注PCB图像中的电子元件。


5. PCB电子元件识别系统实现

        在实现一款实时PCB电子元件识别系统时,我们深入考虑了用户体验和操作便捷性。本系统的设计理念是创建一个集成、高效且用户友好的交互式识别系统,旨在将复杂的图像处理和深度学习模型运用到实际的PCB元件识别中。本系统不仅需要准确识别电路板上的各种元件,而且还需要提供一个直观的用户界面,使得非专业用户也能轻松操作。

5.1 系统设计思路

        我们设计的MainWindow类是这一理念的体现。它不仅作为用户交互的平台,而且还承担着调度各个功能模块的任务。

架构设计
        我们的系统设计思路以三层架构为核心:处理层、界面层和控制层。在我们的系统设计中,重点放在了确保各个组件能够协同工作,同时保持足够的模块独立性,以便于未来的维护和升级。

  • 处理层(Processing Layer):系统的核心——YOLOv8Detector类,是处理层的基石。它加载了预训练的YOLOv8模型并提供了检测与识别的接口。在用户上传PCB图像后,这一层将图像转换为模型可以处理的格式,并执行检测任务,返回识别结果。
  • 界面层(UI Layer):在界面层方面,我们通过PySide6工具套件构建了一套现代化的GUI。用户界面不仅直观展示了识别结果,而且还提供了文件上传、图像预览以及实时识别反馈等功能。这些都是通过Ui_MainWindow类实现的,它定义了窗口布局和各种交互组件,使得用户操作变得直观而简单。
  • 控制层(Control Layer):控制层是沟通用户和处理器的桥梁,通过MainWindow类内的槽函数响应用户的操作指令。当用户加载一张PCB图像,系统将调用处理层执行识别任务,并通过控制层返回结果,最终在界面层显示。控制层还负责处理用户操作产生的各种事件,确保系统反应迅速且准确。

        整体而言,我们的系统设计强调模块化和灵活性。每一个层次都有明确的职责和作用,却又紧密协作,共同构成一个高效的整体。这样的设计不仅提升了系统的稳定性和扩展性,也使得维护和升级变得更加便捷。

系统流程
        在我们设计的PCB电子元件识别系统中,整个工作流程的开始是用户界面的初始化。

  1. 户启动应用程序,系统便创建了MainWindow类的实例。这一实例是用户与我们系统交互的窗口,它负责启动GUI,设置必要的参数,并引导用户进行后续的操作。这个界面不仅仅是一个显示屏幕,更是用户操作的起点,提供了一系列的选择和控制功能。
  2. 一旦程序运行,用户便会通过直观的图形界面进行操作。这个界面提供了选择输入源的选项,用户可以选择使用摄像头实时捕捉图像、从视频文件中读取或是上传静态图片。这为用户提供了灵活性,让他们可以在不同的应用场景和条件下使用我们的系统。
  3. 选择了输入源后,系统将调用媒体处理器和方法来处理这些数据。这个过程可能包括配置摄像头、读取视频文件或加载图像文件等多种形式。不同的输入源可能需要不同的处理方式,我们的系统设计了相应的接口和功能来处理这些多样化的输入。
  4. 随着媒体输入的准备工作完成,系统进入了一个连续的帧处理循环。每一帧图像都会经过一系列的预处理步骤,这些步骤确保了图像能够被YOLOv8模型正确解析。预处理可能包括调整图像尺寸、颜色空间转换、归一化等,这些都是为了使图像数据满足模型的输入要求。
  5. 在预处理完成后,图像数据将送入精心训练的YOLOv8模型。模型将执行其核心功能——检测PCB上的电子元件,并识别它们的类别。这个阶段是我们系统的核心,所有的算法和技术创新都是为了在这个阶段提供精确和可靠的识别。
  6. 当模型完成检测和识别后,界面将会更新,实时地展示电子元件的边界框和类别标签。这种直观的反馈让用户可以即时看到模型的识别结果,同时,用户还可以在GUI中看到更详尽的统计数据和分析结果。除了系统的自动检测和识别功能外,用户还可以通过界面进行一系列的交互操作。比如,用户可以保存检测结果,或者通过界面中的按钮和菜单进行其他操作,如查询系统信息、筛选特定类别的识别结果等。
  7. 最后,我们系统中还考虑了对媒体控制的需求。用户可以通过界面来控制媒体播放的状态,如启动或停止摄像头的捕捉、视频的播放或静态图像的分析。这为用户提供了对整个识别过程的直接控制,增加了系统的灵活性和用户的使用满意度。

        通过这样的设计思路,我们不仅提供了一个功能强大的PCB电子元件识别系统,而且还确保了用户界面的友好性和系统的高度互动性。我们期待这个系统能够成为电子制造领域的宝贵工具,帮助提升生产效率和产品质量。

5.2 登录与账户管理

        在当今数字化时代,安全性和个性化的用户体验已成为软件设计的关键组成部分。我们的PCB电子元件识别系统充分考虑了这一点,实现了一套完整的用户登录与账户管理功能。这套系统基于流行的PySide6框架和SQLite数据库构建,为用户提供了一个安全且易于操作的界面,用户可以通过这个界面进行账户的创建、密码的管理、个人头像的设置等。

        从用户第一次接触系统开始,便会被引导至登录界面,这里他们可以选择注册新账户或登录现有账户。我们意识到,用户可能会在不同的场景下使用系统,因此设计了账户注销和重新登录的功能,使用户在更换工作环境时能够保持操作的连贯性。此外,我们还提供了密码修改和头像设置功能,进一步增强了用户的个性化体验。这些账户管理功能不仅提高了系统的安全性,还使用户可以在一个独立的空间中保存和管理自己的检测结果和设置,确保了数据的私密性和个性化设置的持久性。

        随着账户设置的完成,用户便可进入到系统的核心功能——PCB电子元件识别。系统的主界面设计直观易懂,实时显示检测框、类别和置信度等关键信息,让用户可以直观地观察到检测结果,并进行相应的操作。不论是图片、视频文件、实时摄像头捕获还是批量文件处理,用户都可以期待流畅且准确的识别体验。

        通过整合深度学习模型的强大功能与精细的用户界面设计,我们的系统不仅能够实现高效准确的多物体识别和检测,还能提供符合用户需求的个性化服务。从注册到实时目标检测的全过程,我们旨在为用户提供一个无缝衔接、高度安全且易于管理的操作环境,进一步提升用户使用PCB电子元件识别系统的满意度和效率。这样的系统设计充分考虑了用户在实际应用场景下的需求,无论是个人爱好者还是工业领域的专业人士,都可以通过这一平台实现精确的电子元件识别和管理。

下载链接

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

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

演示与介绍视频:https://www.bilibili.com/video/BV1uw4m1o7Ms/
YOLOv8/v7/v6/v5项目合集https://mbd.pub/o/bread/ZZyUmphu
YOLOv8/v5项目完整资源https://mbd.pub/o/bread/ZZubm5hu
YOLOv7项目完整资源https://mbd.pub/o/bread/ZZucm5dy
YOLOv6项目完整资源https://mbd.pub/o/bread/ZZyUlpZx

    在文件夹下的资源显示如下,下面的链接中也给出了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电子元件识别系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的PCB电子元件检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

        该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。


结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


  1. Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎

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

  3. Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎

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

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

posted @ 2024-03-15 17:31  思绪无限  阅读(82)  评论(0编辑  收藏  举报