基于深度学习的智能PCB板缺陷检测系统(Python+清新界面+数据集)

摘要:智能PCB板缺陷检测系统用于智能检测工业印刷电路板(PCB)常见缺陷,自动化标注、记录和保存缺陷位置和类型,以辅助电路板的质检。本文详细介绍智能PCB板缺陷检测系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面和训练数据集。在界面中可以选择各种图片、视频进行检测识别;可对图像中存在的多种缺陷进行识别分类,检测速度快、识别精度高。博文提供了完整的Python代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。本博文目录如下:

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

完整代码下载:https://mbd.pub/o/bread/ZJaXlZhw

参考视频演示:https://www.bilibili.com/video/av310992529/

离线依赖库下载https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取码:oy4n )


前言

        随着社会的发展和工业产业的快速发展,工业电子产业随之快速发展。其中PCB板是我们经常用到,但是PCB电路板经常会有一定的缺陷率。PCB电路板常见的缺陷检测技术有自动光学检测技术、计算机视觉检测技术等。工厂车间操作人员需借助电子显微镜或放大镜,根据现场作业操作人员主观经验及视觉测量来确定PCB的合格率,这种传统的检测方式准确率低,缺陷检测效率低,数据集合分析难度大。PCB板缺陷检测机器视觉识别系统应运而生。

        基于深度学习的智能PCB板缺陷检测系统是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的各种缺陷,在许多领域中都有广泛的应用。本系统采用登录注册进行用户管理,对于图片、视频和摄像头捕获的实时画面,系统可检测PCB电路板,系统支持结果记录、展示和保存,每次检测的结果记录在表格中。对此这里给出博主设计的界面,同款的简约风,功能也可以满足图片、视频和摄像头的识别检测,希望大家可以喜欢,初始界面如下图:

        检测类别时的界面截图(点击图片可放大)如下图,可识别画面中存在的多个类别,也可开启摄像头或视频检测:

         详细的功能演示效果参见博主的B站视频或下一节的动图演示,觉得不错的朋友敬请点赞、关注加收藏!系统UI界面的设计工作量较大,界面美化更需仔细雕琢,大家有任何建议或意见和可在下方评论交流。


1. 效果演示

        日常使用的软件颜值非常重要,首先我们还是通过动图看一下识别的效果,系统主要实现的功能是对图片、视频和摄像头画面中的线路进行识别,识别的结果可视化显示在界面和图像中,另外提供多个缺陷处的显示选择功能,演示效果如下。本系统界面上显示的所有文字、图标、图片均可自行修改,修改方式可见上面的视频介绍。

(一)系统介绍

        智能PCB板缺陷检测系统主要用于印刷电路板(PCB)缺陷的智能检测,利用相机采集的PCB图像,基于深度学习技术识别包括漏孔、鼠牙洞、毛刺等6种常见的缺陷类型,输出缺陷处的标记框和对应类别,以辅助自动化PCB质量检测;软件提供登录注册功能,可进行用户管理;软件能有效识别相机采集的图片、视频等文件形式,检测PCB表面缺陷情况,并记录识别结果在界面表格中方便查看;可开启摄像头实时监测和统计流水线上的PCB产品以检测其缺陷,支持结果记录、展示和保存。

(二)主要特点

         (1)YOLOv5算法实现,模型一键切换更新;
         (2)摄像头实时检测PCB,展示、记录和保存缺陷情况;
         (3)检测图片、视频等图像中的PCB缺陷;
         (4)支持用户登录、注册,检测结果可视化功能;
         (5)提供数据集和训练代码可重新训练;

(三)选择图片识别

        系统允许选择图片文件进行识别,点击图片选择按钮图标选择图片后,显示所有识别的结果,可通过下拉选框查看单个结果,以便具体判断某一特定目标。本功能的界面展示如下图所示:

(四)视频识别效果展示

        很多时候我们需要识别视频中PCB板,这里设计了视频选择功能。点击视频按钮可选择待检测的视频,系统会自动解析视频逐帧识别多个PCB板的缺陷,并将结果记录在下方表格中,效果如下图所示:

(五)摄像头检测效果展示
        在真实场景中,我们往往利用摄像头获取流水线的实时画面,对PCB板进行实时识别,因此本文考虑到此项功能。如下图所示,点击摄像头按钮后系统进入准备状态,系统显示实时画面并开始检测画面中的PCB板,识别结果展示如下图:


