ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

机器视觉工业缺陷检测:算法与库选型、调参及工程落地实战

机器视觉工业缺陷检测:算法与库选型、调参及工程落地实战 机器视觉工业缺陷检测这个系列写到第四篇前面聊过光源、镜头、相机和标定这一篇绕不开真正决定检出率的那一层——算法和库。说实话硬件搭好只是把看清楚这件事解决了能不能把缺陷认出来全靠算法这一关。我做过几个产线项目最深的感受是同样的相机同样的光源换一套算法方案漏检率能从百分之三掉到千分之三也能反过来从千分之三飙到百分之五。所以这篇不打算罗列名词而是按我拿到一个检测需求后怎么选算法、怎么选库、怎么调参、怎么踩坑这条线来讲适合刚入行想系统梳理机器视觉算法与库的工程师也适合做了几年但一直在用单一套路的同行参考。1. 从产线需求倒推算法选型先搞清楚问题类型1.1 缺陷检测的四大任务类型工业缺陷检测看起来五花八门但落到算法任务上其实就四类。第一类是分类任务判断这张图里有没有缺陷输出是良品/不良品比如注塑件表面有没有黑点。第二类是检测任务不仅要判断有没有还要框出缺陷的位置和大小比如PCB板上的焊点缺失需要知道是哪一个焊点出了问题。第三类是分割任务需要精确到像素级轮廓比如划痕的长度、面积、走向这时候框已经不够用了。第四类是测量任务本质是判断尺寸、距离、角度是否在公差带内比如玻璃盖板的边缘崩缺宽度。这四类任务对应的算法选型差别非常大。分类任务用卷积神经网络最省事检测任务要用到区域提议或者无锚框的思路分割任务要考虑像素级标注成本测量任务很多时候传统算法反而更稳。我见过不少团队一上来就上深度学习结果一个本来用形态学加卡尺就能解决的尺寸测量硬是训了个分割模型标注花了两周推理速度还上不去。所以第一步永远是问自己我到底要输出什么信息。1.2 算法选型的三个硬约束选算法不能只看精度产线上有三个硬约束绕不开。第一是节拍产线跑多快决定了单张图的处理时间上限比如每分钟 300 件那单件处理时间就只有 200 毫秒扣掉通信和 IO留给算法的时间可能不到 100 毫秒。第二是样本量深度学习再强也怕样本少缺陷样本往往是最难收集的一个新产品上线可能只有几十张缺陷图这种时候上大模型就是给自己找麻烦。第三是可解释性与可维护性传统算法的每个参数都能说清楚为什么深度学习给个置信度 0.87 你很难跟产线师傅解释它为什么判不良。这三条约束经常互相打架。精度要求高、样本又少、节拍还快这种组合最常见也最难。我的经验是先用传统算法把能解的 80% 解掉剩下真正难的那 20% 再用深度学习兜底。这样既控制了节拍又降低了对样本量的依赖维护起来也清晰。1.3 一个反常识的点像素精度不是越高越好网上经常有人问机器视觉动了什么会导致像素精度变化这个问题其实指向一个误区。很多人以为相机分辨率越高、像素精度越高检测效果就越好。实际不是。像素精度太高单个缺陷占的像素数变多处理时间成倍上涨同时镜头畸变、景深不足带来的误差会被放大。我做过一个金属表面划痕检测换成 2000 万像素相机后反而因为景深太浅稍微不平的表面就虚焦检出率下降了。合理的做法是根据最小缺陷尺寸反推需要的像素精度一般要求最小缺陷至少覆盖 3 到 5 个像素留出算法处理余量。这个计算在选型阶段就要做掉不要等算法调不动了才发现是硬件给多了或者给少了。2. 传统视觉算法轻量、快、可解释但边界在哪2.1 模板匹配与差分法模板匹配是工业视觉里最经典的一招核心思路是拿一张标准良品图当模板待测图和它对齐后做差分差值超过阈值的区域就是疑似缺陷。这种方法在背景稳定、光照可控、缺陷对比度高的场景下效果极好比如印刷字符的缺失检测、瓶盖的定位检测处理速度能做到几毫秒一张。但它有两个致命限制。一是对位精度要求极高产品稍微偏一点、转一点差分图就全是噪声所以通常要在匹配前先做定位用形状匹配或者特征点匹配把姿态对齐。二是对光照和产品本身变化敏感同一批产品表面纹理略有差异模板匹配就会误报。我的做法是在差分前加一层配准配准用形状模板差分阈值不用固定值而用自适应阈值按局部区域的灰度均值和方差动态算。注意模板匹配的模板一定要覆盖产品的正常变异范围最好用多张良品的平均值做模板而不是随便挑一张。单张模板会把那一张的个体差异当成缺陷。2.2 边缘与轮廓类算法边缘检测和轮廓分析适合尺寸测量和形状缺陷。Canny、Sobel 这些算子大家都不陌生工业里常用的其实是亚像素边缘提取因为普通边缘检测精度只有整像素压不住高精度测量场景。亚像素边缘的思路是在边缘附近用灰度梯度做插值把边缘位置细化到 0.1 像素甚至更高。拿到亚像素边缘点之后再用最小二乘拟合直线、圆、椭圆就能算出尺寸、圆度、直线度。这类算法在轴承、齿轮、连接器检测里用得最多。我个人偏好用卡尺工具的思路在垂直于边缘的方向上取一条窄带对窄带内的灰度做投影求极值点这样抗噪能力比全局边缘检测强很多参数也好调基本就一个极性加一个阈值。2.3 Blob 分析与频域方法Blob 分析说白了就是连通域分析把二值化后的区域按面积、圆度、长宽比等特征筛选出来。它的价值在于把有没有变成是什么形状。比如检测表面麻点先做背景校正再阈值分割得到一堆小连通域然后按面积和圆度筛出真正的麻点。参数选得好处理速度非常快。频域方法用得相对少但在周期性纹理缺陷检测上有一手。比如织物、金属网这类有规律纹理的产品正常纹理在频谱上表现为特定位置的峰值缺陷会打破这种规律通过傅里叶变换后分析频谱异常就能把缺陷找出来。这个方法难点在于频谱解读门槛高调参不直观所以我一般只在纹理类产品上用它。提示Blob 分析之前的背景校正很关键工业现场光照不均匀是常态用高帽变换或者同态滤波先把背景拉平二值化阈值就能稳住否则同一个阈值在不同区域表现完全不一样。2.4 传统算法的参数调试经验传统算法的坑基本都在参数上。我的习惯是把参数分成三类结构参数、阈值参数、后处理参数。结构参数决定算法框架比如用多大的卷积核、取多宽的卡尺带这类参数一旦定了就很少频繁改。阈值参数最关键包括二值化阈值、边缘阈值、面积阈值这类参数必须结合灰度直方图来定不能拍脑袋。后处理参数包括形态学操作、连通域筛选条件用来清掉噪声。调参顺序上我一般从图像预处理开始把对比度、背景尽可能拉一致再调分割阈值最后调后处理。很多人跳过预处理直接调阈值结果阈值怎么调都不对其实是上层图像质量没打好底。还有一点参数一定要在至少 50 张良品和 50 张不良品上验证单张图上调好的参数几乎必然在批量上翻车。3. 深度学习算法分类、检测、分割三条路线怎么选3.1 分类网络解决有没有当缺陷形态多变、传统算法写不出稳定规则时分类网络是最容易上手的选择。输入一张裁剪好的产品图输出良品概率和不良品概率。常用的骨干网络从轻量的 MobileNet、ShuffleNet 到精度更高的 ResNet、EfficientNet 都有工业上还常改造一些 Transformer 结构来提升对复杂纹理的判别力。分类网络的关键不在网络多深而在输入图怎么裁、数据怎么造。工业缺陷往往只占图像很小一块直接整图送进去缺陷信息会被背景淹没。我的做法是先做 ROI 定位把可能出现缺陷的区域裁出来再送分类网络这样网络专注于判别准确率往往能提好几个点。数据方面缺陷样本少的情况下旋转、翻转、亮度扰动这些常规增强要做但不能用会破坏缺陷形态的增强比如把划痕方向随机翻转可能会让网络学到错误的特征。3.2 目标检测解决在哪里需要知道缺陷位置时目标检测网络就上场了像 YOLO 系列、Faster R-CNN 这些。工业场景里我更倾向用单阶段检测器虽然精度略低一点但速度优势明显容易满足节拍。检测网络对标注的要求是矩形框比分割标注便宜适合缺陷形状不规则但只需要位置信息的场景。这里有个实际经验工业缺陷的尺度分布往往很集中不像自然图像里物体大小差异那么大。所以可以根据实际缺陷的像素尺寸分布重新设计锚框尺度或者干脆用无锚框的检测思路减少超参数的同时还提升匹配率。另外小缺陷检测一直是难点输入分辨率、特征金字塔的层数、放大倍率都要匹配缺陷尺度这块调不好网络再大也漏检。3.3 语义与实例分割解决是什么形状需要精确轮廓或者面积时就得用分割网络比如 U-Net、DeepLab 这类语义分割或者 Mask R-CNN 这类实例分割。分割网络的优势是能给出像素级结果划痕长度、面积缺陷占比这些指标都能直接算出来。代价是标注成本高一张图可能要标十几分钟。我的应对策略是先用少量精细标注训一个初版模型然后用它去预标注人工只做修正这样迭代几轮下来标注效率能翻好几倍。另外分割网络的推理速度普遍偏慢如果节拍紧要么缩小输入尺寸要么把分割降级成粗定位加传统精修的组合先用分割找到大致区域再用传统算法在里面精确提取边界。3.4 异常检测这条值得单独说说的路子工业上有一类场景很尴尬缺陷样本极少甚至只有良品样本。这时候监督学习没法训异常检测就派上用场了。思路是只学好品长什么样测试时偏离正常分布的就判为异常。常见做法有基于重建误差的自编码器、基于特征分布建模的方法、以及基于预训练特征加距离度量的方法。这类算法最大的好处是冷启动快产线刚上线只有良品图也能跑起来后续再慢慢补缺陷样本。缺点是误报率通常比监督学习高参数不好调而且对良品样本的多样性要求高——如果训练用的良品全是同一种纹理换个批次就容易误报。我的经验是异常检测适合作为过渡方案或者监督学习的补充手段别指望它一步到位。4. 常用库与工具链盘点从原型到落地4.1 通用图像处理库怎么挑OpenCV是绕不开的传统算法的绝大部分算子它都有文档全、社区大、跨平台做原型验证基本靠它。缺点是部分算子在工业精度上不够比如亚像素精度、工业级的形状匹配需要自己封装或者配合别的工具。而且 OpenCV 版本之间 API 有变动部署时一定要固定版本。Halcon是工业视觉里的老牌商业库形状匹配、亚像素测量、标定这些工业强需求做得非常成熟稳定性好很多产线设备直接用它的算子就能搭出方案。代价是授权费用高代码可移植性差换平台要重写。VisionPro和MIL类似也是商业路线各有擅长领域图纸测量类项目用它们省心很多。选择逻辑很简单传统算法为主、预算紧张、需要跨平台选 OpenCV精度要求高、节拍稳定、能接受授权费选 Halcon 这类商业库。我经常是两者混用OpenCV 做预处理和几何变换Halcon 做高精度匹配和测量。4.2 深度学习框架与推理部署训练侧主流是 PyTorch生态好、调试方便学术界新方法基本都是先出 PyTorch 实现。TensorFlow 在工业部署侧积累深一些老项目还在用。国产的 PaddlePaddle 在工业质检场景里也有不少现成模型和工具中文文档友好值得一看。但训练框架和部署框架往往是两回事。训练用 PyTorch部署用 ONNX 转 TensorRT 或者 OpenVINO这是很常见的组合。TensorRT 在 NVIDIA 平台上的推理加速效果明显OpenVINO 在 Intel 平台CPU、核显上表现好。转换过程中最头疼的是算子不支持一些自定义算子转不过去得手动替换或者自己写插件这个坑在项目早期就要评估别等模型训完了才发现部署不了。注意模型转换后一定要做精度对齐验证用同一批测试图分别跑原模型和转换后模型逐张比对输出差异。有些算子转换后会有微小数值差异累加起来可能导致个别样本判定翻转特别是置信度卡在阈值附近的样本。4.3 点云库与 3D 相关工具涉及 3D 缺陷检测比如高度差、平面度、凹坑深度就离不开点云处理。PCLPoint Cloud Library是点云领域最常用的开源库滤波、配准、分割、特征提取都有入门资料也不少《点云库PCL从入门到精通》这类书可以当手册翻。它的学习曲线有点陡模板编程的报错信息不太友好新手容易卡在编译和依赖上。3D 相机厂商一般会配套自己的 SDK做高度图处理和点云生成。实际项目里我更多是把 3D 数据转成高度图2.5D然后用 2D 的算法思路处理这样开发效率高很多只有真正需要三维几何关系时才动用完整点云算法。3D 这块后续可以单独开一篇细讲这里先点到为止。4.4 那些容易被忽略的辅助库除了核心算法库还有几个东西值得提。NumPy是所有数值计算的地基图像在内存里本质上就是多维数组熟练用 NumPy 做向量化操作性能比 Python 循环快几十倍。SciPy提供滤波、插值、优化等工具做曲线拟合和信号处理很方便。scikit-image在传统图像处理上比 OpenCV 更学术一些一些高级分割和特征算法可以直接调用。通信和工程化方面工业现场多用 TCP/IP、Modbus、Profinet 这类协议和 PLC、机器人通信Python 侧用 socket 或者对应协议库就能接。任务调度和界面用 PyQt 或者 C# 的 WinForm 都行看团队习惯。这些辅助库看着不起眼但真正决定项目能不能顺利交付的往往是这些边角料。5. 算法组合与工程化落地5.1 传统加深度学习的混合流水线我目前最常用的架构是分层处理第一层用传统算法做定位和粗筛把 ROI 抠出来同时过滤掉明显良品减少后续计算量第二层用深度学习做精细判别只对可疑区域推理。这样既保证了节拍又提升了准确率。具体到一个连接器外观检测项目流程是这样的先用形状匹配定位连接器位置和角度做仿射变换把图摆正再用卡尺工具测量几个关键尺寸超差的直接判不良剩下的送分类网络判断端子表面有没有氧化、异物。整个流程单件耗时控制在 80 毫秒以内漏检率千分之二左右。如果全用深度学习单件耗时至少翻三倍还未必更准。5.2 数据、标注与迭代闭环算法能不能持续变好取决于有没有建立数据闭环。我的做法是在产线设备上加一个疑似样本回传机制把置信度处于中间区间、或者人工复判和算法判断不一致的样本自动存下来定期拿去标注、重训。这样模型会随着产线运行越来越贴合实际分布。标注规范一定要提前定死尤其是缺陷边界这种主观性强的判断。不同标注员对同一条划痕的边界理解可能差好几个像素直接导致模型学歪。我的经验是写一份标注手册把每类缺陷的边界定义、最小可标尺寸、多类缺陷重叠时怎么处理都写清楚新标注员上手前先用 20 张图做一致性校验一致率不达标不能正式标。5.3 推理性能与硬件选型推理速度不达标时先别急着换硬件按这个顺序排查模型本身是否过重、输入分辨率是否过大、有没有做量化、推理引擎是否选对。我见过不少项目输入分辨率设成 2048其实缺陷在 512 分辨率下就能看清白白浪费算力。模型剪枝、量化INT8通常能带来两到四倍加速精度损失可控。硬件上边缘端常用 NVIDIA 的 Jetson 系列、Intel 的核显平台、或者专用的推理加速卡。选型时重点关注显存、算力、功耗和散热产线机柜里温度普遍偏高散热没做好推理卡降频节拍就不稳了。另外一定要留足余量按标称算力的 60% 到 70% 来规划别把算力掐着算。6. 常见问题与排查技巧实录6.1 过检与漏检的排查思路漏检和过检是永恒的话题排查时我会按这个顺序走。漏检优先查成像缺陷在图上是否真的可见对比度够不够有没有过曝或者欠曝确认成像没问题后查ROI缺陷是否落在 ROI 内定位有没有跑偏再查算法阈值是不是判太松了最后才怀疑模型能力是不是训练样本里没有这种缺陷。过检则优先查背景干扰有没有反光、灰尘、异物被当成缺陷再查阈值是不是判太紧了。这个顺序很重要因为大多数问题其实出在成像和 ROI而不是算法本身。我遇到过一个项目调了两周算法最后发现是相机镜头前有一层薄油污导致图像整体对比度下降擦一下镜头就好了。6.2 常见问题速查表问题现象可能原因排查与解决同一产品重复检测结果不一致光源波动、触发时序抖动、算法随机性检查光源稳定性加同步触发固定随机种子边缘区域误报多镜头畸变、光照不均、ROI 边缘无有效像素加畸变校正做平场校正ROI 内缩几个像素小缺陷漏检像素精度不足、输入分辨率低、模型感受野过大提高光学放大倍率调整输入尺寸改小卷积核推理速度忽快忽慢硬件降频、内存分配波动、其他进程抢占检查散热预分配内存隔离推理进程换批次产品后准确率骤降产品外观变化、来料差异、模型过拟合旧分布补充新批次样本重训检查来料一致性模型转换后精度变差算子数值差异、量化误差逐层比对输出改用高精度量化或替换算子这张表是我这几年攒下来的基本覆盖了八成以上的现场问题。真正落到项目上把问题现象、原因、解法结构化记录下来比反复翻代码有效得多。6.3 几个容易被忽略的实操心得第一算法验证要用产线真实数据不要用精心挑选的测试集。实验室里挑出来的图都是理想条件产线上光照抖动、来料差异、震动带来的模糊都得考虑进去。我一般会连续采集一整班次的数据做验证这样才看得出真实表现。第二日志和中间结果一定要存。算法判不良时把原图、ROI 图、中间处理结果、最终判定都存下来出了问题能回溯。我吃过这个亏一个项目上线后偶发误判因为没有存中间图只能靠猜浪费了大量时间。第三别迷信单一指标。检出率高不代表好用如果过检率也高产线会被人工复判拖垮。评估时至少看四个指标漏检率、过检率、处理耗时、稳定性。稳定性尤其重要一个平均值达标但方差大的方案产线上就是灾难。第四也是我最想强调的算法工程师要懂工艺。同一类缺陷在不同工艺条件下表现完全不同不了解前端工序很难判断一个异常到底是缺陷还是正常纹理。多去产线看多跟工艺师傅聊比多读几篇论文有用。系列写到这算法和库这一层算是搭起来了。实际做项目时你会发现没有哪个库是万能的也没有哪种算法能通吃所有缺陷。把传统算法的稳定可控和深度学习的泛化能力结合起来按场景灵活取舍才是工业缺陷检测最务实的路子。我个人的体会是先把手上的问题拆清楚再去选工具顺序反了再好的库也救不了方案。
返回列表