导读:本期聚焦于苏锦程创作的《如何用视图增强与噪声注入提升3DGS模型的鲁棒性?》,敬请观看详情。三维高斯泼溅(3DGS)能从稀疏图像重建高质量新视角,但训练视角覆盖不足时常常出现过拟合,渲染结果在未观测角度出现椭圆伪影和颜色偏移。有两个低成本策略可以显著缓解这一问题:视图增强在训练图像和相机参数上做随机变换,模拟更丰富的拍摄角度与光照条件;噪声注入直接对高斯位置、旋转和颜色参数施加微小扰动,迫使优化过程找到更平坦的损失区域。视图增强强调数据多样性,噪声注入侧重模型参数正则化,两者结合能提升模型在测试视角下的PSNR和视觉效果。通过可运行代码展示相机位姿扰动、图像颜色抖动和参数噪声的实现方法,并讨论增强幅度与训练稳定性的平衡。

3D Gaussian Splatting(3DGS)利用一组三维高斯椭球表示场景,通过可微分光栅化实现实时新视角合成。虽然它在多视角输入下效果出色,但当训练视角比较稀疏或分布不均时,优化得到的高斯场容易记住训练图像的细节,在未见过的相机位姿下出现拉伸、噪点和颜色失真。数据增强是提升泛化能力的重要手段,但3DGS的增强不能像分类任务那样只对图像做随机裁剪和翻转,因为训练过程同时依赖图像像素、相机内参与外参,三者必须保持几何一致。

如何用视图增强与噪声注入提升3DGS模型的鲁棒性?

视图增强与噪声注入是两类互补的策略:前者扩充训练数据的多样性,后者提升模型参数本身的平滑性。视图增强通过随机扰动相机位姿、翻转图像、调整颜色来模拟更丰富的拍摄条件;噪声注入则直接在优化过程中给高斯参数加入微小随机扰动,防止参数过度适应训练视角。接下来从几何一致性、具体实现和组合调度三个层面展开。

一、为什么3DGS数据增强必须同时修改图像与相机参数

在神经辐射场(NeRF)和3DGS中,每条训练射线由相机光心和像素方向确定,像素方向又由内参和图像坐标计算。如果只翻转图像而不调整相机投影矩阵,图像上的特征位置会与场景几何发生冲突,网络会学到错误的深度或颜色对应关系。因此视图增强通常分为两类:仅改变图像外观的增强(颜色、亮度、对比度),以及需要同步调整位姿或内参的几何增强(随机旋转、平移、缩放、水平翻转)。

颜色抖动属于最安全的增强方式,它不改变像素与场景点的对应关系,只模拟不同曝光和白平衡。而位姿扰动直接改变相机光心位置,会使重投影误差变大,因此扰动幅度必须很小,通常在零点几个像素到几个像素的等效位移范围内。下面代码展示了如何为3DGS训练读取相机参数并生成扰动后的外参。

import torch

def perturb_pose(c2w, rot_std=0.001, trans_std=0.002):
    """
    c2w: [4, 4] world-to-camera 或 camera-to-world 矩阵
    给旋转部分加微小高斯噪声,给平移部分加微小高斯噪声
    """
    c2w_pert = c2w.clone()
    # 对旋转部分(3x3)添加噪声
    rot_noise = torch.randn(3, 3) * rot_std
    c2w_pert[:3, :3] = c2w_pert[:3, :3] + rot_noise
    # 对平移部分添加噪声
    trans_noise = torch.randn(3) * trans_std
    c2w_pert[:3, 3] = c2w_pert[:3, 3] + trans_noise
    return c2w_pert

注意旋转矩阵加上随机噪声后不再是严格的正交矩阵,工程实现中通常使用李代数扰动,即给旋转向量或四元数加噪声再转换回旋转矩阵,或者使用SE(3)上的指数映射。上述简单版本适用于轻度扰动实验,如果幅度较大需要改用旋转向量参数化,避免旋转矩阵退化导致数值不稳定。

二、视图增强的具体实现:从图像空间到相机空间

视图增强中,随机水平翻转是常用技巧,但必须同时翻转图像和对应的相机内参。由于3DGS使用像素坐标反投影,翻转图像等价于水平镜像场景,相机内参的主点横坐标需要从cx变为width-cx。如果训练集中相机朝向大体一致,这种翻转可以显著增加视角多样性;但如果场景本身左右不对称,翻转后模型可能学到镜像版本,需要根据场景决定是否使用。

图像缩放和随机裁剪同样要调整内参。例如将图像缩小到原来的0.8倍并从左上角裁剪时,焦距fx和fy也要乘以0.8,主点坐标减去裁剪偏移。更简单的方式是直接在原图上做随机裁剪后统一resize到固定尺寸,同时按比例更新内参。颜色增强则不需要修改任何几何参数,可以直接使用torchvision的ColorJitter或自定义逐通道增益。

