【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models
1 引言
现有3D生成模型:
-
3D点云:大量离散的3D点组成的数据表示形式;
-
多边形网格:一系列相连的多边形组成的3D模型;
-
水平集场:使用数值函数来表示物体的边界,并根据函数值的正负来确定物体内部和外部的区域;
仅能创建3D形状的离散表示,都缺少生成3D形状设计本质的能力—绘制过程。
作者提出了一个深度生成网络DeepCAD,能够输出CAD工具(如AutoCAD)中用于构建3D形状的操作序列,这是CAD模型的“绘制”过程。
这是CAD设计的生成模型的第一个工作,挑战在于CAD设计的顺序和参数化性质。CAD模型由一系列几何操作(例如,曲线草图、拉伸、圆角、布尔、倒角)组成,每个操作由某些不规则的参数(离散或连续)控制。故以前开发的3D生成模型不适合CAD模型生成。
为了克服这些挑战,需要寻求一种能够协调CAD模型中的不规则性的表示,作者考虑最常用的CAD操作(命令),并将它们统一在一个公共结构中,该结构对其命令类型、参数和序列顺序进行编码,通过类比CAD命令序列和自然语言,作者提出了一种基于Transformer网络的自编码器,它将CAD模型嵌入到潜在空间中,然后将潜在向量解码成CAD模型。【code】
为了训练这个自编码器,作者还创建了一个新的CAD命令序列数据集,以促进未来基于学习的CAD设计的研究。【dataset】
下图是DeepCAD的生成演示。

2 相关工作
-
参数化形状推断
深度学习的进步使得神经网络模型能够分析几何数据,推断出参数化形状。具体工作如下:
- ParSeNet:将3D点云分解为一组参数化的表面补丁。
- PIE-NET:从3D点云中提取参数化的边界曲线。
- UV-Net 和 BrepNet:专注于编码参数化模型的边界曲线和表面。
- Li等人:训练了一种神经网络,在合成数据上将2D用户草图转换为CAD操作。
- Xu等人:应用神经引导搜索,从参数化实心形状中推断出CAD建模序列。
-
3D形状生成模型
大多数现有方法生成离散形式的3D形状,如体素化形状、点云、多边形网格、隐式签名距离场。生成的形状可能存在噪声,缺乏锐利的几何特征,不便于用户编辑。新方法使用神经网络模型生成3D形状作为一系列几何操作。
- CSGNet:基于体素化形状输入推断CSG操作序列。
- UCSG-Net:无监督情况下推断CSG树。
- 领域特定语言(DSLs):通过DSLs合成3D形状,如ShapeAssembly。
- 作者工作:自编码器网络输出一系列CAD操作指定的CAD模型。CAD模型成为工业生产标准形状表示,可以直接导入CAD工具进行用户编辑,也可转换为点云和多边形网格。这是第一个直接生成CAD设计的生成模型。
-
基于Transformer的模型
Transformer网络作为基于注意力的构建模块,成功应用于自然语言处理、图像处理和其他类型数据。并行工作在约束的CAD草图生成上也依赖于Transformer网络。
与作者工作相关的还有DeepSVG-用于生成可缩放矢量图(SVG)图像的Transformer网络。SVG图像由参数化原语(如直线和曲线)描述,原语无特定顺序或依赖关系。
与SVG不同,CAD命令在3D中描述,可以是相互依赖的,必须遵循特定顺序。所以需要寻求一种新的方法在基于Transformer的自编码器中编码CAD命令及其顺序。
3 方法
DeepCAD围绕对CAD命令序列的新表示方法(3.1.2),这种CAD表示方法特别适合于输入到神经网络中。此外,这种表示法还引导出一个自然的训练目标函数(3.4)。为了训练DeepCAD,作者创建了一个新数据集,其规模远远大于同类数据集(3.3)。
3.1 神经网络的CAD表示
CAD 模型提供了两个层次的表示。
-
在用户交互层面,CAD 模型被描述为用户在 CAD 软件中创建实心形状时执行的一系列操作,例如用户在二维平面上绘制一个闭合曲线轮廓,然后将其拉伸成三维实心形状,再通过布尔运算等进行处理。我们将这种规范称为 CAD 命令序列。
-
在命令序列背后,是 CAD 模型的内核表示,广为人知的是边界表示(B-rep)。给定一个命令序列,其 B-rep 会自动计算出来,通常通过行业标准库 Parasolid。它由拓扑组件及其连接组成,以形成一个实心形状。
我们的目标是生成 CAD 命令序列的模型,而不是 B-rep。这是因为 B-rep 是命令序列的抽象:命令序列可以很容易地转换为 B-rep,但反之则很难,因为不同的命令序列可能会生成相同的 B-rep。此外,命令序列是人类可理解的,便于编辑和应用于各种下游任务。
3.1.1 CAD命令的规范
CAD 工具支持丰富的命令集,作者仅考虑了一组常用的命令,这些命令分为两类:草图和拉伸。

