ARTICLE DETAIL

资讯详情

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

工业视觉测量与缺陷检测实战:从光源衰减到亚像素精度控制

工业视觉测量与缺陷检测实战:从光源衰减到亚像素精度控制 去年做的一个连接器检测项目客户反馈我们系统测出的引脚间距比他们千分尺量出来的小了0.015mm而且不是偶尔一次是稳定地小。我第一反应是算法哪里改坏了查了半天最后发现是光源亮度比验收时衰减了17%。就是这0.015mm让我把尺寸测量这件事重新想了一遍——机器视觉做电子元件尺寸测量和缺陷检测表面上看是两件事本质上都在跟一件事较劲边缘位置稳不稳。这篇文章把我从方案设计、硬件选型、标定、算法链路到现场部署踩过的坑完整串一遍给正在做或准备做类似项目的朋友一条可以直接参考的路线。1. 三个元件、两条产线为什么非要上机器视觉先说项目背景。客户生产的是连接器端子和贴片电阻电容这类小尺寸电子元件最大的元件也就十几毫米小的只有1mm左右。两条产线一条做尺寸抽检一条做外观全检。在我介入之前尺寸是靠人工用二次元量测仪抽检外观是靠人在放大镜下目检。这里有几个非常现实的痛点二次元量测精度高但速度慢一件元件要摆正、对焦、取点、读数一套下来几十秒只能抽检不可能全检。目检人员的疲劳曲线很明显我见过上午和下午的漏检率能差出3倍。小尺寸元件上的划痕、缺角、污染看久了真的是睁眼瞎。品控记录全靠纸质表单出了问题想追溯某个批次是哪台机器、哪个时段产的效率很低。客户自己也在上自动化产线节拍已经压到1.5秒一件人工检测的节奏完全跟不上。所以客户的诉求其实很直接能不能在产线上把尺寸测量和外观缺陷检测一起做掉速度要赶上节拍数据要能留存。我梳理了一下这个项目里真正要检测的项目分两类检测类别具体检测项规格要求尺寸测量元件本体长宽±0.02mm尺寸测量引脚间距、引脚宽度±0.03mm尺寸测量引脚共面度0.05mm以内缺陷检测表面划痕长度≥0.3mm判NG缺陷检测缺角、崩边面积≥0.05mm²判NG缺陷检测引脚氧化、污染灰度异常区域面积这里有个容易忽略的技术点尺寸测量和缺陷检测对图像的需求方向是拧着的。尺寸测量希望边缘越锐利越好所以通常要背光或者同轴光把元件轮廓切得干干净净缺陷检测要的是表面细节划痕、污染这些东西往往在均匀照明下对比度很低反而需要用低角度光或者暗场把它照出来。这就意味着如果一套系统想同时干两件事光源就得做组合设计或者是分工位拍摄。我后面详细讲。我的建议是如果你也遇到类似的需求先别急着定相机和镜头先把检测项和规格列成上面的表格特别是把公差写死。因为公差直接决定了后面所有硬件选型公差差一个数量级整套方案的成本能差出好几倍。没有明确规格的缺陷检测更是后面无穷无尽的扯皮源头。2. 硬件选型先定精度预算再选相机、镜头和光源硬件选型是我觉得整条链路里最容易出错也最容易被新手低估的一块。很多人上来就问用500万像素够不够用海康还是基恩士但说实话这些问题在没有精度预算之前都没有意义。2.1 精度预算先算像素当量再谈相机像素当量这个词通俗讲就是图像里一个像素对应实际物理世界的多少毫米。它是整个尺寸测量系统的度量衡所有测量结果最后都要落到这个数值上。怎么算先看公差。比如元件长宽公差是±0.02mm也就是总公差带0.04mm视觉测量领域有个常用经验法则系统分辨率至少要达到公差带的1/5到1/10也就是0.004mm到0.008mm。取1/10是比较稳的因为实际系统还有机械振动、光照波动、标定误差这些干扰分辨率要是卡着公差做现场一定会超差。有了分辨率需求再看视野。假如我们要拍的元件最大尺寸是10mm×8mm加上边缘留白和定位公差视野至少要做到12mm×10mm。用500万像素相机2448×2048来算X方向像素当量是12mm除以2448像素约等于0.0049mm勉强够1/5法则用1200万像素相机4000×3000X方向像素当量是12/40000.003mm这就比较舒服了。这是第一层账。第二层账是速度。产线节拍1.5秒一件意味着从拍照、传输、算法处理到通信输出总共就1.5秒。1200万像素的全局快门相机配上合适的传输接口纯图像传输在100ms量级算法只要不做太重的深度学习单张处理200~400ms足够。所以速度上没有问题。2.2 镜头测量项目为什么优先远心镜头镜头选型是尺寸测量项目的分水岭。普通FA镜头工业定焦镜头是透视成像物体离镜头近一点就放大远一点就缩小。元件引脚本来就有高度差加上产线定位机构有机械公差元件表面不可能保证绝对在同一高度这就导致同一个尺寸在不同高度下拍出来大小不一样。这个误差在引脚共面度检测时是致命的。远心镜头解决的就是这个问题。它只接收平行光在一定景深范围内比如±5mm放大倍率恒定物体随便怎么上下浮动像的大小不变化。代价是贵一个远心镜头顶好几个普通镜头而且视场越大越贵。但做尺寸测量这个钱必须花。还有个参数容易被忽略远心度。远心度不够物体稍微偏出景深范围还是有微小放大倍率变化。选型时我习惯看远心度指标通常要求小于0.1°甚至0.05°尤其是公差严的检测项。2.3 光源尺寸测量和缺陷检测对光的要求不一样光源这块我单独说一说因为90%的现场问题最后都出在光上。尺寸测量最优解是背光。元件放在光源和相机之间只拍轮廓剪影边缘锐利度和抗干扰能力是所有光型里最强的。但背光拍不到表面缺陷所以如果一套工位要兼顾就得考虑同轴光或者高角度环形光。同轴光是通过半透半反镜把光线沿镜头光轴方向垂直打到元件表面镜面反射光线原路返回所以对镜面、光亮表面效果好。但连接器端子那种镜面弧形面同轴光容易出现中心亮、边缘暗的热斑反而影响边缘判断。缺陷检测特别是划痕检测最经典的是暗场照明。用低角度光斜打过去正常平面把光反射到镜头外面画面是黑的划痕表面不平把光散射进镜头呈现亮线。一黑一亮划痕的对比度极其强烈。这个方法我一直觉得是个诗意的东西——让缺陷自己发光。对于一套系统要兼顾尺寸和缺陷的情况我实际项目里用的是分时复用一个工位两组光源拍两帧图像一帧背光测尺寸一帧暗场查缺陷。反正1.5秒的节拍足够拍两帧。这里注意分时复用的两组光源亮度差异会很大相机的曝光参数必须分开设置不能只设一组。2.4 一个容易被忽略的机械项振动和温漂硬件选型的一个隐性项目是机械结构。现场设备旁边就是冲床和注塑机地都在抖相机如果跟着振边缘位置就跟着飘再好的算法也救不回来。解决办法是从机械上做隔振同时相机曝光时间尽量短全局快门在1ms以内能把振动模糊控制在很小范围。温漂也是我吃过亏的地方。设备白天开机和连续运行5小时之后光源、镜头座、相机靶面的温度状态都会变化图像灰度会整体漂移。这个后面部署部分细说。3. 标定那点事像素当量、边缘光照补偿与标定板陷阱标定是整个测量系统里最核心、也最容易被当成走流程的一步。我见过不少人标定就是拍一张标定板算个像素当量完事后面现场一超差就懵了。3.1 像素不是毫米标定到底在标什么相机看到的是一堆像素不是物理尺寸。一个引脚占了98.5个像素它到底是多少毫米这需要一个转换系数就是像素当量。标定的过程就是找一个已知尺寸的参照物算出每像素代表的毫米数。但这里有个容易忽略的细节像素当量只在同一个工作距离、同一个焦距下有效。变焦了、动了相机当量就变了。所以现场安装完相机、固定好高度之后必须重新标定并且标定之后所有机械位置都不能再动。3.2 标定板的正确与错误用法标定板我习惯用陶瓷棋盘格或者玻璃圆点阵精度等级按需选。陶瓷棋盘格耐脏、不反光适合现场环境玻璃圆点阵因为可以双面透射照明适合高精度背光标定。标定板的精度至少要高于被测公差一个等级比如被测是±0.02mm标定板不能超过±0.005mm的制造误差否则标定本身就引入了误差。讲一个实际踩过的坑。我第一次做这类项目时图省事用了一张普通打印的黑白棋盘格打印尺寸本身就有1%的误差拿它标出来的像素当量每100像素就要差1个像素算成毫米差得离谱。从那之后我定了一条规矩标定板必须采购有出厂精度证书的标准件不能自己打印不能用普通玻璃刻度尺替代。标定板还有一个使用细节必须完全平行于被测平面。如果贴歪了标定出来的当量是倾斜平面上的投影长度等于系统所有测量结果都带上了一个固定的角度误差。3.3 光照变化如何移动边缘位置这是尺寸测量最隐蔽的坑也解释了我开头痛客户那个0.015mm偏差。边缘检测本质是找图像灰度突变的位置。我们用阈值切分时边缘的位置取决于哪个灰度值算分界。光源亮度变化会让边缘处的灰度曲线整体抬升或下降阈值和灰度曲线的交点就会移动导致边缘位置在图像上移动零点几个像素。看起来不多但乘上像素当量就是0.01mm级别的尺寸偏差直接干穿±0.02mm的公差。更棘手的是这个偏移量对不同材质、不同方向的边缘还不一样。金属引脚、黑色塑封体、亮面铜箔对光照变化的响应完全不同所以不是简单地做一个全局灰度校正就能解决的。我的处理办法有三层光源用恒流控制器而不是简单的稳压源降低光源自身的波动。定期采集标准件的图像灰度均值作为系统健康度指标灰度均值漂移超过阈值就报警。算法上加入边缘自适应阈值根据边缘两侧的局部灰度峰值和谷值动态计算分割阈值而不是用固定灰度值。相对阈值对整体亮度变化不敏感能抵消一部分光源衰减的影响。3.4 小视场场景的标定经验小视场高倍率的情况下景深很浅标定板的厚度都不能忽略。我遇到过用厚的陶瓷板标定完之后换薄元件上场边缘虚焦测出来的尺寸全部偏大。后来我标定时会垫一个和被测元件厚度一样的垫片让标定板表面严格落在被测平面上。还有一种情况是视场内畸变。小视场用质量好的远心镜头畸变通常很小可以用单像素当量走天下视场较大又没有远心镜头时畸变不可忽略边缘位置的微小弧度会让测量值从中心到角落产生差异。这时候只标一个像素当量是不够的需要做畸变校正。常用的方法是拍一张完整标定板提取所有角点和理想坐标做映射把映射关系存成一个校正查找表每次测量先做校正再算尺寸。4. 尺寸测量从粗定位到亚像素拟合的完整算子链硬件和标定都到位了接下来是算法。尺寸测量的算法链其实是有固定套路的我把我的处理方式拆开讲你以后做类似项目可以直接平移。4.1 尺寸测量算法整体流程我的检测管道是五步ROI粗定位、图像预处理、边缘提取、亚像素细化、几何拟合和尺寸计算。第一步ROI粗定位非常关键。整个图像视场12mm×10mm里面可能同时出现好几个元件或者多个引脚如果每次都在全图范围找边缘一来慢二来容易受旁边的干扰边缘影响。先用灰度阈值或者模板匹配把目标元件粗定位出来圈定一个比元件略大的ROI后面所有处理都在这个区域里做。这个粗定位不必很精确允许±20个像素的偏差但要稳定。第二步预处理我只建议做一件事中值滤波去孤立噪点。而且滤波核不能太大3×3就够了。滤波核越大边缘被磨得越圆亚像素边缘位置就越偏。高斯滤波虽然平滑效果好但它会把边缘展宽对于亚像素测量来说不一定是好事。4.2 亚像素边缘的底层逻辑为什么用了500万像素还要做亚像素因为一个像素可能对应0.0049mm尺寸检测要求0.004mm级分辨率单个像素的分辨率不够。而亚像素边缘提取就是通过边缘附近的灰度分布把边缘位置估算到0.1甚至0.05个像素。原理其实不复杂。理想边缘是一堵墙像素灰度瞬间从0跳到255但实际镜头都有点扩散边缘在图像上是一段斜坡。我们要找的是这段斜坡哪个位置最陡也就是灰度梯度最大的点。方法有很多Canny算子做非极大值抑制就是在梯度方向上找局部最大值的点。但要更精确会在梯度方向上将梯度值拟合成一条抛物线抛物线的顶点就是亚像素级的最陡点。打个比方太阳下山时天边有个最亮到最暗的转折位置我们能看出大概在哪条云附近但要精确到几点几分几秒就要看那个转折最剧烈的一瞬间。Halcon里的edges_sub_pix算子做的就是这个事。选Canny时参数有三个要调高斯平滑尺度、滞后阈值的低值和高值。高斯尺度越大边缘越平滑抗噪但定位精度下降我一般取1.5上下噪声不太严重就不加码。滞后阈值我习惯设成20和40可以根据图像对比度动态调。4.3 引脚间距测量一条可复用的算子链以连接器引脚间距测量为例给一段Halcon风格的算子链逻辑在其他视觉库也一样* 读取图像 read_image (Image, pin_image.png) * 第一步阈值粗定位引脚区域 threshold (Image, Region, 0, 100) connection (Region, ConnectedRegions) select_shape (ConnectedRegions, Pins, [area,width], and, [500, 20], [5000, 150]) * 第二步提取亚像素边缘轮廓 edges_sub_pix (Image, Edges, canny, 1.5, 20, 40) * 第三步只保留ROI内、靠近引脚的边缘段 clip_contours_xld, select_contours_xld * 第四步对每一条引脚边缘拟合直线 fit_line_contour_xld (Edges, tukey, -1, 0, 0, 2, 0, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) * 第五步计算相邻引脚拟合直线的间距 distance_cc_min_points (Line1, Line2, 1, MinDistance)注意这里拟合直线用的方法是tukey这是一种稳健拟合对边缘上的离群点比如毛刺、脏污引起的伪边缘容忍度很高不会被一两个坏点带偏。这一点在处理引脚边缘有轻微毛刺时特别有用算出来的间距会稳定很多。用Halcon的好处是算子成熟但价格不便宜如果用OpenCV亚像素边缘没有现成的整套算子通常的做法是Canny得到像素级边缘后再用轮廓上的梯度方向做抛物线插值或者对单条直线用cornerSubPix的思路优化实现起来麻烦一些但逻辑完全一样。4.4 精度验证不能只看平均值算法写完验证这一步必须较真。很多项目就死在验证只报了平均尺寸在公差范围内结果生产线上偶发超差。我验证一套尺寸测量算法的标准流程是这样的找一个经过计量校准的标准件重复上下料、拍照、测量50次统计每个测量项的最大值、最小值、平均值、标准偏差。重点关注两个指标一个是重复性精度标准偏差最好小于公差带的1/10另一个是最大偏差和平均值的差距如果最大值和平均值差得远说明系统存在偶发跳变要找根因。50次里任何一次超出公差都不能验收。另外要留个心眼标准件是理想状态生产件又脏又反光最好拿几十个生产实际零件做个交叉验证拿显微镜或者二次元的实测值来对标视觉测量值算一个系统偏差然后在算法里做补偿。我之前一个项目就遇到过视觉测量值整体比实测值小0.008mm来源是引脚顶部的圆角导致亚像素边缘位置整体内缩直接在算法里加了一个补偿量问题解决。5. 缺陷检测先算传统视觉和深度学习的账尺寸测量打底但客户真正关心的是缺陷。缺陷检测这两年被聊烂了一上来就有人说用YOLOv8跑一遍就行了。我的看法是算法路径的选择取决于你的缺陷长得规不规矩而不是哪个模型新。5.1 先给缺陷分类再定算法路径我把这里项目的缺陷分成了三类规则缺陷缺角、崩边、尺寸超差、引脚缺失。这类缺陷形态固定位置固定本质上是和正常模板不一样传统视觉用手都能写。表面纹理缺陷划痕、污染、氧化、水渍。形态变化大但灰度规律相对明确比如划痕是比背景亮或暗的细线。不规则缺陷缺损形态千奇百怪比如塑封体鼓包、剥落、异色。这类缺陷有时候连人都要瞄好几眼才敢判算法很难用固定规则描述。传统视觉在处理前两类时效率极高处理第三类就很吃力。而深度学习的优势恰恰在第三类劣势也明显——需要数据需要标注需要现场调试。5.2 传统视觉能解决大部分规则缺陷缺角崩边这类用Blob分析就能搞定。灰度阈值把元件和背景分开形成连通域然后看连通域的面积、外接矩形、凸包面积占比。一个元件少了一个角它的凸包面积占比就明显变小抓住这个特征就能判NG。这条路的好处是运行快、判定可解释、参数含义明确现场出了问题也好调。划痕是我在传统视觉里最想强调的一个点。直接看灰度的话划痕和背景的灰度差往往很小但它的梯度特征非常明显。最实用的做法是形态学顶帽变换Top-hat用一个大尺寸的结构元对图像做开运算得到背景估计图然后用原图减掉背景估计图剩下的就是比背景亮的小尺度细节其中就包括划痕。这招能把微弱划痕从复杂背景里提出来对比度增强好几倍。氧化和污染这类区域特征是局部灰度和周围不一致。可以直接在亮度通道做分块统计和周围邻域做对比超过一定差异就报警。这个方法的解释性很强客户问你为什么判NG你可以指着图说这块钱的颜色和周围差了30个灰度级客户也能接受。5.3 深度学习介入的场景与最小样本量真正需要深度学习介入的是那种缺陷形态多变、位置随机、规律很难用规则描述的情况。比如我今天项目里遇到的塑封体表面剥落缺陷区域有大有小有亮有暗边缘还带锯齿用传统视觉无论怎么调参数误杀率都压不下来。我用的是YOLOv8做实例分割输入不是整张图而是传统视觉先粗定位出来的元件ROI裁剪图。这样做有几个好处检测目标小全图上做目标检测对小目标本来就不友好ROI裁剪后背景简单了模型更好收敛训练和推理速度都快很多。关于样本量这是问到最多的。我的务实建议是起步300到500张真实缺陷图别偷懒。如果真实缺陷很难收集用合成增强救急。做法是拿正常的图人工用图像编辑把划痕、污点、崩边p上去因为缺陷检测关注的本来就是局部纹理异常合成数据相当有效。我这次项目里真实缺陷样本只有150张左右合成了300张配合随机翻转、旋转、亮度扰动训出来的模型在验证集上的检出率能压到95%以上误杀率控制在2%以内。但有一点我必须强调深度模型在现场部署完之后一定要留模型拒绝样本的回收通道。模型预测NG但置信度不高的图单独存一个文件夹定期人工复审用小批量的增量数据回来迭代模型。不然模型上线就是它衰减的开始。5.4 漏检与误杀率客户真正关心的是哪一项缺陷检测里漏检和误杀是一对矛盾。漏检是把坏的放过去了客户找上门这是质量事故误杀是把好的当成坏的影响产线效率产线负责人跳脚。两个指标不同角色的关注度完全不一样。我的经验是算法调参阶段先把漏检率压到最低宁肯误杀多一点然后逐步放宽让误杀率缓慢下降。原因很简单漏检是0和1的问题发生一次就是事故误杀是多和少的问题最多是效率损失。在客户验收时如果漏检率是0但误杀率偏高你还有谈判空间反过来漏检率哪怕只有0.5%客户整个质量部门都会对你失去信任。具体操作上深度学习分类可以设置两个阈值高阈值判NG低阈值判可疑可疑的图单独分流到人工复检工位。这个设计在产线上一举两得既保证漏检率极低又不会因为大量误杀拖垮产线。6. 从方案验证到现场部署我踩过的几个真实坑实验室里跑得好好的一到现场就出幺蛾子。这是我做这个项目最大的体会。几个真实发生的坑写出来给你排雷。6.1 光源衰减让所有标定数据作废这就是开头那个0.015mm偏差的完整故事。现场运行两个月后客户报尺寸超差。我把当天的图像灰度均值和验收时对比发现整体灰阶掉了17%。光源在持续工作下LED亮度和色温都在缓慢漂移这不是玄学是所有LED光源的物理特性。排查过程花了两个小时这也是我用得最值的两小时。第一小时一直在怀疑算法因为软件没人动过算法代码不可能变第二小时开始看图像把当天拍的图和验收当天拍的图放一起灰度直方图叠加一眼就看出来整体低了。再用标准件现场复测发现偏差方向完全一致——边缘位置向暗侧移动尺寸整体变小。解决方案分成三层硬件上光源控制器换成恒流型降低亮度波动软件上每次开机用标准件做一次自动灰度校正把光源衰减带来的灰度漂移拉回基线流程上规定每月做一次标准件校验灰度均值偏差超过5%就更换光源模块。这个灰度均值指标从此进入我的系统健康度监控名单比任何算法指标都优先。6.2 来料批次颜色差异带来的误杀缺陷检测上线第一周误杀率飙升到15%。查了很久发现是客户换了新的注塑批次塑封体的颜色比上一批深了一点黑色材料在低角度光下的散射特性变化导致灰度整体分布偏移。划痕判据里比背景亮30个灰度级这个硬阈值在新批次下完全不适用。这给我一个教训缺陷检测的阈值尽量不要用绝对灰度要用相对特征。把绝对亮度偏移改成局部邻域的相对差异或者让阈值在每次换批次时通过样品自动学习而不是写死在代码里。从那之后我在系统里加了一个批次校准按钮上线新批次物料时操作员拿两个良品点一下系统自动计算当前批次的灰度基线更新检测参数。6.3 数据追溯只看NG率是不够的客户上线这套系统不只是为了自动检测更是为了追溯。原来靠纸质表单现在每个元件在产线上都有唯一的跟踪码图像和测量数据都要落到数据库里。我在存储方案上做了一个选择每张解析到的图像都以SN时间戳命名存盘测量数据写进SQLiteNG图额外保存一份带检测框标注的副本方便后续人工复核。这套东西看起来不花哨但后来客户做质量回溯时能直接调出某一天某一台设备某一颗元件的原图、测量数据和判定结果省了巨大的扯皮成本。如果你的项目里也有信息追溯的诉求存储格式一定要把原始图标注图测量数据判定结果四件套存齐缺一样后面都补不回来。6.4 算法上线后必须继续迭代最后说一个认识层面的东西。视觉检测系统从来不是交付即结束缺陷的类型会变来料的批次会变环境会变光源在衰减机构在磨损。我给所有验收的客户都会强调一条运维基线每周看一次误杀和漏检的统计每月做一次标准件校验每季度用新收集的缺陷样本复盘一次算法必要时重新训练模型。我印象最深的一次是项目交付三个月后客户那边多了一种新的引脚污染形态之前任何样本里都没见过。因为当初设计了低置信度样本回流机制这批图被自动存下来运行工程师筛选后补标只花了两周就迭代进新模型没有造成产线停线。这件事让我深刻体会到一套视觉系统真正的价值不是上线那一刻跑得多好而是之后遇到没见过的变化时整个链路能不能快速响应。如果你现在正准备启动一个类似的电子元件视觉检测项目我建议你从第一周就开始建立缺陷样本库所有可疑图像都别删按类型打标签存好了。这东西在项目初期看不出价值等上线三个月、半年之后它就是整个系统持续改善的弹药库。做视觉检测是个长期的事真正拉开差距的不是谁的模型更先进而是谁的数据和机制更能支撑系统一直跑稳。
返回列表