import torchvision.transforms as T

# 图像颜色增强,不影响相机几何
color_jitter = T.ColorJitter(
    brightness=0.2,
    contrast=0.2,
    saturation=0.1,
    hue=0.05
)

def apply_color_aug(image):
    # image: [3, H, W] float tensor
    return color_jitter(image)

位姿扰动与颜色增强的组合可以生成更丰富的训练样本。实际训练时无需真正生成增强图像,而是在每次迭代时在线对当前采样的图像和相机参数应用变换,这样数据加载开销很小,增强空间却非常大。另外,对于一些真实世界GT位姿可能存在噪声的数据集,位姿扰动还能帮助模型容忍轻微的几何误差。

三、噪声注入:让高斯参数更鲁棒

噪声注入的思想来自正则化:通过在优化过程中向高斯参数添加随机噪声,可以防止模型过度依赖精确参数值,从而提升测试时的稳定性。3DGS场景由数百万个高斯组成,每个高斯包含位置xyz、旋转四元数、缩放向量、透明度以及球谐系数。对位置添加高斯噪声是最直接的方式,一般幅度与场景尺度相关,例如在标准化到[-1,1]的场景中,位置噪声标准差可以设为0.001到0.005。

除了位置,对颜色或球谐系数添加噪声可以模拟光照变化,对缩放和旋转加噪声则有助于避免出现极端拉长的椭圆。不过旋转和缩放参数与协方差矩阵的数学关系非线性,需要在噪声施加后保证缩放向量非负、四元数归一化。一个实用的做法是对位置和颜色使用加法高斯噪声,对缩放使用对数空间噪声,对旋转使用四元数扰动后重新归一化。

def add_gaussian_noise(params, noise_level):
    """
    params: dict 包含 xyz, features_dc, features_rest, scaling, rotation
    所有参数均为 torch.Tensor 或 nn.Parameter
    """
    with torch.no_grad():
        if "xyz" in params and noise_level.get("xyz", 0) > 0:
            std = noise_level["xyz"]
            params["xyz"].add_(torch.randn_like(params["xyz"]) * std)
        if "features_dc" in params and noise_level.get("dc", 0) > 0:
            std = noise_level["dc"]
            params["features_dc"].add_(torch.randn_like(params["features_dc"]) * std)
        if "scaling" in params and noise_level.get("scaling", 0) > 0:
            std = noise_level["scaling"]
            # 在缩放参数上直接加噪声,注意一般模型中无约束,可加后截断
            params["scaling"].add_(torch.randn_like(params["scaling"]) * std)
            params["scaling"].clamp_min_(-6.0)
    return params

噪声注入的时机很重要。可以在每次迭代前对高斯参数施加噪声,然后正常前向渲染并计算损失,但反向传播时噪声被视为不可导的操作,因此通常使用torch.no_grad()包裹噪声添加步骤,并将参数再次设置为可训练状态。也可以使用PyTorch的param.register_hook或自定义优化器来实现梯度层面的噪声正则化,但实践中最简单有效的方式还是直接在每次迭代开始时扰动参数。

四、组合策略、增强调度与实验建议

视图增强和噪声注入可以同时使用,但需要控制总体的增强强度。一种有效策略是训练早期使用较弱增强,让场景几何快速收敛;训练中期逐渐增大增强幅度,防止过拟合;训练后期再略微减小噪声以便渲染细节更锐利。这类似于学习率预热和退火,增强幅度也可以看作一个可调的超参数。

在代码层面,可以定义一个增强调度器,根据迭代步数返回当前噪声标准和颜色抖动强度。比如位置噪声标准差从0.0002线性增加到0.001,再在最后几千步降至0.0005。位姿扰动幅度也可以有类似的余弦退火曲线。下面是一个简单的分段调度示例。

def noise_schedule(step, total_steps):
    # 前 10% 步线性增加,中间保持,后 20% 步线性衰减
    warmup = int(total_steps * 0.1)
    decay_start = int(total_steps * 0.8)
    if step < warmup:
        return 0.0002 + (0.001 - 0.0002) * step / warmup
    elif step > decay_start:
        progress = (step - decay_start) / (total_steps - decay_start)
        return 0.001 * (1.0 - 0.5 * progress)
    else:
        return 0.001

评估增强效果时应固定一个测试视角集,对比PSNR、SSIM和LPIPS。由于噪声注入会在训练时引入随机性,最好使用多个随机种子重复实验,报告平均值和标准差。值得注意的是,视图增强对少视角输入(例如10到20张图像)提升明显,而噪声注入在视角分布不均或训练图像带有传感器噪声时收益更大。两者结合通常能带来1到2 dB的PSNR增益,但对已经非常密集的视角覆盖可能提升有限。

3DGS数据增强视图增强噪声注入修改时间:2026-08-28 18:59:46

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。