Seg3DParts:分割图当条件,部件级 3D 生成还需要事后拼装吗?
部件级 3D 生成一直卡在同一个位置:模型要么能按你的意思切部件、但拼不回一个整体,要么整体看着挺像、但你不知道每个部件到底是谁。Seg3DParts 把这一步从「推断」改成「读取」:一张分割图在去噪开始之前就把每个部件的身份写死,剩下的尺度、摆位与咬合交给生成过程里的跨部件交互。方法构建在 TRELLIS 的两阶段 SLat 骨架上,配套发布约 20 万物体的 PartObjectNet 数据集Seg3DParts。
1 部件对不上、拼不回去,因为部件身份一直是被猜出来的
现有两条路线在同一个前提上打转:部件身份与空间摆位被当成必须由模型推断的隐变量,而不是可以被指定的量。正因为身份要靠猜,可控分解与拼得回去就只能此消彼长。
单图部件级生成本身是病态的,论文列了三层原因。局部外观往往不足以确定精确的部件边界,相邻部件材质相近或着色线索弱时尤其如此。遮挡会让功能性部件在输入视角里几乎没有二维证据。即便每个部件都看清楚,模型还要在三维里推理跨部件关系,保证它们接得上、相对尺度与位置合理。
现有做法分两类。分解式流水线先把物体切成表面部件,再逐个补全缺失几何,最后装回去,Hunyuan3D 2.1 出整体网格、PartField 做表面部件分割、HoloPart 逐部件补全就是这条链的典型形态HoloPart。它的分解是显式可控的,但每个部件重建时主要看自己那一块里的局部线索,跨部件一致性常常要等补完之后才作为约束加进来,遮挡严重时容易错位、尺度不一致。
部件结构化的生成模型把多个部件放进统一潜空间里端到端联合生成。PartCrafter 用每部件一组解耦 latent token 加可学习的 part identity embedding,用户只指定部件数量;PartPacker 把部件连接图做成二分图,再把任意数量的部件打包进两个互补体积,网格提取时靠连通域读出PartPacker。这类方法全局连贯性更好,但部件身份落在没有语义接地的隐式 slot 上,用户指定不了哪个部件是哪块。
两条路线因此共享同一句话:部件身份与空间分配是被推断的隐变量,而不是被指定的量。Seg3DParts 的重新表述就是把这句反过来写。

图注:参考图先过分割图,SAM 或人工标注都行,再裁出逐部件的图像区域,这三步都排在生成之前;最右侧是同一批结果以组装与爆炸两种视图并排展示。图底三个标签正好对应后面几章各自要回答的问题。Seg3DParts
2 把分割图当生成条件,部件身份在生成前就被写死
可控性的来源可以压成一句:每个部件各自收到一份只属于自己的条件,所以换一张分割图就等于换一套分解方式,模型内部没有一堆需要它自己去猜的槽位。
路径本身不复杂。给定输入图像 $I$,每个部件 $k$ 的分割来自 SAM 一类外部分割器或用户标注,从 $I$ 中裁出对应区域得到部件条件图像 $I^{k}_{part}$。这张裁片过冻结的 DINOv2 拿到高层特征,再经一个轻量可训练 MLP 压成外观嵌入 $v_k$。$v_k$ 与扩散时间步嵌入、以及部件总数 $K$ 的编码拼成部件特定条件向量 $c_k$,投影到调制维度后经 AdaLN 注入所有 DiT 层。与此同时,整张 $I$ 的 DINOv2 特征走另一条路径,用 cross-attention 提供全局上下文。两条路径分工明确,一条管「这个部件长什么样」,一条管「整体是什么」。
| 条件 | 来源 | 注入方式 | 作用范围 |
|---|---|---|---|
| 逐部件 $c_k$ | 该部件裁片、timestep、部件数 $K$ | AdaLN 调制 | 只作用于本部件自己的 token |
| 全局图像特征 | 整张输入图 | cross-attention 的 K/V | 所有部件 |
这里最容易读错的一处是「接地」到底接在哪一层。它接的是 $c_k$ 里的逐部件嵌入经共享 MLP 生成的 AdaLN 参数,通过 indexed broadcasting 只施加到属于该部件的 token 上,而不是在潜变量空间里给每个部件分配一个 slot、再指望模型自己学会 slot 与语义的对应。
拿渲染管线对照一下就清楚了。共享 MLP 相当于一份固定的 shader,$c_k$ 是每次 draw call 各自传进去的 uniform,indexed broadcasting 保证这套参数只喂给这次 draw call 的那些顶点。slot 分配是另一回事,相当于把所有部件的顶点塞进同一个 buffer,再指望模型从偏移量里猜出哪一段属于谁。前者的身份由输入决定,后者的身份是模型分出来的,这就是两种做法的分水岭。
也正因为这样,「用了分割」和「分割定义身份」必须分开看。OmniPart 同样接收二维部件 mask,但按它自己的论文,单张 mask 覆盖不了物体的所有部件,二维 mask 与三维包围盒之间不存在一一对应,作者采用的是与标签无关的非一一对应框OmniPart。mask 经逐像素标签嵌入加到图像特征上,作为条件前缀影响包围盒的位置与尺寸;第二阶段里部件身份来自按预测框序号分配的 part position embedding。所以 mask 在这里管的是布局,不是身份。

