
1. 缺陷检测到底在检测什么先从一个现场画面说起。产线上装了一套视觉检测设备运行了三个月漏检率稳定在 0.5% 以内客户验收很满意。但你要是问现场工程师缺陷检测的原理是什么他不一定能从头讲清楚——这很正常因为表面缺陷检测这件事看着是一个拍照判断的动作实际上牵扯到光学、图像处理、算法模型、产线集成好几层东西。机器视觉表面缺陷检测简单说就是用工业相机代替人眼用算法代替人脑在生产过程中自动判断产品表面有没有瑕疵。你要检测的对象可能是金属划痕、塑料黑点、玻璃气泡、布料断纱、电池极片露白、电路板锡珠甚至是一颗药片的裂痕。每种材质的光学特性不一样每种缺陷的形态特征也不一样所以用什么光、用什么相机、跑什么算法这三件事每一件都得针对具体项目去定制。但有一点是共通的缺陷检测本质上是一个图像分类或图像分割问题。你给算法一张图它要么告诉你这张图正常/异常分类要么告诉你异常区域在哪个像素位置分割定位。围绕这个核心问题才有了后面一系列的光学方案设计、算法选型和工程落地。这里我要先泼一盆冷水。很多刚入行的朋友以为缺陷检测就是装个摄像头、跑个开源模型、准确率调到 99%真到项目现场做调试的时候才发现90% 的时间花在成像上不是花在算法上。相机拍出来的图像如果对比度不够、反光干扰严重、缺陷特征没被凸显出来你再牛的算法也白搭。所以这篇文章我会把成像系统设计放在算法前面讲这不是顺序问题是优先级问题。顺便说一个行业数据供参考在工业质检场景下表面缺陷检测类项目大约占整个机器视觉应用市场的 40% 以上是需求量最大的细分方向之一。但与此同时它也是项目失败率最高的方向之一原因不外乎三点缺陷形态太多变、样本量不够、现场环境干扰。后面我会逐一展开。2. 表面缺陷检测的完整系统构成一套典型的表面缺陷检测系统硬件上就四样东西光源、相机、镜头、图像处理单元。听起来简单但每个环节都有不少讲究。2.1 成像硬件选型光源是灵魂先看光源。我要特别强调一个观点打光方案决定了一个缺陷检测项目 50% 以上的成败。很多人一上来纠结用 BASLER 还是海康相机、用 500 万还是 1200 万像素实际上光源没选对再贵的相机拍出来的图也是废图。常见的光源类型有这些环形光源装在相机镜头周围光线垂直向下均匀照射。适合检测平整表面的黑点、污渍、颜色差异是通用性最强的一种。条形光源从侧面打光适合检测大面积面板、金属表面、布料表面能通过低角度照射凸显表面凹凸纹理。同轴光源光路通过半反半透镜后与相机光轴同方向照射能消除反光适合高反光表面如镜面金属、晶圆、玻璃上的划痕检测。背光源光源放在被测物下方相机从上往下拍形成高对比度的轮廓剪影。适合检测透明物体的内部缺陷、外形尺寸、边缘毛刺。穹顶光源/圆顶光源光线经过球面漫反射后从各个角度均匀照射适合曲面、球形、反光强烈表面的检测。再说光源颜色。很多新手不知道同样的缺陷在不同波长光照下呈现的对比度完全不同。比如金属表面的划痕用蓝色光通常比白色光对比度更高检测透明玻璃内部的杂质用红外光或者特定波长的单色光有时能拍到可见光下拍不到的东西。这一块没有标准答案全靠实际打光测试经验是慢慢积累的。照明方式上还有两种流派明场照明和暗场照明。明场照明是让反射光直接进入相机缺陷区域因为散射导致光强变化形成暗色特征暗场照明则刚好相反正常表面反射光偏离相机光轴只有缺陷处的散射光进入相机所以在暗场下缺陷是亮的。暗场照明对划痕、凹坑这类微小缺陷特别有效能让本来很浅的缺陷在图像里变成非常亮眼的高亮区域。做检测方案的时候这两种方式都要试不要在一种方案上死磕。2.2 相机与镜头分辨率只是起点相机选型要考虑的核心参数有三个分辨率、帧率、接口类型。分辨率决定了你能看到多小的缺陷。这里有一个经验公式如果项目要求检测的最小缺陷尺寸是 0.1mm视场宽度是 100mm那么每个像素对应的物理尺寸至少应该是 0.05mm按缺陷占 2 到 3 个像素计算对应需要的分辨率就是 100mm ÷ 0.05mm 2000 像素也就是至少需要 200 万像素的相机。实际项目中我一般会留 3 到 5 倍余量所以这个场景我通常会直接上 500 万或 600 万像素的相机。像素不能太少少了漏检风险高但也不是越多越好像素越高数据量越大处理速度会变慢成本也水涨船高。帧率很好理解产线速度越快需要的帧率越高这样才能保证产品在运动中也能被清晰拍到。比如产品是连续运动而不是停顿拍照的假设运动速度是 1m/s视场宽度是 200mm相机需要保证在物体移动一个视场距离的时间内至少曝光一次才能做到不漏拍。这里还需要考虑曝光时间不能太长否则物体运动会造成运动模糊——所以高速产线上一般都要搭配强光源才能用极短的曝光时间把画面冻住。接口类型方面现在主流是 GigE千兆网和 USB3.0高速线用 CameraLink 或 CoaXPress。GigE 线可以做到 100 米传输距离部署灵活USB3.0 理论带宽更高但线缆长度限制在 3 到 5 米以内CameraLink 和 CoaXPress 是高端场景的选择成本和复杂度都高一些。镜头方面核心参数是焦距、靶面和光圈。靶面要比相机传感器略大或一致否则成像边缘会有暗角。焦距根据安装距离和视场宽度来算焦距 工作距离 × 传感器靶面尺寸 ÷ 视场宽度。举个例子传感器靶面宽 6.4mm工作距离 200mm要求视场宽 100mm那焦距大概是 6.4 × 200 ÷ 100 12.8mm选个 12mm 或 16mm 的镜头微调距离就行。这是一个非常常用的计算方式建议刻在脑子里。2.3 图像处理单元算力要匹配算法图像处理单元就是工控机加图像采集卡或者现在流行的嵌入式 GPU 平台。这里提醒一点很多项目在实验室里跑算法用的是带高性能显卡的台式机到现场换了个普通工控机结果速度跟不上、内存不够、算法直接跑崩。所以在选工控机的时候一定要先评估你最终要在现场部署的算法复杂度——传统图像处理算法的计算量集中在 CPU深度学习算法则要 GPU 或 NPU 支持。我建议在做完算法验证后以实际部署的硬件环境为基准做压测不要用实验室标准直接套。3. 表面缺陷检测的核心算法技术算法是整个检测系统的大脑。我把表面缺陷检测算法分成两大类传统图像处理算法和基于深度学习的算法。这两条路线不是谁取代谁的关系各有一片适用领域。3.1 传统图像处理路线依然不可替代传统算法的核心思路是人为设计特征 规则判断。你先通过图像预处理把缺陷从背景中分离出来然后提取缺陷的特征参数面积、周长、灰度均值、纹理特征等再设定规则进行判定。常用技术包括图像预处理灰度化、去噪高斯滤波、中值滤波、对比度增强、直方图均衡化。预处理的目的是让缺陷更明显同时抑制背景干扰。阈值分割最基础的分割方式。如果缺陷区域和背景有足够灰度差一个合适的二值化阈值就能把缺陷抠出来。大津法OTSU是自动寻找最佳阈值的经典算法。边缘检测Canny、Sobel、Laplacian 等算子适合提取缺陷边界轮廓。形态学处理膨胀、腐蚀、开运算、闭运算用于连接断裂的边缘、去除孤立噪声点。纹理分析灰度共生矩阵GLCM、局部二值模式LBP适合检测纹理表面的异常比如布料、木材、皮革表面。频域分析傅里叶变换后周期性纹理在频域里表现为规律分布的峰缺陷会破坏这种规律检测频域中的异常分量可以间接发现缺陷。传统算法的优点是可解释性强、运行速度快、不需要大量缺陷样本规则一旦定好就很稳定。缺点是泛化能力弱产品换一个规格可能就要重新调参数。所以它特别适合缺陷类型固定、产品规格单一、检测标准明确的场景比如药片外观检测、螺丝螺纹检测、玻璃基板划痕检测。3.2 基于深度学习的检测路线深度学习方法这几年在工业质检领域落地速度非常快。它的核心优势在于不再需要人工设计特征网络能自动从数据中学习缺陷的表征。这解决了很多传统方法搞不定的难题——比如缺陷类型不固定、背景纹理复杂、缺陷和背景差异不明显的情况。常用的深度学习方案主要有三类分类网络ResNet、EfficientNet、MobileNet 等判断整张图有没有缺陷。适合做粗筛速度极快。你甚至可以把它部署到边缘小盒子上做全检线的第一级过滤。目标检测网络YOLO 系列、Faster R-CNN 等输出缺陷的位置和类别。适合缺陷是块状特征比较明显的场景比如金属表面的斑块、PCB 板上的焊点缺陷。语义分割网络U-Net、DeepLabV3、SegNet 等对每个像素分类精确到缺陷的形状轮廓。适合需要精确测量缺陷面积、形态的场景。除此之外还有两个更贴近工业应用的方向值得关注。一个是无监督异常检测。工业场景里最痛苦的事情是什么缺陷样本凑不够特别是新型缺陷压根没见过几次。无监督方法只需要大量正常样本就能训练模型它的思路是让模型学会记住正常样本的分布特征测试时如果某张图和正常分布偏差过大就判定为异常。MVTec AD 数据集是这个领域的基准数据集之一。PatchCore、PaDiM、SPADE 这类方法在工业异常检测上的效果已经能做到比较高的精度了。我个人认为对于很多中小制造企业无监督异常检测可能是比监督学习更务实的方案因为他们的缺陷样本库通常小得可怜强行上监督学习模型很容易过拟合。另一个是小样本学习和元学习。在一个新产线上线时缺陷样本极其有限怎么让模型只靠几十张缺陷图就快速收敛、达到不错的效果是一个非常有实际价值的方向。实际工程中常用的折中方案是用预训练模型做迁移学习比如用 ImageNet 预训练权重做初始化再用自己的缺陷数据微调效果通常远好于从头训练。3.3 传统 vs 深度学习的选型对比维度传统图像处理深度学习所需样本量少量甚至无需缺陷样本缺陷样本越多越好监督学习处理速度快毫秒级取决于模型大小和硬件可解释性强规则透明可追溯弱黑盒判定泛化能力弱换规格需重新调参较强由训练数据决定部署难度低普通工控机可跑较高需 GPU/边缘算力适用场景缺陷类型稳定、标准明确缺陷多样、背景复杂、无法人工定义特征选型时我的原则是先评估问题复杂度再决定路线。如果传统算法能解决就不要上来就上深度学习这不仅是成本问题也是稳定性和可维护性问题。反过来如果你的缺陷在一堆复杂纹理里若隐若现、形态千奇百怪别犹豫直接上深度学习。4. 玻璃划痕检测实战案例拆解热词里出现了机器视觉玻璃划痕检测这个方向我刚好做过几个项目拿来当案例拆解再合适不过。玻璃检测是表面缺陷检测里比较典型也比较难的一类难就难在玻璃透明、反光、还会折射打光稍不注意整张图就是一片亮瞎眼的眩光。检测目标可能是手机盖板玻璃、车载屏幕玻璃、光伏玻璃基板、建筑玻璃每一类对缺陷的定义和标准都不一样。4.1 项目需求与难点假设现在要检测的是手机盖板玻璃检测项包括划痕、脏污、崩边、凹坑、油污。玻璃尺寸大约 150mm x 70mm产线速度 2 秒一片。客户要求最小检测缺陷尺寸划痕宽度 0.02mm脏污直径 0.1mm漏检率小于 1%过检率小于 5%。这里要特别注意区分划痕和脏污划痕是玻璃表面的物理损伤通常呈线状有方向性边缘锐利。它只在特定光照条件下才会很明显。脏污是附着在表面的异物或油污呈块状或点状灰度特征和划痕不同。两者在算法的特征设计上区别很大如果用同一个特征向量去硬套大概率会顾此失彼。另一个难点是光源方案。玻璃镜面反射强普通环形光打上去会形成大面积反射斑像一面镜子把光源的轮廓都映出来了根本没法看。必须设计专门的光学方案。4.2 打光方案设计与实验针对这个项目我实际测试了三种照明方案。第一种是暗场低角度条形光。光源从玻璃两侧以很低的角度大约 10 到 15 度斜射到玻璃表面。正常平整的玻璃表面会把大部分光线反射到远离相机的一侧相机画面是暗的而当表面有划痕时划痕边缘会对光线产生散射部分散射光进入相机形成亮线。玻璃表面的划痕在暗场下呈现为明亮的线状特征对比度极高。第二种是同轴光。光线垂直照射到玻璃表面又原路反射回相机平整处反射率高、图像亮划痕处因为破坏镜面反射会变暗。玻璃背面的划痕因为光线在内部反射路径更复杂呈现的灰度和正面划痕不一样。同轴光对平整玻璃表面的划痕检测效果不错但对弧边、曲面就无能为力。第三种是背光源用来检测玻璃内部的崩边、气泡和杂质。光线从底部透过玻璃射入相机透明无缺陷的区域光线畅通图像亮有崩边或杂质的地方光路被遮挡图像暗。最终我采用的是多工位组合方案A 工位用暗场条形光检测正面划痕B 工位用同轴光检测表面脏污C 工位用背光源检测内部缺陷和崩边。三个工位各配一台相机依次拍摄最后在软件里把多工位结果汇总判断。这样做的好处是每个工位的光学方案都做到最优坏处是硬件成本变高但对检测效果要求严苛的项目来说值得。这里有个实测经验对于浅划痕深度小于 0.01mm的检测暗场比同轴光灵敏很多。同轴光下很浅的划痕可能只造成很小的灰度变化算法很难稳定检测出来但在暗场下同样的划痕会产生明显的散射亮点。如果你在做玻璃划痕检测优先上暗场方案试试。4.3 算法流程与参数设置以暗场工位为例算法流程是这样的ROI 区域设定玻璃在图像中只占一部分先手动或通过边缘定位确定玻璃边界只处理玻璃区域降低背景干扰。图像预处理对 ROI 区域做高斯滤波去除传感器噪声核大小 3x3sigma 0.8再用顶帽变换增强线状亮特征。顶帽变换的原理是用形态学开运算估计背景然后用原图减背景能把细小亮特征从灰度渐变背景里剥离出来。这一步对划痕检测非常关键。阈值分割用大津法自动计算阈值提取候选缺陷区域。特征提取计算每个候选区域的面积、长宽比、长度、方向、平均灰度、矩形度等特征。规则判定长宽比 3、最小外接矩形长边 5 像素、面积 20 像素的连通域判定为划痕。这里阈值怎么定需要参考最小可接受缺陷尺寸MRB反推。0.02mm 宽的划痕在 20μm/像素的分辨率下约 1 像素宽但因为有散射效应实际成像宽度会放大到 3 到 5 像素所以用面积 20 像素作为下限是合理的——再小的候选区域大概率是噪声。这套流程跑下来检测单张图像耗时约 30ms完全满足 2 秒一片的节拍要求。划痕检出率实测达到 99.5% 以上过检率约 3%通过调整判定阈值可以把过检率压到 1% 以下但划痕检出率会降到 99% 左右——漏检和过检永远是一对矛盾具体平衡点在哪里要跟客户反复确认。我当时跟客户达成的共识是漏检率优先只要过检的产品能被人工复判消化就接受较高过检率。4.4 深度学习方案的融合尝试后来另一个项目里把玻璃缺陷检测升级到了深度学习方案。原因很简单客户新增了多种不规则缺陷类型比如轻微的辊印、水波纹、不规则划伤人工特征规则完全写不过来。当时用的方案是 U-Net 做像素级分割把缺陷区域从背景里分割出来然后对分割结果做连通域分析和特征评估。训练数据大概收集了 2000 张正常样本和 1500 张各类缺陷样本。这里要特别提醒一个深度学习的坑缺陷样本不足时不要直接用原始缺陷图训练要做 online 数据增强包括随机旋转±30 度、随机裁剪、亮度抖动±20%、高斯噪声注入。尤其是划痕类缺陷方向性很强做旋转增强时要注意不要改变缺陷的本质特征。另外玻璃检测有个非常大的干扰源玻璃表面的灰尘。算法在训练时如果没接触过带灰尘的正常样本部署时就会被灰尘干扰产生大量过检。我的解决办法是在采集数据阶段有意保留一部分有灰尘但不算缺陷的样本并且标注为正常让模型学会忽略这类干扰。实测这个策略能把过检率降低约 60%。5. 高频问题与排查技巧实录最后整理一下我在实际项目中反复遇到、也是刚入行的朋友最容易踩的问题。5.1 成像环节常见问题现象可能原因排查方向图像整体过亮或过暗光源强度不合适、曝光参数不当优先调曝光时间再调光源亮度图像有摩尔纹相机分辨率与产品表面纹理频率接近换不同角度光源、改变工作距离图像闪烁不定光源频闪或交流电源频偏检查光源驱动是否恒流、相机触发是否稳定缺陷忽明忽暗产品每次到位位置有偏移加装机械定位或在算法中做位置校准边缘暗角镜头靶面小于传感器靶面换更大靶面镜头或缩小镜头光圈这里要重点展开两个点。第一个是光源稳定性的问题。LED 光源用久了会有光衰同一款光源用半年后亮度可能下降 20%。更隐蔽的坑是LED 驱动电源质量差会导致光源亮度波动图像的灰度均值跟着变算法如果是固定阈值判定就会产生大量误报。我的做法是每次产线停机保养时用一个标准色卡拍一张参考图软件自动计算灰度均值。如果灰度均值偏离基准值超过 5%就给出光源维护预警。这个方案成本低、效果好能提前发现光源老化和污染的问题。第二个是相机触发方式。高速产线上必须用硬件触发外触发模式让相机的曝光和产品到位严格同步。如果用了软件触发哪怕延迟只有几毫秒也可能拍到产品运动中的模糊图像。我当时在一条线上就是因为用了软件触发划痕图像运动模糊严重算法性能一直上不去换了外触发后问题立刻消失。5.2 算法环节常见问题漏检率居高不下时先搞清楚是哪种漏检如果是固定类型的缺陷漏检回到成像端找原因大概率是这类型缺陷没有被拍出来。如果是随机位置的漏检检查算法阈值是否过严、候选区域是否被滤波误去除。如果是边缘位置漏检检查打光均匀性边缘区域光照可能不足。过检率爆表的时候别急着调算法。先到现场看看产品状态是不是表面粉尘太多是不是上工序留下了油污是不是环境光线有干扰很多时候你花三天调算法不如跟产线沟通一下让上工序的把清洁做干净点过检问题立即缓解大半。5.3 深度学习训练中的坑样本不平衡某类缺陷只占总缺陷的 1%模型基本学不到。对策是过采样、合成样本、或用 focal loss 等损失函数强化难样本学习。训练和部署环境不一致实验室用的是 PyTorch 的 GPU 推理现场用的却是 ONNX 转换后的 CPU 推理精度和速度都会有差异。建议从项目开始就用与部署一致的推理框架做验证。模型漂移产线运行几个月后可能因为产品工艺变化导致检测性能下降。要建立模型定期评估机制收集新样本重新训练而不是训一次用三年。标注质量参差不齐标注边界不一致会让模型学偏。一定要把标注规范写清楚——哪些算缺陷、哪些不算、边界在哪里并抽检标注一致性。5.4 一条非常实用的排查路径建议当检测系统出现问题时我建议从图像→算法→软件→硬件这个顺序排查不要跳步。先看图像本身如果图像里缺陷根本不明显那就是成像问题如果图像中缺陷清晰但系统还是漏检那才是算法问题如果算法输出正确但结果没传到 PLC那是通信或软件逻辑问题如果一切正常但产线就是有不良品流出那可能是检测节拍和产线节拍不匹配。这个排查路径看起来只是常识但能帮你省下大量瞎折腾的时间。写在最后的经验做了这些年机器视觉项目最大的体会是缺陷检测不是一个纯技术问题它是一个光学算法工程三脚凳任何一条腿短了都站不稳。很多团队一上来就闷头调算法结果发现瓶颈在成像也有团队把成本全砸在高端相机上忽略了光源设计。真正做好一个缺陷检测项目你的主要精力应该放在理解工艺、设计方案、稳定成像这些环节上算法反而是其中最标准化的一步。另外一个非常重要的软技能是跟产线人员沟通。搞视觉的人如果只盯着电脑屏幕上的图像参数不跟产线操作工聊几句你永远不会知道今天上午设备刚换过耗材表面状态和昨天不一样这种关键信息。理解产线的实时变化往往决定了你的检测系统是真的能跑还是只在验收那天能跑。缺陷检测这个方向说难也难说简单也简单。难在场景碎片化——玻璃、金属、塑料、布匹各有个性简单在核心逻辑始终没变——让缺陷在图像里看得见、让算法认得出、让系统扛得住。把这三件事都做到位一个项目基本就成了。希望这篇文章能帮你在入坑之前把路看清少走几步弯路。