首页 / 资讯中心 / 文章详情

基于YOLO的PCB缺陷检测实战:数据、训练与部署全链路

基于YOLO的PCB缺陷检测实战:数据、训练与部署全链路 ★ FEATURED ARTICLE
如果你去贴片厂或者插件车间的质检岗位待过大概率见过这样的场景质检员在放大镜下快速翻动板卡靠眼睛和经验去挑少锡、桥连、偏位连续盯上几个小时之后人就会疲劳漏检率自然跟着往上爬。我过去帮某电子制造企业搭建PCB板缺陷检测系统时也走了一段从传统图像算法到深度学习算法的弯路最后选定YOLO系列作为核心检测框架在产线上跑通了“相机触发—模型推理—缺陷坐标输出”全链路。这篇文章不吹概念只讲我在实际项目中怎么选型、怎么准备数据、怎么训练以及部署时反复踩过的那几个坑。1. 传统视觉方案为什么扛不住PCB质检这份活很多刚接触机器视觉的人会问PCB缺陷检测不是早就有人用CCD加模板匹配做过了吗为什么非要上YOLO这个问题我当初也纠结过甚至先带着传统方案投入了快两个月最后才明白不是传统算法不行而是PCB这种产品的特性天然对传统方案不友好。1.1 常见PCB缺陷类别与“难在哪”PCB缺陷种类很多但产线上真正高频出现的其实就那么几类缺陷类别典型表现为什么难检测桥连相邻焊盘之间多出焊锡连接细小与焊盘/丝印对比度低少锡焊点上锡量不足、露铜边缘模糊和正常焊点差异小缺件元件未贴装或掉落依赖板卡预期的强先验偏位元件偏移焊盘中心形态变化多样没法用固定规则描述锡珠焊盘周围散落的小锡球目标极小常常只有几个像素异物夹在引脚间的锡丝、毛刺形状不规则背景纹理复杂这里头最让人头疼的是“少锡”和“桥连”。少锡不是完全没有而是“少了那么一点”人的眼睛看都费劲传统图像处理里的灰度阈值、面积筛选、边缘检测在绿色阻焊层和密集丝印的干扰下很难找到稳定的判别空间。锡珠则是典型的“小目标灾难”在一个500万像素的视野里锡珠可能只占十几个像素传统算法处理起来不是漏检就是把焊盘上的高光误判成锡珠。1.2 做模板匹配和形态学分析后的教训传统方案的经典做法是“先配准再差分”找一块标准板拍一张图存成模板每次来料先做几何对齐然后用当前图像减掉模板超出阈值的差值区域就报缺陷。听起来很顺实际落地问题一堆。首先是板卡的定位误差。PCB经过回流焊、人工插件后会存在细微的旋转和伸缩焊接应力甚至会让板子局部翘曲。一旦配准差了一两个像素差分结果里就全是伪边缘必须靠形态学开运算去“洗”掉噪声但开运算的核大小又很难定核大了会把真实的小锡珠一起洗掉核小了桥连和丝印噪声根本分不开。其次是丝印和板面纹理的干扰。B面丝印字、走线、过孔、板边金属化孔每个都是天然“高频信号”传统算法做差分时把这些都当成前景最终只能靠人工反复调ROI和阈值同一个画面换一个批次又来一轮“参数搬家”。我当时的结论是传统方案适合“背景极其干净、目标形态极其固定”的场景比如定位打孔、划痕检测但PCB缺陷这种“变体多、目标小、背景噪”的问题它不是不会做而是做不干净。1.3 YOLO系列解决的是“语义位置”一体问题YOLO这类单阶段检测器本质上做了一件传统算法没有直接做的事一次性告诉你“这是什么缺陷”和“缺陷在哪个位置”。它不需要你定义“少锡是什么颜色、桥连是什么形状”而是从大量标注样本里自己学习每一个类别的判别特征。这一点在PCB领域特别值钱因为很多缺陷人眼能看但说不清楚规则与其写一百条视觉规则不如给模型看一千个正负样本。同时单阶段的架构决定了它在速度上有优势。产线检测工位往往只有几百毫秒的处理时间YOLO可以在保持不差两阶段检测器太多精度的前提下把整图推理时间压到几十毫秒级别。这也是我最终选它作为主框架的根本原因PCB质检是一个强实时、强语义、还要定位的工业场景它正好卡在YOLO最强的区间里。2. 数据准备环节我建议把60%的精力放在这里有一句话我信了很多年模型精度天花板不是网络结构是数据集质量。在PCB缺陷检测项目里尤甚。很多团队拿到一个预训练权重就直接开训训了两天发现mAP卡在0.8上不去就开始怀疑模型其实问题大概率出在“相机成像不标准”和“标注口径不统一”上。2.1 成像系统是数据质量的隐形天花板先说相机和光源。PCB板反光严重焊盘和引脚都是金属表面普通正光一拍全是高光缺陷区域的高光波动比缺陷本身还明显。我的做法是优先用低角度环形光配合同轴光低角度环形光用来勾勒焊盘轮廓和锡珠的立体感同轴光用来压制大面反射让干净焊点和少锡焊点之间的灰度差拉出来。镜头方面常规选用500万像素以上的工业面阵相机。分辨率这个东西不要只看“像素够不够”要看“最小缺陷占多少个像素”。以0.3mm的锡珠为例如果视野是80mm宽用500万像素约2448*2048一个锡珠大概能占到9到12个像素勉强够YOLO学习。如果视野拉到120mm同分辨率下锡珠只有5到6个像素检测器大概率会把这类目标当成噪声学掉。拍摄数量上正常的做法是准备200块以上的不良板每块板按8到12个不同位置和角度采集保证光源和位姿变化都进入训练集。只拿手机对着屏幕拍照做实验可以但拿那种图训练出来上线必翻车。2.2 缺陷类别定义与标注规范标注是数据准备中最容易被低估的环节。我建过好几套标注标准最后留下来的规矩是每一个缺陷实例都单独拉框不允许把同一区域多个缺陷合在一个框里框必须贴合缺陷实际范围稍微压一点正常区域可以接受但不能只框半截目标对“少锡”这类边界模糊的缺陷标注时要统一口径比如“露出铜面面积超过焊盘面积的20%”才标记为少锡边界不足的不标同一类缺陷在不同板卡方向上的框要尽量保持一致的紧致程度。标注工具我们用开源的LabelImg和Label Studio尽量拉多人并行。PCB数据集建议使用YOLO的txt格式每一行是“类别ID 中心点x 中心点y 宽 高”中心点和宽高都是相对图像宽高的比例。这里特别提醒一件小事不同版本的数据集目录写法可能不同容易把归一化坐标搞混最好在训练前写个Python脚本把所有标签的归一化值范围检查一遍出现大于1或者小于0直接报警。2.3 数据增强策略尤其是小目标与不平衡PCB缺陷类别的样本天然不平衡缺件、偏位这种“大目标类”好收集锡珠、桥连这种小目标类却很难凑齐。数据增强不能只用默认的随机仿射要有针对性。增强方式推荐场景经验参数Mosaic拼接整体提升密集场景泛化性官方默认的训练轮次即可随机翻转PCB板不限定方向时可用概率0.5注意丝印方向语义HSV抖动应对同型号板卡不同批次色差饱和度±20亮度±15随机平移缩放让模型对元件偏移更鲁棒平移±5%缩放±10%复制粘贴小目标锡珠、小桥连严重不足时单图最多粘贴2至4个避免遮挡关键焊盘复制粘贴这个操作要谨慎。直接把一个锡珠的局部贴到另一张图上容易在边缘产生生硬的拼接线模型会误学成黑边特征。我建议做小目标合成时限制粘贴位置只能在焊盘附近且贴完要做一次轻微模煳和灰度抖动让粘贴区域和周围光照尽可能融合。2.4 样本数量怎么估算没有统一公式但我给一个经验口径对于每种缺陷类别至少准备300个有效实例如果该缺陷在640分辨率下小于24*24像素建议翻到600个以上如果产线上还允许不同型号板卡混跑最好每个型号都单独补充一定比例的负样本。负样本同样重要。只告诉模型“什么是缺陷”不告诉它“什么不是缺陷”模型就会在无关特征上放飞自我。我的训练集中会固定加入一批“确认无缺陷”的板卡图像大概占到总数据量的20%到30%让背景分布一直被压住。这个习惯帮我解决了很多“过杀”问题。3. YOLO版本选型——够用就行和性能优先是两套逻辑YOLO系列迭代很快从早期的版本到现在的多个分支很多人问到底该用哪个。我的建议是别被刷榜模型忽悠先看你的部署硬件、标注格式、TensorRT支持程度。3.1 从旧版本到新版本真正影响质检效果的是哪些改进如果只用一句话总结新版本在表皮特征提取和训练收敛性上做得更好但对PCB这类小目标密集场景版本红利并不像分类任务那么明显。早期YOLOv5时期很多人用“Backbone PANet”的组合在中等目标上表现不错。后来的几个版本把Anchor-Based换成Anchor-Free省去了大量anchor调参工作对于新手更友好。C2f这类结构让梯度流更丰富深层网络难收敛的问题缓解了很多。真正值得关注的变化是“多尺度特征融合”的加强PCB里锡珠、桥连属于极小目标浅层高分辨率特征图决定了这些小目标的召回率新版本普遍保留并增强了P3甚至P2层输出这对我们来说比刷高那0.5个点的COCO指标更有用。当然如果你的项目需要跑在老旧GPU或者嵌入式设备上轻量分支往往比最新最大的模型更实用。这不是说模型越大越好而是“单位毫秒下的精度收益”才重要。3.2 针对PCB小目标的改进空间在模型上做二次改造时我比较克制因为工业项目最怕“研究了两周精度涨了0.3%但推理时间翻倍”。最稳妥的两招是把输入分辨率从默认的640×640提升到960×960甚至1280×1280让最小缺陷在特征图上占据更多像素在颈部特征融合时额外保留一个更高分辨率的浅层特征层相当于给模型一副“更细的眼睛”。第一招几乎零成本但要注意推理耗时随分辨率近似平方增长。第二招需要动网络结构通常会带来小幅参数量增加性价比一般建议先做完第一招再评估是否必要。如果你使用的是官方预测代码还可以关注“TTA”这类测试时增强。PCB产线上不建议开启因为它的推理时间翻2到4倍换来的收益在小目标上不稳定还会引入抖动。3.3 轻量化选择与算力匹配我把模型规格分为三档档位适合场景我实际测试的感觉Nano类嵌入式盒子、低功耗工控机速度最快但小目标漏检较多适合粗筛Small类常规工控机配独立显卡精度和速度均衡多数PCB项目够用Medium类离线高精度抽检或算力充足mAP最好但需要多留出推理预算如果是双轨高速贴片线每个工位只有300到500毫秒窗口我通常会先把速度预算算出来相机曝光加传输100毫秒推理分配到150到200毫秒留给通信和运动控制100毫秒。在这样紧张的预算下Small类配合FP16推理往往是最务实的方案。反过来如果只是炉后抽检速度慢一点无所谓那直接上Medium类尽量把精度吃满。4. 训练细节和收敛判断我跑出的有效流程选好模型后训练配置直接决定最终精度。这一节我把自己的操作流程摊开讲从数据组织到训练命令再到收敛判断给你一套可以直接抄的作业。4.1 数据组织与目录结构先把数据集按YOLO格式组织好datasets/ pcb/ images/ train/ val/ labels/ train/ val/训练集和验证集按“板卡”切分而不是按“图像”切分。因为同一块板拍出的多张图像高度相关如果混着随机切验证集里就会出现同板图像的“泄漏”mAP虚高。正确做法是先给每块PCB板一个ID然后按板ID划分保证同一块板的所有图像都只出现在同一侧。标签文件与图像文件同名后缀是.txt。每张图像如果没有缺陷对应的标签文件就是空文件这也很正常代表负样本。4.2 训练命令与关键参数以标准YOLO训练命令为例核心参数如下yolo train \ modelyolov8s.pt \ datapcb.yaml \ epochs300 \ imgsz960 \ batch16 \ lr00.01 \ cos_lrTrue \ warmup_epochs3.0 \ weight_decay0.0005这里几个关键的参数说下我的理解imgsz960是我推荐的起点。640对小目标不友好1280虽然更猛但显存和训练时间都要翻倍。960往往比640在PCB小目标召回上能涨3到5个点是性价比最高的档位。epochs不要盲目拉到几千。PCB缺陷检测任务是中小数据集300轮足够再多容易过拟合。观察验证集mAP如果100轮后还在缓慢上升可以适当续训。batch尽量设大一点。小目标检测中batch太小会导致BN统计不稳定模型学出来的特征波动大。显存不够时优先降低输入尺寸不要强行把batch降到4以下。训练时不要用ImageNet预训练权重做“从头微调”。有一种经验是先用COCO预训练权重它已经学到了通用纹理和边缘特征对PCB小目标来说相当于一个更好的起点。4.3 从验证曲线判断问题是欠拟合还是数据问题训练过程中不要只看训练集loss重点盯验证集的mAP0.5和mAP0.5:0.95。PCB小目标场景我对mAP0.5的底线一般是0.92以上如果低于0.85基本没法上线因为产线上只要出现几个漏检人工复判成本分分钟超过项目收益。如果mAP0.5不高我会先按下面顺序排查查看采样回来的badcase图片确认缺陷是否有标注错误看漏检目标在图像里的实际像素大小是否小于模型可学习尺度看类别分布是否有个别缺陷类别样本量严重偏少检查验证集是否与训练集分布不一致比如验证集中某批次板卡颜色异常。一个小经验单独打印每个类别的AP曲线如果某类别的AP突然掉到0.6以下多半是标注口径或样本数量问题不要盲目调超参数。4.4 难例挖掘必须做至少做一轮训练结束后我会把验证集里所有漏检的图片重新挑出来再做一次人工复核。这些漏检样本分成两类一类是标注本来就模棱两可另一类是模型确实认不出来的“真难例”。对真难例不能只把它塞回训练集完事。我会把它和相似的正样本放在一起截图对比检查是不是标注框不贴合、是不是缺陷太靠近图像边缘、是不是训练时被随机裁剪切掉了。更多时候难例集中在某个光照角度或某类板卡型号上这时最有效的办法是去现场补拍一批同环境的图像再合成到原数据集中重新训练一轮。难例挖掘虽然麻烦但涨点效果比换任何网络结构都明显。5. 部署到产线之前模型库里的高mAP不等于能落地模型在电脑上跑得再漂亮和产线正常运行是两码事。部署这一环决定项目是顺利交付还是天天深夜被电话叫醒。5.1 推理硬件与延迟预算部署先算延迟预算。假设产线节拍是每块板停留800毫秒视觉系统必须在这个时间内完成“触发-图像采集-模型推理-结果输出”。我把预算拆成三块环节预算说明相机曝光与图像传输80-120ms过高会拖延整个cycle模型推理200-300ms取决于模型规格和硬件结果处理与PLC通信100-150ms包括坐标转换、分类、串口/以太网发送实际测试时我会用中间值预留20%余量防止产线抖动。推理硬件我常用的是带独立GPU的工控机选型时直接看它的FP16算力而不是浮点峰值。5.2 模型转换与量化训练好的PyTorch权重不能直接进部署SDK一般要转ONNX再转TensorRT或OpenVINO。转换流程大致如下yolo export modelyolov8s_pcb.pt formatonnx imgsz960 trtexec --onnxyolov8s_pcb.onnx \ --saveEngineyolov8s_pcb.engine \ --fp16这里有两个坑。第一个是输出端口的动态shape产线上图像尺寸固定还好如果允许不同型号板卡用不同分辨率就要导出动态batch并在推理引擎里显式设置最大batch数。第二个是FP16量化后小目标精度掉的幅度。我做过一次对比同一批测试集上FP16相比FP32mAP0.5掉0.5个百分点左右但推理速度能快近一半所以一定要先在你自己的验证集上测完再定不要因为“理论差不多”就直接开干。如果要用INT8量化必须准备一份校准数据集且校准图里要包含足够多的锡珠、桥连等小缺陷实例。只有正常板的校准集会拉偏量化阈值上线后小目标会成片消失。5.3 通信联动与结果判定逻辑视觉系统不只是出框还要把缺陷信息送给下游设备。我常用的通信方式是TCP/Modbus TCP通过PLC触发相机采集模型推理完成后把每个缺陷的类别、坐标、置信度打包发给PLC或工控机。如果产线需要自动标记再联动喷码机在缺陷区域附近打一个微小的标记点。这里有一个容易被忽视的业务规则置信度不是越高越好产线上过杀和漏检的成本不一样。PPM百万分之不良率是电子厂的硬指标漏检后果更严重。所以我通常把缺陷判定阈值设在0.35到0.5之间宁可让操作员多看几个疑似框也不能让有问题的板卡流到下一工位。同时对“缺件”这类严重缺陷类别可以单独设置更低的阈值比如0.25。5.4 产线监控与模型更新闭环模型部署完不是终点。我会在软件里加两个统计模块一个记录每天的检测总数、缺陷类型分布、平均处理时间另一个抽样保存检测结果图包括模型标出的框和漏检图片。每周导出一次漏检与过杀案例由质检组长复核后挑出有代表性的图片增量标注进入“周度迭代”流程。这个闭环看起来慢实际是精度持续提升的核心。PCB型号一旦多了不主动收集现场数据做持续训练模型性能只会越来越差。6. 实测踩坑漏检和误杀排查的完整链路即便前面所有步骤都做好了上线初期还是会遇到各种奇怪问题。我把自己亲历过的三种典型现象拆开讲建议按这个顺序去排查。6.1 现象一最小焊盘上的漏检集中爆发第一版模型在实验室验证集上mAP0.5达到0.95上线后却发现漏检大多集中在0.4mm以下的细间距焊盘区域。我先查了推理图确认不是相机曝光问题又对比训练集和现场图的缺陷尺度分布发现问题出在imgsz640时这些焊盘上的桥连缺陷在特征图上只占5×5像素左右模型根本学不出稳定特征。我把推理分辨率提到960并在训练时同步使用960作为主要输入尺度漏检立刻下降约三成。之后又把最小目标复制粘贴增强的量提上去最终这类细间距焊盘的召回率才稳定在可以接受的范围。这个链路告诉我们遇到密集小目标漏检优先看“目标在模型输入尺度上的像素面积”而非盲目加卷积层。6.2 现象二丝印和板边区域误杀严重上线一周后过杀统计显示误报集中在板边的字符丝印和定位孔附近。排查后发现标注阶段我虽然加了不少负样本但那些负样本大多来自板中央板边的丝印在训练集里几乎没有出现过。解决办法分两步第一步在推理端对板边区域加ROI掩膜把本身就容易误报的板框外部直接排除第二步补充采集了大量包含板边和丝印但确认无缺陷的板卡图作为专门负样本集参与重训。两步下来过杀率从每天几十件降到个位数。这里有一个通用教训负样本要覆盖“模型会看到的每一个角落”而不是均匀覆盖整个图像。如果产线上有新的丝印工艺或板卡型号第一时间去补对应区域的负样本图。6.3 现象三光源亮度漂移导致的“假掉点”某个阶段模型在产线上突然整体掉点同一时间段的漏检全集中在焊点高光偏暗的图像上。排查之后发现更换光源驱动板后环形光的亮度比之前降低了约15%低角度光对焊盘的轮廓勾勒效果发生了变化。这个问题最坑的点在于图像在肉眼看还是“正常的”但像素分布已经挪了位置。YOLO对光照变化有一定的鲁棒性可一旦偏差超过训练集覆盖范围所有指标都会缓慢下滑。我的处理方式是把光源亮度参数固定并在软件端加一个亮度自检模块每次开机用一个标准白板校准一次增益如果亮度偏差超过阈值就报警。同时在训练数据里主动加入亮度±30%范围内的图像增强让模型对光照变化更迟钝。6.4 排查顺序建议把所有经验浓缩成一条链路以后遇到任何检测异常按这个顺序来检查现场输入的图像质量分辨率、曝光、对焦、光源状态检查标签与推理结果的对应关系是不是标注口径不一致检查模型输出前的预处理归一化、缩放、通道顺序检查后处理和业务逻辑阈值设置、ROI、坐标转换检查运行环境变化新板卡型号、新批次丝印、光源老化。大多数“玄学掉点”最后都能落到以上五条里排查时千万不要一上来就改模型结构。最后分享一个双级检测的小技巧很多细间距PCB既要全板覆盖又要保住小目标单个模型的输入分辨率怎么调都别扭。我后来在项目里加了双级结构全图用一个Small类模型以960分辨率做粗筛负责找出“可能有问题”的区域然后对这些可疑区域按局部ROI裁出来再送一个Medium类模型以1280分辨率做精判。实测下来总耗时只比单模型多了60毫秒左右但细间距焊盘的漏检基本被压制住了。如果你也遇到“全图看不清、局部看太慢”的尴尬这个思路值得一试。工业检测没有一劳永逸的银弹最可靠的路径就是把数据、模型、部署和现场数据回流捏成一个持续迭代的闭环。
阅读完成 · 觉得有帮助?
咨询建站