当前位置: 首页 > news >正文

第五讲:缺陷不是“扫”出来的——曲面 Pattern 缺陷检测里,为什么必须沿测量集逐点去“测”

原文: 第五讲:曲面 Pattern 缺陷是怎么被测出来的——从模板落位到缺陷判定

许多工业缺陷检测流程,本质上仍然是以像素域异常响应为起点,再将异常回溯到具体对象与局部结构上;而这套曲面 Pattern 缺陷检测系统恰恰相反,它以模板落位后的结构化测量关系为起点,再由点级测量逐步生成最终缺陷。

它的检测链条具有更强的前置条件:模板必须先经过两层配准进入实测图像,测量集必须先获得可靠落位,后续缺陷判定才有意义。换句话说,系统并不是先在整张图里生成异常响应,再去解释异常属于什么字符、什么图样或什么局部结构;恰恰相反,它是先建立模板与实测对象之间的几何对应,再沿已经落位的测量点逐点展开局部测量,最后才把点级异常通过邻域一致性与结构聚并上升为可输出的缺陷。

这件事非常关键。因为它意味着,这套系统从一开始就不是一个无条件的全图异常检测流程,而是一套建立在模板、配准与测量关系之上的结构化测量系统。到测量阶段,系统真正操作的对象已经不再是未经组织的原始位图,而是一个被几何关系约束过、被模板结构参数化过的局部测量空间。也正因为如此,后续输出的缺陷结果并不是从整张图里“扫”出来的,而是沿着已经成立的结构关系被逐步“测”出来的。

前一讲我已经讲了两层配准、注册集和测量集的分工。到那一步为止,系统其实只回答了一个问题:

模板落在哪里?

但“模板落在哪里”不等于“缺陷是什么”。

真正的检测,要从模板落位之后才开始。

这一讲我想把这件事讲透,主要说四个问题:

  1. 为什么缺陷检测不能脱离测量集单独谈;
  2. 系统到底在“测”什么;
  3. 为什么它不是沿整张图漫扫,而是沿测量点逐点展开;
  4. 为什么这么多不同缺陷,最后还能放进同一套测量框架里。

一、为什么不能脱离测量集直接谈缺陷检测?

如果把问题理解得很浅,最容易形成的印象就是:系统面对一张图,最后只要回答“有没有缺陷”就行。

但对这套系统来说,这种理解太粗了。

因为它真正面对的,并不是一张尚未组织的原始图像,而是一个已经经过:

  • 模板组织
  • 两层配准
  • 局部落位

之后的结构化检测对象

也就是说,系统不是先对整张图做全图异常扫描,再回头解释这些异常到底属于什么字符、什么图样、什么局部结构。它的路径正好相反:

  • 先有模板;
  • 先有几何关系;
  • 先有测量点;
  • 然后才沿这些测量点去判断局部是否异常。

从这个意义上说,测量集并不是某种附属数据,而更接近后续缺陷检测的工作坐标系

只有当测量点已经进入正确位置,系统才知道:

  • 应该在什么地方看;
  • 应该沿着什么结构看;
  • 某个局部偏差到底该怎么解释。

一旦脱离了这一层,很多原本可测的细微缺陷,就会重新退化成位图层面的模糊差异。

图 1:测量层总流程图。模板与测量集落位之后,系统沿测量点逐点展开局部测量,并将点级异常进一步组织为最终缺陷输出。

所以,这里最重要的一句话其实是:

缺陷不是脱离结构关系直接从图里找出来的,而是沿着已经落位的测量集被测出来的。


二、系统到底在“测”什么?

很多时候,一说“测量”,大家脑子里会浮现出一种很模糊的印象:
好像就是“看看周围正不正常”。

但在这套系统里,测量不是这种抽象动作。

它不是在“猜缺陷”,而是在测一组明确的局部量。

从工程上看,这些量大致可以分成三类。

1)局部灰度与对比关系

这一类主要对应:

  • 色异常
  • 局部发白、发黑
  • 填充状态异常

系统并不满足于看某个点是亮还是暗,而是要看该点邻域的:

  • 灰度区间
  • 对比关系
  • 局部投影结构

是否与应有 Pattern 保持一致。

换句话说,它不是看“一个像素值”,而是在看局部结构上的灰度关系

2)局部宽度、断裂与连通状态

这一类主要对应:

  • 镭断
  • 局部缺口
  • 细微中断

系统沿着测量点展开局部观察,并不只是为了“看到某个点”,而是为了进一步感知与该点相关的结构连续性是否还成立。

