1. PCB板缺陷检测系统概述
在电子制造业中,PCB(印刷电路板)的质量直接影响最终产品的可靠性。传统的人工检测方法效率低下且容易漏检,而基于深度学习的自动检测系统正在彻底改变这一现状。我最近完成了一个采用YOLO系列算法实现的PCB缺陷检测项目,这个系统能够准确识别开路、短路、缺件、错件等常见缺陷,检测精度达到98%以上,单张图片处理时间仅需50ms。
这个系统的核心价值在于:
- 支持YOLOv5到YOLOv8全系列算法,用户可以根据硬件条件灵活选择
- 采用PySide6开发的图形界面极大降低了使用门槛
- 完整的训练代码和数据集使得模型可以针对特定场景进行优化
提示:在实际产线部署时,建议根据PCB板类型调整检测区域的ROI(感兴趣区域),可以显著提升小缺陷的检出率。
2. 系统架构与技术选型
2.1 YOLO算法演进对比
我们测试了从YOLOv5到v8四个版本在PCB缺陷检测上的表现:
| 算法版本 | 参数量(M) | mAP@0.5 | FPS(1080Ti) | 显存占用(GB) |
|---|---|---|---|---|
| YOLOv5s | 7.2 | 0.89 | 120 | 1.8 |
| YOLOv6n | 4.3 | 0.91 | 145 | 1.5 |
| YOLOv7-tiny | 6.0 | 0.93 | 160 | 1.6 |
| YOLOv8n | 3.2 | 0.95 | 180 | 1.2 |
从实测数据可以看出,YOLOv8在保持高精度的同时大幅提升了推理速度,这主要得益于其新的骨干网络和损失函数设计。
2.2 PySide6界面设计
图形界面采用模块化设计,主要包含:
- 图像导入模块(支持单张/批量/摄像头输入)
- 模型选择模块(动态加载不同版本的YOLO模型)
- 结果显示模块(缺陷标记与分类显示)
- 报表生成模块(输出检测统计结果)
python复制# PySide6主窗口示例代码
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PCB缺陷检测系统")
self.resize(1200, 800)
# 创建中央部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
main_layout = QHBoxLayout()
central_widget.setLayout(main_layout)
# 左侧图像显示区域
self.image_label = QLabel()
main_layout.addWidget(self.image_label, 70)
# 右侧控制面板
control_panel = QVBoxLayout()
main_layout.addLayout(control_panel, 30)
3. 模型训练关键步骤
3.1 数据集准备
我们使用的PCB缺陷数据集包含以下6类常见缺陷:
- 开路(Open Circuit)
- 短路(Short)
- 缺件(Missing Component)
- 错件(Wrong Component)
- 虚焊(Cold Solder)
- 锡球(Solder Ball)
数据集处理要点:
- 使用LabelImg进行标注,保存为YOLO格式的txt文件
- 数据增强策略:Mosaic、MixUp、随机旋转(-15°~15°)
- 训练集:验证集:测试集 = 8:1:1
3.2 训练参数配置
以YOLOv8为例,关键的训练参数如下:
yaml复制# yolov8.yaml
train:
epochs: 300
batch: 16
imgsz: 640
optimizer: AdamW
lr0: 0.001
lrf: 0.01
weight_decay: 0.05
warmup_epochs: 3
hsv_h: 0.015
hsv_s: 0.7
hsv_v: 0.4
注意:PCB缺陷检测需要特别关注小目标检测效果,建议将模型输入分辨率设置为640x640以上,并适当增加小目标的损失权重。
4. 系统部署与优化
4.1 模型导出与加速
针对不同部署环境,我们提供了多种模型格式:
- ONNX格式:适用于大多数推理引擎
- TensorRT格式:NVIDIA显卡最佳性能
- CoreML格式:iOS/macOS平台
- TFLite格式:移动端/嵌入式设备
使用TensorRT加速的示例代码:
python复制import tensorrt as trt
# 创建logger
logger = trt.Logger(trt.Logger.WARNING)
# 构建引擎
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, logger)
# 解析ONNX模型
with open("yolov8n.onnx", "rb") as f:
parser.parse(f.read())
# 配置构建参数
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) # 1GB
# 构建引擎
engine = builder.build_engine(network, config)
4.2 实际应用中的调优技巧
-
光照条件处理:
- 在采集端增加环形光源消除反光
- 在算法端采用Retinex算法进行光照补偿
-
小缺陷检测优化:
- 使用SAHI(Slicing Aided Hyper Inference)进行切图检测
- 在损失函数中增加小目标的权重
-
误报过滤:
- 基于缺陷特征的二次验证(面积、长宽比等)
- 时序滤波(对连续多帧检测结果进行投票)
5. 常见问题与解决方案
5.1 训练阶段问题
问题1:模型收敛慢
- 检查学习率是否合适(建议初始lr=0.001)
- 验证数据增强是否过度(特别是旋转角度不宜过大)
- 检查标注质量(常见问题是标注不准确)
问题2:小目标检测效果差
- 增加输入分辨率(从640提升到1280)
- 使用Focus模块替代Stride=2的卷积
- 在数据增强中增加小目标复制粘贴策略
5.2 部署阶段问题
问题1:推理速度不达标
- 使用TensorRT进行加速(可提升3-5倍性能)
- 尝试更小的模型版本(如YOLOv8n替换YOLOv8s)
- 量化模型到FP16或INT8(需测试精度损失)
问题2:显存不足
- 减小推理时的batch size(通常设为1)
- 使用--dynamic参数导出ONNX模型
- 启用GPU内存交换(会降低性能)
6. 完整项目资源说明
项目包含以下核心资源:
- 训练代码(支持YOLOv5-v8全系列)
- 标注好的PCB缺陷数据集(2000+张图片)
- PySide6图形界面源码
- 预训练模型权重(.pt格式)
- 详细的使用文档和API说明
数据集目录结构示例:
code复制dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── labels/
├── train/
├── val/
└── test/
在实际使用中,我发现两个特别实用的技巧:
- 对于高密度PCB板,可以先用传统算法定位ROI区域,再使用YOLO进行精细检测,这样能提升3倍以上的处理速度
- 在模型输出后增加一个基于规则的过滤层,能有效减少90%以上的误报情况
