ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

金属表面缺陷检测全流程指南:从成像设计到算法落地

金属表面缺陷检测全流程指南:从成像设计到算法落地 干了这么多年工业视觉检测金属表面缺陷检测这个课题算是绕不过去的硬骨头。无论是精密零部件还是粗轧板材表面质量直接决定产品能不能交付、客户会不会索赔。我早期踩过不少坑也推翻过好几版方案现在把整个过程重新梳理一遍从需求拆解到硬件选型再到算法落地的完整链路都写出来希望能给正在做相关项目的朋友省点时间。1. 项目拆解金属表面缺陷检测到底在解决什么问题1.1 核心需求解析所谓的金属表面缺陷检测本质上是替代人眼去做外观质检。传统的人工目检存在几个天然短板长时间盯看容易疲劳导致漏检、不同检验员判定标准不统一、高速产线上人工抽检无法覆盖全量。工业视觉检测就是用相机加算法对产线或批次产品逐件扫描找出表面的划伤、麻点、凹坑、凸起、锈蚀、氧化色差、压伤、脏污等异常。但这里有个容易被新手忽略的问题金属表面的缺陷种类远比大家想象的复杂。按照缺陷形成的工艺阶段可以分成原材料缺陷轧制形成的划伤、夹杂、机加工缺陷车削震纹、铣削毛刺、热处理缺陷淬火裂纹、氧化皮残留、运输存储缺陷磕碰、划痕、锈斑。不同类型的缺陷在成像手段和算法策略上差别很大不做前期分类就直接套通用模型效果往往一塌糊涂。以热词里提到的电机转子绕线缺陷检测为例这类场景关注的通常是漆包线表面是否有漆膜破损、绕线是否松散、表面是否有异物附着。它和普通金属表面缺陷的区别在于检测目标非常小而且绕线表面本身有规则的纹理和反光缺陷特征容易被背景淹没。这类场景对算法的分辨率和小目标检测能力要求很高这也是为什么类似项目里 YOLOv8 这类支持多尺度检测的算法会越来越流行。1.2 检测对象的技术参数确认很多项目在启动时只盯着“能不能检出缺陷”忽略了先确认检测对象的具体技术参数结果方案做完了发现成像系统根本不匹配。我在实际项目里总结了一套参数确认清单刚开始做检测项目的朋友可以直接拿去用工件材质的反射特性是镜面反射如抛光面、磨削面还是漫反射如喷砂面、毛化面这决定了光源类型和打光角度。镜面反光材质如果用直射光整体图像很容易过曝缺陷区域反而不清晰。表面粗糙度范围粗糙度 Ra 值直接影响纹理背景的复杂程度。Ra 越高背景纹理越杂乱对算法抗干扰能力的要求就越高。缺陷的最小尺寸这是整个系统的设计核心指标。如果你需要检测的最小缺陷是 0.1mm 的划痕那么每个像素对应的实际物理尺寸至少要达到 0.03mm 以下否则缺陷在图像上可能只占一个像素算法根本分不出来。产线节拍与检测位距产线节拍决定了相机曝光时间上限和算法处理时间的预算。比如节拍是 3 秒一件那么从图像采集到结果输出的全流程时间必须压缩在 2 秒以内这直接影响你选工业相机还是智能相机、算法跑 CPU 还是 GPU。缺陷标准定义这一点容易在项目验收时扯皮。一定要和客户书面确认什么叫缺陷、缺陷的严重程度等级怎么划分、多少面积或长度的缺陷算不合格。没有这个标准后期算法调优就是无底洞。1.3 检测精度与视场范围的矛盾统一检测精度和视场范围永远是矛盾的两个方向。视场拉大分辨率就下降分辨率提上去单张图像能覆盖的面积就会变小。实际项目中如何平衡这两个指标通常遵循以下思路先根据最小缺陷尺寸确定像素精度。经验法则是一个缺陷至少要占 3x3 个像素才能让算法稳定识别。如果你要检 0.1mm 的缺陷那像素精度至少应该在 0.033mm/pixel 左右。接下来根据工件尺寸算相机分辨率需求。假设你的工件表面需要覆盖的范围是 100mm x 80mm那么在 0.033mm/pixel 的精度下需要的图像分辨率大概是 3000 x 2400也就是 700 万像素左右的相机才能满足。如果你面对的是大面积表面检测比如板材检测单台相机无论分辨率多高都会遇到视场和精度的死结。这种时候不能指望一台相机解决所有问题要么采用多相机拼接方案要么改用线扫相机配合运动机构扫描。线扫相机成像分辨率可以做得非常高适合连续运动的带钢、板材类产品但它的成本和对运动平台的稳定性要求都比面阵相机高一个数量级需要结合预算和现场条件做取舍。2. 核心方案选型成像系统的设计与搭建2.1 光源选型与打光方式选择很多人以为缺陷检测的难点主要在算法实际做过项目的人都会告诉你成像质量决定了算法效果的上限。光源和打光方式设计得好原本复杂的算法问题能简化成阈值分割就解决光源没选对再牛的深度学习模型也要被反光、过曝、对比度过低折磨得头大。金属表面最常见的三大坑强烈反光、镜面效果、纹理背景杂乱。针对不同情况打光方式各有讲究。漫射光源适合处理镜面反光。如果你检测的是磨光面轴承、抛光金属外壳这类材质因为表面本身像镜子一样直接打光一定会形成高光斑块缺陷区域反而被亮光淹没。用低角度的漫射光形成均匀的背景照明缺陷在图像里会呈现为暗色或亮色的局部异常。同轴光光源对检测金属表面的压伤、凹坑、刻痕非常有效。同轴光经过半透半反镜后沿镜头光轴方向照射目标光线垂直打到表面后按原路反射回相机。平整表面亮度均匀一旦表面发生微小凹陷或突起反射方向发生变化在图像上就会形成明显暗区。这种打光方式对水平方向的表面起伏极其敏感能直接换来高对比度的缺陷特征。低角度条形光则适合检测划伤、滚痕这类浅表纹理型缺陷。光线以极低的角度掠过金属表面遇到划痕时散射方向改变缺陷在暗背景下会呈现明亮的线条。这里建议多花时间现场试光因为划伤的方向和光源角度高度相关尽量让光源方向与划伤方向垂直效果最明显。2.2 相机与镜头的选型逻辑相机的选择要先分清是静态检测还是动态运动检测。对于静态拍照面阵相机是主流选择优先考虑全局快门类型的工业相机避免运动过程中的果冻效应。工业领域里我常用的搭配是海康、大恒等国产工业相机品牌性价比高且 SDK 完善搭配对应品牌的工业镜头稳定性和售后都有保障。镜头方面需要注意的是焦段和畸变控制。金属表面缺陷检测通常要求低畸变、高分辨率远心镜头是大型精密工件的首选。远心镜头可以避免普通镜头在工件边缘产生的透视变形保证视场内各个位置的测量精度一致。但远心镜头价格偏高且成像范围有限。如果检测要求没那么严格普通的高分辨率定焦镜头配合均匀照明也可以满足大部分场景。相机分辨率验证是项目初期必须做的事。不要仅仅看相机标称的像素数要实际拍摄一次典型缺陷样本在显示器上放大观察缺陷区域的清晰程度确认其边缘锐利度是否足够支撑后续算法处理。如果缺陷边缘模糊即便分辨率足够算法也很难准确分割出缺陷区域。2.3 硬件平台的调试与安装成像系统的硬件调试不能等到产线装好了再做最好在实验室里搭一套模拟环境提前验证。需要重点关注几个因素工作距离的稳定性、相机与工件表面的相对角度、环境光干扰程度。在实验室模拟和现场真实环境的差异往往不小。车间里的环境光比较复杂头顶的日光灯、窗外射入的阳光、周围设备的指示灯都可能对成像产生干扰。最稳妥的做法是加装遮光罩或者在光源上方增加频闪控制器用极短的曝光时间压制环境光的影响。我在一个汽车零部件项目里现场有一段传送带旁边恰好是窗户白天阳光照射导致图像整体偏亮后来给相机加装偏振片并在光源端也加相同偏振方向的偏振片利用偏振消光原理过滤掉了大部分环境反射光问题才彻底解决。3. 算法路线解析传统视觉与深度学习两代方案的对比3.1 传统视觉方案Halcon 为代表的经典处理方法在深度学习还没有全面普及之前Halcon 是工业缺陷检测领域的事实标准。它对图像处理算子的封装非常完善传统方法的处理速度极快在稳定性要求极高、缺陷特征固定、形态简单的场景下至今仍是值得优先考虑的技术路线。以 Halcon 为基础的表面缺陷检测常规思路是先做图像预处理用高斯滤波或中值滤波抑制噪声再通过灰度形态学、频域滤波等手段削弱背景纹理影响然后使用全局或局部动态阈值分割出可疑缺陷区域最后用形态学操作和特征提取筛选出真正的缺陷判定规则覆盖面积、长度、宽度、圆形度等指标。但传统方案的局限性也很明显它对缺陷类型的泛化能力比较差。当同一表面上出现多种形态各异的缺陷又夹杂着花纹、油渍、指纹等干扰物固定特征规则的方案很容易误判。这时维护阈值和规则的成本会越来越高算法的可迁移性也很差。换一种材质、换一个光照环境所有的规则都要重新调整。3.2 深度学习方案YOLOv8 在缺陷检测中的优势近四五年YOLO 系列在工业缺陷检测领域的使用频率越来越高。YOLOv8 作为当前比较成熟的目标检测模型在速度和精度的平衡上做了很多优化。它的主要特点包括C2f 模块增强了特征提取能力、Anchor-Free 结构减少了很多调参工作、支持多种模型尺寸n/s/m/l/x适应不同算力平台、并且官方提供了完备的训练和部署工具链。在金属表面缺陷检测中YOLOv8 的核心优势在于可以直接对缺陷进行端到端的目标定位和分类不需要像传统视觉那样手工设计特征提取规则。比如在电机转子绕线缺陷检测中绕线的纹理非常复杂传统算法很难用一个统一的阈值把缺陷从纹理中分离出来而 YOLOv8 可以通过学习大量的带标注图像自动提取出“正常纹理”和“缺陷纹理”的区别实现较高的泛化能力。选择深度学习不等于放弃传统视觉。我在多个项目中的做法是先用传统视觉算法做第一道筛选快速剔除大部分明显的正常区域只对可疑区域送入深度学习模型做进一步分类。这种“传统筛粗深度学习定精”的级联结构既能保证处理速度又大大提升了复杂缺陷的识别准确率。3.3 方案选型决策表我梳理了一个简单的方案选型对比方便大家根据实际需求快速做初步判断维度传统视觉Halcon深度学习YOLOv8缺陷特征形态规则、对比度明显形态复杂、纹理背景强缺陷种类单一或少量固定类型多样且无明确规律数据准备不需要标注样本需要大量标注样本运行速度较快CPU 可支撑依模型大小需要 GPU 或 NPU泛化能力较弱换场景需重调较强可适应新样本部署难度相对成熟资料丰富需要深度学习框架环境这里的表格是经验总结实际情况要灵活对待。如果你面对的场景是很单一的划伤检测材质固定、打光稳定我建议直接用传统视觉速度快、成本低、也更容易让客户验收。如果缺陷类型复杂客户有不断新增缺陷种类的需求才考虑深度学习路线。4. 从数据到模型深度学习方案的完整落地流程4.1 缺陷样本采集与标注深度学习方案的落地最核心的资产其实是数据。很多人一开始就把精力放到调模型上结果越调越差因为训练数据的质量根本没有保障。做缺陷检测的数据采集第一原则是覆盖所有已定义的缺陷类型同时尽量包含实际生产中可能出现的光照变化、角度变化和工件表面状态变化。标注环节是极度耗时耗力的工作但这一步直接决定了模型的天花板。标注时需要注意框选要紧密贴合缺陷边缘不要留太多背景区域分类标签要统一避免同一缺陷在不同样本中叫作不同名字对模糊样本要集体评审后给出明确标准不要在源数据里掺入模棱两可的标签。我在做电机转子绕线缺陷检测项目时初期标注了约 3000 张图像涵盖漆膜破损、绕线松散、表面异物等类型。训练出来的模型在测试集上表现尚可但一上产线就频繁误报。排查了一圈发现现场生产环境的光照与实验室差异很大导致部分正常样品出现了类似的暗色区域。后来我在产线现场重新采集并按实际光照条件补充了约 2000 张正常样本将正常样本和缺陷样本的比例控制在大约 3:1模型的误报率立刻有了明显下降。正常样本的数量同样关键尤其对目标检测模型来说见过足够多的正常样本才能学到“正常”与“异常”的边界。4.2 数据增强策略缺陷样本往往数量有限尤其是某些罕见缺陷总共可能只有几十张图像。数据增强的作用就是通过有限的样本生成更多变体提升模型的泛化能力。常见增强方法包括水平翻转、垂直翻转、随机旋转、随机缩放、亮度饱和度调整、高斯噪声添加、随机擦除模拟遮挡等。有一个实际中非常有用的增强方法是让缺陷区域的仿射变换与工件外观保持一致。比如对柱状电机转子缺陷发生位置不同其形状可能会因为曲率而变形通过模拟这类几何变化可以大幅提升模型的实际适应能力。对于在流水线上拍摄到的产品还可以模拟运动模糊和不同角度光源带来的灰度变化让模型对成像环境的变化更鲁棒。4.3 模型训练与调优采用 YOLOv8 做训练时Ultralytics 官方库已经封装了完整的训练流程对工程人员比较友好。核心训练参数需要根据硬件资源和数据集规模反复试验。我常用的初始配置是batch size 16初始学习率 0.01训练轮次 200图像输入分辨率一般设置在 640x640。如果缺陷尺寸本身较小输入分辨率可以适当提升到 1280x1280但对硬件要求也会同步提高推理速度会明显下降。训练完成后不要只看 mAP要重点查看各类缺陷的 Recall 和 Precision。实际项目中漏检Recall 低的代价通常远高于误判Precision 低因为漏检会让客户直接投诉产品质量而误判可以增加人工复核来兜底。所以我在调优时通常以 Recall 指标为优先在保证漏检率低于客户要求的前提下尽量提升 Precision 减少误报。如果某个缺陷类别的 Recall 始终上不去优先从数据侧找问题看看该类别的样本是不是太少、样本是不是过于单一、缺陷尺度的分布是否不均。强行改模型结构和训练参数往往事倍功半。4.4 模型导出与部署模型训练完成后需要将 PyTorch 模型导出为适合推理的格式。我的常规做法是先导出为 ONNX再用 TensorRT 做深度优化最终部署到工控机的 GPU 或 Jetson 系列嵌入式设备上。TensorRT 的 FP16 精度模式在保证精度基本不变的前提下通常可以让推理速度有数倍提升。部署时要注意软硬件环境的兼容性。不同厂商的 GPU 驱动、CUDA 版本、TensorRT 版本之间有微妙的兼容关系建议在一开始就确定目标部署环境的版本组合防止模型开发环境和部署环境不一致导致运行异常。实际工程中最好维护一份依赖版本清单每次升级组件之前先做完整回归测试。5. 实测案例从确定方案到稳定交付的心路历程5.1 电机转子绕线缺陷检测案例这个项目是群友问得比较多的我拿它做一次完整复盘。客户的需求是对生产线上经过的电机转子表面进行自动检测主要关注漆包线的漆膜破损、绕线毛刺、表面脏污产线节拍约 4 秒一个工件需要全检。工件表面是铜色金属绕线区域纹理规则且有光泽。刚开始试过直接用 Halcon 的动态阈值分割但因为绕线本身有纹路导致误判率一直压不下来最终决定采用 YOLOv8 方案。现场成像硬件采用了低角度两条条形光源从左右两侧照射工件相机使用了 1200 万像素面阵工业相机配合全局快门快门时间设定在 200 微秒以内避免运动模糊。采集了约 5000 张图像其中约 3500 张正常、1500 张各类缺陷标注后训练了 YOLOv8m 模型模型输入分辨率设为 1024在 30 万次迭代训练后对三类缺陷的平均检测率 Recall 达到 99.2%误报率约 1.5%。最终交付时在产线上实际运行了三周无重大异常达到了客户验收标准。5.2 部署中遇到的性能瓶颈这个项目初期推理速度并不理想。工控机配置是 i7 处理器加 RTX 3060 显卡Python 环境调用 ONNX Runtime 处理一张 1024x1024 图像大约需要 120 毫秒这样算下来 4 秒一个节拍倒是够用但客户计划未来把节拍提升到 2 秒并且还要增加一个角度的拍摄这样推理时间预算就必须压缩到 150 毫秒以内处理两张图。后来我把 ONNX Runtime 切换为 TensorRT FP16 推理并将输入分辨率做了优化测试最终在保持识别精度不下降的前提下单张图像推理时间压到了 35 毫秒左右。整个工程在部署时一定要留意将 Python 推理代码用 C 重写通常能再降不少延迟但如果用了 TensorRT 的 Python API性能已经比较可观初期可以不必强行 C先把整条链路跑通遇到瓶颈再针对性优化。5.3 持续交付后的维护节奏产线检测系统交付完成只是开始后续的维护比开发更重要。客户现场新增了两种之前没见过的表面状态一种是加工后残留的切削液斑迹一种是防锈油涂抹不均匀导致的色块这两种情况本身不构成缺陷但模型以前没见过就会产生误报。遇到这种情况我去现场采集了一周内的正常样本补充进训练集重新迭代模型并把更新流程固化下来。维护期还需要关注光源和镜头的老化问题。LED 灯珠用久了会有光衰导致图像的亮度和对比度逐步下降。我在项目里加了一个定期拍照校准机制每天开机后自动拍摄一张标准色卡对比亮度直方图如果偏差超过阈值就提示人工清洁光源和镜头。这种做法很简单但可以避免很多由于硬件状态漂移导致的误报强烈建议每个项目都配上。6. 常见问题与排查技巧实录6.1 成像阶段的高频问题第一个常见问题是图像过曝。金属反光强很多人一上来就调大光源亮度结果正常区域变成一片纯白缺陷完全丢失。解决思路是优先降低光源亮度或缩短曝光时间把图像整体灰度控制在一个合理区间比如 100~200 之间保证细节不丢失。第二个常见问题是图像出现明显的环境光干扰。表现为同一产品放在产线不同位置图像亮度不一致或者窗边有阳光时图像里有亮斑。解决方案是加遮光罩、使用偏振片、提高灯源频闪频率也可以在算法里做灰度归一化预处理降低对绝对灰度值的依赖。第三个常见问题是工件定位不稳定。检测过程中工件的位置和角度与标定时有偏差导致缺陷出现在图像中不同位置。对于固定位检测可以增加一个定位步骤先通过模板匹配找到工件区域再提取 ROI 送入算法这样能大幅减少位置变化带来的干扰。6.2 算法层面的典型难题漏检率高的背后通常隐藏着几个原因。一个原因是缺陷过小在图像上只占了很少的像素模型根本看不清。这种情况要重新评估相机分辨率是否真的够用必要时提高分辨率或增加局部分区拍摄。另一个原因是缺陷和背景的对比度偏低比如暗色金属上很浅的划痕。针对这种问题可以尝试用多个角度光源打光增加表面缺陷的阴影效果提高对比度。还有一种情况是缺陷样本在训练集中占比太少模型没有充分学习到缺陷的特征需要补充样本做针对性训练。误报率高的排查重点则要从“模型分不清正常和异常”这个角度出发。一种常见原因是正常样本形态本身就有多样性比如不同批次的烧结表面色泽不一致模型把没见过的新颜色当作异常。对策是持续收集并补充正常样本让模型对正常形态的理解更充分。另一种原因是数据集标注不统一同一个特征有的样本标注为缺陷有的又标注为正常导致模型学到的东西前后矛盾。这种情况下需要重新校准标注标准最好由业务方和算法工程师一起评审一遍所有训练数据输出标准规范。6.3 缺陷检测项目速查表现象可能原因排查手段图像整体过曝光源过亮或曝光时间过长降低亮度缩短曝光图像明暗不均环境光干扰或光源角度不当遮光、偏振片、调整光源角度缺陷对比度低打光方向与缺陷方向不匹配调整光源方向尝试低角度光漏检高像素精度不够或训练样本不足提高相机分辨率补充缺陷样本误报高正常样本形态覆盖不全增加正常样本规范化标注推理速度慢模型过大或部署优化不足剪枝、蒸馏、TensorRT 加速6.4 多场景延伸从金属到其他材质金属表面缺陷检测的方法论其实可以辐射到很多相关领域。热词里提到的 PCBA 缺陷检测逻辑上几乎是同一个套路成像上解决高反射、高反差问题算法上解决微小目标、复杂背景问题。只是在 PCBA 场景里更多关注的是焊点桥连、缺件、偏移、虚焊这些形态特征缺陷类型和金属表面不一样但思路是一致的。外墙缺陷检测和隧道缺陷检测则是同一个方法论在大视场场景的变体。这些场景中缺陷通常以裂缝、渗水、剥落为主成像距离远、光照不稳定传统拍照和深度学习分割模型是主流组合。它的难点不在成像细节而在多视角拼接和裂缝亚像素级宽度测量这对算法和标定提出了更高要求。7. 实操心得与进一步扩展方向7.1 几个让我少走弯路的经验这几年做检测项目的最大体会是算法永远不是项目成败的最关键点成像与数据的优先级远高于模型结构。我遇到过的绝大多数项目问题最终都回溯到了成像环节——不是对比度不够就是光源不均匀或者样本代表性不足。模型本身反而很少成为木桶的短板。具体来说项目启动后先花 70% 的时间在成像方案和样本采集上把打光、相机位置、工件定位等基础问题搞扎实。等到成像稳定了再切到算法环节这时候你会发现即便是一个很简单的模型也能达到不错的水准。相反如果成像不稳定再先进的结构也无法稳定工作。见过太多团队在成像没有稳定之前就急着跑模型最后反复返工。另外尽可能在项目早期就建立一个可量化的验收基线。表面缺陷检测的“好”与“坏”没有绝对的量化标准必须结合客户方的验收条件把漏检率、误报率、检测节拍、最小缺陷尺寸这些指标写在合同或项目计划里双方签字确认。没有明确基线项目后期会陷入无休止的“再调调”循环对项目和团队都是一种消耗。7.2 后续可以扩展的方向缺陷检测这类系统一旦稳定运行很多客户会提出更进一步的需求缺陷原因的自动归类比如通过系统自动统计某个时间段内划伤缺陷的比例反向推导是哪道工序异常缺陷趋势的预测结合历史数据判断某个设备是不是快出问题了甚至是在线实时反馈给生产线做自动剔除或工艺参数调整。这些方向从技术上来说已经具备了基础只是需要在数据采集和业务对接层面多做积累。还有一个值得关注的趋势是多模态检测。金属表面的缺陷不仅体现在可见光图像中还可以通过 3D 深度相机、热成像等手段来捕捉。某些缺陷在二维图像中不够明显但在三维高度图上一目了然。比如凹坑和凸起这类对深度敏感的问题3D 方案比 2D 方案要好处理得多。随着 3D 相机成本和普及度的改善很多以前只能靠人工的检测项目也会逐步找到自动化解决方案。结合我自己的项目经验金属表面缺陷检测绝不是单一技术的问题它是光学、机械、算法、软件工程和现场工程能力的综合体现。一个系统真正好用往往不在于用了多前沿的算法而在于每个环节是否做得扎实、准确、可维护。希望这篇梳理能让你少踩一些坑也欢迎在实际项目中遇到过类似问题的朋友多交流互相补补课。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进