【YOLO5 项目实战】(3)PCB 缺陷检测

欢迎关注『youcans动手学模型』系列
本专栏内容和资源同步到 GitHub/youcans
【YOLO5 项目实战】(1)YOLO5 环境配置与测试
【YOLO5 项目实战】(2)使用自己的数据集训练目标检测模型
【YOLO5 项目实战】(3)PCB 缺陷检测


【YOLO5 项目实战】(3)PCB 缺陷检测

    • 1. PCB 缺陷检测问题
    • 2. PCB 缺陷数据集
      • 2.1 下载 PCB 瑕疵数据集
      • 2.2 构建 PCB 缺陷数据集
        • 2.2.1 划分训练/测试数据集
        • 2.2.2 标签格式转换
      • 2.3 数据集配置文件
    • 3. 训练 PCB 缺陷模型
      • 3.1 下载 YOLOv5 预训练模型
      • 3.2 修改 YOLOv5 模型配置
      • 3.3 YOLOv5 模型训练
      • 3.4 模型训练结果
    • 4. 模型推理
      • 4.1 修改推理程序 detect.py
      • 4.2 运行推理程序检测 PCB 缺陷
    • 5. 报错处理

1. PCB 缺陷检测问题

印制电路板(简称PCB)是组装电子零件用的基板,PCB板的制造品质直接影响电子产品的可靠性。随着电子组装向更高密度、更小尺寸的PCB混合技术的纵深发展,为减少进入下步工序的缺陷电路板的数量,对PCB检测的自动光学检测(AOI)系统的需求也越来越大。

AOI系统是基于机器视觉技术应用的自动化检测系统,由图像采集单元、光源和主机组成,采用高清相机和高速图像处理软件进行实时检测,提取PCB表面图形、通过图形数字化转换、特征点逻辑判断与图形匹配、线条形态轮廓逻辑比对、缺陷点判定与提取这一技术流程来实现PCB表面图形的缺陷检测。

AOI系统作为基于机器视觉的自动化检测工具,具有高速、高效、高精度的特点,广泛应用于PCB检测。它能尽早发现并纠正缺陷,提高SMT生产工艺的成品率,并能适应高密度PCB组装的检测需求。

传统的 PCB 缺陷检测技术,通常基于数字图像处理技术进行处理。例如:首先读取图片,然后进行开运算和闭运算以预处理图像,接着使用动态阈值分割方法提取缺陷区域,最后展示原图和检测出的缺陷边缘。常用处理算法包括:

  • Blob分析+特征检测
  • Blob分析+特征检测+差分
  • 频域滤波+空间滤波
  • 光度立体法
  • 特征训练(分类器,深度学习)
  • 测量+拟合

近年来随着深度学习技术的发展,基于深度学习的PCB板缺陷检测方法取得了显著的进步。YOLO(You Only Look Once)系列算法,以其快速、准确的特点,在实时缺陷检测领域受到广泛关注。

一种基于 YOLO5 PCB板缺陷检测系统,面临的挑战包括:

  • PCB板缺陷检测的准确性和速度
  • 环境适应性和模型泛化能力
  • 用户交互界面的直观性和功能性
  • 数据处理能力和存储效率
  • 系统的可扩展性和维护性

2. PCB 缺陷数据集

2.1 下载 PCB 瑕疵数据集

北大印刷电路板(PCB)瑕疵数据集
北大智能机器人开放实验室提供的 印刷电路板(PCB)瑕疵数据集,是一个公共合成PCB数据集,包含1386张图像,具有6种缺陷(漏孔、鼠咬、开路、短路、杂散、杂铜),用于图像检测、分类和配准任务。

  • 下载地址:北京大学智能机器人开放实验室
  • 百度AI stduio下载链接:https://aistudio.baidu.com/datasetdetail/272346,下载内容包括JSON和VOC格式版

使用百度AI stduio下载,选择 PCB_DATASET_VOC.zip 下载。下载数据集的结构如下:

- DataSetPCB- Annotations- ImageSets

在这里插入图片描述

DeepPCB 瑕疵数据集:
一个数据集包含1500个图像对,每个图像对由一个无缺陷的模板图像和一个对齐的测试图像组成,带有注释,包括6种最常见的PCB缺陷的位置:开路、短路、鼠咬、毛刺、针孔和假铜。每张 640 x 640图像中大约有3到12个缺陷。推荐将1000张图像作为训练集,将剩余图像作为测试集。

  • 下载地址:DeepPCB数据集
  • Gitee 下载链接:https://gitee.com/dengzhiguang/DeepPCB
  • 参考文献:Online PCB Defect Detector On A New PCB Defect Dataset

2.2 构建 PCB 缺陷数据集

下载的 PCB 瑕疵数据集与 YOLOv5 的格式不一致,本文以北大 PCB 瑕疵数据集为例,构建 YOLOv5 数据集。

