Skip to content

XHmodel/PCB_defect_detection

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

💡 阅读指南

如果你只想快速了解最终方案,请直接查看 yolo/ 目录;如果你想了解完整的技术探索历程(含Patchcore方案的尝试与放弃),请从 data_generation/ 目录开始。

PCB工业缺陷检测系统

基于YOLOv8的PCB电路板缺陷检测模型,实现6种常见缺陷的精准识别与定位,mAP50达到93.7%

项目亮点

  • 完整工业级闭环:从数据探索、模型选型、训练调优到TensorRT量化部署,全流程独立完成
  • 极致推理性能:完成YOLOv8模型的TensorRT FP16量化加速,推理速度提升8.3倍,从84.5ms/张降至10.2ms/张,满足工业实时检测需求
  • 严谨的技术选型:经过Anomalib无监督异常检测、SeaS生成式数据增强等前沿方案的实验验证,最终选择YOLOv8有监督学习方案,每一步决策都有实验数据支撑
  • 扎实的工程能力:独立解决Python环境配置、API版本兼容、外网模型下载超时、Windows长路径限制等实际工程问题
  • 100%可复现:所有代码、数据路径、训练参数、评估指标均清晰记录,可直接复现全部实验结果

效果展示

训练与验证指标

数据集 mAP50 精确率(P) 召回率(R)
验证集 (valid) 0.928 0.957 0.876
测试集 (test) 0.937 0.969 0.881

各缺陷类别检测精度 (测试集)

缺陷类别 mAP50 评价
missing_hole (漏孔) 0.995 接近满分,几乎完美识别
short (短路) 0.982 接近满分,检出率极高
spurious_copper (杂铜) 0.945 优秀
open_circuit (开路) 0.932 优秀
mouse_bite (鼠咬) 0.896 良好,形态不规则但仍能检出
spur (毛刺) 0.868 良好

检测效果图

检测效果图存放于 yolo/val 目录下,包含各缺陷类别的检测框可视化结果。

项目结构

PCB_defect_detection/

├── README.md # 项目说明文档

├── requirements.txt # 环境依赖清单

├── yolo / # YOLO训练与测试脚本

│ ├── dataset.yaml # 数据集配置文件

│ ├── train_model.py # YOLOv8训练脚本

│ ├── test_yolo.py # 模型测试与评估脚本

│ └── train/ # 训练好的模型权重

│ └── val # 模型预测效果图 (mAP50=0.937)

├── data_generation / # 数据探索与增强模块(Patchcore模型尝试)

│ ├── PCB_USED # 无缺陷pcb板图像

│ ├── results # 训练好的Patchcore模型权重

│ ├── sliced_dataset # 数据增强模块

│ ├── Anomalib.py # 训练模型

│ ├── Anomalib_No2.py # 训练模型NO.2

│ ├── data_enhance.py # 数据增强

│ ├── data_enhance_plus.py # 数据增强NO.2

│ ├── good_test.py # 验证模型

│ ├── slice_good_pcbs.py # 划分10张无缺陷PCB板

│ ├── wide_resnet50_2.racm_in1k # Anomalib的backbone权重,用于特征提取

│ └── course_screenshot # 探索历程截图证据(详见下文)

├── dataset # 原始数据集

│ ├── PCB_datas # 数据集划分

│ ├── test # 检查数据集脚本文件

└── DeepPCB-master # 二值图像素级缺陷数据集

探索历程:在最终方案之前的尝试与验证

本项目并非一步到位。在最终选择YOLOv8之前,我进行了系统的技术探索,每一步失败都为最终成功提供了关键线索。

第一阶段:数据探索与问题发现

核心发现:公开数据集先天不足——没有一张无缺陷PCB板图像。

我首先对下载的公开PCB数据集进行了完整的数据探索:

  • 写脚本遍历train/labels目录下的2772个标注文件,检查每个文件的内容是否为空。
  • 实验结果:所有2772个标注文件均包含缺陷坐标信息,连一个空文件都没有。
  • 结论:该数据集仅适合训练有监督检测模型,无法直接用于无监督异常检测方案。