2. 基于YOLOv5的缺陷检测

(一)PCB检查方法

        电气测试通常测量测试点之间的阻抗特性以检测所有连续性(即开路和短路)。视觉测试通过视觉检查电子元件的特性和印刷电路的特性来发现缺陷。在寻找短路或开路缺陷时,电气测试更加准确。视觉测试可以更容易地检测导体之间的缺陷,包括漏孔、开路、毛刺、鼠牙洞等。目视检查通常在生产过程的早期进行。尝试发现缺陷并修复它们,以确保最高的产品良率。

(1)人工目检PCB板

        电气测试通常测量测试点之间的阻抗特性以检测所有连续性(即开路和短路)。视觉测试通过视觉检查电子元件的特性和印刷电路的特性来发现缺陷。在寻找短路或开路缺陷时,电气测试更加准确。视觉测试可以更容易地检测导体之间的错误间隙。目视检查通常在生产过程的早期进行。尝试发现缺陷并修复它们,以确保最高的产品良率。

(2)PCB板子在线测试

        通过电气性能测试识别制造缺陷并测试模拟、数字和混合信号组件电路板检测,以确保它们符合规范。有几种测试方法,例如针床测试仪和飞针测试仪。主要优点是每块板的测试成本低、强大的数字和功能测试能力、快速彻底的短开放测试、可编程固件、高缺陷覆盖率和易于编程。主要缺点是需要测试夹具、编程和调试时间、夹具制造成本高、使用困难。

(3)深度学习检测

        PCB板缺陷检测识别系统通过YoloV5网络深度学习技术,对现场PCB是否存在缺陷部分进行实时分析检测,当检测到PCB本身存在缺陷的时候,立即抓拍存档告警方便后期针对性的进行调整改。Yolo系列算法是一类典型的one-stage目标检测算法,其利用anchor box将分类与目标定位的回归问题结合起来,从而做到了高效、灵活和泛化性能好,所以在工业界也十分受欢迎,接下来我们介绍本系统的Yolo系列算法。

(二)基于YOLOv5的缺陷识别系统

         YOLOv5的整体结构如下图所示,和之前版本的Yolo类似,整个YoloV5可以依然可以分为三个部分,分别是Backbone,FPN以及Yolo Head。

         Backbone可以被称作YoloV5的主干特征提取网络,根据它的结构以及之前Yolo主干的叫法,我一般叫它CSPDarknet,输入的图片首先会在CSPDarknet里面进行特征提取,提取到的特征可以被称作特征层,是输入图片的特征集合。在主干部分,我们获取了三个特征层进行下一步网络的构建,这三个特征层我称它为有效特征层。

        FPN可以被称作YoloV5的加强特征提取网络,在主干部分获得的三个有效特征层会在这一部分进行特征融合,特征融合的目的是结合不同尺度的特征信息。在FPN部分,已经获得的有效特征层被用于继续提取特征。在YoloV5里依然使用到了Panet的结构,我们不仅会对特征进行上采样实现特征融合,还会对特征再次进行下采样实现特征融合。

        Yolo Head是YoloV5的分类器与回归器,通过CSPDarknet和FPN,我们已经可以获得三个加强过的有效特征层。每一个特征层都有宽、高和通道数,此时我们可以将特征图看作一个又一个特征点的集合,每一个特征点都有通道数个特征。Yolo Head实际上所做的工作就是对特征点进行判断,判断特征点是否有物体与其对应。与以前版本的Yolo一样,YoloV5所用的解耦头是一起的,也就是分类和回归在一个1X1卷积里实现。

        因此,整个YoloV5网络所作的工作就是 特征提取-特征加强-预测特征点对应的物体情况。整个项目的实现步骤如下图所示,首先需要配置好Python环境依赖,利用YOLOv5加载训练数据集进行训练,得到pt模型后用于UI界面中的PCB板缺陷检测。