2.2.1 划分训练/测试数据集

把原始数据集划分为训练集、测试集和验证集,处理代码 split_train_val.py如下:

import os
import random
import argparseparser = argparse.ArgumentParser()
# 数据集的标注文件夹的路径,默认 '\Annotations'
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
# 数据集的图像文件夹的路径,默认 '\ImageSets'
parser.add_argument('--txt_path', default='ImageSets', type=str, help='output txt label path')
opt = parser.parse_args()xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
# xmlfilepath = '\Annotations'
# txtsavepath = '\Images'total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):os.makedirs(txtsavepath)trainval_percent = 0.9
train_percent = 0.8
num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')for i in list_index:name = total_xml[i][:-4] + '\n'print(name)if i in trainval:file_trainval.write(name)if i in train:file_train.write(name)else:file_val.write(name)else:file_test.write(name)file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

2.2.2 标签格式转换

(1)该 PCB 瑕疵数据集 采用 VOC 的标签格式,保存在 Annotations 子目录中。
以 01_missing_hole_01.xml 为例,内容如下:

<annotation><folder>Missing_hole</folder><filename>01_missing_hole_01.jpg</filename><path>/home/weapon/Desktop/PCB_DATASET/Missing_hole/01_missing_hole_01.jpg</path><source><database>Unknown</database></source><size><width>3034</width><height>1586</height><depth>3</depth></size><segmented>0</segmented><object><name>missing_hole</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>2459</xmin><ymin>1274</ymin><xmax>2530</xmax><ymax>1329</ymax></bndbox></object><object><name>missing_hole</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>1613</xmin><ymin>334</ymin><xmax>1679

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400419.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-cli 中 配置 productionSourceMap 为 false 失效?

背景 最近 发现 vuecli 构建的 项目中配置的 productionSourceMap 为 false 后 &#xff0c;生产代码 还是能够看到 sourceMap 文件 。 原因 生效前提条件 得设置 NODE_ENV 为 production 才会生效&#xff01; 解决 直接修改生产环境的配置 NODE_ENV 为 production 直接覆…

融资3亿美元——月之暗面:AI大模型领域的新星

月之暗面&#xff0c;这个名字在AI领域引起了不小的震动。作为国内大模型创业企业的佼佼者&#xff0c;月之暗面以其独特的技术优势和商业模式&#xff0c;迅速在激烈的市场竞争中崭露头角。同时以其出色的长文本处理能力和创新的商业模式吸引了众多投资者的目光。 优牛企讯-企…

基于DETR模型实现交通标志检测

