尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

3C外观检测新架构:TVA三层视觉架构如何破解漏检与过杀难题

3C外观检测新架构:TVA三层视觉架构如何破解漏检与过杀难题 如果只看送检样件TVA这套方案在实验室里的表现几乎是满分误检率低得让人想直接签验收单。但把它搬上3C产品视觉检测的量产线之后我才真正体会到什么叫“破局”和“重构”——不是算法又准了几个点而是整个检测链路被现场问题反复锤打后重新长出了不一样的结构。TVA的全称我们内部定义为Three-layer Vision Architecture也就是三层视觉架构专门用来处理3C外观检测里那些“看着不难、一上线就崩”的缺陷。这篇是系列第三篇前面聊过成像方案选型和模型方向这篇我重点讲落地为什么必须分层、分层之后现场数据长什么样以及两个让我印象极深的排查案例。1. 为什么3C外观检测总在“漏检”和“过杀”之间摆钟1.1 产线换型太快方案跟着“调参”是死路3C产品线的特点就是“快”和“杂”。今天这条线跑的是A客户高光黑色后盖明天可能就换成B客户磨砂金属中框再过几天又来个透明件的摄像头支架。每换一种材质、每改一次表面工艺图像特征都会变一遍。我们最早的做法和大多数团队一样方案不够调参来凑。换型之后算法工程师的第一件事就是去产线重新采图调整阈值、切换光源、补建模板。这套流程走下来半天到一天就没了而且每次调完都提心吊胆——因为你不确定这次调整会不会让另一种缺陷漏掉。表面上看是“工作量问题”实际上是“架构问题”。单模型方案把所有判断压力都压在一个分类器上而这个分类器对光照、材质、纹理方向极其敏感。只要一个条件变了它的决策边界就失效。与其说是我们不够努力不如说是在用一个脆弱结构硬扛多变场景。1.2 传统单模型的三个天花板对比度、样本量、语境缺失我后来把传统方案的局限总结成三个天花板几乎每个3C项目都会踩到。第一个是对比度天花板。很多缺陷先天就和背景长得太像拉丝面上的浅划伤人眼要拿手电倾斜45度才看得出来透明件里面的气泡常规照明下就是一团模糊影子。模型再强也拿一张缺陷跟背景几乎融为一体的图像没办法。这就是“成像没做好算法来背锅”。第二个是样本量天花板。3C缺陷样本收集本来就难良品几万张缺陷可能只有几十张某些稀有缺陷可能几个月才出现一次。单模型要同时学会所有缺陷形态数据根本喂不饱。更头疼的是一旦出现一个新缺陷类型你得重新攒样本、重新标注、重新训练中间这段空窗期全靠肉眼盯。第三个是语境缺失天花板。同样是划伤出现在可视面上可能是致命缺陷出现在装配面上可能根本没人关心。单模型只能输出“OK”或“NG”它不知道产品标准是什么不知道这个缺陷在哪个区域、什么方向、多大尺寸才算超标。这类知识没办法写到像素分类里只能靠外部规则补。1.3 最后一根稻草一个漏检事件让我们决定推倒重来真正让我们下决心重构的是一个不算特别严重的漏检事件。当时现场反馈过杀率偏高我们为了让产线稳住把分类阈值往上抬了一点。结果当天就有一批“深色小花纹”漏掉了——那种花纹在正常光线下几乎看不见质检员用手电筒逐件抽查才发现那批外观件返工了两次。复盘的时候大家其实都清楚问题出在哪阈值一旦上调处于灰色地带的缺陷就会从“轻微可疑”变成“直接放过”。单模型方案本质上是一个黑盒你无法让它在某个局部变得更严格又不影响其他地方。我们当场决定停止“补丁式”调参开始按三层架构重构检测链路。2. TVA破局的三次关键取舍不堆模型改成切分层2.1 第一层取舍先把“让缺陷显形”变成硬约束TVA的第一层不是模型而是成像。我们内部有一条很轴的规矩缺陷在图像里看不见算法再好也白搭。以前布光是“能看清产品就行”现在布光是“让缺陷和背景的对比度最大化”。划伤类缺陷要用低角度条形光让表面微起伏产生高亮或暗影形成一条明确的引导线镜面外观要用同轴光或穹顶光源避免硬反光把整个视野打白拉丝金属表面则用两个方向的光交替照明分别采集顺纹和逆纹的图像信息。这一步听起来简单但实际推进时会发现光学工程师和算法工程师经常互相“甩锅”。所以我们在架构上明确成像质量是检测效果的第一责任人谁布的光、谁拍的图谁就必须对后续误检负责。很多缺陷之所以难检不是算法不行而是光源角度一偏对比度就没了。2.2 第二层取舍粗检只做召回不做精确分类TVA的第二层是粗检。这一层的目的非常纯粹从大图上找出所有“不对劲”的候选区域至于它到底是什么缺陷先不管。我经常用安检闸机来打比方粗检就像闸机口的保安宁可多拦几个看起来可疑的人也绝不能让真有问题的人混过去。哪怕每张图拦下来一两百个候选框都没关系只要那个真正的缺陷一定在里面就行。实现方式可以很灵活。可以做背景差分可以做局部梯度异常检测也可以用轻量级分割模型。核心指标只有一个召回率。粗检阶段一旦开始纠结精确率就会不由自主地收紧阈值那就又回到单模型的老路上了。这层取舍最大的好处是让算法团队松了口气。以前的模型既要“找得到”又要“判得准”两件事互相打架现在把“找”和“判”拆开每一层都能用最简单、最稳定的方式做自己最擅长的事。2.3 第三层取舍把“产品知识”写回判定逻辑TVA的第三层是细分类加语义校验。候选ROI被裁出来之后先送进细分类模型判断它属于划伤、脏污、凹坑、毛刺、异物等哪一类然后进入判定引擎。关键就在判定引擎这里。最终放行或拦截不是细分类模型单独说了算而是把分类结果、几何尺寸、位置、方向、缺陷数量、产品标准放在一起综合计算。举个例子同样是划伤出现在可视面且长度超过1毫米判NG出现在装配面长度低于3毫米可以放行。脏污如果可擦除先进入复判流程而不是直接判死。毛刺方向如果和开模方向一致脱落风险更高判定权重就更大。这类“产品知识”以前散在工艺人员脑子里现在被结构化地写进判定规则。这是TVA和传统方案最大的分水岭模型负责“看见”规则负责“理解”。两者打通之后过杀率才能降下来因为很多以前被判NG的样本本质上只是“模型不认识这个语境”而不是“产品真的有问题”。3. TVA重构后的完整检测链路从成像到判定怎么串起来3.1 一条完整的检测样本流长什么样重构之后我们的检测链路大概是这样的上料定位触发相机拍照。工位一45度环形光成像负责整体脏污、大颗粒异物。工位二低角度条形光成像光方向与拉丝纹理垂直负责划伤、浅凹坑。工位三同轴光成像负责镜面外观的微小压伤和指纹类脏污。各工位分别做粗检产出候选区域。候选区域按位置坐标合并成ROI列表剔除跨工位重复项。每个ROI被裁切后送细分类模型打上缺陷类型标签。判定引擎结合产品规则输出放行、拦截、复检。被拦截的工件进入人工复判通道所有标签回流样本库。需要特别强调的是多工位的图像不是简单拼成一张“大图”再喂给模型。同一个缺陷在不同光照下长得很不一样直接合并反而会干扰模型。我们的做法是每个工位独立粗检最后只汇总候选坐标和对应图像块保留光照信息进入下游。3.2 关键参数与工位设计怎么定很多团队问我们的参数是怎么定的这里给一组比较典型的初始值作参考参数项典型配置说明相机分辨率500万1200万像素按视野大小与最小缺陷尺寸反推最小缺陷尺寸0.1mm要求缺陷在图像上至少覆盖3×3像素工位一照明45度环形光主要覆盖脏污、异物、大面积色差工位二照明低角度条形光垂直于拉丝或加工纹理方向工位三照明同轴光镜面高光外观减少现场环境影响粗检候选区上限每图200个超过即触发异常提示绝不让候选区无上限堆积细分类输入尺寸128×128像素兼顾小缺陷细节与推理速度判定规则按机型独立维护可视化面的划伤、装配面的划伤阈值不同有人问分辨率怎么算出来的。思路很简单假设视野宽度是50毫米传感器横向像素数是5000那么单个像素对应0.01毫米。要让0.1毫米的最小缺陷至少有3个像素覆盖这个配置刚好够用如果视野更大或缺陷更小就往上加分辨率。这套逻辑虽然基础但很多方案在立项时根本没算过导致后面越调越费劲。3.3 闭环迭代当天误报当天进训练集架构跑起来之后真正的体力活在于数据回流。产线每天都在自然产生两类极其珍贵的样本一类是误报也就是系统拦截了但人工复判为OK的工件另一类是漏报发生在人工抽检或客户端反馈里。我们的规矩是**误报图当天追加为负样本漏报图当天追加为正样本每周做一次增量训练加回归测试。**现场质检员在复判终端上只需要点三个标签——OK、NG、疑似点完以后数据自动进入待标注队列算法工程师第二天上班直接处理。这套流程看起来不难但执行起来会暴露很多管理问题。以前我们攒样本是按“周”甚至“月”来算的等数据够了再训一次模型结果发现产线的材质、光源、机台状态早就变了旧数据对新场景帮助有限。改成当天回流之后模型每次迭代都在“吃”最新鲜的问题针对性好很多。我这里补一句增量训练一定要配回归测试。每次训完新模型必须拿过去两周的全量历史图像重跑一遍确认之前的缺陷没有“回潮”。否则这个模型可能对今天的误报修好了却把上周一个已经解决的漏检又放出来了。4. 换型首月的实测数据与两个难啃的现场问题4.1 首月数据对比漏检率和过杀率的变化在这个3C外壳项目上传统单模型方案运行了将近四周之后切到TVA架构再跑四周。因为中间存在人工复判流程我们把几种核心指标做了对比指标重构前单模型重构后TVA说明漏检率人工复检口径0.6%0.15%以全检加抽检结果为基准过杀率复判后放行占比9.5%2.8%每次拦截后由人工确认换型调试时间半天到一天24小时主要是更新样本库和判定规则新增缺陷的模型迭代周期攒样本数周当天收集、周内更新靠回流闭环现场投诉/复检压力高明显下降判断依据更透明需要说明的是这是单一项目的数据不同材质和不同产品形态差异会很大。它的意义不在于“TVA一定能把漏检率降到多少”而在于我们从结构上把指标的波动压住了换型不再是一场灾难新增缺陷也不再意味着整个方案推倒重来。4.2 排查链路实录拉丝纹理为何被当成划伤首月跑得还算顺利但第二个星期就撞上一个硬问题换型到拉丝铝外壳之后过杀率从2.8%一路飙到7%。终端显示的原因高度集中几乎都是“划伤”。排查链路是这样的。第一步先把被判为划伤的图像全部拉出来看。结果发现大量候选区域其实是拉丝纹理本身的亮线。拉丝方向与低角度条形光方向垂直时每条丝纹都会形成高亮反射视觉效果和浅划伤极度相似。第二步看训练样本。我们把样本分布调出来发现训练集中“光滑表面”的照片占了绝大多数真正包含拉丝纹理的负样本只有5%左右。模型没见过那么多“纹理亮线”自然会把它们当成异常。第三步看特征分布。把拉丝亮线样本和真实划伤样本的特征映射出来之后我们注意到一个关键差异拉丝产生的亮线梯度方向高度一致基本沿同一方向排布而真实划伤的方向比较分散深浅变化也更随机。第四步补规则而不是只硬训模型。我们在判定引擎里增加了一条方向校验当候选缺陷方向与拉丝主方向夹角小于阈值时只有亮线长度和深度同时超过标准才判NG否则进入人工复检。同时重新采集了两百多张拉丝面图像加入训练集。第五步回归验证。拿历史两周的误报图像重新评估过杀率回到2.6%而且没有新增漏检。这次排查让我印象很深因为它告诉我们出现误报的时候不要急着骂模型先把“信息是在哪一层断裂的”找出来。成像、样本、特征、规则四层逐一排查大多数问题都能定位。4.3 第二个坑镜面反光伪影被当成真实缺陷另一个印象深刻的问题来自高光黑色外观件。上线第一天粗检模块就疯狂报警候选框大量集中在视野边缘的固定位置。细分类模型把这些候选框里的边缘纹理变化判成了“压伤”。这批“压伤”如果按缺陷处理过杀率会直接爆表。我们停线排查后发现问题的根源很微妙反光光斑是环境灯在工件曲面上的投影每件产品拍照时都会在同一个位置出现但它不是缺陷而是光学伪影。光靠细分类模型很难区分这种伪影因为它的局部纹理和真实压伤太像了。我们的解法是“多视角一致性校验”同一个真实缺陷会在多个工位、多个光源角度下同时被检出且空间坐标基本一致而反光伪影往往只在一个光源角度下出现。于是规则里增加了一条候选区如果只在单个工位检出且坐标不与其他工位产生关联就标记为环境伪影并过滤掉。这个方案上线以后那种固定位置的反光报警基本消失。这件事再次验证了一个观点很多“算法解决不了”的问题其实是因为没有把物理世界的信息引入决策链。多一个视角多一次光源切换比给模型加一百层参数都管用。5. 给想复刻这套架构的团队几句实在话5.1 先统一“漏检率”的口径否则团队会吵到怀疑人生这是我最想提醒的一点。我们刚上线的时候算法、生产和品质对“漏检率”的理解完全不一样有人按质检员复检数算有人按客户端退回数算还有人按抽检比例反推。同样的数据有人算出0.1%有人算出1%两边还都认为自己没错。所以在项目一开始就要把口径定死建议至少固定三个指标漏检率人工复检或抽检中发现的NG件数 / 对应样本总数。过杀率复判为OK的拦截件数 / 总拦截件数。换型时间从切换机型到设备稳定运行所花的时间。口径统一之后算法工程师和生产主管才能在同一张报表上对话。否则所有争论都会变成“你们算得不对”的无意义内耗。5.2 给现场留一条“人工复判通道”别让算法一锤定音很多检测项目上线后被判NG的工件直接流入废品箱导致两个问题一是误杀的工件无法挽回二是误报样本永远进不了训练集。这等于让系统闭着眼睛跑越跑越脆。我们的做法是设置复判工位。系统拦截的工件先到人工复判区质检员确认OK的返回产线确认NG的登记缺陷类型。这条通道表面上看多了一个人工环节实际上它既降低了过杀带来的物料损失又源源不断地为算法提供标注数据。没有复判通道的检测系统后期迭代速度会慢一个数量级。5.3 模型版本按机型管理别指望一个模型通吃不同材质、不同光源、不同机型的图像特征差异太大指望一个模型“通吃”所有产品是不现实的。我们把模型按产品族拆成多个基线版本新机型从最接近的基线复制出来做微调每个版本都有独立的样本库和判定规则。上线之前必须做历史回归拿新模型跑一遍过去两周的全量图像确认它在新老问题上都不劣化才允许发布。一旦现场出现异常还能一键回退到上一个稳定版本。这套版本管理机制看起来传统但在快速换型的产线上非常管用它能保证“改进”和“稳定”不互相牺牲。我特别想强调的一点是TVA三层架构最大的收益其实不在准确率数字变好看而在于团队终于能正常配合了光学工程师知道自己要为什么样的图像负责算法工程师不再整天给“万能模型”做救火现场品质也有明确的复判流程。如果你现在正被漏检率和过杀率两头夹击我建议先别急着换更大更贵的模型而是把检测链路拆成“成像—召回—细判—语义—回流”五段看看信息是在哪一段丢的。这套架构不一定适合所有场景但这个排查思路我自己用下来相当值。
返回列表