欢迎关注『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