1. 项目背景与核心挑战
在机械设计领域,SolidWorks工程图承载着产品从概念到生产的全生命周期信息。传统CAD系统依赖人工标注和规则引擎处理工程图元素间的关系,这种方式在面对复杂装配体时效率低下且容易出错。我们尝试用图神经网络(GNN)来学习工程图中面元素与标注之间的隐含关系,这本质上是一个几何特征与语义关联的双重学习问题。
工程图中的每个面元素都包含几何特征(边界、曲率、面积等)和工程语义(配合面、基准面、加工面等)。标注信息则通过尺寸公差、形位公差、技术要求等形式与特定面关联。这种关联关系往往呈现以下特点:
- 非对称性:标注箭头指向的面是主参考面
- 层级性:装配体标注可能跨越多个零件层级
- 上下文依赖:同一几何特征在不同工程语境下需要不同标注
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备与特征工程
2.1 SolidWorks工程图解析
通过SolidWorks API提取工程图数据时,需要特别处理以下数据结构:
python复制import win32com.client as win32
swApp = win32.Dispatch("SldWorks.Application")
drawing = swApp.ActiveDoc
# 获取所有图纸视图
views = drawing.GetFirstView()
while views:
# 提取视图中的面和标注
faces = views.GetFaces()
annotations = views.GetAnnotations()
views = views.GetNextView()
关键特征提取维度:
-
几何特征:
- 边界点集(归一化到视图坐标系)
- 最小包围盒尺寸和方向
- 曲率特征值(平面/圆柱面/自由曲面)
-
拓扑特征:
- 相邻面连接关系
- 特征树中的层级位置
- 与基准坐标系的空间关系
-
工程语义:
- 特征类型(拉伸/旋转/扫描等)
- 材料属性标记
- 所属零件的BOM信息
2.2 标注关系图构建
将工程图转换为图结构时,采用异构图建模:
-
节点类型:
- 面节点(几何特征+工程属性)
- 标注节点(标注类型+公差值)
-
边类型:
- 面-面边(共享边界/投影关系)
- 面-标注边(标注关联关系)
- 标注-标注边(引线连接/基准参照)
mermaid复制graph LR
A[面节点1] -- 共享边界 --> B[面节点2]
A -- 尺寸标注 --> C[标注节点1]
B -- 形位公差 --> D[标注节点2]
C -- 基准参照 --> D
3. 图神经网络模型设计
3.1 网络架构选择
采用RGCN(Relational Graph Convolutional Network)处理异构图关系,其消息传递机制为:
$$
h_i^{(l+1)} = \sigma\left(\sum_{r\in R}\sum_{j\in N_i^r}\frac{1}{c_{i,r}}W_r^{(l)}h_j^{(l)}+W_0^{(l)}h_i^{(l)}\right)
$$
其中:
- $R$ 表示所有边类型集合
- $N_i^r$ 是节点i通过关系r连接的邻居
- $c_{i,r}$ 是归一化系数
3.2 多任务学习头设计
模型输出层包含三个并行任务:
- 标注分类(尺寸/形位公差/技术要求等)
- 目标面预测(与标注关联的面集合)
- 标注合理性评分(基于设计规范)
python复制import torch
import torch_geometric as tg
class GNNModel(torch.nn.Module):
def __init__(self, num_node_features, num_relations):
super().__init__()
self.conv1 = tg.nn.RGCNConv(num_node_features, 64, num_relations)
self.conv2 = tg.nn.RGCNConv(64, 64, num_relations)
# 多任务输出头
self.class_head = torch.nn.Linear(64, 10) # 标注类型
self.face_head = torch.nn.Linear(64, 1) # 面关联概率
self.valid_head = torch.nn.Linear(64, 1) # 合理性评分
def forward(self, data):
x, edge_index, edge_type = data.x, data.edge_index, data.edge_attr
x = self.conv1(x, edge_index, edge_type)
x = torch.relu(x)
x = self.conv2(x, edge_index, edge_type)
return {
'cls': self.class_head(x),
'face': self.face_head(x),
'valid': self.valid_head(x)
}
4. 训练策略与优化技巧
4.1 损失函数设计
采用多任务加权损失:
$$
\mathcal{L} = \alpha\mathcal{L}{cls} + \beta\mathcal{L} + \gamma\mathcal{L}_{valid}
$$
其中:
- 分类损失$\mathcal{L}_{cls}$使用Focal Loss处理类别不平衡
- 面关联损失$\mathcal{L}_{face}$采用加权BCE(正样本权重为负样本的5倍)
- 合理性损失$\mathcal{L}_{valid}$使用MSE损失
4.2 数据增强策略
针对工程图数据的特殊性:
-
几何增强:
- 视图投影角度扰动(±15°)
- 尺寸标注位置抖动(±5%视图尺寸)
-
拓扑增强:
- 随机删除非关键边(共享边界保留)
- 添加虚拟标注节点作为负样本
-
工程语义增强:
- 材料属性随机替换(同类型材料)
- 公差等级按IT标准上下浮动
5. 工程化落地挑战
5.1 SolidWorks集成方案
通过Add-In方式嵌入模型推理功能:
-
实时推理模式:
- 监听视图变更事件
- 增量式图结构更新
- 使用LRU缓存已计算节点特征
-
批处理模式:
- 全图推理生成标注建议
- 冲突检测与自动修正
csharp复制// C# Add-In示例代码
public void RunInference()
{
var graph = BuildGraphFromDrawing(swDrawing);
var results = Model.Predict(graph);
foreach(var anno in results.Annotations)
{
var swNote = swDrawing.CreateNote(anno.Text);
swNote.SetAttachment(anno.Face);
}
}
5.2 持续学习机制
建立标注反馈闭环:
- 设计师修正记录作为新训练数据
- 在线困难样本挖掘(Hard Sample Mining)
- 模型增量更新策略:
- 每周全量微调
- 每日参数偏置更新
6. 实际应用效果评估
在某汽车零部件企业的实测数据显示:
| 指标 | 传统规则引擎 | GNN模型 |
|---|---|---|
| 标注准确率 | 72.3% | 89.7% |
| 冲突检测召回率 | 65.1% | 93.2% |
| 平均标注时间 | 4.2min/视图 | 1.8min/视图 |
| 设计变更适应能力 | 需人工调整规则 | 自动适应 |
典型应用场景:
- 标注自动补全:输入主要尺寸后,自动生成相关形位公差
- 标注冲突检测:识别不符合GD&T规范的标注组合
- 视图一致性检查:发现不同视图间的尺寸矛盾
关键发现:模型对"隐含基准"的识别准确率达到82%,远超人工设计的规则系统(45%)
7. 常见问题与解决方案
7.1 小样本学习问题
当遇到新零件类型时:
- 采用元学习(MAML)初始化模型参数
- 构建零件族特征空间,实现知识迁移
- 使用合成数据生成器扩展训练集
7.2 长尾分布处理
针对罕见标注类型:
- 在损失函数中引入类别权重
- 采用解耦训练策略(先学通用特征,再学特定分类)
- 建立标注类型层次结构(父类-子类关系)
7.3 工程图差异适应
处理不同企业的制图习惯:
-
风格迁移学习:
- 使用AdaBN进行特征分布对齐
- 添加制图风格标识节点
-
可解释性改进:
- 生成标注决策的热力图
- 提供关联面排序依据
8. 进阶优化方向
-
多模态融合:
- 结合BOM表信息增强语义理解
- 引入加工工艺知识图谱
-
动态图学习:
- 处理设计变更的传播影响
- 实时更新关联标注状态
-
自监督预训练:
- 利用未标注工程图学习几何先验
- 对比学习构建面特征空间
实际部署中发现,在钣金类零件上模型表现最佳(准确率92%),而在复杂曲面零件上仍有提升空间(准确率78%)。通过引入曲率敏感的特征提取层,后者性能可提升至85%。
