Contents

OmniPart: Part-Aware 3D Generation with Semantic Decoupling and Structural Cohesion


作者Yunhan Yang, Yufan Zhou, Yuan-Chen Guo, Zi-Xin Zou, Yukun Huang, Ying-Tian Liu, Hao Xu, Ding Liang, Yan-Pei Cao, Xihui Liu
机构The University of Hong Kong, Harbin Institute of Technology, VAST, Zhejiang University
arXivhttps://arxiv.org/abs/2507.06165
项目页面https://omnipart.github.io/

现在大部分 3D 生成模型只能生成一个整体模型,零件粘在一起拆不开;OmniPart 先生成每个零件的位置框,再分别生成每个零件的样子,最后把零件拼成一个完整物体,这样零件既能单独编辑,拼起来又不会有缝。

OmniPart teaser
OmniPart 输入一张图片和 mask,先规划出零件的 3D 位置,再生成每个零件的具体模型,最后拼成完整物体。

研究动机

核心方法

1. 整体流程:先画框,再填内容

OmniPart 分两个阶段。第一阶段叫结构规划:输入一张图片(可以配合 2D mask),模型用自回归的方式,一个一个地输出每个零件的 3D 边界框(标出这个零件大概占据哪块空间)。第二阶段叫零件合成:把这些边界框喂给一个改造过的 3D 生成模型,让它在每个框里生成对应零件的具体几何和纹理,所有零件一起生成,保证拼起来是整齐的。

OmniPart overview
OmniPart 整体流程。第一步用自回归模型预测零件的边界框,第二步在这些框的基础上微调一个 3D 生成模型,把每个零件具体生成出来。

2. 基础:TRELLIS 的体素表示

OmniPart 是在已有模型 TRELLIS 的基础上改的。TRELLIS 把一个 3D 物体切成很多小方块(体素),只记录物体表面经过的那些方块的位置,每个方块再配一个向量记录这里的形状和颜色细节。OmniPart 第一阶段生成的边界框,就是用来告诉 TRELLIS 的体素"这块属于哪个零件"。

3. 边界框序列化:自回归生成

每个边界框就是 6 个数字:最小角的 x、y、z 和最大角的 x、y、z。OmniPart 把这 6 个数字按顺序排成一串,多个边界框按它们在空间里从下到上、从前到后的顺序排好,拼成一条长序列。这样"生成一组零件的位置"就变成了和写句子一样的"一个词一个词往后猜"的任务,用的是常见的自回归 Transformer(OPT 结构)。

4. 用 2D mask 告诉模型该拆成几块

同一个物体该拆成几个零件,往往没有标准答案。OmniPart 让用户(或者 SAM 等分割模型)画一张 2D mask,每种颜色代表一个零件,喂给模型当作提示。图片先过 DINOv2 提取特征,mask 上每个像素对应一个"零件编号",查一个小表得到这个编号的向量,加到对应位置的图片特征上。这里不要求 mask 和最终的 3D 框一一对应——mask 只是个"建议怎么拆"的提示。

5. Part Coverage Loss:别让框画小了

如果只用普通的"猜下一个数字"的损失来训练,模型会倾向于把边界框画得偏小。OmniPart 加了一个 Part Coverage Loss:如果预测的框比真实框小,就罚;如果预测的框比真实框大,不罚。这样逼着模型宁可把框画大一点,也要保证把整个零件都包进去。

6. 零件一起生成:Part Position Embedding

确定了每个零件大概的位置框后,OmniPart 微调 TRELLIS 的第二阶段模型,让它同时给整个物体和每个零件的体素去噪。为了让模型在同一串 token 里分清楚哪些属于哪个零件,每个 token 会带一个编号,叫 Part Position Embedding(PPE):整体物体的 token 统一编号 0,第一个零件编号 1,第二个零件编号 2,以此类推。

Part synthesis stage
零件合成阶段示意图。整体和每个零件的体素一起送进 Transformer 去噪,token 上带位置编码和 PPE 编号,模型还会给每个体素打一个"有效性"分数,用来丢掉不该要的体素(图里带条纹的方块)。

7. Voxel Discarding:把不属于这个零件的方块扔掉

因为边界框是个粗略的长方体,相邻两个零件的框难免会重叠,框里混进了一些其实属于隔壁零件的体素。OmniPart 给每个体素多算一个"有效性"数值:训练时,真正属于这个零件的体素目标值设成正数(+α),混进来的目标值设成负数(-α)。生成的时候,把这个数值过一下 sigmoid 函数变成 0 到 1 之间的分数,分数超过 0.5 才保留,否则就丢掉。

8. 训练数据:18 万个粗标注,挑出 1.5 万个好的

作者收集了 18 万个带零件标签的 3D 物体,从里面挑出标注质量最好的 1.5 万个。边界框生成模型直接用全部 18 万个数据从零训练。零件合成模型是在 TRELLIS 已经训练好的基础上微调,只用了那 1.5 万个高质量数据。

Dataset part count distribution
训练数据里,不同物体的零件数量分布。大多数物体零件数在 5 个左右,最多到 50 个。

主要实验结果

Qualitative comparison
几种方法生成结果的对比图。OmniPart 生成的零件有纹理、形状准,拼起来也整齐;其他方法或者没纹理,或者零件形状破碎、边界不干净。
Applications
OmniPart 的几个应用:(a) 用 mask 控制怎么拆零件,(b) 调整 mask 精细度控制零件粒度,(c) 单独改某个零件的材质,(d) 几何处理时零件边界更干净。

局限与展望