图注:左侧是自回归的部件框规划,右侧是空间条件的部件合成。注意图里没有一条把某块二维 mask 连到某个三维部件的线,mask 影响的是框的位置与尺寸,这就是布局级控制与身份级控制的区别。OmniPart
分割驱动控制最直接的证据是换分割。固定同一张条件图,只改部件分割,生成结果的部件数量与切法跟着变,而且各自内部是自洽的。

图注:两行分别是书本与剑,每行只给一张条件图,配两组不同的分割输入,右边各自对应一套生成结果。部件颜色只用于区分,不代表任何评分。两个案例,不构成统计结论。
3 身份定死之后,部件之间的尺度和摆位靠跨部件注意力补上
身份问题解决的是「哪个部件是哪个」,可它立刻带出第二个缺口:部件分开生成,谁来决定它们的相对尺度、摆位与咬合。Seg3DParts 的答案是让跨部件信息交换在每一层里周期性发生,而不是等生成完了再约束。
骨架沿用 TRELLIS。SLat 是挂在稀疏体素网格上的局部 latent,活跃体素勾勒粗结构,挂在上面的 latent 承载细几何与外观。Stage-1 只生成稀疏体素占用,定全局结构、不编码细节;Stage-2 在这套结构上生成结构化 latent,再解码成网格。decoder 共享架构、只换输出层,训练不需要为每个物体单独拟合某种表示TRELLIS。

图注:上排是表示的编码与解码路径,下排是生成的两阶段,先出稀疏结构、再出挂在结构上的结构化 latent。这张图里没有部件、没有分割图,它只用来定位后面的改造发生在哪个盒子里。TRELLIS
Seg3DParts 把组件命名与两阶段框架整套继承下来,改造落在三个位置。所有 VAE 与 DiT 的 latent 按部件维护,不再对整物体维护。Stage-2 把 TRELLIS 的体素特征投影换成网格型的 latent 编码。DiT 里单部件块与多部件块交替堆叠。

图注:与上一张对读,(a) 里 Stage-1 与 Stage-2 都多出了 Segmented Parts 这一路输入,Stage-2 的 latent 也是按部件带噪的;(b) 里逐部件条件与全局图像特征分成两条路径,分别走 AdaLN 调制与 cross-attention。蓝橙两种底色是单部件块与多部件块。Seg3DParts
跨部件那一层的形式就是式 (1):
$$X_k^{out} = X_k + \mathrm{Attn}\left(Q = X_k,; K = [X_j]{j \neq k},; V = [X_j]{j \neq k}\right) \tag{1}$$
$Q$ 取本部件,$K$ 与 $V$ 取其他部件的 token 沿 token 维拼接。插入位置在部件内自注意力之后,回写用残差。这三个选择合起来才是「部件既协调又不塌缩」的原因:残差保住了 $X_k$ 自身的内部表示,跨部件注意力只往上面叠加别人的结构上下文。如果改成把所有部件的 token 混在一起做一次全局注意力、再平分回去,每个部件拿到的就是同一份共享表示,部件身份在层与层之间就被磨掉了。所以残差不是写法习惯,它就是机制本身。
块结构上,单部件块是部件内自注意力、图像 cross-attention、FFN 依次串联;多部件块在自注意力之后多插一层 multi-part attention,其余相同。多部件块按固定调度稀疏交错,只有单个部件时这一层自然退化为标准自注意力。

