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

发布于:2024-08-17 ⋅ 阅读:(101) ⋅ 点赞:(0)

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


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下载,选择 PCB_DATASET_VOC.zip 下载。下载数据集的结构如下:

- DataSetPCB
   - Annotations
   - ImageSets

在这里插入图片描述

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


2.2 构建 PCB 缺陷数据集

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

2.2.1 划分训练/测试数据集

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

import os
import random
import argparse

parser = 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

网站公告

今日签到

点亮在社区的每一天
去签到