如果你只想快速了解最终方案,请直接查看
yolo/目录;如果你想了解完整的技术探索历程(含Patchcore方案的尝试与放弃),请从data_generation/目录开始。
基于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个标注文件均包含缺陷坐标信息,连一个空文件都没有。
- 结论:该数据集仅适合训练有监督检测模型,无法直接用于无监督异常检测方案。
📸 关键证据截图:
![]()
![]()
该三张截图清楚显示:“完好的PCB图像: 0张,有缺陷的PCB图像: 2772张,且不存在txt坐标文件与图像数量不一致的情况,杜绝了该数据集存在无缺陷PCB板图像的可能”。
技术选型:为应对“正样本稀缺”的工业痛点,选择Intel Anomalib库中的Patchcore模型进行无监督异常检测,为此我花了大量的时间去GitHub以及kaggle上寻找无缺陷PCB正样本图像,但最终也只是在“北京大学人机交互开放实验室发布的PCB缺陷数据集”中找到了10张可用的无缺陷PCB图像。
实验设计:
- 将10张真实无缺陷好板按8/2划分:8张用于训练,2张用于验证。
- 对训练集切片并进行两轮数据增强(基础增强:翻转/亮度;进阶增强:CutMix/Mosaic/随机裁剪)。
- 使用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类型”才能避免误检,违背了“低成本冷启动”的初衷。
- 结论:此方案在当前条件下不具备工程可行性,果断放弃。
该截图清楚显示:“验证集总数: 35张,正确判定为正常: 0张,准确率: 0.0%,甚至采用训练模型的数据集做缺陷检测,在模型已知答案的情况下,仍然存在严重误检,正确率仅为0.2%”。
针对无监督方案暴露的无缺陷PCB正样本数量少、采集成本高的核心痛点,我进一步调研了 ICCV 2025 前沿工业生成模型 SeaS(Separation and Sharing Fine-tuning),尝试通过AI生成虚拟样本完成项目冷启动。
SeaS 基于扩散模型架构,主打少样本工业图像生成,理论上仅需 1–5 张真实无缺陷样本,即可批量生成高保真的虚拟PCB图像与对应掩码,非常契合本场景需求。
经过预研评估,该方案存在两处关键落地瓶颈:
- 验证条件不足:项目仅收集到10张无缺陷原图,若拆分出部分样本用于模型训练,剩余可用作验证的真实样本数量过少,不具备统计参考价值,无法有效判定生成图像的分布真实性与实际可用性。工业场景下,可靠验证通常需要数十张真实样本作为支撑。
- 工程链路复杂、性价比偏低:整套流程需要先后训练生成模型、再训练无监督检测模型,环节多、不确定性强。结合本项目缺陷标注样本储备充足的现状,该方案额外增加了大量开发与验证成本。
综合判断后,基于ROI原则,暂时搁置SeaS生成式增强路线,优先采用数据充足、链路简单、效果可控的有监督方案完成项目落地。后续若遇到真正的少样本工业场景,可重启该方向的探索。
技术选型:放弃无监督方案,转向有监督学习。利用已有的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跑通了一个公开数据集”,而在于完成了“发现数据问题 → 探索前沿方案 → 实验验证边界 → 转向成熟技术 → 拿到可交付结果”的完整技术决策流程。这种“知道什么时候该用什么工具”的判断力,才是工业界真正需要的。
核心依赖:
- Python 3.10
- PyTorch 2.6.0 (CUDA 12.4)
- ultralytics 8.4.53
- opencv-python 4.13.0
- albumentations 1.4.0
git clone https://github.com/XHmodel/PCB_defect_detection.git
cd PCB_defect_detectionpip install -r requirements.txtpython yolo/train_model.pypython yolo/test_model.py本项目已解决了“缺陷检测”和“模型部署”这两个核心问题。后续可扩展方向:
- ✅
模型轻量化:将模型转换为TensorRT格式,部署到嵌入式设备(已完成,推理速度提升8.3倍) - 缺陷分割:利用数据集自带的二值化Mask标注,从“框出缺陷”升级为“精确勾勒缺陷轮廓”
- 多尺度检测:优化小尺寸缺陷(如针孔、毛刺)的检测精度
- 边缘设备部署:将模型移植到Jetson Xavier等工业边缘计算板卡
-
流程一:使用onnx通用的中间格式,将已训练好的YOLO模型预训练权重文件“best.pt”做文件格式转换,便于后续适配部署流程。可见:yolo/train/weights/imgs/onnx_transition.png

-
流程二:下载英伟达官方提供的tensorRT工具,运行“流程一”转化好的best.onnx,进行模型部署以及推理加速,注意,这个环节非常注重GPU的CUDA以及CUDA工具包的版本,能否适配你下载的tensorRT版本,请在下载英伟达官方tensorRT之前确认 下载版本是否适配你设备的CUDA,否则就会像我一样卸载清除不适配CUDA的版本的tensorRT,然后重新安装:
-
最终部署效果为:相较于普通GPU做模型推理,目前使用tensorRT做模型部署和加速推理,推理速度提升了8.3倍!效果展示:

| 推理框架 | 精度 | 单张图像推理耗时 | FPS | 加速比 |
|---|---|---|---|---|
| PyTorch 原生 | FP32 | 84.5ms | 11.8 | 1.0x |
| TensorRT 量化 | FP16 | 10.2ms | 98.0 | 8.3x |
本项目基于MIT许可证开源。