交通标志检测在自动驾驶和交通监控中是一个重要的问题。目标检测技术极大地促进了这一过程的自动化。本文实现基于DETR目标检测模型识别交通标志。 Tiny LISA交通标志检测数据集 本文数据集使用Kaggle上提供的Tiny LISA交通标志检测数据集(https://www.kaggle.com/datasets/mm…

手把手教你CNVD漏洞挖掘 + 资产收集

0x1 前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖&#xff0c;但是一般要挖证书的话&#xff0c;还是需要花时间的&#xff0c;其中信息收集&#xff0c;公司资产确定等操作需要花费一定时间的。下面就记录下我之前跟一个师傅学习的一个垂直越权成功的CNVD漏洞通杀&#…

MySql 5.7.1 分区的实践

在性能优化中&#xff0c;Mysql 进行分区&#xff0c;能有效提高查询效率&#xff0c;因此开始百度了起来。但是结果总不是那么一番风顺的。如今使用 uuid 作为主键的情况已是主流&#xff0c;因此在给表增加分区时&#xff0c;出现了如下错误&#xff1a; 错误&#xff1a; A …

AI在医学领域:联邦学习 (FL) 在肿瘤学的应用综述

关键词&#xff1a;联邦学习 (Federated Learning, FL)、机器学习 (Machine Learning, ML)、肿瘤学 (Oncology)、数据隐私 (Data Privacy)、精准医疗 (Precision Medicine)、多模态 (Multi-modal) 肿瘤学正在经历快速的变革&#xff0c;这得益于机器学习&#xff08;ML&#xf…

奥德彪视频素材去哪里找?视频素材网站分享

今天我们来聊一聊一个非常实用的话题——视频素材网站推荐&#xff0c;尤其是奥德彪视频素材。这个名词可能对你来说有些陌生&#xff0c;但别担心&#xff0c;跟着我一起探索&#xff0c;你会发现这是一个充满创意与乐趣的旅程。 蛙学网 首先要介绍的是蛙学网。这是一个视频素…

【传知代码】医疗AI:轻量级图像分割新突破(论文复现)

在医学图像领域&#xff0c;精准的图像分割技术一直是提高诊断效率和准确性的关键&#xff0c;然而传统的图像分割方法常常受到计算资源和处理速度的限制&#xff0c;尤其在资源紧张的医疗环境中更是如此。随着人工智能技术的飞速发展&#xff0c;我们迎来了一个激动人心的新时…

PAT--1101.B是A的多少倍

题目描述 算法分析 把数字转为字符串处理&#xff0c;会简化问题 完整代码 #include<bits/stdc.h> //万能头文件 //#include<iostream> //#include<string> //#include <iomanip> // 包含 std::fixed 和 std::setprecision using namespace std;…

PHP汽车保养维修信息管理系统小程序源码

&#x1f697;爱车守护神器&#xff01;揭秘“汽车保养维修信息管理系统”全攻略&#x1f50d; &#x1f525;【开篇揭秘&#xff1a;为何你需要它&#xff1f;】&#x1f525; 在这个快节奏的时代&#xff0c;爱车不仅是代步工具&#xff0c;更是生活品质的象征。但你是否曾…

JUC-变量的线程安全

成员变量和静态变量是否线程安全&#xff1f; 如果它们没有共享&#xff0c;则线程安全&#xff0c;即没有被外部访问。 如果它们被共享了&#xff0c;根据它们的状态是否能够改变&#xff0c;又分两种情况 如果只有读操作&#xff0c;则线程安全 如果有读写操作&#xff0c;…

精彩回顾 | 风丘科技亮相2024名古屋汽车工程博览会

2024年7月17日-19日&#xff0c;风丘科技联合德国IPETRONIK亮相日本名古屋汽车工程博览会。该展会面向汽车行业不同应用场景&#xff0c;包括新的eAxle、FCEV、ADAS、测试测量系统和ECU测试等相关技术&#xff0c;是一个专为活跃在汽车行业前线的工程师和研究人员举办的汽车技术…

Leetcode JAVA刷刷站(11)盛最多水的容器

一、题目概述 二、思路方向 这个问题是经典的“盛最多水的容器”问题&#xff0c;通常使用双指针法来解决。基本思路是&#xff0c;我们初始化两个指针&#xff0c;一个指向数组的起始位置&#xff0c;另一个指向数组的末尾位置。然后&#xff0c;我们计算当前两个指针所指向…

学习笔记第二十四天

1.exec族函数的区别 int exec l(const char *path, const char *arg, ...); int exec l p(const char *file, const char *arg, ...); int exec l e(const char *path, const char *arg,..., char * const envp[]); int exec v(const char *path, char *const argv[]); …

硬件面试经典 100 题(31~40 题)

31、多级放大电路的级间耦合方式有哪几种&#xff1f;哪种耦合方式的电路零点偏移最严重&#xff1f;哪种耦合方式可以实现阻抗变换&#xff1f; 有三种耦合方式&#xff1a;直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重&#xff0c;变压器耦合的电路可以实现…

广告资料库是什么?如何正确使用Facebook广告资料库?一文解决你的烦恼!

什么是广告资料库 广告营销领域&#xff0c;创意和策略的更新速度极快。为了跟上这种节奏&#xff0c;广告资料库应运而生&#xff0c;成为广告人和营销专家的重要工具。广告资料库是一个集中存储和管理广告素材、创意案例、市场数据和用户反馈的平台。它不仅帮助用户获得灵感…

掌握高可用核心:Keepalived 铸就坚不可摧的集群防线

目录 一.初识keepalived 二.VRRP工作模式 1.三种状态 2.选举机制 三.Keepalived 架构 四. Keepalived环境准备 五.KeepAlived 配置说明 1.配置文件组成部分 2.配置语法说明&#xff1a;全局配置 3.配置虚拟路由器 4.启用keepalived日志功能 5.实现独立子配置文件 六…

Adobe PhotoShop - 制图操作

1. 排布照片 菜单 - 视图 - 对齐&#xff1a;打开后图层将会根据鼠标的移动智能对齐 菜单 - 视图 - 标尺&#xff1a;打开后在页面出现横纵标尺&#xff0c;方便图层的对齐与排列 2. 自动生成全景照 在日常处理中&#xff0c;我们常常想要将几张图片进行拼接获得一张全景图&…

SpringBoot快速入门(手动创建)

目录 案例&#xff1a;需求 步骤 1 创建Maven项目 2 导入SpringBoot起步依赖 3 定义Controller 4 编写引导类 案例&#xff1a;需求 搭建简单的SpringBoot工程&#xff0c;创建hello的类定义h1的方法&#xff0c;返回Hello SpringBoot! 步骤 1 创建Maven项目 大家&…

【多线程-从零开始-柒】单例模式,饿汉和懒汉模式

单例模式&#xff1a;是一种设计模式 设计模式&#xff0c;类似于“棋谱”&#xff0c;就是固定套路&#xff0c;针对一些特定的场景&#xff0c;给出一些比较好的解决方法只要按照设计模式来写代码&#xff0c;就可以保证代码不会太差&#xff0c;保证代码的下限 设计模式 设…