ARTICLE DETAIL

资讯详情

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

BRepNet加工特征识别实战:从图网络原理到工程部署

BRepNet加工特征识别实战:从图网络原理到工程部署 一开始接触BRepNet是在一个老客户的CAM自动编程项目里。对方要求把过去需要工艺工程师手工标注的孔、槽、台阶全部自动识别出来接进后处理流程。当时我第一反应还是走传统几何推理的老路结果折腾了一个多月面对千奇百怪的倒角、圆角过渡、拔模斜面规则写了一堆却永远补不完漏洞。换到BRepNet这类基于边界表示的图神经网络方法之后事情才真正有了转机。这篇文章把原理、复现细节、踩坑经历和精度泛化提升的实操经验一次性聊清楚适合正在做CAD/CAM二次开发、智能制造算法落地或者想研究BRep方向GNN应用的工程师参考。1. 加工特征识别这件事为什么卡了三十年1.1 先搞清楚特征在制造业到底指什么加工特征识别Machining Feature RecognitionMFR要解决的问题很朴素给定一个三维CAD实体模型让计算机自动判断这个零件上有哪些可以被机床直接加工的区域——通孔、盲孔、凹槽、台阶、型腔、凸台等等。这些特征本质上对应特定的加工操作和刀具路径。传统CAD软件里的特征识别功能大多停留在参数化特征树的层面那是在建模过程中记录下来的。真正的痛点在于交换模型当客户发来一个只有几何信息的STEP文件或者是从别的CAD软件导出的BRep模型特征树已经丢失了只剩下一堆面、边、顶点的拓扑关系。这时候怎么把这里是一个台阶面那里是一个盲孔内壁这些信息恢复出来这就是MFR的战场。这里有个关键区别需要明确加工特征不完全等于设计特征。设计上叫圆角的东西在加工层面可能意味着清根、圆角铣削设计上是一个倒角加工时要区分是车削倒角还是铣削倒角。所以MFR的任务不仅是从几何上找出形状还要映射到工艺语义上这就比单纯的分割要复杂得多。1.2 传统的几何推理方法为什么总是脆上世纪八九十年代开始学界和工业界就在做特征识别主流思路可以归纳为三类第一类是图模式匹配。把BRep的face作为节点、edge作为边构造属性邻接图Attributed Adjacency GraphAAG。每种特征对应一种子图模式比如通孔的AAG就是一圈凹边连接内壁面型腔的AAG是底面被凹边环绕且外轮廓呈环状。识别过程就是子图同构搜索和模式匹配。理论漂亮实际工程里却非常脆弱真实零件上大量存在倒角、过渡圆角、自由曲面、特征相交任何一个修饰面都会让标准子图面目全非。更致命的是在一个上万面的复杂零件上做子图同构搜索是NP-hard问题搜索空间爆炸后规则库越写越长还是覆盖不了所有变体。第二类是基于体积分解。想法是把实体拆成凸包再通过凸包与原始实体的差集找到加工去除体积也就是每次走刀切掉的部分。典型的方法有凸分解、单元分解。这类方法对特征的语义建模更强但分解过程中会产生大量假的凸单元任意两个凸单元合并可能就形成一个新的假特征组合爆炸非常严重。我在一个实际壳体件上测试过一个两百多个面的零件分解出的候选单元能到几千个后处理筛选规则比图匹配还复杂。第三类是基于痕迹hint-based。这个方法通过识别出加工可达方向、刀具接近方向来反推特征的边界痕迹比如孔的轴线、槽的开口轨迹。思路很工业对特定工艺很有效但每个工艺都要单独设计一套痕迹提取算法可扩展性极差。这些传统方案都逃不过同一个魔咒规则的完备性和特异性不可兼得。规则写得宽就会把不是特征的东西误判成特征规则写得严真实零件的变体一旦稍有偏离就漏检。在我接触的大量实际模型中光是一个台阶与通孔相交的典型结构就能让几乎所有传统规则库崩溃。1.3 深度学习进场体素、点云、多视图各自的问题2015年之后深度学习方法开始冲击CAD这个领域。最早一批是体素化的三维卷积网络把实体离散成固定分辨率的体素网格。好处是能直接用3D CNN分类坏处也很直接分辨率太粗孔和薄壁的特征被磨平分辨率提高显存和计算量立刻爆炸而且体素化引入了人为离散误差BRep里精确的曲面方程和拓扑信息全部丢光了。对于工程级精度要求体素方法用于特征识别基本只能停留在论文演示阶段。点云方案PointNet、PointNet及其变体情况好一些通过局部采样点做空间特征提取。点云方法的问题在于BRep模型的几何精度高但采样后边界的锐利性会退化尤其是那些只有几个面的小型加工特征稍微采样密一点还行采样稀疏一点就把孔内部的阶梯面丢失了。而且点云方法需要额外计算法向量和邻域关系本质上是在重新估计我们本来就从BRep中可以直接拿到的拓扑信息。多视图方法把3D模型投影成多张2D图像用预训练的2D卷积网络提取特征。这类方法对渲染视角非常敏感零件内部的特征比如深孔内壁几乎看不见多个视角融合的时空开销也不小。它偶尔在检索任务里效果不错但用于逐face级别的加工特征识别完全对不上号。究其根本这些方法的共同问题在于它们在用一个本质上与BRep无关的数据表示去学习一个有强拓扑结构的CAD模型。加工特征识别的核心信息是拓扑连接和几何边界而体素、点云、视图都把这些信息绕了一个大弯去重建。BRepNet的价值恰恰在这里它把BRep本身当作图来用让网络直接在拓扑结构上演进。2. BRepNet的核心把BRep拓扑变成一张可以训练的图2.1 BRep的三层结构Face、Edge、Coedge不理解BRepNet的设计就无法正确地实现它。先回顾一下BRepBoundary Representation边界表示的数据模型。一个BRep实体由三层拓扑元素组成最上面是face面每个face对应一个几何曲面区域face的边界由若干环wire围成环又由一条或多条edge边首尾相连每条edge是一条有方向的曲线落在相邻两个face的共同边界上。关键的第三层是coedge有向边/半边。BRep里每个edge其实会被邻接的两个face各自引用一次每个引用就是一条coedge。coedge保存了edge相对于该face的方向如果顺着coedge方向走face区域在左侧还是右侧。这保证了任何一条edge在其所属的face环中都有确定的方向语义。为什么必须有coedge这一层因为一条edge在两个相邻face上呈现的方向是相反的。没有了方向信息我们就无法定义边的凸凹性。而凸凹性恰恰是加工特征识别最核心的几何线索凹边通常意味着材料被去除的边界凸边意味着突起或台阶的外边界。这是BRepNet设计中绕不开coedge的根本原因。在OpenCASCADE这类内核里访问路径是 TopoDS_Shape → TopoDS_Face → TopoDS_Wire → TopoDS_Edge → TopoDS_Vertex而coedge在OpenCASCADE中对应 TopoDS_Edge 在 TopoDS_Face 内的方向关系通常需要通过 BRep_Tool 和 TopExp 来考察。实现时最好用自己的数据结构把这些拓扑关系重新组织一遍直接依赖几何内核的顶层API会把关键的方向信息藏在底层细节里调试起来非常痛苦。2.2 异构图设计为什么用超边而不是普通边BRepNet把CAD模型构建成一个异构图face是节点edge是节点coedge则起到超边hyperedge的作用。异构图的意思是图中不只一种节点/边类型信息传播路径也因类型而异。为什么不是简单的face为节点、edge为边的普通图我在第一次实现的时候也这么想过但很快发现这样行不通。普通图里一条边连接两个节点没有任何中间层可以承载方向信息。而实际上从face A到face B中间要穿过edge且edge相对face的方向信息决定了这个穿越是沿凹边还是沿凸边。没有coedge这一层网络就无法区分这条edge是在face A的上环还是在face B的下环也就无法利用边的方向性。BRepNet中coedge作为超边连接两个组件一侧是edge一侧是所属face。超边的引入让图和BRep拓扑保持了一一对应关系。在这个结构下消息传递可以自然地实现多跳传播face特征先传播到coedgecoedge再传播到edgeedge的信息经另一条coedge传播到邻接face。这样一条edge的凸凹性和连接角信息经过一跳就可以影响两侧面的特征表示。工程上这种结构在PyTorch Geometric里面其实很好表达。face和edge各维护一份节点特征coedge用一个索引表维护连接关系每个coedge关联一个face_id和一个edge_id。消息传递就变成两次聚合一次把face消息聚到coedge一次把edge消息聚到coedge然后再把更新后的coedge特征分别聚回face和edge。理解了这一点图构建代码写起来并不复杂。2.3 初始特征怎么从几何内核提取图结构搭好之后要解决的是每个face、edge、coedge上放什么初始特征。这是BRepNet效果好的另一个关键。初始特征既要包含局部几何信息又不能包含太多绝对位置否则会破坏旋转平移不变性。对face节点我常用的初始特征有这组面积、法向量三分量、两个主曲率、曲面的类型编码平面、圆柱面、圆锥面、球面、样条曲面、该face包含的环数量、每个环上的edge数量直方图、外环周长和面积之比。其中主曲率不是在网格上估计的而是直接从曲面方程上解析获得。比如从圆柱面上取face主曲率一个为0另一个为1/半径这个信息对区分孔内壁和台阶面非常有用。对edge节点特征包括曲线长度、曲线类型编码直线、圆弧、样条、如果是圆弧则包括半径和扫掠角、edge两端顶点的坐标局部归一化、和相邻face的夹角二面角。最核心的是凸凹性计算方式很简单拿到edge两侧face的法向量n1和n2选择coedge方向使得face区域在左侧定义切向量t为coedge的切线方向那么凸凹性由n1与t的叉积点乘n2的符号决定。正负号约定不同的库可能不一样但关键是要保持一致。这个特征对特征识别太重要了后文会专门展开。对coedge特征主要是相对edge的方向标志、在所属face环中的序号、如果是光顺连接比如倒角边则额外标记光顺类型。倒角边在加工特征识别里是特别容易干扰规则的有了coedge层的标记网络能学会把光顺边两侧的face特征做弱关联而不是强制合并。初始特征维度不用太高我通常控制在30到50维。原论文里也强调重要的是特征的信息密度而非维度。一上来堆砌几百维的局部统计反而会让训练变慢而且容易过拟合到训练集的几何分布上。3. 消息传递是怎么一步步更新节点特征的3.1 四步消息传递流程细拆BRepNet的核心网络结构是一个在face、edge、coedge三种实体之间交替更新特征的消息传递网络。每次图卷积层大致分成四个步骤。第一步是face到coedge的消息传递。每个face节点把它当前的隐藏状态发给它所有关联的coedge。实现上就是把coedge侧的隐藏状态和它所属face的隐藏状态拼接到一起过一个小型MLP做特征融合得到临时候选状态。这个步骤让coedge感知到它所在面的几何信息。第二步是edge到coedge的消息传递。每条edge把它的隐藏状态发给对应的coedge。因为每条edge恰好关联两条coedge所以这里相当于把edge的特征广播给两侧。与第一步的结果一起coedge特征就被更新为融合了face和edge信息的表示。在实现时要注意两条关联的coedge拿到的edge特征相同但自身携带的方向标志不同所以更新后的表示也会逐渐分化。这个分化就是网络理解这条边在这侧是凸的、另一侧是凹的的基础。第三步是从coedge到face的聚合。每个face节点把它关联的所有coedge的更新后特征聚合成一个向量更新face的隐藏状态。聚合函数我的经验是先用对称聚合求和或均值再做非线性变换。求和能保留数量信息均值更稳。如果图规模差异大建议用均值或者带权求和避免大face关联很多coedge的特征数值爆炸。第四步是从coedge到edge的聚合。类似地每条edge把两条coedge的特征聚合到edge隐藏状态里。这一步让edge节点也感知到两侧面经过更新后的信息。跑完这四步一个图卷积层完成。堆叠K层之后每个face节点的表示理论上编码了K-hop邻域的几何和拓扑信息最后把face表示接一个全连接层和softmax分类器就可以做逐face的特征类型分类了。3.2 为什么凸凹性和边方向如此重要如果你只记得一个经验我想强调凸凹性这个特征在所有输入中占据的特殊地位。原因很直接加工特征在BRep里几乎都是由凹边围起来的。看一个台阶特征。台阶的底面和侧面之间是一条凹边顶面和外侧面之间是一条凸边。再看一个型腔pocket底面与所有侧壁之间是凹边侧壁与顶面之间是凸边。孔的内壁之间是凹边但孔与顶面的交线是凸边。所以只要网络能在早期层里识别出哪些边是凹的、哪些边是凸的后续层就能非常容易地把face聚集成有意义的加工区域。传统AAG匹配方法里凸凹边分类几乎是唯一的判别依据因此它受倒角、圆角干扰时会彻底失效。BRepNet的优势在于凸凹性只是输入特征之一网络可以结合曲率、连通关系、环结构甚至更高阶的上下文做联合判断。但我的实测经验依然显示如果把凸凹性特征都拿掉模型的mIoU会掉5到8个点这是所有输入特征里影响最大的单个特征。方向信息之所以关键还体现在特征融合上。同一条edge在台阶底面看是凹的在台阶侧面看也是凹的但在顶面外侧看是凸的。如果简单地把edge特征无差别广播给两侧face网络就不知道这个边到底是材料向内切还是材料向外凸。有了coedge的方向标志网络才可能建模这种非对称关系。3.3 BRepNet和普通GCN/GAT在实现上的差异图卷积网络GCN和注意力图网络GAT大家比较熟BRepNet可以理解为MPNN消息传递神经网络在异构三元组上的一种特化。它们的核心差异有三个方面。第一是边类型高度异质化。GCN里的边通常是无类型或固定几种类型而在BRepNet里一条边的语义由凸凹性、方向、所属面组的组合决定光类型组合就能到几十种。直接在邻接矩阵里给每种类型一个可学习权重会爆炸BRepNet的办法是把边信息作为特征输入让网络自己学习组合。第二是节点更新的信息流向不同。GCN通常是一次聚合相邻节点而BRepNet必须走face → coedge → edge → coedge → face的闭环。这个环路保证了edge的信息能够回流到face再进入下一层。如果直接构造一个二部图face直接连接edge然后跑两跳GCN效果会明显差一截原因就是coedge这个中间载体承载的方向信息没有被显式建模。第三是批量训练图尺寸差异很大。一个MFCAD里的简单零件可能只有十几个face测试阶段的复杂零件可能上千个face。GCN模型对图尺寸变化有一定鲁棒性但消息传递的层数、聚合方式、归一化方式都会影响大图的稳定性。我在一个数百面的大型支架件上测试如果不做聚合归一化深层特征会越来越尖锐最后softmax输出几乎变成one-hot置信度完全失真。后来在聚合后加了LayerNorm才把这个问题压下去。4. 复现BRepNet的完整过程和踩坑记录4.1 环境准备与数据获取如果你要用Python复现BRepNet推荐的环境组合是Ubuntu 22.04 Python 3.9 PyTorch 1.13 PyTorch Geometric 2.2 pythonocc-coreOpenCASCADE 7.6的Python绑定。数据方面最常用的是MFCAD数据集包含约60K个由脚本生成的模型覆盖17种加工特征类型带face级别的分割标签。数据获取有个坑要先提醒MFCAD的官方发布版本是STEP格式的BRep文件但标签文件是JSON格式的face索引列表。face索引的顺序和STEP文件内部face的顺序对齐但这个顺序在不同解析器读出来可能有差异建议用官方预处理脚本统一用OpenCASCADE读取不要自己用别的库解析。另外如果只是先跑通流程可以先从MFCAD的验证子集里随机采样两百个模型做小实验确认自己的图构建和消息传递没有bug再上全量数据。直接在6万模型上跑图特征构建即使并行也要大半天前端时间浪费在等特征上是件很痛苦的事。4.2 数据预处理从STEP文件到图样本拿到STEP文件后第一步是遍历BRep结构。用pythonocc的核心逻辑大概是先通过BRepPrimAPI或者STEPControl_Reader读入TopoDS_Shape然后递归探索shape里的solid、face、edge、vertex。每个face对应一个TopoDS_Face可以通过BRepAdaptor_Surface拿到曲面类型和参数范围每条edge的凸凹性可以是全局属性也可以是局部的——严格来说凸凹性要在每条edge和双侧face的上下文里判定所以实现时我通常先建立edge到两侧face的映射再统一计算凸凹性。计算凸凹性有个细节最容易出错法向量方向不一致。OpenCASCADE中face的法向量方向依赖于face内部的朝向同一个几何平面在不同solid里法向可能是相反的。如果直接拿法向量去做叉积某些edge会被误判为凸边。稳妥的做法是把每个face的几何曲面参数化为(u,v)确保法向量为曲面的外法向可以在构建时就规范化方向。这个方向一致性检查是我调试中最耗时的一个环节。图构建完成后每个样本就是三个索引数组face到coedge、edge到coedge、coedge到face/edge和三个特征矩阵。建议直接把图序列化成h5文件缓存在本地PyTorch DataLoader读取的时候按子图切片即可。不要每次都重新解析STEP那个IO开销会让你怀疑人生。4.3 训练细节损失函数、类别不均衡、过拟合训练时最头疼的问题是类别不均衡。MFCAD里孔类特征占了很大比例槽、台阶、型腔的样本少得多。直接跑交叉熵模型会倾向把所有face都判成孔整体accuracy虚高但槽的recall几乎为零。我的做法是两段式处理。先统计训练集每个类的face数量算中位数权重给每个类一个加权交叉熵。加权后槽的预测明显改善但依然有部分容易混的类盲孔vs通孔分不好。第二阶段引入focal lossgamma设2.0聚焦到难分样本上。两个阶段加起来mIoU大概提升了4个点左右。过拟合也是大问题。图网络参数量不大但初始特征里如果包含了对训练集特有的绝对坐标信息网络会去记位置分布。一个典型的错误是把每个face的bbox中心绝对坐标加进特征在MFCAD上训练时验证集还行换到真实零件上立刻崩。解决方案是特征工程时坚决只用相对几何量必要的位置信息也要先做局部坐标系归一化以face的中心和法向量为参考。训练超参数方面我踩过几次坑后的稳定配置是学习率1e-3Adam优化器weight decay 5e-4批量大小32如果显存允许可以用64图卷积层数3层隐藏维度128dropout 0.2。在这个配置下MFCAD测试集上face-level accuracy能干到95%以上mIoU在0.88左右。层数再多到5层效果不会明显提升显存占用却涨得飞快而且小图上的训练稳定性反而变差。4.4 评估里那些容易被骗的指标评估环节有非常多的坑。最典型的是accuracy虚高MFCAD里孔类face占多数模型把一切判成孔就能拿到高accuracy。所以报告评估结果时我建议至少给三个维度face-level accuracy、类别平均IOUmIoU、feature-level precision/recall把相同标签的连通face聚合成特征区域后再计算。feature-level的评估才是制造场景真正关心的。因为加工操作是针对整个特征做的一个特征上只要有一个face没被识别出来整个加工边界就不完整。计算方式很容易实现把预测标签相同的相邻face做连通域合并然后和标注的连通域比较每个区域算IoU超过0.5算检出。这个指标比face accuracy残酷得多很多模型face acc能到96%feature-level recall却只有80%。另外一个容易被忽略的问题是评估集的数据泄露。MFCAD的生成过程是参数化的同一个特征类别下的模型高度相似。如果你在同一个生成配置的测试子集上评估泛化指标会好得离谱。想真实衡量泛化能力必须跨数据集测试比如在MFCAD上训练在FTCAD或者自己手工绘制的零件上测试这样得到的分数才是可信的。我在一次跨数据集实验中face-level accuracy从95%掉到了78%mIoU从0.88掉到0.62那才是模型真实泛化水平的写照。5. 从能用到好用精度和泛化能力的实战提升5.1 数据侧改进特征增强和小样本策略数据方面提升最大的两个手段是几何增强和多类混合训练。几何增强不是普通图像那种随机旋转缩放而是制造域特有的变换整体刚体变换这已经天然满足但建议仍然显式做几次随机旋转验证网络对绝对坐标是否敏感、镜像变换、比例缩放。比例缩放对小零件检测影响很大因为孔的半径和刀具尺寸相关但特征类型本身不应该随尺度变化所以要确保网络不受绝对尺度影响。有个简单办法在输入特征里除一个整体尺度因子把模型尺寸缩放到单位包围盒。实测显示做了尺度归一化之后跨数据集测试的mIoU涨了4个点。小样本策略方面针对某些样本很少的特征比如T形槽、鸠尾槽可以先去生成一批参数化变体保持拓扑结构不变但几何尺寸在合理范围内随机变化。如果生成程序不好写更轻量的办法是收集少量真实样本用基于BRep的特征插值生成合成样本。这个我尝试过效果不错但要非常小心不要生成出物理上不可能的几何比如过切、自交。5.2 模型侧改进注意力消息传递和边界监督模型层面除了原版MPNN我实验下来最有效的三个改动是多头注意力消息传递、残差连接、边界监督分支。多头注意力消息传递是把第三步的对称聚合换成attention weighted sum。每个coedge在把特征聚回face时学习一个权重表示这条coedge对当前face分类的重要程度。这个注意力权重可视化之后很有意思网络确实会高亮那些位于凹边上的coedge对噪声面则低权重。多头设置为4头稳定性比单头好很多。这个改动在MFCAD测试集上mIoU提升2个点左右跨数据集提升更明显。残差连接就是很常规的ResNet思想每个消息传递层输入和输出相加再经过归一化。很多图网络不加残差也能训练但如果模型层数超过三层不加残差的梯度会变得不太稳定训练曲线波动明显。加上之后收敛速度快了差不多三分之一。边界监督是更好用的技巧。加工特征识别的本质是区域聚集所以可以加一个辅助损失预测每条edge是否位于两个不同特征区域的边界上。实现方法是在edge节点上接一个二分类头标签用训练标注生成两个相邻face标签不同则为边界边。主损失加边界辅助损失比例设为1:0.3。这个辅助任务迫使edge节点学习更准确的凸凹性和邻域关系最终face分类的边界更干净特征级指标提升尤其显著。5.3 工程落地跨CAD内核、实时推理和部署陷阱说完模型改进说说落地层面。在实际CAM软件里部署BRepNet核心难点不在网络本身而是数据管道的鲁棒性。跨CAD内核的问题很现实客户发来的STEP文件可能来自SolidWorks、NX、Creo、CATIA也可能来自国产CAD。不同CAD内核导出的STEP在曲面容差、裁剪边界、几何精度上有差异。同一根圆柱面一个内核可能导出为两个半圆柱面另一个内核导出为一个整圆柱面这在BRepNet的图构建里会导致不同的拓扑结构。实际项目里我建议在数据管道里加一个面融合预处理几何连续且公共边为光顺边G1连续的相邻face先尝试合并减少内核差异带来的拓扑裂变。这个预处理能把跨CAD文件的feature-level recall提升10个点以上。实时性方面单个零件的图构建加推理在GPU上通常需要50到200毫秒CPU上约1秒。瓶颈在STEP解析和图构建不在模型推理。如果要做大批量离线处理建议模型推理用PyTorch的TorchScript导出面特征提取用C重写这样单零件总耗时能压到200毫秒以内。最后还有一个部署陷阱特别值得提BRepNet输出的是face级别的标签概率但CAM后处理需要的是加工特征连通区域及其访问顺序。所以要加一个后处理层把预测结果映射成加工元素按标签做连通域分析提取每个连通域的包围盒、主轴线、刀具进给方向。这个后处理层才是真正和工艺挂钩的部分网络只负责分类后处理负责把分类变成可执行的加工指令两者配合才对工艺师有价值。写在最后的几点个人体会跑了大半年BRepNet相关的项目几个感受比较深。第一个是拓扑结构理解清楚比调模型重要得多。刚开始实现网络时我花了大量时间在PyTorch里调整消息传递模块后来发现大部分精度问题其实源于coedge方向构建错误和凸凹性计算不一致这些是BRep领域特有的细节文档里基本不会写。建议初学的朋友先在数据管道上下足功夫把可视化做好能看到凸边凹边正确上色、coedge方向一致之后再去碰模型结构。第二个体会是加工特征识别这类任务更适合用图拓扑局部几何的组合思路而不是堆体积卷积或端到端的暴力学习。BRepNet的成功不是因为它发明了多高级的GNN而是因为它选对了数据的组织方式。后续做任何类似CAD理解任务思考顺序应该是先问拓扑怎么编码再问几何怎么融入。最后一个小建议如果你准备在自己数据集上训练BRepNet别急着追求精度的涨点先跑通全流程观察初始特征里凸凹性那一列的一致性再开始增量改进。基线模型的稳定复现、评估指标的严谨设定往往比调那几个注意力头数对项目的帮助更大。
返回列表