前阵子我蹲在某轴承厂的生产现场看了整整三天,印象最深的不是自动化装配线,而是保持架终检工位。那位师傅每两三秒就要判断一只浪形保持架有没有缺球、有没有歪铆、兜孔边缘是不是带了毛刺,一天下来七八千只,赶上订单旺季还得加夜班。这不是态度问题,是人的生理极限问题——连续盯着金属反光件两小时,眼睛就会开始投降。后来我把工业相机加机器视觉软件这套组合真正搬进产线,做完轴承保持架缺陷检测系统之后,最大的感慨是:机器不是来碾压人的,而是替人守住了一条靠肉眼根本守不住的底线。
这篇文章想聊的,不是宣传片里那种"一键智能"的悬浮概念,而是一套真实可落地的检测方案:成像怎么打光、算法怎么分工、换型和节拍怎么扛住,以及上线之后那些没人提前告诉你的坑。适合正在做视觉集成的工程师,也适合想上自动检测的轴承厂质检负责人——后者可以直接拿这篇文章当需求清单用。
1. 保持架缺陷检测难在哪:先列清楚缺陷清单和光学障碍
1.1 冲压浪形、实体铜保、尼龙保:不同材质各有各的"坏法"
先花点时间把检测对象讲清楚。轴承保持架就是把滚动体隔开并引导它转动的那个"笼子"。常见的有这么几类:
- 冲压浪形保持架,多由薄钢板冲压成型,用于深沟球轴承、圆柱滚子轴承。轻薄、有弹性,制造过程包含冲压、铆接、整形多道工序。缺陷集中在冲压和铆接环节:缺球、兜孔欠冲、兜孔边缘毛刺披锋、铆钉头偏、铆接开裂、冲压划伤。
- 实体铜保持架,多用于中大型轴承或高转速场合,靠车削、钻削加工出来。缺陷主要是兜孔尺寸超差、孔壁裂纹、气孔砂眼、崩边,还有车削刀纹过深。
- 尼龙保持架,注塑成型,表面纹理不规则。缺陷多为缺料、缩水、飞边、断裂,混料问题也很头疼——不同牌号尼龙在图像灰度上的差别很小。
为什么要把材质分类讲这么细?因为视觉检测的第一前提是"缺陷定义"。开发软件之前必须跟客户把缺陷清单一条条确认清楚,否则后面调算法就是无底洞。而且不同材质的光学特性完全不同:冲压钢带表面有一层冲压油,油膜和指纹会形成假缺陷;车削铜保持架有间距细密的刀纹,刀纹和裂纹在图像里极易混淆;尼龙件表面是漫反射,对光源的要求和金属件完全不一样。同一个方案不可能通吃,这是很多新入行的朋友容易踩的第一个坑。
1.2 典型缺陷清单与视觉检测难度速查
把常见缺陷列成一张表,团队内部对齐用,比开会争论高效得多。
| 缺陷类型 | 形成环节 | 视觉表现 | 检测难度 |
|---|---|---|---|
| 缺球 | 装配漏装 | 兜孔区域内容缺失,灰度异常 | 中等,但易被遮挡 |
| 兜孔欠冲/变形 | 冲压模具磨损 | 兜孔轮廓与标准差异 | 中等,需做轮廓比对 |
| 铆钉偏头/开裂 | 铆接参数漂移 | 铆钉头位置偏移、出现裂纹线 | 偏难,细节尺寸小 |
| 毛刺披锋 | 冲压刃口钝化 | 边缘亮斑或细线凸起 | 难,强反光下极易看不清 |
| 划伤压伤 | 转运碰撞、掉料 | 随机位置的条状或点状灰阶异常 | 难,位置不固定 |
| 混料 | 原材料管理失误 | 表面灰度、纹理与标准件略有差异 | 难,依赖打光方案 |
这张表也是后面所有技术选型的依据。比如毛刺和划伤是高频缺陷,所以打光和算法要优先照顾这两个对象;混料虽然出现频率低,但一旦发生就是批次问题,必须要有专门的处理策略。
1.3 人工目检的极限:节拍、疲劳与漏检的三角困局
保持架检测之所以长期依赖人工,是因为它结构复杂、缺陷种类多,自动化不是不想上,是没人敢保证能看全。但人工目检的账是可以算出来的:节拍两秒一件,八小时就是上万件。眼睛在高反光、小目标、多缺陷类型的三重压力下,有效专注时间通常不到两个小时。车间里的真实漏检率浮动很大,平时可能千分之几,一旦疲劳累积或光线变化,漏检率会明显抬头。
更麻烦的是人工检测存在主观不一致。同一个缺陷,早班师傅认为要返工,晚班师傅可能觉得"能过"。客户投诉一多,质检主管往往倾向于卡严,结果误杀率也上去了,合格品被当成废品扔掉,成本照样损失。这正是工业相机和机器视觉软件切入的最佳位置:检测标准一致、数据可追溯、而且不会疲劳。但要把这套系统做好,先得承认前面讲的光学障碍——下面进入成像系统选型。
2. 成像方案选型:把穹顶光、低角度光、相机分辨率一次算明白
2.1 金属反光与毛刺检测:穹顶光和低角度环形光的配合
做金属件视觉检测的新手,最典型的表现是拿一支环形光源怼上去,然后拍出来的图一片惨白。冲压保持架是高反光曲面,普通环形光直接打过去,高光区域完全饱和,兜孔边缘的毛刺就藏在最亮的那一圈里,相机根本分不出来。
实际项目里我用的组合是"主光加副光":主光用穹顶光源,也叫圆顶光源或积分球光源,光线经过漫反射涂层多次散射后变得非常均匀,能把金属件大面积高光抹平,得到一个干净的灰色背景;副光用低角度环形光,从接近水平的角度斜射过去,让毛刺、压痕这类微小起伏产生小而亮的特征点。两路光分时点亮,相机分别曝光出两张图:一张看整体轮廓和表面污渍,一张专门找毛刺和微小压伤。两张图既可以合并成一个检测流程,也可以独立跑各自的算法,最后取并集判定。
这里要提醒一句:光源的安装高度和角度不是拍脑袋定的。低角度光源离工件越远,入射角越平,对凸起越敏感,但照度下降也快。现场要用标准缺陷件反复扫角度,找到一个"背景稳定、缺陷突出"的甜点区,再锁死机械位置。我见过有人为了省事把光源角度随手一摆,结果检测系统上线后毛刺漏检率居高不下,最后排查半天才发现是光源角度偏了不到五度。
2.2 分辨率怎么算:一个公式帮你选出够用的像素
相机分辨率不是越高越好,而是"够用就好"。按我习惯的经验公式:
假设最小缺陷尺寸为 d,检测视野为 FOV,要求缺陷在图像上至少占 3 个像素才算可靠,那么分辨率至少需要:
分辨率 = FOV / d × 3
举个例子:要检出的最小毛刺是 0.1mm,保持架最大外径约 60mm,视野放宽到 80mm。代入公式就是 80 / 0.1 × 3 = 2400 像素。选一台 500 万像素(2448×2048)的相机,长边方向足够,还有不少余量。如果对 3 像素的宽容度不放心,可以提高到 4 到 5 像素,对应选 1200 万像素。
这个公式的底层逻辑是:缺陷再小,也必须跨过数字化采样的门槛。1 个像素能成像,但灰度变化只有一级,算法根本不敢下结论;至少 3 个像素才能形成中心亮、边缘暗的稳定特征。很多项目翻车就是因为拍出了"看起来很清楚、但实际只有 1.5 个像素"的伪清晰图,放大后全是锯齿。
像素选高了也有麻烦:图像文件大、传输慢、处理耗时长。1200 万像素的灰度图,一张就是 12MB,如果每个节拍拍 4 张,那就是 48MB 的数据量,处理时间明显增加。机器视觉软件的性能瓶颈往往不在算法,而在 I/O 和内存拷贝。
2.3 别忘了接口和快门:节拍约束藏在细节里
相机接口的选择和节拍强相关。GigE Vision 接口是目前的绝对主流,千兆带宽,传输一张 500 万像素灰度图大概几十毫秒,而且线缆可以做到几十米,布线方便;USB3 Vision 短距离小成本,适合桌面式检测台;如果现场节拍非常快,比如每秒检测好几件,再考虑万兆网卡或 Camera Link 这类高速接口,不过成本会显著上升,普通轴承检测项目一般用不到。
| 接口类型 | 带宽与特点 | 适合场景 |
|---|---|---|
| GigE Vision | 千兆、长线、可供电 | 产线离散工位,性价比最高 |
| USB3 Vision | 高带宽、短线、成本低 | 桌面式、小视野 |
| 10GigE / Camera Link | 超高带宽、成本高 | 高速多相机系统 |
另一个容易忽视的细节是快门方式。运动中的工件若用卷帘快门相机,会拍出"果冻效应"般的拖影,边缘拟合精度直接崩掉。所以只要工件不是完全静止,尽量选全局快门。别小看这个点,我调试过一个项目,换用全局快门相机后,外径测量重复性稳定提升了一个数量级。
3. 软件算法怎么组织:定位、极坐标展开、差分与深度学习协作
3.1 定位和极坐标展开:解决圆周均布件"转了一个角度"的难题
保持架是圆周对称的零件,放进检测工装时它的角向姿态是随机的。如果直接用直角坐标图去比,同一个保持架转个 10 度,图像内容就完全不同,模板匹配会非常吃力。处理这类零件有一个非常成熟的套路。
第一步,用基于边缘的形状匹配找到保持架中心点和角向角度。为什么用边缘形状而不是灰度模板?因为金属反光导致灰度不稳定,但轮廓是稳定的。
第二步,把角度归零,将图像绕中心点旋转到标准姿态。
第三步,做极坐标展开——简单说,就是把环形区域从"一圈"剪开拉平成"一条"。兜孔分布从圆周变成竖直排列的周期条带,后续检测算法完全不需要学习旋转变换,只需要在拉平后的图像上做周期性分析。
极坐标展开还有一个额外好处:尺寸测量更直观。比如兜孔中心圆直径在直角坐标里是一条圆弧,展开后变成一条直线,用直线拟合就能测;相邻兜孔的等分角度在展开图里变成水平方向上的等间距,可以通过频谱分析快速判断有没有周向不均匀。
3.2 传统视觉算法管哪些:尺寸拟合、Blob 和规则判断
在整套软件里,传统算法仍然是绝对主力,它的强项是快、稳定、可解释。
第一类任务是几何测量。用亚像素边缘提取找出兜孔轮廓、保持架内外圆轮廓,然后拟合圆、拟合直线,算出外径、内径、节圆直径、兜孔宽度等尺寸,和图纸公差做比对。亚像素精度一般能做到 1/5 到 1/10 像素,对 0.1mm 级公差完全够用。
第二类任务是 Blob 分析。适合检测缺球、缺料、明显压伤、大面积油污这类直接把图像区域改变的目标。做法是预处理后,用连通域算法找出所有灰度异常的区域,再看每个区域的面积、长宽比、圆度等特征是否超限。
第三类任务是规则逻辑。比如判断某个保持架的兜孔数量是否正确、铆钉点是否存在、圆周上是否存在周期性缺失。这些任务用"计数加坐标比对"几行代码就能完成,可靠性非常高,完全不需要上深度学习。
3.3 深度学习负责什么:低对比度缺陷与"类缺陷"的裁决
有人说现在缺陷检测不上深度学习就落伍了,我不完全同意。但在处理特定难题时,深度学习确实不可替代。
第一类是低对比度缺陷,比如冲压裂纹,可能只在图像里比周围暗了一点,传统阈值分割根本分不出来。
第二类是"类缺陷",比如保持架冲压边缘有自然圆角,圆角的阴影看起来和轻微划伤几乎一样,传统几何规则无法裁决。
第三类是多变的光照和纹理干扰,比如刀纹、拉丝方向不一致时,固定模板的差分法容易误报。
我的做法是把深度学习放在"兜底"位置:传统算法能可靠判断的,绝不让模型去做;传统算法搞不定的,交给语义分割网络做像素级缺陷分割。分割网络比单纯分类网络更好用,因为它在输出缺陷边界的同时,可以顺势输出缺陷面积、位置、方向,方便后续统计。
当然,深度学习的代价很明显:需要标注数据、需要推理硬件、需要持续迭代。所以项目启动阶段宁可先用传统算法把框架跑起来,再逐步把难例交给模型,而不是一上来就全家桶。
3.4 一个可落地的流程演示:从图像到判定结果
下面是一段参考形态的流程演示代码,用 Python 表达思路。
import cv2 import numpy as np def cage_inspect(image, param): # 1. 定位中心与角度(实际项目常用边缘形状匹配,这里用模板匹配示意) match = cv2.matchTemplate(image, param["template"], cv2.TM_CCOEFF_NORMED) _, score, _, center = cv2.minMaxLoc(match) # 2. 旋转归一:让保持架回到标准角度 rotated = rotate_about_center(image, center, -param["angle"]) # 3. 极坐标展开:环形区域拉平成矩形 unwrapped = polar_unwrap(rotated, center, param["r_min"], param["r_max"]) # 4. 与参考图差分,去掉正常周期特征 diff = cv2.absdiff(unwrapped, param["reference_unwrap"]) # 5. 形态学去噪,去掉孤立噪点 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) diff = cv2.morphologyEx(diff, cv2.MORPH_OPEN, kernel) # 6. 找缺陷连通域 _, labels, stats, _ = cv2.connectedComponentsWithStats(diff > param["threshold"]) defects = [s for s in stats[1:] if s[cv2.CC_STAT_AREA] > param["min_area"]] return defects说明一下:上面只是流程演示,真正上线的系统需要把模板匹配替换成基于边缘的多尺度形状匹配,并使用更稳定的极坐标映射函数,但整体思路完全一致。核心就是把复杂的旋转检测问题转换成"定位、展开、比差"三个阶段。
4. 上线后的三座大山:换型、节拍和过杀率的煎熬与对策
4.1 换型十分钟:配方化而不是改代码
轴承厂的产品型号多,保持架规格隔几天就换一个。视觉系统能不能快速切换,往往决定了车间愿不愿意用。有些集成商把每个型号的检测逻辑都写在代码分支里,每上一个新型号就改一次程序,维护量巨大,最后工程师被绑在现场回不了办公室。
正确做法是"配方化"。每个型号对应一条配方记录,包含:光源亮度档位、相机曝光时间和增益、检测区域坐标、缺陷判定阈值、兜孔数量、尺寸公差、极坐标展开半径等。换型时只需调用配方,必要时用离线标定工具微调一次,控制在十分钟内。
我见过一个比较极端的例子:某工厂有六十多种保持架,靠配方化维护,技术人员培训半天就能独立加新型号,现场再也没出现过"等技术员来调"的停工场面。这比写多少行高级逻辑都管用。
4.2 节拍压力下的流程优化:并行处理与异步采集
节拍账要分两边算:硬件动作时间加软件处理时间。比如相机采集 50ms,图像预处理加传统算法 200ms,深度学习推理 300ms,PLC 结果输出加剔除机构动作 300ms,加起来 850ms,放进 2 秒节拍是安全的。
但如果检测项目复杂,要拍多个工位,每张图像的处理时间就可能冲到 1 秒以上。这时不能简单堆硬件,要做流程优化。常用三招:
一是采集与处理异步化。A 相机在拍的时候,B 相机的图像已经在处理,流水线式重叠。
二是把传统算法和深度学习推理拆到不同线程,互不阻塞,主流程只取汇总结果。
三是图像 ROI 裁剪和压缩传输。只传感兴趣区域,减少 I/O 时间,处理完的图再存全图。
这三招叠加,通常能把单件检测时间压掉一半。
4.3 过杀率的第一大敌:油污、指纹、振动与光的漂移
视觉系统上线第一周最容易遇到的问题不是漏检,而是过杀——合格品被大量误判成缺陷,生产线天天响起报警声。现场最常见的原因,按出现频率排一排:
油污和指纹。保持架本身带冲压油,搬运人员手上有汗,一碰就是一枚指纹。
检测工装振动。机械手放料或传送带停顿瞬间,保持架与治具之间有轻微弹跳,对位一偏,边缘附近全是假差异。
光源老化亮度漂移。LED 光源用过半年,亮度明显下降,图像整体变暗,和参考图一比处处是"缺陷"。
应对方式也成体系:检测前加吹气清洁工位;差分前做形态学开运算,把面积小于阈值的亮暗点直接滤掉;对治具加缓冲结构,减少弹跳;光源定期做亮度校准,用标准白板做增益补偿。这个阶段最忌讳的是看到过杀就盲目调阈值,越调越乱。要像析案一样先分类,统计每一类误报的占比,再对症下药。
我把一个项目的过杀率从 15% 压到 3% 以下,用的就是这种"先分类、再归因、后处置"的方法,前前后后花了两周。
4.4 漏检样本的迭代闭环:把每一次返工都变成训练数据
相比过杀,漏检更致命,因为缺陷流到客户端就是质量事故。但漏检不可能一次清零,它需要一套迭代机制。实际运营中我是这样做的:
- 每条缺陷被人工复检确认为"漏检"时,触发存档逻辑:自动保存原图、缺陷坐标、型号批次信息。
- 每周把新确认的漏检样本导出来,打标签后分两类处理:传统算法漏掉的,改进规则或调整参数;深度学习漏掉的,补充进训练集做增量训练。
- 每两周一版模型更新,更新后先在历史样本集上回归验证,防止"修好一个漏检、引入十个过杀"。
举个例子,某项目初期漏检率大概 0.8%,核心问题是对细小裂纹不敏感。经过三轮迭代,针对性补充了三百多张小裂纹样本后,漏检率降到 0.1% 出头,后续基本稳定。别小看这种笨功夫,它能确保检测系统越用越懂产品,而不是越用越"瞎"。
5. 检测数据怎么反哺工艺:从剔除缺陷到预测模具磨损
5.1 检测记录上系统:给 MES 和 SPC 提供数据入口
机器视觉软件在车间里还有个容易被忽略的价值:它天然是一台数据采集器。每次判定结果、每个缺陷的类别、位置、大小、出现时间、对应的型号和批次,都应该被记录下来。软件预留标准接口,输出结构化记录或数据库,与工厂的 MES、SPC 系统对接。
这件事的意义在于,质量人员终于不用靠抽查和纸质报表猜问题。打开系统就能看到:今天哪个型号缺陷比例偏高,集中在哪个时间段,缺陷类型分布有没有变化。数据的颗粒度越细,后续改善才越有的放矢。
5.2 缺陷热图与工艺预警:毛刺角度、缺球工位都能看出来
更进一步,可以把缺陷坐标映射成热图。比如毛刺总是出现在保持架圆周的 120 度到 150 度区间,说明冲压模具的那个区域刃口磨损了;缺球缺陷集中在某几个固定兜孔位置,说明上料机构的对应分度座在周期性卡料;铆接点缺陷突然增多,说明铆接机的压力参数漂了。
这些信号一旦被机器视觉软件变成趋势曲线和位置热图,产线工艺人员就能在缺陷批量发生之前去调模具、清卡料、校参数。检测系统从"被动把关"进化成"主动预警",这才是"革新"两个字最有含金量的部分——它不是把人工换成相机那么简单,而是把质量数据变成了工艺改进的输入。
5.3 数据资产化:把缺陷图库变成公司的长期竞争力
再往下想一步,缺陷图像本身就是资产。一个运行一年的检测系统,会积累几十万张标注过的缺陷图和合格图。这些数据是后续开发新机种、训练新模型、评估新工艺最宝贵的底料。很多厂家意识不到这一点,系统一建好就把历史图像都清掉了,等到要扩产、要召回验证时才发现找不到数据,非常可惜。
归档策略也不复杂:按型号、缺陷类别、时间戳三个维度分类压缩存储,定期备份到服务器;涉及客户投诉的缺陷图像单独打标,形成重点跟踪目录。将来无论换算法、换相机还是做产线复制,这批图库都能让新项目少走一半弯路。
最后再说一点我自己的体会。做视觉检测项目,不要一上来就追"零漏检",那会把自己逼进死胡同。先把不漏真缺陷、过杀可控这两个目标守住,再逐步迭代。项目过程中最大的资产不是算法,也不是相机,而是那些被保留下来的缺陷图像——它们是这套系统越用越聪明的本钱。如果现在要重新做一个保持架检测项目,我还会在方案阶段多留几个相机位置和光源角度,因为现场打光的试错空间,永远比你预想的小。