铝镁合金装配产品视觉检测这个项目,我在产线上啃了小半年,说实话,这类设备最难的不是算法,而是弄清楚“你到底要测什么、怎么测才稳定、产线能不能留出这个工位”。今天就把整套方案从头到尾捋一遍,从项目需求拆解、光学选型、算法实现到现场调试的坑,一次性说清楚,给正在做汽车零部件在线检测或准备上视觉检测设备的朋友一个完整参考。
我当时接到的任务说起来很简单:在一条汽车零部件装配线上,检测铝合金壳体与内部组件的装配质量。产品是铝镁合金材质,包含多个零件组装,检测项包括装配到位、方向是否正确、有无漏装、紧固件是否拧紧到位、外观是否有压伤碰伤等。产线节拍要求不低,工位空间又很小,整条产线是自动化流转,必须在线检测、自动判级、自动分流。这种需求放在整个国内汽车零部件制造里非常典型,解决思路基本可以抽象成一个固定套路,今天我来完整拆解。
1. 项目背景与整体设计思路
1.1 汽车轻量化趋势下的装配检测难题
我接触的这类铝镁合金装配产品,是汽车轻量化大趋势下的典型零件。整车厂为了降油耗、提续航,把大量原来用铸钢、铸铁做的结构件换成了铝合金、镁合金压铸件。铝镁合金重量轻、比强度高,但带来的新问题就是:材料偏软、容易磕碰伤、压铸过程容易产生砂眼、缩孔,而且零件表面状态一致性比机加工件差很多。这就给后续的在线检测增加了很多不确定性。
装配工艺上,铝镁合金零件里面通常要压装、螺纹连接一些钢制嵌件、衬套、密封圈,装配是否到位、是否压偏、是否漏装,直接决定总成件的密封性能和安全性能。这类零部件通常服务于发动机、变速箱、电驱桥等核心总成,一旦漏检流到整车厂,轻则异响、漏油,重则可能引发安全召回。所以整车厂和Tier 1供应商对这类装配质量在线检测设备的认可度很高,投入意愿也强,这也是我敢接这个项目的原因。
项目的核心需求拆解下来,无非三个层面。第一个层面是“有没有”,就是零件有没有漏装,这个靠常规视觉在位检测就能做;第二个层面是“对不对”,方向有没有放反、规格有没有装错,这个需要模板匹配或深度学习分类;第三个层面是“好不好”,装配到位距离、紧固件扭矩特征、密封圈是否扭曲割伤等,这些必须靠高精度几何测量和打光方案去实现。真正难的是第三个层面。
1.2 在线检测工位设计中最容易被低估的三件事
做这个项目之前,我一直强调一句话:视觉检测项目失败,一半以上不是算法不行,是前期方案设计出了问题。在线检测尤其如此,因为它不是实验室里随意摆放相机,而是要嵌入到一条自动化产线里,满足节拍、满足环境、满足和PLC的通讯握手逻辑。我总结初期最容易低估的三件事,供大家设计时参考。
第一是工位空间。很多产线是后期改造加装视觉检测设备,原有线体根本没有预留检测位。我这次项目里,检测工位大概只有700mm长的空档,上下左右全是其他设备。空间受限意味着相机布置、光源安装、传感器支架都要最大化利用有限区域,稍不注意就会出现装不上、光路被遮挡、维护空间不足的情况。设计前一定要拿产线3D模型做干涉检查,别到了现场再发现装不进去。
第二是节拍。视觉检测不是按下快门瞬间就完事,还包括触发延迟、图像采集、算法处理、结果输出、PLC分流几个环节。很多项目死在“一算节拍发现比预想多了0.5秒”上。这里建议提前用一个严谨公式估算:单件检测周期 = 触发响应时间 + 曝光时间 + 图像传输时间 + 算法处理时间 + 通讯输出时间。把所有时间加起来,再乘以1.2的安全系数,看是否满足产线要求。我这次项目理论检测周期约1.8秒,实际现场稳定运行做到了约2.1秒,产线节拍要求2.5秒一件,留有余量。
第三是环境适应性。汽车零部件产线虽然比焊接、铸造线干净,但仍有切削液、防锈油、粉尘、振动等因素干扰。铝镁合金产品表面常常有残留脱模剂或防锈油,呈现不均匀反光,这会直接干扰图像特征提取。光学方案设计时必须把材质反光特性、油污干扰、环境杂散光全部考虑进去,并在方案阶段做验证,不能等到现场装完才发现图像不稳定。
2. 硬件方案设计与关键部件选型
2.1 铝镁合金材质的成像特性与打光难点
铝镁合金压铸件和普通钢件的成像特性差别很大,光源选型必须针对材质特性来做。我用实际数据说明一下,铝合金压铸件表面粗糙度一般在Ra 3.2-Ra 6.3之间,局部机加工面则达到Ra 0.8-1.6;铝本身对可见光的反射率很高,大概在80%-90%之间,而且属于漫反射和镜面反射共存的不均匀表面。这意味着如果直接用普通条形光以某个角度照射,图像里就会出现大片过曝区域和死黑区域,边缘信息严重丢失,给后续算法带来极大麻烦。
这类材料检测,最常见的打光策略是把光源分成两大类:亮场照明和暗场照明。亮场照明让反射光直接进入相机,装配孔、定位销、凸台轮廓会比较清晰,适合做几何尺寸测量和特征存在性判定;暗场照明让大部分镜面反射光被排除在相机视野外,只有高低起伏、划痕、凹坑等缺陷位置才会散射光线进入相机,适合表面缺陷检测。
我在这个项目里两种光源都用了。下面是项目中针对不同检测项的光源配置,供参考。
| 检测项目 | 光源类型 | 照射方式 | 核心作用 |
|---|---|---|---|
| 装配到位与方向判定 | 高亮漫射条形光 | 低角度环形照射 | 均匀照亮轮廓,消除强反光 |
| 紧固件有无及拧紧状态 | 同轴光 | 垂直照射 | 避免螺纹反光造成的误判 |
| 表面压伤、磕碰伤 | 低角度条形光 | 暗场照射 | 凸显凹凸缺陷,表面不平整处亮度突变 |
| 密封圈在位检测 | 环形无影光源 | 穹顶漫射 | 消除弧形表面反光干扰 |
2.2 相机与镜头选型的实际计算过程
相机选型我这里直接给经验值,同时讲明白为什么这么选。检测视场大约在180mm×140mm左右,最小检测特征尺寸设计为0.3mm的磕碰伤和0.2mm的装配缝隙异常。按照机器视觉的工程惯例,为了稳定检测,最小特征在图像上至少要覆盖3-5个像素,我按4个像素设计。
分辨率计算公式很简单:相机水平分辨率 = 视场宽度 / 最小特征尺寸 × 每特征像素数。代入数据为180mm / 0.3mm × 4 = 2400像素。垂直方向为140mm / 0.3mm × 4 ≈ 1867像素。因此选型至少需要2400×1800像素级别的相机。考虑到产线振动和运动模糊风险,我最终选了一台500万像素的面阵工业相机,分辨率2448×2048,使用GigE接口走网线传输,稳定性和兼容性都成熟。
镜头方面,根据相机靶面尺寸、工作距离和视场要求,估算焦距。我用的相机靶面对角线约为11mm,工作距离大约在300-350mm,视场宽度180mm,焦距等于工作距离乘以靶面宽度除以视场宽度,即 340mm × 8.8mm / 180mm ≈ 16.6mm。所以我选择了16mm定焦工业镜头,光圈调节到F8-F11之间,保证景深覆盖零件的装配高度差。这里有一点要注意,铝镁合金零件表面并不是平整的,装配后的高度差可能达到十几毫米,光圈太小会进光不足,光圈太大景深不够,F8一般在常规打光下都能兼顾。
关于运动模糊,产线上产品不是停着不动的,有一种方案是飞拍,相机在运动中抓拍,有一种是到位后停止拍照。我建议这个项目用到位停止方案,可靠性最高,但是对PLC控制要求高,必须等产品完全静止并且给出触发后才曝光,否则哪怕1mm/s的微小移动,曝光时间超过2ms也会造成图像模糊。实际测试下来,我设置曝光时间为1ms,再配合外部硬触发,基本消除了运动模糊问题。
2.3 有限空间作业下的机械布局与干涉规避
这次项目的检测工位是典型的有限空间作业场景,整个视觉检测系统要被嵌在长约700mm的滚道段内,相机的Z轴方向可用高度大约500mm,左右两侧还有拧紧机的立柱挡着。空间非常紧张,这是我做了这么多项目里比较典型的“螺蛳壳里做道场”。
我采用的方案是将视觉系统分成三个独立单元挂在滚道上方的一个铝型材框架上。第一套相机垂直向下,配合同轴光,拍壳体上的紧固件和装配面;第二套相机倾斜约30度,配条形光源,专门检测侧面的密封圈和配合缝隙;第三套相机安装在滚道侧面,暗场照明,用来扫产品外表面压伤和磕碰伤。三套相机之间间距控制在150mm左右,保证光源之间的杂散光不会互相干扰。安装时还专门加了遮光罩,把外部环境光和相邻工位闪光灯的影响全部隔离开。
有个很实用的经验是,在方案设计阶段就用CAD把检测工位的所有干涉物都画出来,包括气管、线槽、传感器支架,甚至要考虑维护人员的操作空间。如果铝型材框架距离防护罩太近,后期检修时手都伸不进去,换光源和镜头会非常痛苦。我见过太多项目死在“设计时觉得能用,现场装完发现没法维护”这个细节上。
3. 检测算法与模型构建的核心实现
3.1 多检测项融合判定框架设计
硬件搭好之后,就轮到核心的算法逻辑。我的经验是先画一张检测流程图,把每个检测项、对应的图像工具、触发条件、判定规则全部列清楚,再开始写代码。这种多检测项的在线视觉检测项目,最忌讳的就是每个检测项各写一段独立代码,互不相通,后期维护和参数调整会让人崩溃。
整个框架分三层。第一层是图像采集层,负责从三个相机分别抓图,并做必要的图像预处理。第二层是特征提取层,针对不同检测项调用不同的视觉工具,包括灰度匹配、轮廓定位、边缘查找、Blob分析、以及基于深度学习的缺陷分类模型。第三层是逻辑判定层,综合所有单检测项结果,输出最终OK或NG,并记录每个项的具体量化数值。
这里要强调一个思路,同一张图可以复用多次。比如说垂直相机拍的图,既用来定位壳体主特征,又用来检测紧固件是否装配到位,还用来检测内腔有无异物残留。这些检测任务在一个图像上做多次ROI提取,而不是重新触发拍三次。这样可以大幅压缩算法处理时间,对整个系统节拍是有很大帮助的。
下面是项目中检测项与算法工具的对应关系,我花了很长时间才把这张表打磨到最优。重点关注紧固件检测,这是汽车安全件最容易出问题的地方。
| 检测项 | 核心算法工具 | 关键参数/阈值 | 备注 |
|---|---|---|---|
| 主定位 | 基于边缘特征的模板匹配 | 匹配分数≥0.85;角度范围±3° | 保证后续ROI跟随精度 |
| 装配到位距离 | 边缘对测量 | 距离公差±0.5mm | 基于标定像素当量换算 |
| 紧固件有无 | Blob分析与深度学习分类 | 置信度≥0.95 | 有无及拧紧状态综合判定 |
| 方向判定 | 自研特征向量比对 | 方向偏差≤5° | 结合产品非对称特征 |
| 表面压伤/磕碰伤 | 基于视觉检测的深度学习模型构建 | 交并比≥0.5且置信度≥0.8 | 需要建故障样本库 |
3.2 传统视觉算法与深度学习的混合使用策略
在做这个项目的过程中,我对“要不要上深度学习”这个问题有了更深的理解。如果整个检测系统全部用传统算法,紧固件装配状态和表面缺陷的检测很难达到理想的准确率;如果全部用深度学习模型,又会带来样本量大、训练周期长、硬件投入高、过杀和漏检难以归因的问题。最合理的方式是混合使用。
我们项目中,壳体定位、装配到位距离测量、边缘查找这些几何特征明显的检测项,全部用传统视觉算法实现。原因是这些检测项规律性强,用边缘提取和几何拟合又快又准,而且算法的可解释性强,现场工程师能够根据数据调参。像表面划痕、压伤、磕碰伤这类缺陷形态随机、没有固定几何规律的检测项,传统算法用阈值分割很容易误判。
紧固件检测我用了一个小技巧:先通过灰度形态学操作定位螺栓头位置,再用局部梯度特征判断梅花槽是否完整,同时提取一个紧固区域图像块输入到一个轻量级分类网络,最后综合物理特征和CNN分类结果给出结论。这个轻量级分类网络基于视觉检测的深度学习模型构建,结构不复杂,只包含4个卷积层和2个全连接层,参数量在百万级,单张图推理时间在30ms左右,在普通工控机上即可运行,不需要专门配GPU。实际测试下来,对“正常拧紧”“未拧到位”“漏装螺栓”“螺栓头滑丝”四类状态的分类准确率达到了99.2%,远高于之前单用传统算法的95%左右。
这里有个关键认知:深度学习模型不是越深越大越好,部署在工业产线上的轻量级模型往往比超大型模型更实用。工业场景检测项明确,数据分布相对集中,只要采集到足够多的特征性样本,一个浅层CNN已经完全够用。很多公司一上来就用ResNet152这种大模型,训练慢、推理慢,还容易在类似缺陷之间过拟合,完全没有必要。
3.3 深度学习模型的样本采集、标注与迭代闭环
深度学习模型的成功80%靠数据,20%靠模型调优,这个比例在工业视觉项目里尤其适用。我们在项目推进过程中积累了一套标准的样本采集和模型迭代流程,在这里完整分享。
第一阶段是样本采集。正常情况下,产线上合格品占绝大多数,缺陷品很少,光靠自然流出的缺陷样本完全不够训练。我的做法是,项目初期在产线上持续运行设备运行一个星期,把所有检测为疑似NG的图像全部自动保存下来,同时安排质检员人工复核,给每张图像打上真实标签。这种做法能积累大约2000-3000张真实图像。然后再专门去现场制造部分典型缺陷样件,比如用工具敲出压伤、划伤,用人工方式模拟漏装、歪斜安装,把这部分图像也采集进来,最终形成一个包含真实缺陷与模拟缺陷的样本库。
第二阶段是标注与数据集划分。标注工作一定要让懂产品工艺的人来做,单纯外包标注会导致大量误标。每个缺陷类别标注为带旋转角度的最小外接矩形框。数据集按6:2:2划分为训练集、验证集、测试集,保证测试集里包含模型从未见过的图像,防止“考自己背过的题”。
第三阶段是模型训练评估与现场试运行。几个关键评价指标,我建议重点看误检率、漏检率和平均响应时间。我们的表面缺陷检测模型训练了1200次迭代后,验证集准确率稳定在97%左右,测试集准确率约96%,基本达到可用状态。但要注意,实验室指标再好,到产线上还是会掉点,因为环境光、产品批次变化会造成数据漂移,所以必须留出现场试运行阶段用于持续调优。
| 评估指标 | 实验室指标 | 现场试运行实际指标 | 说明 |
|---|---|---|---|
| 分类准确率 | 97.8% | 96.5% | 现场光照和产品批次差异导致下降 |
| 漏检率 | 1.5% | 2.1% | 仍低于客户要求的3%上限 |
| 过杀率 | 2.2% | 2.8% | 在可接受范围内,且保留人工复判 |
| 单张推理时间 | 28ms | 32ms | 工业计算机CPU负载波动导致小幅上升 |
训练过程我用的是PyTorch框架,训练脚本管理得当,切换不同的数据集版本可以快速重用。在线检测环节使用ONNX Runtime部署,极大简化了运行环境的复杂度,工业现场也不需要配Anaconda这类重型Python生态,稳定性更高。这里也提醒一句,工业场景里尽量少依赖开源库的在线下载和临时更新,所有推理库必须离线打包,避免现场网络不稳定导致服务起不来。
4. 在线检测节拍与产线集成调试
4.1 视觉系统与产线PLC的交互逻辑设计
视觉检测设备不是独立存在的,必须和产线的PLC无缝对接。这次项目用的通讯方式是工业以太网加硬IO信号的双重结合。PLC通过硬接线IO向视觉控制器发送触发信号和多路区域信号,视觉系统检测完成后,通过IO输出OK、NG信号,同时通过TCP/IP协议向MES系统发送检测数据和图像结果,实现产品质量的全流程追溯。
这里要重点讲一下触发信号时序。产线上有一个到位传感器,当产品运动到检测工位并停止后,传感器信号进行滤波处理,PLC确认产品稳定后,发一个脉冲给视觉控制器。我特意和PLC工程师沟通,在程序中增加了延时确认,要求传感器信号保持至少50ms稳定后才判定到位,否则容易出现产品还在抖动中就拍照,导致图像模糊的假NG。这个细节在调试初期非常重要,我遇到过不少产线因此产生大量误报。
结果输出时序也需要注意。视觉检测完成后,必须考虑NG标记与气缸剔除动作之间的时序配合。比如PLC要求在触发后2秒内收到结果信号,如果视觉节拍超过这个时限就会造成信号冲突。我们当时专门做了一个监控画面,把“触发时间、拍照时间、算法耗时、结果输出时间”全部实时显示,便于现场判断瓶颈在哪个环节。
通讯协议内容相对标准化,主要包括以下字段:设备ID、产品序列号(通常是扫码枪读取的条码)、触发时间、检测结果、缺陷类型编码、各检测项数值、图像存储路径、软件版本。这些数据全部要传给上位机程序,由上位机做报表和追溯分析。如果客户有追溯要求,图像保存建议按“日期/批次/产品序列号”三级目录存,保留周期至少6个月,方便后期质量问题回溯。
4.2 节拍优化的实践过程与实测数据
在线检测项目的节拍优化贯穿整个调试过程。第一次现场运行,我们实测平均单件检测周期大约3.1秒,超过产线节拍要求,主要是几个环节耗时较长:图像传输采用GigE协议,但网线质量不佳且交换机是百兆,导致三幅图像传输花了约500ms;深度学习推理阶段,推理库在没有GPU加速的情况下CPU占用率非常高,且大量时间浪费在数据预处理上;算法代码里还有一些不必要的for循环处理和无效ROI计算。
逐一优化后,情况有了明显改善。网络全部升级为千兆交换机和Cat6网线,三幅图传输时间降低到120ms;深度学习输入图像直接从BGR格式转为RGB,并采用零拷贝推理模式,预处理时间降低到原来的三分之一;对几个不必要的ROI计算做了跳过处理,采用多线程并行处理三路图像的任务,算法总耗时压缩到800ms以内。
这个节拍优化过程再一次验证了我之前强调的公式:单件检测周期 = 触发响应时间 + 曝光时间 + 图像传输时间 + 算法处理时间 + 通讯输出时间。优化不是只盯着算法,传输、IO响应、判定输出每一个环节都可能成为瓶颈,必须全局考虑。
存图逻辑也要注意,不能为省时间就不存图,一旦出现客户投诉或批量退货,没有图像数据根本没法分析。但异步存图可以做到不占用检测时间,在检测结果输出后,直接把图像和检测数据丢给上位机的存储队列,由后台线程慢慢写入磁盘。
4.3 不合格品分选与防止漏检的多级联动设计
在线检测设备还有一个容易被忽视的功能点:不合格品处理。视觉系统判定NG后没有物理隔离,不合格品就可能混入合格品中流到下一道工序。我这次项目在滚道末端设计了一个自动剔除机构,视觉系统通过IO输出NG信号后,PLC控制一个气缸在指定位置把NG品推入不合格品缓存区。
这里有一个细节,NG信号的输出是一个持续电平而不只是一个脉冲,剔除气缸动作有延迟,如果只发一个很短的脉冲,PLC可能来不及响应。我设置的是NG信号保持300ms的高电平,确保PLC一定能捕捉到。同时工位还设置了一个“未收到视觉结果即按NG处理”的安全逻辑,如果视觉系统死机或超时未返回,PLC会默认拦截该件产品并报警。
现场还设计了防漏检联动:视觉控制器每处理完一个产品,都会给PLC发送一个“检测完成”信号,如果PLC发出触发信号后在设定时间(比如3秒)内没有收到此信号,说明视觉系统异常,产线安全回路会触发停机,杜绝“产品流过去了但视觉没有检测”的情况。这一套防漏检多级联动机制是汽车零部件客户的刚性要求,也是体现设备专业度的重要一点。
5. 常见问题与现场调试经验
5.1 铝镁合金表面反光引起的误检与排除过程
现场调试阶段,我处理最频繁的问题就是反光干扰。铝合金表面有大量不规则反光点,尤其是机加工面和压铸面交界处。第一轮测试时,表面缺陷检测的过杀率高达15%,就是国内产线根本没法用的水平,每次产品经过都会报一堆不存在的“压伤”。经过分析,问题基本锁定在光源角度和偏振片配置上。
我的解决办法是,给暗场照明的条形光源前面加装偏振片,相机镜头前面也加装了偏振方向垂直的偏振片,利用偏振消光原理滤掉大部分镜面反射光。加装后过杀率从15%下降到了3%左右。然后我又在算法层面对图像增加了局部均方差滤波处理,进一步平滑不均匀反光。经过这三层处理,最终过杀率稳定在2.8%,完全达到客户要求。
关于偏振片,有两点要提醒。一是偏振片会降低光通量(通常衰减30%-50%),光源功率必须适当加大或者增加曝光时间,不然图像整体变暗,对比度反而下降;二是偏振片安装方向要找准,拍照验证的最优角度是旋转偏振片直到反光最弱,并不是随便转到一个位置就行。
5.2 深度学习模型在实际产线中的过杀与漏检调优
现场试运行期间,深度学习模型也出现了不少状况。最典型的问题是:模拟缺陷样本和真实缺陷形态存在差异,导致模型在现场频繁过杀或漏检。我们造出来的模拟压伤,磕碰边角太规则,真实产线上的压伤往往伴随擦伤和不规则边缘,模型在区分“压伤但合格”和“压伤且不合格”时经常摇摆。
解决办法是对模型进行增量训练。把现场连续一周采集的所有图像里误判的样本全部找出来,人工标注后加入到原训练集,再重新训练一轮。这个迭代过程持续了三轮后,模型在现场的过杀率才降到可接受水平。这里也建议大家,在项目预算中预留出模型迭代的时间,不要指望一次训练就能完美上线,工业缺陷的复杂性决定了必须经过多个轮次的实战打磨。
漏检问题也一样值得重视,我们曾经遇到一个紧固件轻微浮起的情况,传统算法的距离阈值设为0.5mm,浮起0.35mm时就已经属于缺陷但被算法判定为OK,导致漏检。最后把判定逻辑改为“距离+颜色梯度”双重判定,同时增加深度学习分类作为补充,才把这类边缘案例有效拦截下来。这个案例说明,阈值设计不能只看理论值,要结合实际装配公差和客户工艺要求来定,而且必须留有一定的余量,避免恰好卡在临界状态。
5.3 有限空间内的设备维护与长期运行稳定性建议
最后想聊聊有限空间内设备维护和长期稳定运行的问题。由于工位空间小,光源、镜头、相机都装得很紧凑,调试时我基本是跪在产线旁边拿着内六角扳手一点点调角度的,比常规工位费劲很多。这里建议各位在项目开始前就和客户确认好维护空间,至少保证相机和光源能够快速拆卸更换,否则一旦设备故障,产线停线的损失会远超想象。
长期运行稳定性的经验也整理成几条供参考:光源和相机至少每季度做一次清洁,否则灰尘累积导致图像亮度下降,灰度值波动超过10%就要考虑清洁或更换;每半年做一次像素标定校验,保证测量精度没有漂移;所有通讯线缆和电源线都预留机械应力释放环,避免振动导致接头松动;工业计算机设置开机自动启动检测服务软件,并配置看门狗程序,防止软件崩溃后设备长时间停摆。
最后分享一个小技巧:在检测软件后台做一个图像灰度值统计曲线,每天保存一次平均值和标准差。通过观察曲线可以预先判断光源衰减或镜头污染趋势,不用等出现误检才去排查,这种方法在项目长期运行稳定性的维护中非常实用。我靠着这个统计曲线,提前两天就发现一个条形光源的亮度下降了20%,及时更换,完全避开了突然停机对产线的影响。
做铝镁合金装配产品的视觉检测项目,和我之前做的很多其他项目相比,最大不同在于材料特性和装配工艺的耦合度非常高,光学方案、算法设计、产线集成每一环都要吃透现场实际情况。这类设备的价值不在于某个算法有多亮眼,而在于整套系统是否能在产线上长期稳定、准确、可追溯地运行。这个项目从方案设计到稳定量产,前后花了约五个月,我收获最大的不是那些代码和参数,而是摸索出了一套适合汽车零部件产线在线视觉检测的工程化方法。希望这篇文章对正准备接触类似项目的同行有帮助。