从单张参考图加一句描述直接生成可用的3D资产,已经不再是论文里的概念。过去文本生成3D容易得到轮廓模糊、纹理失真的结果,因为语言对几何拓扑的描述天然抽象;而单纯用图像生成3D,又很难改变物体的类别或局部特征。图文联合控制的价值在于把两种信号的优势叠加:图像负责提供确定的形状、材质和视角信息,文本负责引入语义约束和可编辑性。

多模态输入在3D生成中要跨过的三道坎
第一道坎是模态对齐。图像特征通常来自DINOv2、CLIP ViT或卷积网络,文本特征来自CLIP text encoder、T5等。两个特征空间的分布完全不同,直接把图像token和文本token拼接在一起,模型会偏向数值较大或维度较高的一侧,导致训练不稳定。更合理的做法是让两种特征分别经过一层可学习的投影层,映射到统一维度,再用LayerNorm稳定分布。这样后续的交叉注意力模块才能够在同一个空间里进行查询和匹配。
第二道坎是几何与外观不容易解耦。参考图像里包含光照、视角、背景等大量冗余信息,而3D生成真正需要的是与视角无关的几何结构。文本可以提示椅子是否对称、杯子有没有把手,但文本本身无法描述精确的倒角半径或曲面过渡。因此网络需要学会忽略图像中的光照污染,同时利用文本进行符号层面的约束。实际工程中会在图像编码器后面加随机裁剪、颜色扰动等增强手段,迫使模型不过度依赖某一个像素区域的表面外观。
第三道坎是多视角一致性。单张参考图只能看到一个面,背面和遮挡区域需要靠先验补全。多视图扩散模型在这个环节比较有效,它把参考图作为条件,在多个相机位姿下生成一致的外观,再由NeRF或高斯泼溅升维到3D。文本提示在这里的作用是补语义空洞,例如输入“背面有拉链的背包”,模型在补全背面时就有了明确方向,而不是简单地把正面纹理镜像过去。如果缺少文本约束,背面很容易出现拉伸、重复或者完全虚构的结构。
主流技术路线:扩散先验、交叉注意力与多阶段生成
扩散先验路线是目前效果最突出的一种。Zero-1-to-3把单张图像和相对相机旋转作为条件,在Stable Diffusion基础上微调,让模型学会从任意视角生成同一物体。ImageDream进一步把图像的不同层级特征注入UNet的各个block,使浅层纹理和深层语义都能参与生成,同时文本仍然通过cross-attention控制风格和内容。这种方式的优点是几何细节较好,单图条件也很直接;缺点是推理时需要多次2D生成再蒸馏到3D,时间成本偏高,而且容易出现多视图之间的细微不一致。
交叉注意力融合适合需要更高可控性的场景。下面给出一个可运行的条件编码示例,它把图像特征和文本特征映射到同一维度,再让文本作为查询去检索图像中的外观线索。文本特征负责提出“要找什么”,图像特征负责回答“在哪里、长什么样”,这样融合后的条件既保留语义约束,又不会丢失视觉细节。
import torch
import torch.nn as nn
class MultiModalConditionEncoder(nn.Module):
def __init__(self, img_dim=1024, text_dim=1024, cond_dim=768):
super().__init__()
self.img_proj = nn.Linear(img_dim, cond_dim)
self.text_proj = nn.Linear(text_dim, cond_dim)
self.cross_attn = nn.MultiheadAttention(embed_dim=cond_dim, num_heads=8, batch_first=True)
self.norm = nn.LayerNorm(cond_dim)
def forward(self, img_feat, text_feat):
# img_feat: [B, L_img, img_dim]
# text_feat: [B, L_text, text_dim]
img_tokens = self.img_proj(img_feat)
text_tokens = self.text_proj(text_feat)
attn_out, _ = self.cross_attn(query=text_tokens, key=img_tokens, value=img_tokens)
fused = self.norm(text_tokens + attn_out)
return fused
多阶段生成是另一种落地思路。先用图像到3D的基础模型如InstantMesh或SF3D生成粗略网格,再使用文本条件进行纹理重绘或局部变形。这种方案适合产品流水线,因为每个阶段可以单独评估、单独替换。比如初版网格不合格,可以先优化图像到几何阶段;纹理风格不对,可以只调整文本编辑模块。它的缺点也很明显:误差会在阶段之间累积,如果初期图像重建不够准确,后面的文本编辑很难修复大范围的几何错误,只能在已有几何上做微调。
损失函数设计与训练稳定性
在2D扩散条件生成中,直接优化噪声预测损失即可,但3D表示是点云、网格或神经场,不能直接套用2D损失。目前常用的SDS损失把当前3D模型的渲染图像加噪,交给扩散模型预测噪声,再把预测误差的梯度回传到3D参数。图像和文本条件同时参与扩散模型,因此可以自然地实现联合控制。SDS的优点是无需真实3D标签,缺点是梯度噪声较大,需要较大batch和较慢的学习率来稳定训练。
对比损失与一致性正则也经常被加入。CLIP score本来用于评价图文一致性,训练中也可以作为辅助损失,对渲染图和文本嵌入计算余弦相似度。此外,为了保持跨视角一致,可以对同一物体不同视角的渲染图计算LPIPS,并与参考图做局部特征匹配。这些正则项不是主损失,但能明显减少漂浮物和纹理闪烁。需要注意的是,正则权重不能太高,否则模型会倾向于生成与参考图完全相同但视角单一的结果,破坏3D的旋转稳定性。
动态权重和条件dropout是稳定训练的关键。图像条件过强会造成模型只记住参考图的某一个视角,其他视角严重崩坏。实践中可以在训练前20%步给图像条件更高权重,随后线性衰减;文本条件保持固定或略微提升。条件dropout是指以一定概率随机将文本或图像条件置零,防止模型对单模态产生依赖。经验上10%的dropout对泛化有帮助,但过高会降低参考图还原度。使用dropout时要注意,训练必须同时见过单模态和双模态输入,否则推理时突然缺少某个模态会导致条件编码分布偏移。
数据、评估与工程调优
数据准备往往比模型结构更影响最终效果。公开数据集如Objaverse-XL包含大量带文本描述的3D模型,但图像渲染质量参差不齐,很多模型的UV展开和材质并不干净。实际业务可以自己渲染多视角图,统一光照和相机内参,并为每个模型标注结构化文本,例如类别、材质、风格、局部特征。标注时不要只写一句笼统的描述,最好把形状、纹理、功能、局部差异都写进去,这样文本条件才能提供足够细的约束。多视角渲染的角度间隔不要太大,通常每30度到45度一张图,否则扩散模型难以学到连续视角变换。
评估指标需要同时覆盖图像质量和3D几何质量。FID和CLIP score是通用指标,但3D生成还需要关注几何精度,可以用Chamfer Distance和Normal Consistency。图文一致性主要看渲染图与文本的CLIP相似度;跨视角一致性可以用环视视频的时序稳定性来判断。人工评估在早期仍然不可替代,尤其对背面是否合理、细节是否符合描述这类主观指标。建议在项目初期建立一个小规模人工评分集,每次模型迭代都对比同一批提示词和参考图,避免只盯着自动指标优化。
显存和推理优化在3D生成项目中非常现实。3D神经场训练显存消耗大,常见做法是冻结图像和文本编码器,离线缓存条件特征,只训练3D解码器或融合模块。同时使用混合精度和梯度检查点可以进一步降低显存占用。推理阶段可以先低分辨率生成粗模型,再用高清纹理重绘。如果使用高斯泼溅表示,可以在迭代中每N步增加高斯球数量,在速度和细节之间取得平衡。对于需要批量生成的业务场景,把条件编码预先算好并缓存下来,能减少大量重复计算。