图注:左侧单部件块,右侧多部件块多出一层跨部件注意力。右下角的示意是逐部件调制:Part 0 与 Part 1 各经共享 MLP 得到自己的 AdaLN 参数,只作用于本部件的 latent,图注原文就是 each part's features modulate only that part's tokens。Seg3DParts
另一处改造在 Stage-2 的解码侧。Seg3DParts 采用受 TripoSF 启发的网格型结构化 latent 编码,把表面几何直接编码成稀疏 latent token,解码端用 FlexiCubes 做可微的等值面提取SparseFlex。技术出处这一层有三条边界要说清。SparseFlex 本身是整体单物体方法,全文没有部件概念,也没有免对齐主张。「网格型 latent 在部分观测或遮挡下更稳」是 Seg3DParts 的判断,不是 SparseFlex 的结论。它的高分辨率指标属于自身实验,与这里的部件级结果不是一回事。
4 解码即对齐:部件从来没被打散过,不用再拼一次
免对齐不是一个额外的工程步骤,而是表示约定带来的结果:部件从一开始就躺在同一个坐标系里,解码出来自然就在正确位置。
做法是在数据准备与训练全程保留部件级的空间对齐。部件确实是从完整物体上分解下来的,但保留原始尺度与摆放;编码、生成、解码三个阶段都直接作用在这些已经对齐的表示上。于是推理时独立解码出的部件网格彼此已经处在正确位置,不需要平移、缩放或优化式后处理,附录的原话就是 no test-time optimization or post-processing。
换成坐标系的说法,每个部件从第一步起就在世界空间里,而不是各自待在局部空间里等一个 transform 再去拼。爆炸视图之所以天然成立也是同一个原因:它只是把这批世界空间里的网格沿各自方向拉开,不需要重新装配一次。
完全被遮挡的部件是这套约定的极限情形。它在输入视角里没有任何二维证据,Seg3DParts 给它一张全黑的图像裁片作为部件图像条件,训练时同样如此:某个部件在当前视角完全不可见,它收到的也是全黑裁片。模型因此学会把空白条件读成「该部件没有可用局部证据」,几何由全局图像上下文、学到的三维先验,以及跨部件交互传来的可见部件流共同推断。

图注:分割输入里用 ∅ 标出的就是完全遮挡、拿不到裁片的部件;生成结果的拆解视图用箭头把它指出来,说明空白条件并没有让模型放弃这个部件,糖果罐的倒出口与工具箱的内盖都是这样恢复的。单个案例,不能据此说遮挡部件一般都能正确恢复。
这一能力的量化读数来自按可见比例分层的表 4,它只存在于上传的 camera-ready 版本。交互在每个区间都改善三项指标。零可见度那一档,部件 F-score 从 0.311 到 0.384,部件 IoU 从 0.101 到 0.171,部件 CD 从 0.614 降到 0.539。这组表比较的是完整模型与去掉交互的模型,两者处于同一受控消融设置,不是与外部基线的对比。
5 每个部件单独比也更好,部件之间也不再互相穿插
这两块机制不是叠加的锦上添花,它们各自守着一个不同的失败面。要看懂这一点,得先把口径和方向摆正。
四类指标各司其职。全局几何把所有部件网格拼成一个网格与 GT 比,归一化到 $[-1,1]^3$,表面均匀采样 16K 点,报 CD 与阈值 0.1 下的 F-score。部件级几何是每个生成部件与对应 GT 部件比,协议相同,另在 $64^3$ 体素化下算体积 IoU。部件重叠是同一 $64^3$ 下生成部件之间的平均成对 IoU。分割遵循度看生成结果是否跟随输入 mask,用 part-count match、silhouette IoU 与 matched part-mask IoU。
两个 IoU 方向相反,读反了整段结论就反了:部件重叠 IoU 越低越好,说明穿插越少;部件级 IoU 越高越好,说明体积对得上。
| 变体 | 全局 FS↑ | 部件重叠 IoU↓ | 部件级 FS↑ | 部件级 IoU↑ |
|---|---|---|---|---|
| Full Model | 0.856 | 0.054 | 0.631 | 0.649 |
| 去掉多部件交互 | 0.838 | 0.103 | 0.531 | 0.434 |
| 逐部件条件换成整体 mask | 0.840 | 0.126 | 0.488 | 0.444 |
去掉多部件交互时,全局几何只是温和下降,0.856 到 0.838,但部件重叠 IoU 几乎翻倍,0.054 到 0.103,它买的是不穿插与结构协调。把逐部件条件换成单张整体 mask,整体形状看着还行,部件级 F-score 掉得最重,0.631 到 0.488,它买的是部件边界与身份。这两行合起来才是完整的分工:一个管部件之间怎么摆,一个管每个部件是什么。
需要交代口径:表 3 的变体都在随机 1K 物体上训练 5K 步,绝对数值低于主表,不能与主结果直接比较,也不是与外部基线的对比。主表那边只需记住三个方向:最低的部件重叠是 0.012,部件级 F-score 0.774 对 0.565,分割遵循度里 part-count match 达到 100%,最后这一项只见于 camera-ready 版本的附录表。表里的基线数字是 Seg3DParts 侧复评值,与各基线论文自报值口径不同,不相减、不排名。