尽管概念上简单,但它们足够表达生成各种形状。

-
草图命令用于在三维空间中的二维平面上指定闭合曲线,每个闭合曲线称为一个环,多个环形成一个闭合区域,称为轮廓。我们的表示方法中,一个轮廓由其边界上的环列表描述(如Figure 2中的“Sketch 1”);一个环总是以指示命令开始,后跟一系列曲线命令。我们列出环上的所有曲线,并按逆时针顺序排列,开始点为最左下角的曲线。实际中,我们考虑三种最常用的曲线命令:画直线、弧线和圆。这些命令占了我们大规模现实数据集中 92% 的比例。
每个曲线命令由其曲线类型( t i ∈ { ⟨ SQL ⟩ , L,A,R } t_i\in \{\langle\text{SQL}\rangle,\text{L,A,R}\} ti∈{⟨SQL⟩,L,A,R})和参数(Table 1)描述,曲线参数指定了曲线在草图平面的局部参考框架中的二维位置。由于每个环中的曲线是一个接一个连接的,为了简洁,我们从参数列表中排除了曲线的起始位置;第一条曲线总是从草图平面的原点开始,原点的世界空间坐标在拉伸命令中指定。简言之,一个草图轮廓由一个环列表描述( S = [ Q 1 , … , Q N ] S=[Q_1,\dots,Q_N] S=[Q1,…,QN]),每个环 Q i Q_i Qi由一系列从指示命令开始的曲线组成,例如 Q i = [ ⟨ SQL ⟩ , C 1 , … , C n i ] Q_i=[\langle\text{SQL}\rangle, C_1,\dots,C_{n_i}] Qi=[⟨SQL⟩,C1,…,Cni],每个曲线命令 C j = ( t j , p j ) C_j=(t_j,p_j) Cj=(tj,pj)指定曲线类型 t j t_j tj及其形状参数 p j p_j pj。
-
拉伸命令有两个目的。
-
它将草图轮廓从二维平面拉伸成三维实体,拉伸类型可以是单向、对称或双向。
-
它通过布尔运算指定如何将新拉伸的三维实体与先前创建的形状合并:创建新实体,或者与现有实体连接、切割或相交。
拉伸命令还需要定义草图平面的三维方向和其二维局部参考框架,这是通过旋转矩阵(Table 1中 ( θ , γ , ϕ ) (\theta,\gamma,\phi) (θ,γ,ϕ)参数确定)定义的(为了跟平面局部参考系对齐,并将 z z z轴与平面的法线方向对齐)。命令参数包括一个拉伸轮廓的比例因子 s s s。
-
通过这些命令,我们将一个 CAD 模型 M M M描述为交替出现的曲线命令和拉伸命令序列。换句话说 M = [ C 1 , … , C N c ] M=[C_1,\dots,C_{N_c}] M=[C1,…,CNc],其中每个 C i = ( c i , p i ) C_i=(c_i,p_i) Ci=(ci,pi)指定命令类型和参数。
3.1.2 网络友好的表示
我们的 CAD 模型 M 的规范类似于自然语言,词汇表由一系列 CAD 命令组成,形成句子。句子的主语是草图轮廓;谓语是拉伸。这种类比表明我们可以利用在自然语言处理中成功的网络结构(如 Transformer 网络,LLMs)来实现我们的目标。
然而,CAD 命令在几个方面与自然语言不同。每个命令有不同数量的参数。在某些命令(例如拉伸)中,参数是连续值和离散值的混合,参数值跨越不同范围。这些特性使得命令序列不适合直接用于神经网络。
为了克服这一挑战,我们对命令序列的维度进行正则化。
-
首先,对于每个命令,其参数堆叠成一个 16 × 1 16×1 16×1 的向量,其元素对应于Table 1中所有命令的集合参数(例如 p i = [ x , y , α , f , r , θ , ϕ , γ , p x , p y , p z , s , e 1 , e 2 , b , u ] p_i=[x,y,\alpha,f,r,\theta,\phi,\gamma,p_x,p_y,p_z,s,e_1,e_2,b,u] pi=[x,y,α,f,r,θ,ϕ,γ,px,py,pz,s,e1,e2,b,u])。每个命令的未使用参数设置为 -1。
-
接着,我们固定每个 CAD 模型 M M M 的命令总数 N c N_c Nc,并通过添加空命令来填充 CAD 模型的命令序列,直到序列长度达到 N c N_c Nc。我们选择 N c = 60 N_c = 60 Nc=60,这是训练数据集中出现的最大命令序列长度。
-
此外,我们通过量化连续参数来统一连续和离散参数。为此,我们将每个 CAD 模型规范化到一个 2 × 2 × 2 2×2×2 2×2×2 的立方体内;我们还将每个草图轮廓规范化到其边界框内,并在拉伸命令中包括一个比例因子 s s s来恢复规范化轮廓到其原始大小。这种规范化限制了连续参数的范围,使我们能够将其值量化为 256 256 256 个级别,并使用 8 8 8 位整数表示。结果是,所有命令参数都只有离散值集合。参数量化不仅是训练基于 Transformer 网络的常见实践,对于 CAD 模型来说,它对于提高生成质量尤为重要。在 CAD 设计中,必须遵循某些几何关系,例如平行和垂直的草图线条。然而,如果生成模型直接生成连续参数,通过参数回归获得的值容易产生错误,破坏这些严格的关系。相反,参数量化使网络能够将参数“分类”到特定级别,从而更好地遵循学习到的几何关系。
作者在 4.1 中通过消融研究实验证明对 CAD 命令表示选择的正确性。
3.2 CAD模型的自编码器
DeepCAD的网络架构如下:

