多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

国产CAD的AI识图:从矢量解析到视觉融合的图元识别实战

国产CAD的AI识图:从矢量解析到视觉融合的图元识别实战 1. 国产CAD的AI识图需求到底从哪来1.1 一个真实场景引发的思考去年年底我帮一家做非标自动化设备的朋友处理一批历史图纸。他们厂里从2008年开始用CAD画图积累了将近两万个DWG文件分散在十几台老电脑和三个移动硬盘里。老板想把这些图纸里的标准件、常用符号、标题栏信息全部提取出来建一个可检索的数据库。我一开始觉得这事不难写个脚本遍历文件、提取块参照和文字不就行了结果打开第一张图纸就懵了——同一个“气缸”符号在不同年份的图纸里被画成了完全不同的样子有的用块有的用多段线拼的有的干脆就是几条直线加圆弧图层名也是五花八门“气动”“气缸”“QF”“AIR_CYL”什么都有。这件事让我意识到一个核心问题CAD图纸里的“图元”和“图标”在机器眼里和在人眼里完全是两回事。人看一眼就知道那是气缸但软件只认它是LINE、ARC、INSERT还是LWPOLYLINE。国产CAD软件这些年进步很大中望、浩辰、CAXA这些产品在功能上已经能覆盖大部分日常设计需求但“智能识别”这一块尤其是把AI能力真正落地到图纸理解上还有很长的路要走。1.2 为什么2026年这个节点特别关键有几个因素叠加在一起让CAD国产化和AI识别的结合变得特别紧迫。第一是数据安全层面的考虑大量工业图纸涉及企业核心技术放在云端做AI分析有顾虑本地化部署的国产CADAI方案成了刚需。第二是国产CAD软件本身的成熟度到了临界点基本的绘图、编辑、标注功能已经稳定用户开始期待更高级的智能化功能。第三是大模型和视觉识别技术的成本大幅下降以前做一个图纸符号识别系统可能要几十万现在用开源模型加少量标注数据就能跑出不错的效果。我自己的判断是2026年会是国产CAD智能化功能爆发的一年但爆发的前提是解决一个基础问题怎么让AI看懂CAD图纸里的图标和图元。这个问题不解决后面所有的智能标注、智能检索、智能设计辅助都是空中楼阁。1.3 这篇文章能帮你解决什么如果你正在做国产CAD相关的开发或者你是一个设计团队的负责人想把手里的图纸资产盘活再或者你只是一个对CAD二次开发感兴趣的工程师这篇文章都会给你一套可落地的思路。我会从数据准备、模型选型、识别策略、工程化落地几个维度把“AI智能识别CAD图标与图元”这件事拆开讲清楚。里面会涉及具体的代码示例、参数配置、踩坑记录以及我在实际项目中验证过的方案。需要提前说明的是CAD图元识别和普通的图像识别有本质区别。普通图像识别处理的是像素CAD图纸处理的是矢量数据但矢量数据又经常被渲染成图像来显示所以实际工程中往往是矢量解析和视觉识别两条腿走路。这个思路会贯穿全文。2. 搞懂CAD图元的数据结构是第一步2.1 DWG/DXF文件里到底存了什么很多人一上来就想用深度学习模型去识别CAD图纸结果发现效果很差根本原因是对CAD的数据结构理解不够。DWG是二进制格式DXF是文本格式但不管哪种里面存储的核心信息都是实体Entity。一个CAD图纸本质上就是一个实体列表每个实体有自己的类型、坐标、图层、颜色、线型等属性。常见的实体类型包括实体类型含义识别难度LINE直线低ARC圆弧低CIRCLE圆低LWPOLYLINE轻量多段线中INSERT块参照中TEXT/MTEXT文字低HATCH填充高DIMENSION标注中SPLINE样条曲线高我拿一个实际的例子来说明。假设图纸里有一个“阀门”符号它可能是一个INSERT实体引用了名为“VALVE”的块定义。块定义里又包含若干LINE和ARC。如果你只解析顶层实体你看到的就是一个INSERT知道它是个块但不知道它长什么样。如果你递归解析块定义你就能拿到构成这个阀门的所有线段和圆弧的坐标。注意块参照可能有多层嵌套A块引用B块B块引用C块解析的时候一定要做递归处理同时要防止循环引用导致死循环。2.2 矢量解析和视觉识别的分工在实际项目中我通常把识别任务分成两类第一类结构化信息提取。比如提取标题栏里的图号、材料、比例提取明细表里的零件信息提取标注的尺寸数值。这类任务用矢量解析就够了直接读TEXT和MTEXT实体的内容配合位置信息做版面分析准确率可以做到95%以上。第二类图形符号识别。比如识别图纸里哪些是气缸、哪些是电机、哪些是传感器。这类任务光靠矢量解析不够因为同一个符号在不同图纸里的画法可能不同图层命名也不统一。这时候就需要引入视觉识别把图纸的某个区域渲染成图像用CNN或ViT模型做分类或检测。我的经验是矢量解析负责“精确”视觉识别负责“泛化”。两者结合才能既保证准确率又保证覆盖率。举个例子你可以先用矢量解析找到所有INSERT实体如果块名匹配已知的符号库直接确定类型如果块名不匹配再把块渲染成小图像用视觉模型做分类。这样大部分常见符号走快速通道少数疑难杂症走AI通道整体效率最高。2.3 图层和块名里的隐藏信息国产CAD图纸有一个特点就是图层命名往往带有很强的业务含义。比如“给排水”“电气照明”“暖通-风管”这种图层名本身就说明了这个图层上放的是什么类型的东西。块名也是一样“MOTOR_3KW”“PUMP_CENTRIFUGAL”这种命名直接告诉你这个块是什么。我在项目里做过统计在一个管理规范的制造企业图纸库里大约60%到70%的符号可以通过图层名和块名的规则匹配直接识别不需要动用AI模型。剩下的30%到40%才是真正需要AI介入的部分。这个比例很关键它决定了你的系统架构——如果大部分都能规则匹配那AI模型只需要处理长尾部分对模型的精度要求可以适当降低推理速度也可以放宽。所以我的建议是在动手训练模型之前先花一周时间把图纸库里的图层名、块名、文字内容做一个词频统计看看规律有多强。这个前期投入会帮你省掉后面大量的调参时间。3. AI识别方案选型从传统CV到多模态大模型3.1 传统图像处理方案还能不能用说到图像识别很多人第一反应是上深度学习。但在CAD图元识别这个场景里传统图像处理方法在某些子任务上依然有优势。比如识别图纸里的圆孔、直线段、圆弧这些基本几何元素用OpenCV的Hough变换就能做得很好而且速度极快不需要GPU。我实测过用HoughCircles检测图纸里的圆在预处理得当的情况下召回率能到90%以上单张A1图纸的处理时间在200毫秒以内。相比之下用YOLO系列模型检测同样的圆虽然召回率能到95%但需要GPU单张推理时间在50毫秒左右用TensorRT加速但模型训练和部署的成本高得多。所以我的策略是分层处理基础几何元素直线、圆、圆弧用传统CV方法快且准复杂符号阀门、电机、仪表用深度学习模型文字信息用OCR但要注意CAD里的文字往往是矢量文字直接解析TEXT实体比OCR更准实操心得CAD图纸渲染成图像时线宽设置很关键。线宽太细小符号会断线线宽太粗相邻符号会粘连。我一般用1.5到2像素的线宽渲染分辨率控制在200到300 DPI之间这个区间在多数场景下效果最稳。3.2 深度学习模型怎么选如果你决定用深度学习模型选型要考虑三个因素精度、速度、部署成本。CAD图纸识别通常是本地部署不像互联网应用可以随便调云端API所以模型不能太大。我目前用得比较多的方案是方案一YOLOv8/v11做目标检测。适合识别图纸里的符号输入是渲染后的图像输出是符号的边界框和类别。优点是速度快YOLOv8n在RTX 3060上能跑到100 FPS以上一张A1图纸切成的几十个小图块几秒钟就能处理完。缺点是需要大量标注数据而且对旋转、缩放的符号泛化能力一般。方案二ResNet或EfficientNet做图像分类。适合对已经裁剪出来的符号小图做分类。比如你已经通过矢量解析找到了所有INSERT实体把每个块渲染成64x64的小图然后用分类模型判断它是什么符号。这个方案的好处是训练数据容易构造你只需要收集每个类别的样本图不需要标注边界框。方案三ViT或Swin Transformer做细粒度识别。如果你的符号类别很多比如超过100类而且类间差异很小比如不同规格的阀门用Transformer架构的模型效果会更好。但推理速度会比CNN慢需要做模型量化或蒸馏。方案四多模态大模型做零样本识别。这是最近一年比较火的方向。你可以把符号图像和文本描述一起输入给多模态模型让它判断这个符号是什么。优点是零样本能力强不需要训练数据缺点是推理成本高而且对CAD这种专业领域的符号通用多模态模型的准确率还不够稳定。我的建议是先用方案二快速搭一个baseline收集一批标注数据看看分类准确率能到多少。如果准确率不够再考虑上方案一做检测或者方案三做细粒度分类。方案四目前更适合做辅助验证不适合做主识别引擎。3.3 矢量特征和视觉特征怎么融合这是CAD图元识别里最有意思也最有挑战的部分。纯视觉识别会丢失矢量信息纯矢量解析又缺乏泛化能力。我的做法是双通道融合矢量通道提取的特征包括实体类型分布、图层名、块名、文字内容、几何拓扑关系比如一个符号由几条线组成、线之间的夹角是多少。视觉通道提取的特征就是渲染后的图像经过CNN得到的特征向量。两个通道的特征拼接后再过一个全连接层做分类。我在一个包含50类工业符号的数据集上做过对比实验纯视觉特征的准确率是87.3%纯矢量特征的准确率是72.1%融合后的准确率是94.6%。这个提升非常明显说明两种特征确实有互补性。注意矢量特征里的图层名和块名是文本需要做embedding。我一般用字符级CNN或者简单的词袋模型不需要上BERT这种大模型因为CAD里的文本通常很短而且专业词汇有限。4. 从零搭建一个CAD图元识别系统的完整流程4.1 数据准备图纸清洗和标注这一步是最耗时的但也是最关键的。我做过一个统计在一个典型的CAD图元识别项目里数据准备占整个项目工作量的60%以上。如果你跳过这一步直接搞模型后面一定会返工。第一步图纸清洗。把图纸库里的DWG文件批量转成DXF用ODAOpen Design Alliance的转换工具或者Teigha库。转换过程中要注意版本兼容性高版本DWG转低版本DXF可能会丢失一些实体。我一般统一转成DXF 2018格式兼容性和信息完整性比较平衡。第二步实体提取。用ezdxfPython库或者AutoCAD的.NET API遍历所有实体把每个实体的类型、坐标、图层、块名、文字内容导出成结构化数据。ezdxf的好处是纯Python跨平台不需要装AutoCAD缺点是性能一般处理大图纸比较慢。如果图纸量很大建议用多进程并行处理。import ezdxf from ezdxf import recover def extract_entities(dxf_path): doc, auditor recover.readfile(dxf_path) msp doc.modelspace() entities [] for e in msp: entity { type: e.dxftype(), layer: e.dxf.layer, handle: e.dxf.handle } if e.dxftype() INSERT: entity[block_name] e.dxf.name entity[insert_point] tuple(e.dxf.insert) elif e.dxftype() in (TEXT, MTEXT): entity[text] e.dxf.text if e.dxftype() TEXT else e.text entity[insert_point] tuple(e.dxf.insert) elif e.dxftype() LINE: entity[start] tuple(e.dxf.start) entity[end] tuple(e.dxf.end) entities.append(entity) return entities第三步符号裁剪和标注。对于需要视觉识别的符号要把它们从图纸里裁剪出来。裁剪的方式有两种一种是根据INSERT实体的边界框裁剪另一种是根据图层或选择集手动框选。我一般用第一种自动化程度高但要注意块参照可能有旋转和缩放裁剪出来的图像要做归一化。标注环节建议用LabelImg或者CVAT标注格式用YOLO格式或COCO格式。如果符号类别不多少于20类每个类别标注200到300个样本就够了。如果类别很多每个类别至少100个样本而且要保证样本的多样性包括不同旋转角度、不同缩放比例、不同线宽。4.2 模型训练参数配置和调优我用YOLOv8做符号检测的配置如下供参考# dataset.yaml path: ./cad_symbols train: images/train val: images/val nc: 15 # 类别数 names: [valve, pump, motor, sensor, gauge, flange, ...]训练参数yolo detect train \ datadataset.yaml \ modelyolov8s.pt \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.001 \ momentum0.937 \ weight_decay0.0005 \ warmup_epochs3 \ augmentTrue \ mosaic1.0 \ mixup0.1 \ copy_paste0.1 \ device0几个关键参数的解释imgsz640输入图像尺寸。CAD符号通常比较小640在精度和速度之间比较平衡。如果符号特别小可以调到1024但推理速度会下降。mosaic1.0马赛克增强把四张图拼成一张。这个对CAD符号识别特别有用因为图纸里符号往往密集排列马赛克增强能让模型更好地学习密集场景。copy_paste0.1复制粘贴增强把一些符号复制到其他位置。这个能增加符号在不同上下文中的出现频率提升泛化能力。lr00.01初始学习率。YOLOv8的默认值是0.01如果训练不稳定可以降到0.001。我实测下来在5000张标注图像上训练200个epochYOLOv8s的mAP0.5能到0.92左右模型大小约22MB在RTX 3060上单张推理时间约8毫秒。这个性能对于大多数CAD图纸识别场景已经够用了。4.3 后处理把识别结果映射回CAD坐标模型输出的边界框是图像坐标需要映射回CAD的模型空间坐标。这个映射关系取决于你渲染图纸时的变换矩阵。如果你是用ezdxf的matplotlib后端渲染的可以通过doc.header[$EXTMIN]和doc.header[$EXTMAX]获取图纸范围然后计算缩放比例和平移量。def image_to_cad_coords(bbox, img_width, img_height, extmin, extmax): x_min, y_min, x_max, y_max bbox cad_width extmax[0] - extmin[0] cad_height extmax[1] - extmin[1] scale_x cad_width / img_width scale_y cad_height / img_height cad_x_min extmin[0] x_min * scale_x cad_y_min extmin[1] (img_height - y_max) * scale_y cad_x_max extmin[0] x_max * scale_x cad_y_max extmin[1] (img_height - y_min) * scale_y return (cad_x_min, cad_y_min, cad_x_max, cad_y_max)注意Y轴方向要翻转因为图像坐标的原点在左上角CAD坐标的原点在左下角。这个坑我踩过好几次一开始识别出来的框总是上下颠倒。映射回CAD坐标后还可以做一步矢量验证检查这个区域内是否有INSERT实体如果有把块名和识别结果做关联如果没有说明这个符号可能是用基本图元拼出来的需要进一步分析。5. 实际项目中遇到的坑和解决方案5.1 图纸版本混乱导致解析失败国产CAD软件生成的DWG文件虽然都声称兼容AutoCAD格式但实际上各有各的“方言”。我遇到过中望CAD保存的DWG用ezdxf打不开的情况也遇到过浩辰CAD的DXF里某些实体属性缺失的问题。解决方案在解析之前先用ODA的转换工具做一次标准化转换把所有图纸统一转成DXF 2018格式。ODA的转换工具是命令行调用的可以批量处理ODAFileConverter input_folder output_folder ACAD2018 DXF 0 1 *.DWG如果ODA也搞不定那就只能上AutoCAD的COM接口或者.NET API用AutoCAD本身来打开和另存。这个方案最稳但需要装AutoCAD而且速度慢。5.2 符号旋转和缩放导致识别率下降CAD图纸里的符号经常被旋转和缩放尤其是块参照。一个在0度方向训练得很好的模型遇到90度旋转的符号可能就识别不出来了。解决方案训练时做旋转增强把训练样本随机旋转0到360度。YOLOv8默认的旋转增强角度范围比较小可以在配置里调大。另外在推理时也可以做测试时增强TTA把图像旋转几个角度分别推理然后合并结果。TTA能把召回率提升3到5个百分点但推理时间会成倍增加。我自己的做法是训练时做全角度旋转增强推理时不做TTA。因为训练时见过各种角度的样本后模型本身已经具备了旋转不变性不需要推理时再额外处理。5.3 小符号漏检和密集符号粘连CAD图纸里经常有很小的符号比如直径只有几个像素的圆点或者密集排列的端子排。这些在渲染成图像后要么太小看不清要么粘在一起分不开。解决方案对于小符号提高渲染分辨率把图纸切成小块分别识别。比如一张A0图纸直接渲染成4000x3000的图像小符号可能只有5x5像素但如果切成16块每块渲染成2000x1500小符号就有20x20像素了识别率会大幅提升。对于密集符号用NMS非极大值抑制的时候把IoU阈值调低比如从默认的0.7降到0.5这样相邻的框不会被误合并。另外可以在后处理阶段用矢量信息做辅助分割比如两个符号之间如果有明显的图层分界线就强制分开。5.4 常见问题速查表问题现象可能原因排查方法解决方案解析DXF时报错文件版本不兼容用ODA转换后重试统一转DXF 2018识别框位置偏移坐标映射错误检查Y轴是否翻转修正映射公式某类符号全部漏检训练样本不足统计该类样本数补充标注数据推理速度慢模型太大或图像太大测单张推理时间换小模型或切图符号分类混淆类间差异小看混淆矩阵增加细粒度特征文字识别错误字体不支持检查字体映射用矢量文字解析块参照解析不全嵌套块未递归检查块定义层级递归解析块表内存溢出图纸太大监控内存占用分块处理或流式解析6. 国产CAD平台上的AI集成实践6.1 中望CAD的二次开发接口中望CAD提供了ZRXZhongwang Runtime ExtensionSDK类似于AutoCAD的ObjectARX。你可以用C写ZRX插件在CAD内部直接调用AI模型。ZRX的优势是性能好能直接访问CAD的数据库不需要导出DXF再解析。缺点是开发门槛高需要熟悉C和CAD的内部数据结构。如果不想写C中望CAD也支持.NET API用C#开发。我一般用C#做原型验证用C做性能敏感的部分。AI模型的推理可以用ONNX Runtime把训练好的PyTorch模型导出成ONNX格式然后在C#里调用。using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; var session new InferenceSession(symbol_detector.onnx); var inputTensor new DenseTensorfloat(new[] { 1, 3, 640, 640 }); // 填充输入数据... var inputs new ListNamedOnnxValue { NamedOnnxValue.CreateFromTensor(images, inputTensor) }; var outputs session.Run(inputs); // 解析输出...6.2 浩辰CAD的GRX接口浩辰CAD的二次开发接口叫GRX用法和ZRX类似。浩辰的文档相对少一些但基本的功能都有。我在浩辰上做AI集成时遇到的最大问题是渲染接口不完善不像AutoCAD有现成的Plot接口可以把图纸渲染成图像。最后的解决方案是用浩辰的显示接口抓屏或者导出成PDF再转图像。6.3 跨平台方案用Python做中间层如果你的团队Python技术栈比较强C人才不足可以考虑用Python做中间层。具体做法是用Python调用ezdxf解析图纸用PyTorch或ONNX Runtime做推理然后把识别结果写回DXF或者通过CAD的COM接口写回DWG。这个方案的优点是开发效率高迭代快缺点是性能不如原生插件而且依赖CAD软件提供的COM接口稳定性受CAD版本影响。我一般用这个方案做快速验证验证通过后再用C重写核心部分。实操心得不管用哪种方案都建议把AI推理和CAD操作解耦。AI推理在一个独立的进程或服务里跑CAD插件只负责数据交换和结果展示。这样AI模型更新时不需要重新编译CAD插件维护起来方便很多。7. 效果评估和持续优化7.1 怎么定义“识别准确”CAD图元识别的准确率不能只看一个数字。我一般从三个维度评估维度一检测召回率。图纸里实际有多少个符号系统识别出了多少个。这个指标反映的是“有没有漏掉”。维度二分类准确率。识别出的符号里有多少个分类是正确的。这个指标反映的是“有没有认错”。维度三定位精度。识别出的边界框和实际符号位置的偏差有多大。这个指标对后续的自动标注、自动连线等操作很关键。在实际项目中我通常要求召回率不低于95%分类准确率不低于90%定位偏差不超过符号尺寸的10%。这三个指标都达标系统才算可用。7.2 持续优化的三个方向方向一主动学习。系统上线后把置信度低的识别结果挑出来让人工复核复核后的数据加入训练集重新训练模型。这个循环跑几轮准确率会有明显提升。我做过一个项目第一轮模型准确率82%经过三轮主动学习后提升到94%。方向二规则和模型的融合。随着项目推进你会发现某些类别的符号用规则匹配比用模型更准。比如标题栏的识别用版面分析加文字解析准确率可以做到99%以上比视觉模型靠谱得多。所以不要迷信AI该用规则的地方就用规则。方向三领域自适应。不同企业的图纸风格差异很大一个在A企业训练的模型拿到B企业可能就不行了。解决方案是做领域自适应用B企业的少量标注数据对模型做微调。如果B企业没有标注数据可以用无监督域适应方法比如用对抗训练让模型学习域不变特征。7.3 一个实际项目的效果数据我在一个包含12000张图纸的制造企业项目里部署了这套CAD图元识别系统。最终的效果数据如下符号检测召回率96.2%符号分类准确率91.8%单张A1图纸处理时间3.2秒含渲染、推理、后处理人工复核工作量减少约75%这个项目里系统识别出的符号被自动关联到物料编码设计人员在做新设计时可以直接搜索历史图纸里的符号复用已有的物料。以前找一个特定型号的阀门要翻半天图纸现在几秒钟就能定位到。8. 一些个人体会和后续扩展思路这套方案我在三个不同行业的项目里落地过有离散制造、有流程工业、也有建筑设计。每个行业的图纸风格差异很大但核心思路是通的先用矢量解析拿结构化信息再用视觉识别补全语义最后用业务规则做校验。有一个点我特别想强调不要追求一步到位的全自动识别。我见过太多项目想做一个“万能识别引擎”结果做了半年还在调模型。更务实的做法是先做半自动系统识别加人工确认先把流程跑通再逐步提升自动化率。用户其实不介意偶尔确认一下他们介意的是系统完全不能用。后续扩展的话我觉得有几个方向值得尝试。一是把识别结果和PLM/ERP系统打通实现图纸信息的自动入库。二是用生成式模型做图纸的自动标注识别出符号后自动生成标注文字。三是做跨图纸的符号一致性检查发现同一符号在不同图纸里画法不一致的情况提醒设计人员统一。最后分享一个小技巧在渲染图纸做视觉识别时把不同图层用不同颜色渲染能显著提升模型对符号边界的敏感度。比如设备层用红色管道层用蓝色标注层用灰色。这个简单的处理能让检测召回率提升2到3个百分点而且几乎不增加计算成本。
返回列表