📸 关键证据截图:test_data.png test_data_NO.2.png test_data_NO.3.png 该三张截图清楚显示:“完好的PCB图像: 0张,有缺陷的PCB图像: 2772张,且不存在txt坐标文件与图像数量不一致的情况,杜绝了该数据集存在无缺陷PCB板图像的可能”。

第二阶段:无监督异常检测方案(Anomalib/Patchcore)

技术选型:为应对“正样本稀缺”的工业痛点,选择Intel Anomalib库中的Patchcore模型进行无监督异常检测,为此我花了大量的时间去GitHub以及kaggle上寻找无缺陷PCB正样本图像,但最终也只是在“北京大学人机交互开放实验室发布的PCB缺陷数据集”中找到了10张可用的无缺陷PCB图像。

实验设计

  1. 将10张真实无缺陷好板按8/2划分:8张用于训练,2张用于验证。
  2. 对训练集切片并进行两轮数据增强(基础增强:翻转/亮度;进阶增强:CutMix/Mosaic/随机裁剪)。
  3. 使用Wide-ResNet50-2作为特征提取器,训练Patchcore模型。

实验结果

验证集类型 验证集数量 正确判定 准确率
独立验证集 (test/good) 35张 0张 0.0%
原始10张好板 (PCB_USED) 10张 0张 0.0%
训练集自身 (good_plus) 945张 3张 0.2%

失败原因分析

  • 样本多样性绝对不足:虽然通过切分和增强将数量扩充至1315张,但其信息源头仅来自8张原始好板,无法覆盖PCB板的全部纹理类型。
  • Patchcore模型特性:该模型为“分布外泛化”能力极弱,会将任何未见过的新纹理都判定为异常。在工厂部署需“搜罗市面上所有PCB类型”才能避免误检,违背了“低成本冷启动”的初衷。
  • 结论:此方案在当前条件下不具备工程可行性,果断放弃。

📸 关键证据截图: test_model_NO.2.png test_model.png

该截图清楚显示:“验证集总数: 35张,正确判定为正常: 0张,准确率: 0.0%,甚至采用训练模型的数据集做缺陷检测,在模型已知答案的情况下,仍然存在严重误检,正确率仅为0.2%”。

补充探索:基于 SeaS 少样本生成模型的数据增强方案

针对无监督方案暴露的无缺陷PCB正样本数量少、采集成本高的核心痛点,我进一步调研了 ICCV 2025 前沿工业生成模型 SeaS(Separation and Sharing Fine-tuning),尝试通过AI生成虚拟样本完成项目冷启动。

SeaS 基于扩散模型架构,主打少样本工业图像生成,理论上仅需 1–5 张真实无缺陷样本,即可批量生成高保真的虚拟PCB图像与对应掩码,非常契合本场景需求。

经过预研评估,该方案存在两处关键落地瓶颈:

  1. 验证条件不足:项目仅收集到10张无缺陷原图,若拆分出部分样本用于模型训练,剩余可用作验证的真实样本数量过少,不具备统计参考价值,无法有效判定生成图像的分布真实性与实际可用性。工业场景下,可靠验证通常需要数十张真实样本作为支撑。
  2. 工程链路复杂、性价比偏低:整套流程需要先后训练生成模型、再训练无监督检测模型,环节多、不确定性强。结合本项目缺陷标注样本储备充足的现状,该方案额外增加了大量开发与验证成本。

综合判断后,基于ROI原则,暂时搁置SeaS生成式增强路线,优先采用数据充足、链路简单、效果可控的有监督方案完成项目落地。后续若遇到真正的少样本工业场景,可重启该方向的探索。

第三阶段:有监督检测方案(YOLOv8)

技术选型:放弃无监督方案,转向有监督学习。利用已有的2772张标注缺陷图(含6种缺陷类别)训练YOLOv8模型。