一旦训练完成,网络的解码器部分将自然地作为 CAD 生成模型。我们的自编码器基于 Transformer 网络,受其在处理序列数据方面成功的启发。自编码器输入一个 CAD 命令序列 M = [ C 1 , … , C N c ] M = [C1,\dots , C_{N_c}] M=[C1,…,CNc],其中 N c N_c Nc 是固定数量。
首先,每个命令 C i C_i Ci 被分别投射到维度为 d E = 256 d_E = 256 dE=256 的连续嵌入空间。然后,将所有嵌入组合起来输入编码器 E E E,输出一个潜在向量 z ∈ R 256 z\in \mathbb{R}^{256} z∈R256。解码器以潜在向量 z z z 作为输入,输出生成的 CAD 命令序列 M ^ \hat{M} M^。
-
嵌入部分
与自然语言处理的方法类似,我们首先将每个命令 C i C_i Ci 投射到一个公共嵌入空间。然而,不同于自然语言中的词语,一个 CAD 命令 C i = ( t i , p i ) C_i = (t_i, p_i) Ci=(ti,pi) 有两个部分:命令类型 t i t_i ti 和参数 p i p_i pi。因此,我们将 C i C_i Ci 的嵌入计算为三个嵌入的总和,即
e ( C i ) = e i cmd + e i param + e i pos ∈ R d E , e(C_i) = e^\text{cmd}_i + e^{\text{param}}_i + e^\text{pos}_i\in \R^{d_E}, e(Ci)=eicmd+eiparam+eipos∈RdE,
-
第一个嵌入 e i cmd e^\text{cmd}_i eicmd 表示命令类型 t i t_i ti,由 e i cmd = W cmd δ i c e^\text{cmd}_i=W_\text{cmd}\delta_i^c eicmd=Wcmdδic 给出。这里 W cmd ∈ R d E × 6 W_\text{cmd}\in\R^{d_E\times 6} Wcmd∈RdE×6 是一个可学习矩阵, δ i c ∈ R 6 \delta_i^c\in\R^6 δic∈R6 是一个指示命令类型 t i t_i ti 的独热向量。
-
第二个嵌入 e i param e^{\text{param}}_i eiparam 考虑命令参数。每个命令有 16 16 16 个参数,每个参数被量化为一个 8 8 8 位整数。我们将这些整数转换为维度为 2 8 + 1 = 257 2^8+1=257 28+1=257 的独热向量 δ i , j p ( j = 1 … 16 ) \delta^p_{i,j}(j=1\dots16) δi,jp(j=1…16),并将所有独热向量堆叠成矩阵 δ i p ∈ R 257 × 16 \delta^p_i\in\R^{257\times16} δip∈R257×16。然后使用另一个可学习矩阵 W param b ∈ R d E × 257 W_\text{param}^b\in\R^{d_E\times 257} Wparamb∈RdE×257 单独嵌入每个参数,并通过线性层 W param a ∈ R d E × 16 d E W_\text{param}^a\in\R^{d_E\times 16d_E} Wparama∈RdE×16dE组合这些单独的嵌入,即
e i param = W param a flat ( W param b δ i p ) , e^{\text{param}}_i=W_\text{param}^a\text{flat}(W_\text{param}^b\delta^p_i), eiparam=Wparamaflat(Wparambδip),
其中 flat ( ⋅ ) \text{flat}(\cdot) flat(⋅)将输入矩阵展平为向量
-
最后,位置嵌入 e i pos e^\text{pos}_i eipos 表示命令 C i C_i Ci 在整个命令序列中的索引,由 e i pos = W pos δ i e^\text{pos}_i = W_\text{pos}\delta_i eipos=Wposδi 定义,其中 W pos δ i ∈ R d E × N c W_\text{pos}\delta_i\in\R^{d_E\times N_c} Wposδi∈RdE×Nc 是一个可学习矩阵, δ i ∈ R N c \delta_i\in\R^{N_c} δi∈RNc 是一个在索引 i i i 处填充 1 1 1 其他位置填充 0 0 0的独热向量。
-
-
编码器
编码器 E E E 由四层 Transformer 块组成,每层有八个注意力头和 512 512 512 的前馈维度。编码器将嵌入序列 [ e 1 , … , e N c ] [e_1, \dots, e_{N_c}] [e1,…,eNc] 作为输入,输出向量 [ e 1 ′ , … , e N c ′ ] [e'_1,\dots, e'_{N_c}] [e1′,…,eNc′],每个向量的维度为 d E = 256 d_E = 256 dE=256。输出向量最终被平均以生成一个 d E d_E dE 维的潜在向量 z z z。
-
解码器
解码器 D D D 也建立在 Transformer 块上,具有与编码器相同的超参数设置。它以学习到的常量嵌入为输入,同时关注潜在向量 z z z。最后一个 Transformer 块的输出被送入线性层,以预测 CAD 命令序列 M ^ = [ C ^ 1 , … , C ^ N c ] \hat{M} = [ \hat{C}_1,\dots, \hat{C}_{N_c}] M^=[C^1,…,C^Nc],包括每个命令的命令类型 t ^ i \hat{t}_i t^i 和参数 t ^ i \hat{t}_i t^i。与自然语言处理中常用的自回归策略不同,我们采用前馈策略,模型的预测可以分解为
p ( M ^ ∣ z , Θ ) = ∏ i = 1 N c p ( t ^ i , p ^ i ∣ z , Θ ) , p(\hat{M}|z,\Theta)=\prod_{i=1}^{N_c}p(\hat{t}_i,\hat{p}_i|z,\Theta), p(M^∣z,Θ)=i=1∏Ncp(t^i,p^i∣z,Θ),
其中 Θ \Theta Θ表示解码器的网络参数。
3.3 CAD数据集的创建
现有数据集:
-
ABC数据集:虽包含百万级别的CAD设计,但这些设计采用B-rep格式,缺乏如何通过CAD操作构建设计的具体信息;
-
Fusion 360 Gallery数据集:虽然提供了CAD设计及其构建指令序列,但规模仅有约8000个设计,不足以训练出泛化能力强大的生成模型。
鉴于此,作者决定创建一个全新的、大规模的数据集,该数据集不仅数量庞大,还提供了CAD命令序列,旨在满足训练自动编码网络的需求,并为未来的研究提供资源。
新数据集构建过程始于ABC数据集:
-
利用其中每个CAD模型链接至Onshape的原始设计。
-
接着,通过Onshape的FeatureScript语言(一种专门用于解析CAD操作与参数的领域特定语言),作者筛选出仅使用“草图”和“拉伸”操作的模型,舍弃了那些采用更复杂操作的模型。
-
对于符合条件的模型,作者编写了一段FeatureScript程序来提取其草图轮廓和拉伸操作,并将其转化为Table 1中列出的命令格式。
最终,作者收集到了总计178,238个以CAD命令序列形式描述的CAD设计,这个数量级远超现有同类型数据集。数据集进一步被随机划分为90%的训练集、5%的验证集以及5%的测试集,以备训练和测试之用。

3.4 训练和运行时生成
3.4.1 训练阶段
我们利用构建的数据集对自编码器网络进行训练,采用标准的交叉熵损失函数作为优化目标。具体而言,定义预测的CAD模型 M ^ \hat{M} M^与真实模型 M M M之间的损失函数为:
L = ∑ i = 1 N c ℓ ( t ^ i , t i ) + β ∑ i = 1 N c ∑ j = 1 N p ℓ ( p ^ i , j , p i , j ) , \mathcal{L} = \sum_{i=1}^{N_c} \ell(\hat{t}_i,t_i) + \beta \sum_{i=1}^{N_c} \sum_{j=1}^{N_p} \ell(\hat{p}_{i,j},p_{i,j}), L=i=1∑Ncℓ(t^i,ti)+βi=1∑Ncj=1∑Npℓ(p^i,j,pi,j),
其中, L ( ⋅ , ⋅ ) \mathcal{L}(·, ·) L(⋅,⋅)表示标准的交叉熵损失, N p N_p Np每个命令的参数数量(在我们的示例中, N p = 16 N_p = 16 Np=16),而 β \beta β是一个权重项,用于平衡两项损失(在我们的示例中, β = 2 \beta = 2 β=2)。值得注意的是,在真实的命令序列中,有些命令是空的(即填充命令 ⟨ EOS ⟩ \langle \text{EOS} \rangle ⟨EOS⟩),而有些命令参数未使用(标记为 − 1 -1 −1)。在这种情况下,这些元素对上述损失函数中的求和部分不做贡献。
训练过程中,我们使用Adam优化器,初始学习率为 0.001 0.001 0.001,并设置线性预热期为前 2000 2000 2000步。所有Transformer模块的Dropout率设定为 0.1 0.1 0.1,并在反向传播中应用梯度裁剪值为 1.0 1.0 1.0。我们以批处理大小 512 512 512对网络进行 1000 1000 1000轮的训练。
3.4.2 CAD生成阶段
当自编码器训练完成后,我们可以使用一个 256 256 256维的潜在向量 z z z来表示一个CAD模型。为了自动生成CAD模型,我们运用latent-GAN技术于已学得的潜在空间上。生成器和判别器都是简单的多层感知机(MLP)网络,各自包含四层隐藏层,它们的训练采用带有梯度惩罚的Wasserstein-GAN策略。最后,生成CAD模型时,我们从多元高斯分布中采样一个随机向量,并将其输入GAN的生成器中。GAN的输出是一个潜在向量 z z z,随后将其输入基于Transformer的解码器,从而生成CAD模型。
4 实验
我们从两个角度评估我们的自编码器网络:CAD模型的自编码性能(4.1)和潜在空间形状生成(4.2)。我们还讨论了可以受益于CAD生成模型的潜在应用(4.3)。由于之前没有针对CAD设计的生成模型,因此无法直接进行比较。我们的目标是通过一系列消融实验理解模型在不同指标下的性能,并验证我们的算法选择。
4.1 CAD模型的自编码
自编码性能通常用于指示生成模型表达目标数据分布的程度。我们使用自编码器网络对训练数据集中不存在的CAD模型 M M M进行编码,然后将所得的潜在向量解码成CAD模型 M ^ \hat{M} M^。通过比较 M M M和 M ^ \hat{M} M^的差异来评估自编码器的性能。
-
指标
-
命令准确率( ACC cmd \text{ACC}_{\text{cmd}} ACCcmd):衡量预测的CAD命令类型的正确性;
ACC cmd = 1 N c ∑ t = 1 N c I [ t i = t i ^ ] , \text{ACC}_{\text{cmd}}=\frac{1}{N_c} \sum_{t=1}^{N_c}\mathbb{I}[t_i=\hat{t_i}] , ACCcmd=Nc1t=1∑NcI[ti=ti^],
-
参数准确率( ACC param \text{ACC}_\text{param} ACCparam):衡量命令参数的正确性;
ACC param = 1 K ∑ i = 1 N c ∑ j = 1 ∣ p ^ i ∣ I [ ∣ p i , j − p ^ i , j ∣ < η ] I [ t i = t ^ i ] , \text{ACC}_\text{param} = \frac{1}{K} \sum_{i=1}^{N_c} \sum_{j=1}^{\left| \hat{p}_i \right|} \mathbb{I}[|p_{i,j} - \hat{p}_{i,j}| < \eta]\mathbb{I}[t_i = \hat{t}_i], ACCparam=K1i=1∑Ncj=1∑∣p^i∣I[∣pi,j−p^i,j∣<η]I[ti=t^i],
其中 K = ∑ i = 1 N c I [ t i = t ^ i ] ∣ p i ∣ K=\sum_{i=1}^{N_c}\mathbb{I}[t_i=\hat{t}_i]|p_i| K=∑i=1NcI[ti=t^i]∣pi∣是所有正确恢复命令中的参数总数。注意 p i , j p_{i,j} pi,j和 p ^ i , j \hat{p}_{i,j} p^i,j都被量化为 8 8 8位整数,选择 η \eta η是作为考虑参数量化的容差阈值,在实践中,我们选择了 η = 3 \eta=3 η=3(256个级别)
-
此外,我们使用Chamfer距离(CD)来评估3D几何体的质量,通过均匀采样2000个点来计算参考形状和生成形状之间的CD。另外,我们还报告无效率,即无法转换为点云的输出CAD模型的百分比。
-
-
比较方法
由于缺乏现有的CAD生成模型,我们比较了几种模型变体以验证我们的数据表示和训练策略。具体包括以下几种变体:Alt-Rel、Alt-Trans、Alt-ArcMid、Alt-Regr和Ours+Aug。每种变体在数据表示或训练策略上有所不同。

总体而言,Ours+Aug(即使用合成数据增强训练)表现最佳,表明随机组合数据可以提高网络的泛化能力。Alt-ArcMid的性能与Ours相似,说明中点表示法是表示弧的可行替代方法。Alt-Trans在CD方面略逊于Ours。虽然Alt-Rel的参数准确率(ACCparam)高于Ours,但其CD分数较大且有时会出现无效拓扑,例如在Figure 4中第二行中的黄色模型有两个三角形环路相互相交,导致拓扑无效,这是由于预测曲线位置的误差累积导致的。Alt-Regr由于不量化连续参数,误差较大,可能破坏关键的几何关系,如平行边和垂直边,例如Figure 4中的第一行。

我们还验证了我们自编码器的泛化,在其他更小的数据集(来自Autodesk Fusion 360)上评估它表现出良好的泛化能力,实现了可比较的定量性能。
4.2 形状生成
由于CAD设计没有现成的生成模型,我们选择将我们的模型与l-GAN进行比较,l-GAN是一种被广泛研究的点云三维形状生成模型。我们注意到,我们的目标并不是要显示出孰优孰劣,因为这两种生成模型有不同的应用领域。相反,我们证明了我们的模型即使在点云生成模型的度量下也能产生可比的形状质量。

此外,如Figure 5所示,我们模型中的形状具有更清晰的几何细节,并且可以轻松地进行用户编辑(Figure 7)。

为了与点云生成模型进行定量比较,我们遵循l-GAN中使用的指标。这些度量标准用于衡量两组3D点云形状之间的差异,即真实形状集合 S S S和生成形状集合 G G G。
-
覆盖率(COV):衡量 S S S中的形状有多少可以很好地近似为G中的形状;
-
最小匹配距离(MMD):表示 S S S和 G G G中两个点云之间的最小匹配距离来衡量 G G G的保真度;
-
Jensen-Shannon散度(JSD):衡量 S S S和 G G G的点云分布的相似性
然后,我们将真实和生成的CAD模型转换为点云,并评估这些度量标准。结果如下:

表明我们的方法在点云度量标准方面与l-GAN具有可比性的性能。然而,由于其参数化表示,CAD模型具有比点云更平滑的表面和更锐利的几何特征。
4.3 未来应用
-
借助CAD生成模型,可以将点云(例如通过3D扫描获取的)重建为CAD模型,例如作者这里使用自编码器将CAD模型 M M M编码为潜在向量 c c c。然后,利用PointNet++编码器训练它将 M M M的点云表示编码为相同的潜在向量 c c c。在推断时,给定一个点云,我们使用PointNet++编码器将其映射到潜在向量,然后使用我们的自编码器解码为CAD模型。

-
生成的CAD模型可以直接导入CAD工具进行用户编辑。
5 总结
作者提出了DeepCAD,第一个一个用于CAD设计的深度生成模型。几乎所有以前的3D生成模型都产生离散的3D形状,如体素、点云和网格。为此,作者还引入了一个大型CAD模型数据集,每个模型都表示为一个CAD命令序列。
在构建CAD生成模型的过程中,作者的方法存在以下几个主要限制:
-
曲线命令类型有限:目前,作者仅考虑了三种最常用的曲线命令类型(直线、弧线和圆)。然而,其他曲线命令也可以轻松添加,例如可以通过三个控制点以及起点来指定的三次贝塞尔曲线,其参数结构可以按照3.1中描述的方式进行。
-
操作命令的局限性:虽然像旋转草图这样的操作可以类似于拉伸命令进行编码,但某些CAD操作(如倒角)作用于形状边界的部分,因此需要参考模型的B-rep(边界表示),而不仅仅是其他命令。将这些命令纳入生成模型仍需进一步研究。
-
拓扑有效性无法保证:并非每个CAD命令序列都能生成拓扑上有效的形状。作者的生成网络不能保证其输出的CAD序列的拓扑一致性。在实践中,生成的CAD命令序列很少失败,但随着命令序列变长,失败的可能性增加。
相关文章:
【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models
1 引言 现有3D生成模型: 3D点云:大量离散的3D点组成的数据表示形式; 多边形网格:一系列相连的多边形组成的3D模型; 水平集场:使用数值函数来表示物体的边界,并根据函数值的正负来确定物体内部…...
《如鸢》开通官号,女性向游戏爆款预定
今天,备受瞩目的沉浸式剧情卡牌手游《如鸢》正式开通了官方社媒账号并发布了玩家信。 《如鸢》由灵犀互娱倾力打造,游戏不仅拥有跌宕起伏的权谋剧情,更采用Live2D技术,为玩家带来沉浸式的游戏体验,吸引了众多玩家关注。…...
OpenAI再下一城:发布Voice Engine,可使用文本和参考语音合成说话者的新语音!
转自 机器学习算法工程师 OpenAI又发布了一个最新的工作:Voice Engine。Voice Engine可以使用文本输入和单个 15 秒音频样本生成听起来自然且与原始说话者非常相似的语音。而且,一个小型模型仅通过一个 15 秒的样本就能创造出富有情感且逼真的语音。Voi…...
KVM高级功能部署
一、概述 KVM(Kernel-based Virtual Machine)是一种基于内核的虚拟化技术,它依赖于CPU的虚拟化扩展(如Intel VT和AMD-V)来实现虚拟机的创建、管理和调度。KVM虚拟化技术因其高效、稳定的特点,在云计算和企…...
【C语言】柔性数组(打开前所未见的大门)
文章目录 前言柔性数组1.1 概念1.2 柔性数组的特点1.3 柔性数组的使用1.4 柔性数组的优势 总结 前言 说到柔性数组,相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系,相信本章能够带你从到认识到掌握柔性数组,做一个充满知识…...
设计模式17-适配模式
设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化?如何既能利用现…...
react ant Input defaultValue={value}设置了value值以后,但是defalult没有赋值上,输入框也没有显示
在 React 中,defaultValue 是一个非受控属性,而 value 是一个受控属性。这两个属性都可以用于设置 Input 组件的值,但是它们的工作方式有所不同。 value:这是一个受控属性,意味着输入框的值由 React 状态控制。每当状态…...
大模型开发如何把一段文字变成一组token?
在大模型开发中,将一段文字变成一组token通常称为"tokenization"(分词)。这是自然语言处理中的一个关键步骤,主要是将连续的文本划分成离散的单元(token),这些单元可以是单词、子词或…...
【MSYS】Windows Terminal 集成
Windows Terminal 集成 MSYS2安装在默认位置C:\msys64打开Windows Terminal打开JSON配置文件文件。 添加如下配置: "profiles": {"defaults": {},"list": [{"guid": "{71160544-14d8-4194-af25-d05feeac7233}"…...
Python酷库之旅-第三方库Pandas(056)
目录 一、用法精讲 211、pandas.Series.truncate方法 211-1、语法 211-2、参数 211-3、功能 211-4、返回值 211-5、说明 211-6、用法 211-6-1、数据准备 211-6-2、代码示例 211-6-3、结果输出 212、pandas.Series.where方法 212-1、语法 212-2、参数 212-3、功能…...
ZBrush入门使用介绍——4、笔刷选项说明
大家好,我是阿赵。 这次来看看ZBrush的笔刷的选项用法。 一、选择笔刷 点击笔刷,可以打开笔刷选择面板。 在最上面的Quick Pick,有最近使用过的笔刷,可以快速的选择。下面有很多可以选择的笔刷。但由于笔刷太多,…...
Java每日一练,技术成长不间断
目录 题目1.下列关于继承的哪项叙述是正确的?2.Java的跨平台特性是指它的源代码可以在多个平台运行。()3.以下 _____ 不是 Object 类的方法4.以下代码:5.下面哪个流类不属于面向字符的流()总结 题目 选自牛…...
传知代码-上下位关系自动检测方法(论文复现)
代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 Hearst patterns revisited: Automatic hypernym detection from large text corpora[1] 提出的文本中上位词检测方法。 在自然语言处理中,上下位关系(Is-a Relations…...
从零开始的MicroPython(二) GPIO及代码应用
上一篇:http://t.csdnimg.cn/mg2Qt 文章目录 ESP32(NodeMCU-32S)简介引脚注意事项 类与对象的概念MicroPython的GPIO使用文档解释machine.PinPin.irq 点灯 ESP32(NodeMCU-32S) 简介 NodeMCU-32S 是安信可基于 ESP32-32S 模组所设计的核心开发板。该开发板延续了 N…...
嵌入式day15
数组指针 能够指向整个数组 一维数组: &a,考察a的数据类型 int(*p)[10]:表示一个指向长度为10的一维整型数组的指针 二维数组: 指向函数的指针 函数的函数名,即为函数的入口地址&#x…...
【电池管理系统(BMS)-01】 | 电池管理系统简介,动力电池和储能电池区别
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...
C++ STL partial_sum 用法
一:功能 计算部分和,即遍历序列中每个元素,计算前 i 个元素的累加和,并将结果存在 i 的位置上。 二:用法 #include <iostream> #include <vector> #include <numeric>int main() {std::vector<…...
诚宜开张圣听不应妄自菲薄
拾人牙慧孜孜不倦 青山依旧在几度夕阳红朝闻道夕死可矣 青山依旧在几度夕阳红 安能以血补天我计不成乃天命也臣本布衣躬耕南阳大丈夫宁死不辱尔要试我宝剑是否锋利吗又待怎样休教天下人负我竖子不足与谋皇天不佑天下英雄唯使君与操尔青光殷殷其灿如炎备不量力欲申大义于天下我…...
Vue3 加载条(LoadingBar)
效果如下图:在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小,单位 pxnumber2falsecolorLoading加载中颜色string‘…...
《CSS创意项目实战指南》:点亮网页,从实战中掌握CSS的无限创意
CSS创意项目实战指南 在数字时代,网页不仅是信息的载体,更是艺术与技术的融合体。通过CSS,你可以将平凡的网页转变为引人入胜的视觉盛宴,让用户体验跃升至全新高度。《CSS创意项目实战指南》正是这样一本引领你探索CSS无限可能的…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