图注:五列依次是条件图、去掉多部件注意力、逐部件条件换成单张整体 mask、完整模型与 GT,三行物体。第二列能看到部件互相穿插、结构断裂,第三列能看到分解不稳,这正是表 3 两行退化在图上长什么样。定性对照,不替代数值。
四条基线各自的失效形态则是另一张图。

图注:六列并置,PartCrafter、PartPacker、OmniPart、Hunyuan3D 加 PartField 与 HoloPart 的组合、Ours、GT,六行物体,颜色只表示语义部件。这组图说明「整体像」与「部件对得上」是两件事。属作者精选案例,不代表平均表现。
论文对这四条路线的定性观察是:PartCrafter 能生成多样的部件几何,但常常维持不住语义上的部件分离,边界破碎或含混PartCrafter;PartPacker 与 Hunyuan3D 那条链条一般能给出看似合理的整体外形,部件级可控性不稳定,部件身份不一致、相对摆放跨实例波动;OmniPart 虽然以整体分割图为条件显式建模部件结构,仍常出现部件不完整或被合并。这三句是本文作者的对比观察,不是各基线论文的自述。
6 部件级生成变成模型原生能力,但前提是分割给得准
这套方法的定位是把「部件怎么切、怎么摆」从多段工程工序挪进模型输入,一次推理直接拿到可编辑、可重组的部件网格。原来要重建、分割、补全三段流水线才凑出来的东西,现在是一个模型的输出。

图注:每行是条件图、三个视角的生成结果,以及与生成结果分离展示的部件。剑、机械装置、书、钢丝钳、字母方块、管钳、支架器皿、布袋支架都在同一套流程下被拆成部件。属精选案例,不承载任何数值。
代价落在对分割的依赖上。论文自述的局限只有一条:性能依赖输入部件分割的质量,分割质量低、或部件边界在语义上存在歧义时,生成几何会相应退化。

图注:这是论文自己的失败案例图,左侧是参考图与分割图,右侧是多视角渲染。分割边界混乱时,生成的部件也跟着碎。它用来具体说明「依赖分割质量」这句话长什么样,不能据此推断失败率。
其余状态按论文自查清单客观陈述:代码与数据尚未开放,正在整理;没有报告误差棒与统计显著性,理由是训练多个 3D 生成模型的算力代价过高;推理耗时与显存占用论文未给出。
这条线还在往前走。FlexPart 把 point、box、mask 三种几何条件统一进同一个 DiT,用 Gated AdaLN 逐层调制,训练期再用可微偏最优传输把强空间先验迁移给稀疏输入FlexPart。

图注:左侧是三类提示各自的编码分支与 null embedding 占位,中部是带噪 latent、part ID 与时间步同融合条件一起进 DiT 主干、由门控自适应层归一化逐层调制,右侧是训练期才生效的几何引导分支。这张图属于 FlexPart,不是 Seg3DParts 的架构,只作方向参照。FlexPart
两篇之间没有任何直接对比,这里只作方向说明。回到开头那个问题:部件级 3D 生成还需不需要事后拼装,答案取决于你把部件身份写在哪一层。写进输入,拼装就退化成解码;写进隐变量,拼装就只能一直留在流水线里。
参考文献
- Seg3DParts: Segmentation-Grounded Controllable Part-Level 3D Generation — arXiv:2609.36918
- TRELLIS: Structured 3D Latents for Scalable and Versatile 3D Generation — arXiv:2412.01506
- OmniPart: Part-Aware 3D Generation with Semantic Decoupling and Structural Cohesion — arXiv:2507.06165
- PartCrafter: Structured 3D Mesh Generation via Compositional Latent Diffusion Transformers — arXiv:2506.05573
- Efficient Part-level 3D Object Generation via Dual Volume Packing — arXiv:2506.09980
- HoloPart: Generative 3D Part Amodal Segmentation — arXiv:2504.07943
- SparseFlex: High-Resolution and Arbitrary-Topology 3D Shape Modeling — arXiv:2503.21732
- FlexPart: A Unified Framework for Image-to-3D Part Generation via Variable Granularity — arXiv:2610.31671