训练配置

  • 模型:YOLOv8n (预训练权重)
  • 数据:2772张训练图 + 366张验证图
  • 参数epochs=100, batch=6, imgsz=640, optimizer=AdamW
  • 早停机制patience=20 (设置patience=20,训练全程未触发早停,说明模型在验证集上的mAP指标持续提升,100轮训练充分利用了数据,没有过早收敛。)

最终成果

  • mAP50 = 93.7% (测试集),满足工业级检测标准
  • 漏孔和短路缺陷检测精度接近满分 (0.995 / 0.982)
  • 模型已可直接部署使用

技术选型总结

方案 尝试动机 失败/成功原因 结论
Anomalib (Patchcore) 解决正样本稀缺问题 少样本下无法建立可靠正态标准 放弃
SeaS 少样本生成增强 借助 AI 生成扩充无缺陷正样本,支撑无监督方案冷启动 真实样本总量过少,验证集不具备统计可信度;工程链路长、性价比低 放弃
YOLOv8 利用现有标注数据实现缺陷检测 数据充足,模型成熟,效果显著 采用

核心价值:本项目的真正价值不在于“用YOLO跑通了一个公开数据集”,而在于完成了“发现数据问题 → 探索前沿方案 → 实验验证边界 → 转向成熟技术 → 拿到可交付结果”的完整技术决策流程。这种“知道什么时候该用什么工具”的判断力,才是工业界真正需要的。

环境依赖

详见 requirements.txt

核心依赖

  • Python 3.10
  • PyTorch 2.6.0 (CUDA 12.4)
  • ultralytics 8.4.53
  • opencv-python 4.13.0
  • albumentations 1.4.0

快速开始

1. 克隆项目

git clone https://github.com/XHmodel/PCB_defect_detection.git
cd PCB_defect_detection

2. 安装依赖

pip install -r requirements.txt

3. 训练模型

python yolo/train_model.py

4. 训练评估

python yolo/test_model.py

未来展望

本项目已解决了“缺陷检测”和“模型部署”这两个核心问题。后续可扩展方向:

  • 模型轻量化:将模型转换为TensorRT格式,部署到嵌入式设备(已完成,推理速度提升8.3倍)
  • 缺陷分割:利用数据集自带的二值化Mask标注,从“框出缺陷”升级为“精确勾勒缺陷轮廓”
  • 多尺度检测:优化小尺寸缺陷(如针孔、毛刺)的检测精度
  • 边缘设备部署:将模型移植到Jetson Xavier等工业边缘计算板卡

PS:目前已将“未来展望”中“将模型转换为TensorRT格式,部署到嵌入式设备。”实现并落地,以下为落地过程记录:

  • 流程一:使用onnx通用的中间格式,将已训练好的YOLO模型预训练权重文件“best.pt”做文件格式转换,便于后续适配部署流程。可见:yolo/train/weights/imgs/onnx_transition.png onnx_transition.png

  • 流程二:下载英伟达官方提供的tensorRT工具,运行“流程一”转化好的best.onnx,进行模型部署以及推理加速,注意,这个环节非常注重GPU的CUDA以及CUDA工具包的版本,能否适配你下载的tensorRT版本,请在下载英伟达官方tensorRT之前确认 下载版本是否适配你设备的CUDA,否则就会像我一样卸载清除不适配CUDA的版本的tensorRT,然后重新安装:

  • tensorRT_versions2.png

  • tensorRT_versions.png

  • 最终部署效果为:相较于普通GPU做模型推理,目前使用tensorRT做模型部署和加速推理,推理速度提升了8.3倍!效果展示: deploy.png

模型部署性能对比

推理框架 精度 单张图像推理耗时 FPS 加速比
PyTorch 原生 FP32 84.5ms 11.8 1.0x
TensorRT 量化 FP16 10.2ms 98.0 8.3x

许可证

本项目基于MIT许可证开源。

About

PCB电路板缺陷检测系统,基于YOLOv8实现6种缺陷识别,mAP50=93.7%

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages