AutoPartGen
AutoPartGen:先看整体,再逐个生成部件
以图片输入为例:先生成物体的整体三维形状作为参照,再看着这个整体,一件一件地生成部件。每完成一件,就更新“已经生成了什么”,直到结束。
例如输入一张椅子图片,最后得到可以分别选中、编辑的椅座、靠背和椅腿 mesh。
1. 整个过程是怎样的?
下面是没有部件掩码时的常用流程:
图里的潜码,就是用一组数字压缩表示三维形状。模型生成潜码,再通过解码器把它变成 mesh。
所以,“先生成整体 mesh,再把整体作为条件”的理解基本正确。更准确地说,先得到整体潜码,后续直接使用它,不必先把整体解码成 mesh。
2. 每生成一个部件,模型都看什么?
| 条件 | 用椅子举例 | 作用 |
|---|---|---|
| 整体形状 | 整把椅子的形状和比例 | 告诉模型最终要做成什么样 |
| 已生成的历史 | 椅座和靠背已经做好 | 告诉模型目前有什么,避免重复,并让新部件与已有部件协调 |
| 原始图片 | 椅子的外观 | 提供视觉参照 |
| 可选的部件掩码 | 只标出图片中的一条椅腿 | 指定这一轮希望生成哪一块 |
整体条件在过程中保持固定,历史条件每一轮都会更新。
历史具体怎么更新?把已生成部件的表面采样点收集起来,重新编码成一个形状潜码。这样模型能看到“目前已经做好的整体”,历史长度也不会随着部件数不断增长。
3. “逐个生成”与“扩散”是什么关系?
它有两个循环:
- 外层循环生成部件:这轮做椅座,下轮做靠背。
- 内层循环反复去噪:为了做出当前部件,从一整组随机噪声开始,结合条件逐步调整,最后得到部件潜码,再解码成 mesh。
这就是“部件级自回归”:每生成一个完整部件,才进入下一轮。 后面的部件会参考前面已经生成的结果。
没有掩码时,可以把算法理解成:
整体参照 ← 根据图片生成整体潜码
已生成部件 ← 空列表
历史 ← 空
重复:
部件潜码 ← 根据整体参照、历史和图片,从噪声逐步生成
如果部件潜码表示“已经生成完了”:停止
部件 mesh ← 解码部件潜码
将部件加入已生成部件列表
历史 ← 收集所有已生成部件的表面点,重新编码
返回已生成部件
为什么要这么做? 如果每个部件各自独立生成,模型可能重复生成椅座,或生成与椅座位置不匹配的靠背。加上历史后,模型能根据已有结果调整下一件,改善部件之间的配合。
4. 用一把椅子走一遍
下面是一种可能的生成顺序,仅作教学示例:
- 先建立整体参照:根据图片得到整把椅子的三维潜码。
- 生成椅座:历史为空,模型先生成椅座 mesh,然后记入历史。
- 生成靠背:模型看到“目标是一把椅子,椅座已经有了”,生成与它协调的靠背。
- 生成椅腿组:历史更新为“椅座+靠背”,下一轮生成支撑它们的椅腿。
- 结束:模型输出代表空形状的结束信号
[EoT],返回这些独立部件。
部件都在同一个物体坐标系里,所以生成时就带着相应的位置与大小,可以直接放在一起。
这些部件是重新生成的。 例如椅座与靠背接触的面,在图片或整体外壳里可能看不到,模型也可以根据经验补出来。因此它不只是把整体 mesh 切成几块。
5. 另外几个关键点
为什么这种潜码适合表示部件?
它使用 3DShape2VecSet 表示形状。作者观察到,把两个部件的潜码拼接起来,通常能近似解码出二者的组合。这说明这种表示适合处理由多个部分组成的形状;实际生成时,历史还会重新编码以保持紧凑。
怎么知道要生成几个部件?
无掩码时,模型自己决定分法,并用结束信号停止。有掩码时,逐个处理用户给出的掩码,处理完列表就结束。掩码只指定图片区域,三维深度和隐藏表面仍需要模型推测。
这种能力怎么学出来?
训练使用本来就包含部件划分的三维资产。模型学习:给定整体、已有部件和图片,怎样生成下一个部件。所谓“自动发现部件”,是指使用时可以不再提供部件标注。
如果已经有整体 mesh 呢?
直接把它编码成整体参照,再走逐部件生成流程。整体参照是论文中有帮助的附加条件,这里讲的是使用它的常用流程。
最需要注意什么?
同一把椅子可以有不同分法,四条腿也可能被当成一组生成。自动模式不能精确指定拆分粒度;补出的隐藏结构也只是模型的合理猜测,不保证等于真实内部结构。
本文来自博客园,作者:S-X-Q,转载请注明原文链接:https://www.cnblogs.com/sxq-blog/p/22893735

浙公网安备 33010602011771号