三维生成中的风格迁移,目标是把任意艺术风格的视觉特征——比如梵高的笔触、浮世绘的平涂色彩、或者水墨画的留白与飞白——施加到3D模型或场景之上。这事儿远比2D风格迁移麻烦,因为3D资产需要在任意视角下都保持一致,既不能出现某个角度风格突然消失,也不能为了风格化而破坏几何结构。换句话说,风格必须“长”在3D表示本身上,而不是简单地给渲染图像套个滤镜。接下来我们从神经辐射场、扩散模型和3D高斯泼溅这三种主流3D表示出发,看看风格控制到底是怎么实现的。

先明确一个基本问题:风格迁移在2D中通常使用预训练的VGG网络提取内容特征和风格特征,然后构造一个损失函数来迭代优化图像。对于3D,主流做法是把这种思想迁移到隐式表示或显式点云上。常见策略有两种:一是把风格损失作为正则项加入3D表示的优化过程;二是先在2D渲染图上做风格化,再通过多视图一致性约束反哺3D表示。下面分别讨论。
基于NeRF的风格迁移:让辐射场学会风格
神经辐射场(NeRF)将场景表示为一个连续函数,输入空间坐标和观察方向,输出颜色和密度。要对NeRF进行风格化,最直接的方式是在训练NeRF的同时加入风格损失。具体做法是:随机采样一批相机位姿,渲染出对应的2D图像,然后计算这些图像与风格参考图之间的风格损失,同时保持内容损失约束几何形状。风格损失通常使用VGG特征图的Gram矩阵差异,内容损失则比较内容图像和渲染图像在VGG中间层的特征距离。
这种做法有一个明显优势:风格损失直接作用于渲染图像,因此风格化的效果比较自然,不需要显式修改3D几何。但它也存在两个挑战:第一,训练过程中每个迭代都要渲染多张图,计算开销大;第二,如果只优化风格损失而不约束几何一致性,模型可能通过调整密度来“作弊”,比如产生模糊或半透明区域来匹配风格纹理,从而破坏3D结构的真实性。为了解决这些问题,研究者引入了几何正则项,例如表面法向平滑损失、深度图一致性损失,或者直接约束NeRF的密度场不要出现异常波动。
下面是一个简化版的NeRF风格化训练循环,展示了如何结合风格损失和内容损失:
# 伪代码:NeRF风格化训练片段
for epoch in range(num_epochs):
# 随机采样相机位姿
rays, target_imgs = sample_rays(batch_size)
# 渲染
rendered_imgs = render_nerf(model, rays)
# 内容损失(使用VGG特征)
content_loss = mse_loss(vgg_features(rendered_imgs), vgg_features(target_imgs))
# 风格损失(使用Gram矩阵)
style_loss = compute_style_loss(vgg_features(rendered_imgs), style_gram_matrices)
# 几何正则(可选)
normal_reg = compute_normal_regularization(model)
total_loss = content_loss + style_weight * style_loss + geom_weight * normal_reg
optimizer.zero_grad()
total_loss.backward()
optimizer.step()
实际实现中,风格权重需要仔细调节,过大容易导致几何退化,过小则风格不明显。另一个技巧是使用课程式训练:先训练普通NeRF收敛,再逐步增加风格损失的权重,这样能更好地保持几何稳定性。此外,还可以在渲染图像上使用感知损失(LPIPS)替代简单的MSE,以提升风格化质量。
基于NeRF的风格迁移最大的局限在于渲染速度慢、内存消耗大。如果目标场景很大或者需要实时预览,NeRF方案就显得力不从心。为此,后续工作转向了更轻量的表示。
基于3D Gaussian Splatting的风格迁移:实时性与风格化的平衡
3D Gaussian Splatting(3DGS)用一组3D高斯椭球来表示场景,每个高斯包含位置、协方差、不透明度和球谐系数等属性。通过光栅化渲染,3DGS可以达到实时帧率,同时保持较高的图像质量。这种显式表示非常有利于风格迁移,因为我们可以直接对高斯属性进行修改,或者把风格损失注入到优化过程中。
一种常见的做法是固定3DGS的几何参数(位置、协方差),只优化颜色和球谐系数来匹配风格。这样能避免几何被破坏,同时风格化的自由度也比较高。具体实现中,先训练一个标准3DGS模型,然后固定几何,用风格损失和内容损失联合微调颜色参数。渲染时使用可微光栅化器,因此梯度可以回传到颜色属性上。由于渲染速度快,训练效率比NeRF高得多。
下面给出一个利用PyTorch和diff-gaussian-rasterization库实现的风格迁移微调循环:
# 假设已经加载了预训练的3DGS模型,并且设置了style_gram和content_features
for it in range(max_iters):
# 随机采样相机
cam = sample_camera()
# 渲染RGB图像
rendered = render_gaussians(gaussians, cam)
# 计算VGG特征
feat_rendered = vgg(rendered)
feat_content = content_features # 预计算的内容特征
style_loss = gram_loss(feat_rendered, style_gram)
content_loss = mse_loss(feat_rendered[2], feat_content[2]) # 只取某一层
loss = style_weight * style_loss + content_weight * content_loss
loss.backward()
# 只更新颜色和球谐系数,冻结位置和协方差
optimizer.step() # 优化器中只包含颜色和SH参数
这种方法的优势很明显:实时渲染、内存占用小、训练速度快。缺点则是风格化的表达能力受限于高斯数量,如果风格包含非常复杂的纹理(比如点彩派),可能需要增加高斯数量或者采用多个尺度的高斯表示。另外,固定几何的做法可能无法处理那些需要形状配合的风格(例如立体主义),但大多数艺术风格迁移任务并不需要修改几何。
还有一种更激进的思路是直接在高斯的颜色上做文章,通过风格参考图生成一个颜色映射表,然后对每个高斯应用映射。这种做法速度极快,几乎可以做到零成本风格化,但效果通常比较粗糙,适合风格差异不大的场景。
基于扩散模型的3D风格迁移:从2D先验到3D一致性
扩散模型在2D图像生成上取得了巨大成功,自然也被引入到3D风格迁移中。一种典型的做法是使用SDS(Score Distillation Sampling)损失,利用预训练的2D扩散模型来引导3D表示的优化。比如,给定一个文本描述“梵高风格的椅子”,我们可以冻结一个2D扩散模型(如Stable Diffusion),然后优化NeRF或3DGS,使得渲染图像在扩散模型的视角下看起来像是符合该风格的图像。
SDS损失的核心思想是:对渲染图像加噪,然后用扩散模型预测噪声,将预测噪声与真实噪声的差值作为梯度信号驱动3D参数更新。这样做不需要成对数据,只需要一个预训练扩散模型和一个风格提示。风格提示可以是文本,也可以是风格参考图(通过图生图方式)。这种方法灵活性极高,几乎可以描述任意风格。
下面是一个使用SDS损失优化3DGS的代码示意:
# 使用SDS损失进行3D风格化(伪代码)
diffusion_model = load_stable_diffusion()
gaussians = init_gaussians()
for step in range(num_steps):
cam = sample_camera()
rendered = render(gaussians, cam)
# 对渲染图像加噪
t = random.randint(1, T)
noise = torch.randn_like(rendered)
noisy_img = add_noise(rendered, noise, t)
# 扩散模型预测噪声
pred_noise = diffusion_model(noisy_img, t, text_prompt="van Gogh style")
# SDS梯度
grad = (pred_noise - noise) * weight(t)
rendered.backward(grad) # 用此梯度反向传播到gaussians参数
optimizer.step()
扩散模型方案的优势在于风格多样性,只要有合适的文本描述或者参考图,几乎可以生成任何想要的艺术风格,而且不需要额外的风格损失设计。缺点是训练过程非常不稳定,容易产生过度饱和、颜色偏移或细节丢失的问题。另外,SDS损失本身容易导致渲染图像趋于平滑,丢失高频细节。为了缓解这些问题,研究者提出了变体如VSD(Variational Score Distillation),或者结合多视图扩散模型来加强3D一致性。
值得一提的是,扩散模型也可用于生成风格化的纹理贴图,然后映射到3D模型表面,这种方式更适合游戏资产生产流程,因为可以直接复用现有材质管线。
方案对比与选型建议
下面用一个表格总结三种方案的特点:
| 方案 | 风格保真度 | 几何稳定性 | 训练/推理速度 | 风格灵活性 |
|---|---|---|---|---|
| NeRF + 风格损失 | 较高 | 中等(需正则) | 慢 | 中(依赖参考图) |
| 3DGS + 风格损失 | 较高 | 高(几何冻结) | 快 | 中(依赖参考图) |
| 扩散模型 + SDS | 高 | 中低(易漂移) | 较慢 | 极高(文本/图驱动) |
对于需要实时渲染且风格固定的应用(例如VR展览中展示特定艺术风格),3DGS方案是性价比最高的选择。如果追求最高质量的风格化且不在乎渲染速度,NeRF配合精细调参也能得到不错的结果。而扩散模型方案最适合原型验证或需要快速尝试多种风格的情况,但需要做好结果后处理来稳定质量。
工程实现上,很多框架已经开始原生支持风格迁移功能。例如Nerfstudio和Gaussian Splatting的官方实现都提供了插件接口,可以方便地添加自定义损失。如果自己从头搭建,建议优先使用可微渲染库(如diff-gaussian-rasterization或tiny-cuda-nn),能大幅减少开发工作量。
最后提醒一点:风格迁移中的“风格”是一个主观概念,很难用单一指标衡量。在实际项目中,往往需要结合用户研究和A/B测试来调整风格权重、选择合适的VGG层以及决定是否加入正则项。多尝试几种组合,才能找到最适合自己应用场景的配置。