StepCAD让AI边造边改:逆向工程IoU从0.31升到0.82
想象你拿到一个3D扫描出来的零件模型,老板说:把它变成可以在CAD软件里打开、能随意修改尺寸的工程图纸。这件事现在大部分靠人工。一个熟练的CAD工程师可能要花几个小时,对着扫描点云一点点猜测这个零件当初是怎么画出来的:先挖了一个圆孔,还是先切了一刀再倒角?这个过程业内叫"逆向工程",枯燥又耗时。AI能不能替你干...
假设手头有一个从3D扫描得到的零件模型,老板要求你把它转成能在CAD软件中打开、尺寸可随意调整的工程图纸。
如今这一步大多还是人工完成。经验丰富的CAD工程师往往要耗上几个小时,盯着扫描点云反复推测零件最初的画法:是先挖了个圆孔,还是先切一刀再倒角?业内把这道工序称为“逆向工程”,既枯燥又费时。
AI能不能接手这件事?过去两年确实有不少团队在做尝试,可惜结果大多不理想。症结不在AI不会画图,而在它的画法存在一个根本短板:只懂得“一口气画完”,画错了也不回头检查。
一口气生成的代价
现有主流方案,例如CAD-Recode、Cadrille,流程大体是:把目标点云交给一个大语言模型,模型像背课文那样,把整段构造代码一次性输出。从第一行到最末一行,中途不执行、不校验、不折返。
这好比让人闭着眼写一篇作文,中途不许停下来读一读写得是否对题,只能写到最后一个字才睁眼验收。倘若开头第三句就跑偏,后面的内容会在错误方向上越走越远,而写的人全然不觉。
数据层面的结果相当难看。论文提到,在ABC Hard这个高难度基准测试集上,几个主流方法(CAD-Recode、Cadrille、CADEvolve)的IoU(交并比,衡量生成形状与目标形状重叠程度的指标,1代表完全重合)仅有0.31到0.39。也就是说,生成模型与真实目标的体积重叠不足四成,剩下六成不是多出来就是缺失。
更麻烦的还在后面。这些方法几乎全都只依赖“草图+拉伸”(sketch-extrude,先画一个2D轮廓,再拉伸成3D实体,是最基础也最单一的建模方式)这一种操作。现实零件常要靠旋转、放样、扫描等更复杂的造型手法才能准确还原,这些方法学不会,就只能拿拉伸硬凑,凑出来的形状与真实零件自然差得很远。
研究者眼前的难题很明确:模型要么一次性生成、速度快却容易整体跑偏,要么靠人工反复修改、精度高却无法规模化。有没有办法让AI像人类工程师那样,边建边看边调?
StepCAD团队的做法是把生成过程分作两段:先让模型像摸着石头过河那样,一步一步把模型建起来,再交给一套专门设计的搜索算法去纠正细节上的偏差。
状态条件策略:让AI边画边看
StepCAD的第一个核心设计叫状态条件策略(State-Conditioned Policy),意思是模型在生成下一步操作时,不光要看目标形状长什么样,还得看自己已经画出的中间结果长什么样。
具体流程是:模型先生成一个操作(比如“挖一个圆孔”),这段CadQuery代码(CadQuery是一种用Python描述CAD建模步骤的编程库,相当于给计算机下达“画图指令”的语言)随即被真正执行一遍,生成实际的三维几何体。随后系统从这个几何体上采样出新的点云,重新喂回模型,告诉它:“这是你现在画出来的东西,接下来该怎么办?”
打个比方,这有点像徒弟跟着师傅学木工。闭着眼睛照图纸硬背,每一步都不清楚自己做得对不对,等木料全切完了才发现这块板子长短不对。师傅带徒弟不是这样,他是每锯一刀就停下来比一比,对着成品看一眼进度,再定下一刀往哪儿下。少了这道回看的工序,错误会在十几道工序里越滚越大,最后只能拆了重做。
目标几何和中间几何的编码共用同一个模块,名为Point-MAE编码器(一种点云自监督学习模型,通过遮盖部分点云再重建的方式学习三维形状的表示)。语言模型骨干选的是Qwen2.5-Coder-1.5B(阿里云开源的代码生成大语言模型,1.5B代表15亿参数规模),实验验证这个规模性价比最优——论文附录对比了0.5B、1.5B、3B三种规模,3B的提升幅度微乎其微,不值得多花那份算力。
单靠这个状态条件策略(论文里简称Π-StepCAD),不加后续优化,就已经在ABC Hard上把IoU从0.31-0.39提升到0.52,相对提升接近四成。可见光是“让模型看见自己画了什么”这一件事,就带来了实质性改善。
几何感知树搜索:生成之后的精修
但仅凭策略生成,离完美仍有距离。论文给出的数字是,策略单独生成后IoU大约0.68,叠加第二阶段的搜索优化能冲到0.82,中间0.14的差距,靠的是StepCAD的第二个核心模块:几何感知程序优化(Geometry-Aware Program Optimization)。
这个模块的思路,是把生成好的CAD程序当成一份能改的“草稿”,在草稿上一点点做局部编辑,每改一次就执行一次、算一次IoU,看这一改是变好了还是变坏了。整套流程跑在束搜索(Beam Search,一种启发式搜索算法,每一步只保留若干个最优候选,避免穷举所有可能性导致的组合爆炸)框架上,束宽(Beam Width,每一步保留的候选数量)设为2,每一步尝试4种局部编辑手法,再从中挑出表现最好的两个继续往下走。
这套局部编辑一共有四种武器。
第一种叫连续参数优化,管的是拉伸深度、圆角半径、草图尺寸这类数值型参数。办法是贝叶斯优化(Bayesian Optimization,一种利用概率模型高效搜索最优参数的算法,常用于参数空间大、每次评估代价高的场景):先随机采样6个点,再做10轮迭代,每轮尝试4个候选值。这跟你拧水龙头找合适水温差不多,不是瞎拧,而是每次调一点,看上回冷热的反馈决定这回往哪边调,比盲目试错高效得多。
第二种叫草图替换,直接从目标网格上截取真实的轮廓曲线,把模型生成的草图换掉。具体做法是拿一个平面去切目标网格,提取截面轮廓,再拟合成圆、直线、圆弧的组合。这好比与其让学徒凭记忆临摹一张图纸,不如把原始图纸的那一页直接撕下来用,准确度自然高得多。少了这一步,模型靠“脑补”画出的草图往往和真实轮廓有微妙偏差,而这种偏差会在后续拉伸、切割等操作里被不断放大。
第三种编辑叫补集切除,专门收拾“画多了”的情况。系统先算出生成几何体与目标几何体之间的差集,多出来的那块区域被拟合成一个切除操作,再补写进程序。论文的消融实验里,这一项单独带来IoU提升的30.3%,在四种编辑中收益排第二。
第四种是操作跳过,针对的是“画蛇添足”。某个操作删掉之后IoU反而上升,就说明它多余甚至有害,直接把它从程序里拿掉。倒角、圆角这类装饰性操作最容易出现这种问题——模型有时加了个参数不对的圆角,删掉比留着强。
消融表格给出的贡献排序是:草图替换41.5%居首,补集切除30.3%次之,连续参数优化16.2%,操作跳过12%。这个顺序不难理解——大轮廓都错了,参数抠得再细也白搭,得先把形状对上,精修才有意义。
整套搜索平均下来,一个样本大约花一分钟。单看不算快,可人工逆向建模动辄要几小时,这笔时间账还是划算的。
ARCADE-1.5M:给模型准备的训练燃料
想让模型学会“边画边看边改”,先得有数据教它怎么一步步搭出复杂形状。问题是现有CAD数据集几乎都卡在同一个短板上:操作种类太单一。
论文里那张对比表格的数据很能说明问题。DeepCAD、Fusion 360这些经典数据集,100%的程序只用到拉伸,旋转、放样、扫描的覆盖率统统是0。即便是较新的CADEvolve,旋转操作覆盖率也只有4.8%,扫描操作是5.75%。
换句话说,这些数据教给模型的本事,差不多等于“只会用乐高里的长方体”。现实零件中常见的圆柱体、曲面过渡、螺旋结构,模型几乎没见过真实样例,自然也学不会怎么用。
为此,StepCAD团队自己造了个新数据集ARCADE-1.5M(Artificial Repository of CAD Examples,人工CAD样例库),内含150万条可执行CAD程序。它有三个核心亮点。
其一是操作多样性明显提升。拉伸覆盖率95.42%,旋转达到12.13%,扫描25.37%,放样13.10%,圆角34.77%,倒角33.66%。横向比,扫描覆盖率是CADEvolve的4倍多。
其二是构造序列足够长。平均每个程序含40.3个计数操作(把草图图元、布尔组合等细粒度步骤都算上),最长序列超过150步;落到实体建模操作上,平均为8.5个。这一密度远高于DeepCAD的15步和Fusion 360的18步。
其三最关键:数据集提供密集的中间状态监督。每完成一次实体操作,系统就存下一份当时的几何快照,最终积累1250万个构造状态转移对。StepCAD的状态条件策略正是靠这些中间快照训练出来的——缺了它们,模型根本学不会“看中间结果再决定下一步”。
数据生成本身也有讲究。团队用了一套叫“策略库”的系统,内置94种启发式生成策略,模仿真实工程师的建模习惯,比如先打孔再倒角、先做基座再加凸台,而非随机拼凑操作,这样产出的构造序列才有工程合理性。每个生成的模型还要过双重验证:内存中的实体必须有效,导出成Python脚本重新执行一遍,结果也得一致,才能入库。
五大基准测试上的结果
团队在CADBench这个综合评测集上测了StepCAD。该评测集整合DeepCAD、Fusion 360、ABC、MCB、Objaverse五个来源,从简单机械件到复杂有机形状都有覆盖,算得上目前较为全面的评测标准。
结果汇总如下:
| 数据集 | 最强基线IoU | StepCAD IoU | 相对提升 |
|---|---|---|---|
| ABC Hard | 0.39 | **0.73** | 87.2% |
| ABC Medium | 0.43 | **0.74** | 72.1% |
| Organic(有机形状) | 0.42 | **0.71** | 69.0% |
| Mechanical(机械件) | 0.67 | **0.89** | 32.8% |
| DeepCAD | 0.86 | **0.89** | 3.5% |
有个规律很显眼:形状越复杂,StepCAD的优势越大。相对简单的DeepCAD数据集上只提升3.5个百分点,最难的ABC Hard数据集上提升接近90%。道理不复杂——简单形状几步拉伸就完事,模型闭眼画也差不到哪去;复杂形状却要十几步甚至几十步连续判断都对,哪一步走偏都会被后面的步骤放大,这正是“边画边看”机制最能派上用场的地方。
有效性可以精确到每一个零件。
除了IoU这种看整体重叠度的指标,团队还从更细的层面做了验证。
在高精度重建的占比上,StepCAD有39.9%的样本做到IoU≥0.95,15.3%做到IoU≥0.99;最强基线CADReasoner对应的数字是27.2%和7.4%,差不多翻了一倍。
再看实体级几何准确率,也就是顶点、边、面的精确匹配,StepCAD拿到顶点20.8、边12.6、面8.1,对比CADEvolve的15.7、9.7、6.4,提升都很明显。
还有一个挺能说明问题的迁移实验:团队把StepCAD的搜索模块直接套到CAD-Recode生成的程序上,不做任何重新训练,只做后处理优化,平均IoU便从0.597升到0.745。可见这套搜索逻辑并非绑死在某一个模型上的专属补丁,而是一种通用的程序精修手段,无论谁生成的程序都能拿它来改善。
一对多的构造逻辑。
另一个有意思的附带发现是,面对同一个目标形状,StepCAD有时会给出截然不同的构造路径,最终几何体却几乎一样。论文里就举了个例子:同一个零件,模型既可能用"放样+壳体+倒角"的组合造出来,也可能走"旋转+壳体+倒角",两条路殊途同归。
这说明模型学到的并非死记某一种固定套路,而是真正理解到"造出这个形状可以有多种合理方式"。真实的CAD工程师群体里也有类似现象:十个工程师画同一个零件,常常画出十种不同但都正确的构造历史。
局限和诚实的边界。
这套方法的短板,团队并没有回避。
搜索阶段每个样本大约要花一分钟,而且局部编辑的参数搜索范围是有界的,最优解一旦落在搜索边界之外,系统就找不到。策略生成阶段则设了12步的动作上限(注意这不等于12个底层操作,一个动作可能打包多个操作),也就是说,特别复杂、超出这个预算的形状,重建会受到限制。
论文还有一处特别坦诚:它明确指出IoU和倒角距离这类几何指标衡量的是形状匹配程度,并不代表恢复了原始设计者的真实意图、约束关系或者参数语义。打个比方,原始零件上有一个半径5毫米的工艺圆角,模型错误地把它去掉,IoU反而变高,系统也会接受这个"改进",可这已经偏离了设计初衷。几何重建成功和设计还原成功是两回事,不能简单画等号。
写在后面
论文读罢,真正让我在意的倒不是IoU涨了几个点,而是它把一件看上去应当一步到位的事,硬是切成了“生成”与“修正”两个彼此独立的环节。
拆开来做的思路,别处其实也常见。写过代码的人都清楚,先弄出一版能跑通的,再回头重构打磨,通常比一上来就憋一个完美版本靠谱得多。这篇论文做的就是把这套经验搬到AI生成CAD程序上,还拿出了量化结果:光靠生成策略能提升约40%,再叠上搜索优化又多出约20%,两边少一边都不行。
另有一处细节可以单独拎出来讲。团队比较了四种局部编辑手法,出力最大的并非那套花哨的贝叶斯参数优化,反倒是最朴素的招数——把草图直接从真实网格上抠下来替换进去。这提醒人一件事:复杂优化算法未必赛得过“直接从真实数据里取答案”这种笨办法,尤其在目标本身拿得到的时候。
论文也留下一个没有完全说清的问题:同一个形状可以对应好几种有效的构造历史,那究竟哪一种才算“对”?往后若要判断一个AI生成的CAD程序是真“懂”了设计意图,还是碰巧拼出了相似形状,这套标准该怎么立,恐怕是接下来要啃的硬骨头。
Q&A
Q1:StepCAD是什么?
A:StepCAD是MIT团队提出的AI方法,用于把3D网格转成可编辑的CAD程序。它的做法是先以状态条件策略边生成边查看中间结果,再借几何感知树搜索对生成的程序做局部精修;在多个基准测试上,其IoU相较现有方法最高提升87.2%。
Q2:ARCADE-1.5M数据集和之前的CAD数据集有什么不同?
A:ARCADE-1.5M包含150万条可执行CAD程序,覆盖拉伸、旋转、放样、扫描等多种操作类型,而不像DeepCAD等旧数据集几乎100%只用拉伸操作,同时提供1250万个中间构造状态,专门用于训练模型学会分步骤建模。
Q3:StepCAD为什么在复杂形状上提升特别明显?
A:形状一复杂,就得连续多步都判断正确,哪一步出了错,后面会被越放越大;StepCAD边生成边看的机制,配上后续的几何感知搜索,能及时把中间的错误拉回来。因此在ABC Hard这类高难度数据集上,它的相对提升达到87.2%,比在简单数据集上的提升幅度高出一大截。