第四讲:曲面 Pattern 缺陷检测的核心几何机制——两层配准与注册集、测量集的角色分工

张开发
2026/5/26 3:14:31 15 分钟阅读
第四讲:曲面 Pattern 缺陷检测的核心几何机制——两层配准与注册集、测量集的角色分工
原文 第四讲曲面 Pattern 缺陷检测的核心几何机制——两层配准与注册集、测量集的角色分工在前一篇里我主要讨论了这套系统为什么能够在不同产品、不同国别、不同产线之间复用以及 xml 为什么不只是普通配置文件而更接近一份产品几何描述文件。但模板文件本身仍然只是“静态结构”。它保存了字符库、全局几何锚点、block 序列、拓扑先验和方向容错却还没有回答一个更核心的问题这些静态模板究竟如何进入实测图像并真正支撑起后续缺陷测量答案就在配准。不过这里的配准并不是一个孤立的小模块也不是做完“对齐一下”就结束的技术动作。对这套系统来说配准承担的是更基础的任务它要把模板和实测对象之间的可比较关系建立起来使后续检测不再停留在位图层面的直接碰撞而是落在一个已经被几何组织过的结构关系上。也正因为如此这套系统并不是“一次配准解决全部问题”。在当前工程实现中这一思想被具体落成了两层配准先在较粗层级上建立局部单元之间的大致对应再在更细层级上让结构模板真正落入实测图像。这里的“两层”不必被理解为唯一可能的形式它更接近于一种分层配准思想在当时工程规模下的有效实现。若从更一般的角度看这类机制完全可以被进一步推广为层级化、图结构化的配准组织但在这套系统所面对的对象规模与节拍约束下两层已经足够有效也足够稳定。与此同时这套系统并没有把“模板”简单理解成一堆统一处理的点。前面第三篇已经看到模板 xml 的character层下面组织着多个skeleton节点但到了检测阶段这些skeleton并不只是静态模板条目而会进一步成为配准组织中的最小单元。更进一步系统又不会把单元内部的所有点一视同仁地统一处理而是继续区分出注册集与测量集。这样做的原因很简单最适合建立定位关系的单元粒度不一定最适合感知局部缺陷而最适合用于定位的点也不一定最适合用于测量。于是配准和测量虽然连续发生却并不依赖完全同一种组织方式。所以这一篇真正要讲清楚的是四件事为什么这套系统不能跳过配准直接做缺陷判别为什么不是一次配准而是两层配准为什么skeleton的粒度本身就是配准设计的一部分为什么注册集与测量集要在模板层就区分角色。一、为什么这套系统不能跳过配准直接做缺陷判别如果把问题理解得很浅最容易产生的想法就是既然目标是检测缺陷那么为什么不直接在图像上判断哪里异常、哪里不异常但这条路在这类项目里通常走不远。原因并不只是现场存在扰动——这在平面检测里同样成立。更关键的是这套系统并不满足于在位图层面直接比较“像不像”而是进一步抓住了 pattern 的几何结构本身。换句话说这里的检测对象并不只是原始位图区域而是经过模板组织与配准落位之后的一组结构点及其邻域关系。只有当这种结构关系被建立起来系统才有可能把局部几何偏离从普通成像波动中分离出来并进一步测量出非常细微但真实的缺陷。例如一个字符局部少掉一个点一段笔画中间断掉一个很小的方块或者骨架邻域里出现极小但真实的结构中断这些都不是简单靠位图阈值就能稳定抓住的。因此配准之所以不可跳过不是因为“曲面对象更复杂”这一句泛泛的判断而是因为只有先把模板结构带到实测图像中后续测量才有真正可靠的几何参照。从这个意义上说缺陷判别不是起点配准后的几何关系才是起点。二、为什么不是一次配准而是两层配准如果已经承认配准不可跳过接下来自然会问为什么不能一次完成为什么系统里会长成目前这种分层结构原因在于这套系统面对的并不是一个单一、干净、局部的小对象而是一整张产品面上的多个 block、多个局部结构、多个模板入口以及实时业务输入带来的动态变化。如果一上来就直接拿所有精细结构点去做统一配准问题通常会变得既慢又不稳搜索空间太大候选关系太杂局部细节又很容易被全局误差拖偏。所以系统必须先回答一个更粗的问题再回答一个更细的问题。第一层配准作用在较粗层级上。它面对的是 block 的几何代表点例如中心点集合或全局锚点集合本质上仍然是点集配准只不过粒度更粗。它要解决的不是精细测量而是先建立局部单元之间的大致对应当前图像里哪些 block 成立它们分别大致对应模板中的哪一部分后续精配准应该在什么局部范围内展开。第二层配准才真正进入结构模板层。也就是在 block 大致落位之后再把注册集带入实测对象在更细的几何层面上建立局部模板与实测对象的对应关系并让测量集随之同步进入正确位置。只有做到这一步后续缺陷测量才真正拥有了足够细的几何基础。因此当前实现里的“两层配准”并不是重复劳动而是分别承担两个层级的问题第一层回答“哪一块对哪一块、整体大致在哪”第二层回答“结构模板如何真正落位、后续测量点如何进入实测图像”。如果把这两层任务混在一起系统就很容易既不稳定也不经济。图 1两层配准的层级示意图。上层负责 block 级粗配准下层负责 register set / measure set 的精配准与测量。三、为什么skeleton的粒度本身就是配准设计的一部分讨论第二层配准时一个很容易被忽略的问题是模板到底以什么作为最小配准单元进入实测图像在这套系统里这个单元并不是抽象的“全部点集”而往往就是一个skeleton。而skeleton又不一定总是对应单个字符它既可以表示一个字符的骨架也可以把多个字符、一个 logo、甚至一段更复杂的局部图样合并成一个整体骨架单元。也就是说skeleton不只是模板库里的一个名字它实际上决定了第二层配准的基本粒度。这一点非常重要因为不同粒度的skeleton有不同的工程取舍。如果把单个字符做成一个skeleton局部配准通常会更精细对单字符的形变也更敏感某些缺陷更不容易被“平均掉”。但它的代价是对一些结构过于简单的对象尤其是几何约束很弱、拓扑信息很少的字符配准本身会变得不够稳。例如像 “1” 这类简单字符如果它局部少掉一小段非刚性配准在某些情况下仍然可能把模板“配上去”。原因并不神秘这类对象的结构自由度高而约束少局部 break 可能会被平滑形变吸收掉。换句话说模板虽然对齐了但缺陷本身却没有因此被可靠地显现出来这就会带来现场漏检风险。而对带有回环、分叉或者更复杂内部几何组织的对象情况就会不一样。像 “B”“6” 这类结构或者把多个字符合并成一个整体骨架之后配准时会得到更强的整体约束。其原因在于一旦对象内部存在更丰富的拓扑关系或更长程的结构耦合非刚性配准就不那么容易只靠局部拉伸或滑移把缺损“抹平”。简单说结构越复杂模板越不容易在错误位置上“假装配准成功”。这就是为什么在汉字、不规则图形或者一些局部结构过于简单的字符区域里把多个字符合并为一个skeleton往往反而更鲁棒。这样做虽然会牺牲一部分单字符粒度的灵活性但它会显著降低配准失败和过杀的风险也更不容易让缺陷被非刚性形变吸收掉。因此这里的skeleton粒度并不是模板制作上的随手选择而本身就是配准设计的一部分。单字符skeleton的优势在于灵敏多字符skeleton的优势在于鲁棒而真正合理的取舍来自对象结构本身及其拓扑约束强弱。四、为什么注册集与测量集必须在模板层就分开这套系统里另一个非常关键、也非常容易被忽略的设计是注册集与测量集的角色分工。很多人在做检测时会很自然地默认既然一组点能用来定位模板那它们当然也可以直接拿来做缺陷测量。但在真实工程里这两件事往往并不完全重合。最适合用来建立定位关系的点不一定最适合感知局部异常反过来对缺陷最敏感的点也不一定在注册时最稳定。因此这套系统并不是在运行时才临时把点分成两类而是在模板层就已经把这种角色分工编码了进去。最直接的证据就是读取skeleton点属性时的这段逻辑xatoi(p_p-Attribute(x));yatoi(p_p-Attribute(y));tatoi(p_p-Attribute(t));// point typeif(1t){s.ps4regist[s.num4regist][0]x;s.ps4regist[s.num4regist][1]y;s.num4regist;}elseif(0t){s.ps4measure[s.num4measure][0]x;s.ps4measure[s.num4measure][1]y;s.num4measure;}这段代码的意义并不只是“把点读进来”。它真正说明的是同一个skeleton内部的点并不是天然同质的而是从模板描述层就已经被区分成了两种角色t 1的点进入注册集t 0的点进入测量集。也就是说注册集与测量集并不是后处理阶段才拆开的两个点集而是一开始就写在模板里的角色分工。这种设计的意义非常大因为它使得“定位稳定性”和“缺陷敏感性”可以在模板层就被分别优化而不必强迫同一批点同时承担两个并不完全一致的目标。这种区分在不同对象上会有不同体现。对于枝杈结构例如字符中轴线往往同时具有较强的结构代表性和测量可用性因此注册集和测量集可以接近甚至重合。但对于实心结构例如某些实心 logo 或填充区域边缘点更适合用来建立定位关系而内部点可能更适合承接后续测量。也就是说这套系统并不是先验地规定“所有对象都用同一批点做所有事”而是根据对象结构去决定哪些点最适合注册哪些点最适合测量。一旦把注册和测量分开系统就获得了更高的灵活性定位可以优先追求稳定性测量则可以优先追求敏感性而不必让同一批点同时承担两个并不完全一致的目标。反过来如果把两者强行混在一起往往就是注册不够稳测量也不够准。图 2注册集与测量集分离示意图。左侧为枝杈结构右侧为实心结构。五、两层配准在系统里到底是怎么串起来的从系统流程上看分层配准、skeleton粒度以及注册集、测量集的角色分工并不是彼此分离的几个概念而是紧密串成一条主线。系统首先读取产品模板与 block 组织信息并在较粗层级上对 block 的几何代表点——例如中心点集合或全局锚点集合——进行第一层点集配准以确定哪些局部单元在当前图像中成立以及它们与模板之间的大致对应关系。换句话说第一层并不是一个模糊的“先找一找位置”而已经是在较粗粒度上建立局部单元之间的几何对应。随后对已经落入合理局部范围的 block系统再读取其对应的skeleton单元并根据模板中已经编码好的点角色把注册集与测量集分别取出。在第二层配准中系统用注册集把模板真正带到实测图像上而测量集并不是另起一套独立流程而是随着配准关系同步推进。最后镭断、色异常、多镭、偏移等局部缺陷测量才沿着这些已经被带到实测图像中的测量点展开。如果把这一过程再压缩一点它的逻辑其实就是先在粗层级上建立局部单元之间的大致对应再在细层级上以skeleton为最小单元建立结构模板与实测对象之间的精细对应最后把缺陷测量放在这个对应关系之上。所以配准在这里并不只是“求一个变换”或者“返回一个分数”它真正做的是把模板关系变成后续检测可以依赖的几何事实。从工程实现的角度看这一过程更接近下面这样的流程for each matched block: coarse registration on block-level representative points determine approximate correspondence select skeleton unit(s) in this block load register set and measure set from template fine registration on the register set move the measure set together perform local defect measurement along measurement points这段流程看上去并不复杂但它把系统里最关键的分工都压缩进去了第一层负责建立 block 级对应第二层负责让模板真正落位skeleton决定了精配准的最小组织单元而缺陷测量则始终建立在已经落位的测量集之上。六、为什么配准在这里不是最终判决器很多人一看到配准就很容易把它理解成“最后给出一个分数”或者“最后决定是不是匹配成功”。但在这套系统里配准并不是最终判决器。它当然可以给出某种全局失配量并在某些情形下辅助 mismatch 一类的判定但对于镭断、色异常、多镭这类真正依赖局部结构的缺陷类型来说配准分数本身并不构成结论。真正的结论来自哪里来自配准之后。更准确地说来自这样一个过程模板已经通过注册关系被带到实测图像上测量集也已经随之进入了正确位置系统随后再沿着这些测量点去展开局部邻域分析、灰度与对比度测量、宽度与残余面积测量最后才对缺陷类型作出判断。从这个意义上说配准最重要的输出并不是某个抽象的返回值而是它把后续检测所依赖的测量点关系变成了实测图像中的几何事实。这也是为什么我一直更愿意把配准理解为几何基础而不是最终判决器。它本身不是“最后答案”但没有它后面的答案就没有可靠的参照系。七、这一层为什么是整套系统真正的核心几何机制如果把 xml 看作这套系统的静态骨架那么两层配准、skeleton作为最小配准单元的组织方式以及注册集 / 测量集在模板层就被区分开的角色分工就是这套系统真正开始“动起来”的地方。模板在这里不再只是存储对象而是开始进入图像block 不再只是组织单元而是开始建立对应skeleton不再只是模板库中的一个名字而是开始决定精配准的基本粒度注册集不再只是模板点的一部分而是开始承担定位任务测量集也不再只是附属点而是开始沿着正确的几何关系进入实测对象并真正支撑起后续缺陷测量。也就是说到这一层为止这套系统才第一次把“模板组织”真正转化成了“检测能力”。这也是为什么我会把这一层看作整套系统的核心几何机制。因为它真正解决了这样一个问题模板如何不只是静态存在而是成为后续检测可以依赖的几何事实以及模板的粒度、拓扑复杂度与点角色分工又如何共同影响配准的稳定性与后续测量的可靠性。下一讲我会继续沿着这里往下写在测量集已经落位之后镭断、色异常、多镭等缺陷究竟是如何被逐点测量、逐类归并并最终转化成系统输出结果的。

更多文章