3. PCB板缺陷检测识别

        PCB版缺陷检测数据集的部分截图如下所示,其中训练集6975张图片,验证集1989张图片、测试集包括997张图片,共计9961张图片构成。该数据集涵盖漏孔、鼠牙洞、开路、短路、毛刺、杂铜等类别,所有缺陷处均添加标记框。

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

        数据集中各类标签、图片的情况如下图所示,从柱状图的统计结果可以看出各类别样本数目接近,发布较均匀,适合用来进行训练模型。

        然后我们可以执行train.py程序进行训练。在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。而YOLOv5训练时主要包含三个方面的损失:矩形框损失(box_loss)、置信度损失(obj_loss)和分类损失(cls_loss),在训练结束后,我们也可以在logs目录下找到生成对若干训练过程统计图。下图为博主训练PCB板类识别的模型训练曲线图。

        一般我们会接触到两个指标,分别是召回率recall和精度precision,两个指标p和r都是简单地从一个角度来判断模型的好坏,均是介于0到1之间的数值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,为了综合评价目标检测的性能,一般采用均值平均密度map来进一步评估模型的好坏。我们通过设定不同的置信度的阈值,可以得到在模型在不同的阈值下所计算出的p值和r值,一般情况下,p值和r值是负相关的,绘制出来可以得到如下图所示的曲线,其中曲线的面积我们称AP,目标检测模型中每种目标可计算出一个AP值,对所有的AP值求平均则可以得到模型的mAP值。

        以PR-curve为例,可以看到我们的模型在验证集上的均值平均准确率为0.862。

        在训练完成后得到最佳模型,接下来我们将帧图像输入到这个网络进行预测,从而得到预测结果,预测方法(predict.py)部分的代码如下所示:

parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='./weights/pcb-best.pt',
                    help='model.pt path(s)')  # 模型路径仅支持.pt文件
parser.add_argument('--img-size', type=int, default=480, help='inference size (pixels)')  # 检测图像大小,仅支持480
parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')  # 置信度阈值
parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')  # NMS阈值
# 选中运行机器的GPU或者cpu,有GPU则GPU,没有则cpu,若想仅使用cpu,可以填cpu即可
parser.add_argument('--device', default='',
                    help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--save-dir', type=str, default='inference', help='directory to save results')  # 文件保存路径
parser.add_argument('--classes', nargs='+', type=int,
                    help='filter by class: --class 0, or --class 0 2 3')  # 分开类别
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')  # 使用NMS
opt = parser.parse_args()  # opt局部变量,重要
out, weight, imgsz = opt.save_dir, opt.weights, opt.img_size  # 得到文件保存路径,文件权重路径,图像尺寸
device = select_device(opt.device)  # 检验计算单元,gpu还是cpu
half = device.type != 'cpu'  # 如果使用gpu则进行半精度推理
 
model = attempt_load(weight, map_location=device)  # 读取模型
imgsz = check_img_size(imgsz, s=model.stride.max())  # 检查图像尺寸
if half:  # 如果是半精度推理
    model.half()  # 转换模型的格式
names = model.module.names if hasattr(model, 'module') else model.names  # 得到模型训练的类别名
 
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(names))]  # 给每个类别一个颜色
img = torch.zeros((1, 3, imgsz, imgsz), device=device)  # 创建一个图像进行预推理
_ = model(img.half() if half else img) if device.type != 'cpu' else None  # 预推理

        执行得到的结果如下图所示,图中PCB板缺陷的种类和置信度值都标注出来了,预测速度较快。基于此模型我们可以将其设计成一个带有界面的系统,在界面上选择图片、视频或摄像头然后调用模型进行检测。

        博主对整个系统进行了详细测试,最终开发出一版流畅得到清新界面,就是博文演示部分的展示,完整的UI界面、测试图片视频、代码文件,以及Python离线依赖包(方便安装运行,也可自行配置环境),均已打包上传,感兴趣的朋友可以通过下载链接获取。


下载链接

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

    在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,离线依赖的使用详细演示也可见本人B站视频:win11从头安装软件和配置环境运行深度学习项目Win10中使用pycharm和anaconda进行python环境配置教程

注意:该代码采用Pycharm+Python3.8开发,经过测试能成功运行,运行界面的主程序为runMain.py和LoginUI.py,测试图片脚本可运行testPicture.py,测试视频脚本可运行testVideo.py。为确保程序顺利运行,请按照requirements.txt配置Python依赖包的版本。Python版本:3.8,请勿使用其他版本,详见requirements.txt文件;

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

完整代码下载:https://mbd.pub/o/bread/ZJaXlZhw

参考视频演示:https://www.bilibili.com/video/av310992529/

离线依赖库下载https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取码:oy4n )


结束语

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

posted @ 2023-03-21 23:57  思绪无限  阅读(2345)  评论(0编辑  收藏  举报