这也是为什么这套系统能抓一些很细的 break。
因为它关心的不是“图上某块是不是黑一点”,而是:

这个本来应该连续的局部结构,现在还连续吗?

3)局部面积、残余与异常聚集

这一类更接近:

  • 多镭
  • 残胶
  • 局部残余区域
  • 异常填充

它们往往不表现为单点灰度异常,而表现为某种局部区域的:

  • 宽度扩张
  • 面积残留
  • 异常堆积

所以,这一层“测量”从来都不是泛泛的,它始终对应某类明确的局部几何量或灰度量,而后续缺陷判定也正是建立在这些量之上。


三、为什么系统不是沿整张图测,而是沿测量点逐点展开?

这套系统最有特色的地方之一,就是测量不是对整张图做盲目的密集搜索,而是沿着已经落位的测量集逐点展开。

这一点非常重要。

因为一旦测量点已经通过配准进入了正确位置,系统就不再需要在整张图里到处“猜”哪里值得看,而是可以直接把注意力集中在那些本来就应该存在结构的位置上。

换句话说,后续测量不是在全图漫扫,而是在一个已经被模板和配准:

  • 缩小过
  • 组织过
  • 约束过

的局部空间里进行。

这样做的好处非常直接。

第一,对细微缺陷更敏感

因为测量不是在无上下文的位图区域里比较亮暗,而是在“本来应该有结构”的位置上比较结构偏差。

这样一来,非常小的:

  • 缺口
  • 局部中断
  • 极细异常区域

都会更容易被稳定地显现出来。

第二,对无关噪声更不敏感

因为系统并没有把整张图都当成等价检测对象,而是把注意力限制在已经落位的局部结构上。

很多来自:

  • 背景
  • 局部污染
  • 边缘偶然波动

的干扰,根本不会轻易进入最终判定链条。

所以,这套系统的检测并不是“看整张图哪里不对”,而更接近于:

沿着一组已经落位的结构点,逐点展开局部测量,再把这些局部测量组织成最终缺陷。


四、为什么这么多不同缺陷,最后还能放进同一套测量框架?

从表面上看,这套系统面对的缺陷类型很多:

  • 镭断
  • 色异常
  • 多镭
  • 局部失配
  • 码数量异常
  • 等等

它们看起来完全不像一回事,似乎应该对应很多彼此独立的小算法。

但如果从更深一层的机制看,这些缺陷并不是若干套彼此孤立的逻辑,而是被统一纳入了同一条主线:

  1. 测量集已经落位;
  2. 局部邻域被展开;
  3. 某种局部几何量或灰度量被测出;
  4. 点级异常被记录;
  5. 再通过邻域关系聚并为缺陷区域或缺陷类型。

也就是说,不同缺陷虽然“长得不一样”,但它们在系统里进入检测链条的方式其实很相似:都先表现为某些测量点上的局部异常,再逐步从点级异常上升为最终可输出的缺陷结果。

这件事非常关键。

因为它说明这套系统并不是把每一类缺陷都单独写成一套完全不同的流程,而是在一个统一的测量框架上,允许不同类型的局部量去触发不同的异常解释。

也正因为如此,系统才没有退化成:

“缺陷类型越多,逻辑越碎,最后全是补丁和特例。”

相反,它始终保持了一条清楚的主线。


五、从点级异常到最终缺陷:为什么不是一个点异常就直接 NG?

测量点上的局部异常,并不会立刻等价于最终缺陷。

这是因为在真实现场里,孤立的异常点可能来自:

  • 局部波动
  • 偶然噪声
  • 边界不稳定
  • 局部污染

如果系统只要某一个点异常就直接判 NG,那么误报会非常高。

所以,这套系统真正的判定过程并不是:

点异常 = 缺陷

而是更接近下面这条链:

  • 某些测量点先表现出局部异常;
  • 系统再观察这些异常点在邻域内是否形成足够稳定、足够密集的异常集合;
  • 当这种集合达到一定结构条件后,才进一步形成缺陷区域、缺陷类型和最终输出。

这一步非常重要。

因为它解释了为什么系统既能抓住很细微的缺陷,又不会因为少数孤立噪声点就轻易乱报。

说得更直白一点:

  • 点级测量负责“发现异常苗头”;
  • 后续聚并负责“把异常苗头解释成真正可输出的缺陷”。

也正是在这一层,系统才真正完成了从“局部测量”到“工业输出”的转换。

图 2:从点级异常到最终缺陷。系统不是看到单个异常点就立刻判 NG,而是通过邻域聚并,将局部异常点组织成最终可输出的缺陷区域。


六、为什么这套系统能测到非常细微的缺陷?

如果只看最终结果,很多人会把系统能抓到细微缺陷归功于某个特别强的分类器、某个很高深的特征,或者某种特别神秘的阈值策略。

但对这套系统来说,更根本的原因并不在那里。

它之所以能测到非常细微的缺陷,首先是因为模板结构已经通过配准真正落入了实测图像;其次是因为后续测量并不是在整张图里盲扫,而是沿着这些已经落位的结构点逐点展开。

也就是说,系统始终是在:

“应该有结构的地方”测偏差,而不是在无差别地扫整张图。

为了让这一点更直观,不妨把“模板已经真正落位”和“细微缺陷如何显现”放在同一张图里看。

左侧给出的是中轴线配准后的现场效果图:绿色线条并不是人工标注,而是由现场软件依据模板结构在实测图像上自动生成的骨架,也就是 XML 中skeleton在图像中的实际落位结果。它的意义不只是“看起来对齐了”,而是说明后续测量所依赖的结构关系已经真正进入了实测对象。

右侧则给出几类真实产线样本中的局部缺陷效果图,包括镭断和多镭等典型情形。图中保留的是与缺陷相关的局部区域,红色方框标示系统检测到的异常位置。

这样并排来看,这套系统之所以能测到非常细微的缺陷,原因就会很清楚:它不是先在整张图里盲目找异常,而是在模板已经落位、骨架关系已经建立之后,沿着这些结构去感知局部偏差。

图 3:左侧为配准后的中轴线覆盖效果,右侧为真实产线样本中的局部缺陷检测结果。左:绿色中轴线为配准后叠加到实测图像中的结构模板;右:红色方框标示系统检测到的局部缺陷。

正因为如此,它才能够对一些极其细小但真实的结构异常保持敏感。例如:

  • 某个局部点缺失;
  • 一段笔画中间断掉一个很小的方块;
  • 某个局部邻域里出现轻微但真实的异常膨胀。

如果只在原始位图层面去看,这些现象很容易与噪声、局部亮度波动或成像不均匀混在一起;但一旦放到已经落位的骨架和测量关系上,它们就会变成更可解释、也更可测的局部结构偏差。


七、为什么这套测量层本质上仍然是结构化测量,而不是简单规则堆砌?

从表面上看,这套系统当然有不少参数、阈值和局部判别逻辑。于是很容易有人觉得,它最终不过是一套调参很多的规则系统。

这个印象并不奇怪。因为如果只看配置文件里的参数名,而不去看它们依附在哪一层机制上,确实会觉得“规则很多”。

但问题的关键不在于“有没有参数”,而在于:

这些参数是不是悬空存在的。

为了说明这一点,不妨先看一小段经过简化后的参数组织方式:

[Path] XmlPath=.\lab_config\AM\laserCarving_TCharge.xml [Param] ThresholdBlockSize=... contAreaMin=... contAreaMax=... NeighbourSize=... NgPointNumThres=... CharPointNumThres=... DiffThres=... MatchingThres=... IterCount=... MaxPointDist=... DistYThres=... [Defect] detectType=11 LightThres=... DarkThres=... GlobalColorThres=... GumThres=... DiaThres=... ResidualAreaThres=... ZeroDiaRate=... detNormThres=...

如果只看这些名字,确实会觉得参数不少。但稍微往下看一层,就会发现,它们并不是杂乱堆在一起的,而是分属不同层级:

1)模板入口与对象形成层

XmlPath并不是一个普通路径项,它实际上把当前这份INI直接连到了对应国别或产品面的XML模板上。也就是说,这套系统一开始就不是“先有一堆阈值,再想办法去适配对象”,而是先由XML给出字符骨架、全局几何锚点、block组织和模板入口,INI再去调节这一整条检测链如何工作。

2)前端提取与 block 形成层

例如ThresholdBlockSizecontAreaMincontAreaMax一类量,控制的是局部二值化、轮廓筛选、膨胀与降噪等前处理过程。它们回答的不是“最后判什么 defect”,而是“哪些区域有资格进入后续检测链”。

3)配准与结构落位层

例如MatchingThresIterCountMaxPointDistDistYThresNeighbourSize等量,控制的是模板匹配是否成立、点集对应范围有多宽、迭代配准做多少轮,以及局部测量尺度取多大。它们首先服务的是“结构如何稳定落位”,而不是“结果如何直接给出”。

4)局部测量对象层

例如LightThresDarkThresGlobalColorThresDiaThresResidualAreaThresZeroDiaRatedetNormThres,分别对应局部灰度与对比关系、整体色异常、局部宽度或直径类量、残余区域以及整体失配程度等辅助量。

5)点级异常如何上升为最终缺陷

例如NgPointNumThres,以及更完整配置中出现的BreakPointNumThresColorDiffPointNumThresLargeDiaPointNumThresconvergRadius一类量,本质上都不是在定义单点异常本身,而是在定义:异常点在邻域内达到什么规模、什么密度之后,才足以形成可输出的缺陷。

所以,从更本质的角度看,这一层并不是简单规则堆砌,而是一种建立在模板、配准、测量点和局部邻域之上的结构化测量系统。参数当然存在,但它们不是主干;主干始终是:

先把结构关系建立起来,再让参数和规则落到已经成立的结构之上。

八、这一讲的结尾:缺陷不是“找出来”的,而是“测出来”的

到这里其实可以看清:这套系统里的缺陷检测,并不是直接从图像里“扫出来”的,而是沿着已经落位的测量集被逐点测量、再逐步聚并出来的。

所以,这一讲最重要的结论其实可以压缩成一句话:

缺陷不是直接从整张图里找出来的,而是沿着已经落位的测量集被测出来的。

这也意味着,系统真正的难点并不只是“有没有一个判定规则”,而在于:模板、配准、测量点、局部邻域和缺陷输出之间,能否被组织成一条连贯的技术主线。

下一讲,我会继续沿着这里往下写:这些已经形成的缺陷结果,最终是如何进入并适应产线节拍、并行处理、多线程组织和工程实施流程的。

http://www.jsqmd.com/news/640269/

相关文章:

  • RWKV7-1.5B-g1a开源模型价值:1.5B参数实现多语言生成的性价比之选
  • 乙巳马年春联生成终端Java学习路线实践:贯穿理论与项目的综合案例
  • kubectl top 命令实战:实时监控 node 与 pod 的 CPU、RAM 资源占用
  • ncmdump:3步快速解密网易云音乐NCM格式的完整指南
  • SITS2026多模态预训练实战指南:从零搭建跨模态对齐框架,72小时内复现SOTA性能
  • SiameseAOE模型与MySQL集成实战:抽取结果存储与查询优化
  • Claude Code 怎么用?2026 最新配置方案 + 踩坑全记录
  • 深入解析Linux审计工具auditd:从规则配置到日志分析实战
  • 从一次`ros2 daemon`故障恢复,聊聊ROS2底层通信的‘管家’是怎么工作的
  • 反无人机系统(C-UAS)技术:从探测到中和的全面防御策略
  • 软件测试面试经验day03
  • 稀缺资源预警:仅开放3个月的多模态增强数据合成工具链(含LLM驱动的伪标签校验器v2.3)
  • Stata: 手动部署ivreghdfe及其依赖包的完整指南
  • 告别乱码!用Gui Guider给LVGL项目一键添加思源宋体中文字体(附详细步骤)
  • AI Agent岗位35岁危机存在吗:职业寿命分析
  • AI显微镜Swin2SR:5分钟快速部署,小白也能轻松修复模糊图片
  • 云计算垄断:中小企业开发者的测试困境与破局路径
  • SmallThinker-3B-Preview赋能运维:日志智能分析与故障根因定位
  • CLIP-GmP-ViT-L-14图文匹配实测:小白也能用的本地测试工具
  • 告别下载!前端集成docx-preview插件实现文档在线预览
  • 10分钟打造专属语音模型:Retrieval-based Voice Conversion WebUI 终极指南
  • 告别手动编译:用ADI的meta-adi层在PetaLinux里一键集成AD9361 IIO驱动
  • Phi-4-Reasoning-Vision惊艳效果:多轮图文交互中持续上下文保持与逻辑一致性演示
  • 广域网技术——iFIT:随流检测的智能运维实践
  • Easy-Scraper:基于DOM树模式匹配的3倍性能提升数据提取方案
  • WebRTC实战:如何用MediaStream API实现摄像头和麦克风的动态切换(附完整代码)
  • Scratch二次开发#2——自定义菜单栏
  • RC吸收电路设计实战:如何快速计算并优化MOS管关断尖峰
  • NifSkope终极指南:如何免费编辑Bethesda游戏3D模型的完整解决方案
  • 阿里Z-Image-Turbo镜像体验:无需下载模型,3步跑通文生图