💡

文章摘要

从传统点云处理到神经辐射场(NeRF),掌握 3D 视觉的完整技术栈和 2026 年最新进展

前置阅读收获

阅读本文后,你将收获:理解 3D 视觉 从传统几何方法到神经渲染的完整技术演进路线;掌握 点云处理(PointNet、PointNet++、体素化)的核心算法和实战技巧;深入理解 神经辐射场(NeRF) 的数学原理、架构设计和优化方法;了解 2026 年 3D 视觉最新进展(3D Gaussian Splatting、大规模数字孪生平台、端侧 NeRF 推理),以及这些技术在工业、医疗、游戏等领域的实际应用。

💡 建议前置阅读:如果你对计算机视觉基础还不熟悉,建议先阅读 cv-001「目标检测」cv-002「图像分割」。如果你已经了解 CNNTransformer,可以直接开始本文。

💡 一句话理解

3D 视觉的核心理解难点在于:从 2D 图像恢复 3D 结构本质上是一个欠定问题(无数种 3D 结构可以投影成同一张 2D 图像)。所有 3D 视觉方法都在引入额外的约束(多视角、深度传感器、先验知识)来解决这个欠定性。

⚠️ 常见踩坑

不要将 3D 视觉简单理解为「2D 视觉加一个深度维度」。3D 数据的表示方式(点云、网格、体素、隐式场)与 2D 图像有本质差异,需要完全不同的算法和处理管线。

13D 视觉概览:为什么我们需要第三维度?

3D 视觉是计算机视觉中最接近人类感知方式的子领域。人类通过双眼视差、运动视差、遮挡关系等线索感知三维世界,而 3D 视觉的研究目标就是让机器也能「看到」并理解三维结构。这一能力对于自动驾驶(理解道路和障碍物的空间关系)、机器人导航(在三维空间中规划路径)、医学影像(从 CT/MRI 重建器官结构)和增强现实(将虚拟物体精准叠加到真实场景)都至关重要。

3D 视觉的核心挑战在于表示(Representation):我们如何数学化地描述一个三维物体或场景?常见的 3D 表示方式有四种:(1)点云(Point Cloud)——三维空间中离散点的集合,每个点包含坐标 (x, y, z) 和可选的颜色/法线信息;(2)体素(Voxel)——三维空间的规则网格划分,类似于 2D 像素的 3D 版本;(3)网格(Mesh)——由顶点和三角面片组成的表面表示;(4)隐式场(Implicit Field)——用一个连续函数描述空间中每个点的属性(如占据概率、密度、SDF)。

2026 年的 3D 视觉格局正在经历从「显式表示」向「隐式表示」的范式转变。传统的点云和体素方法正在被 NeRF(神经辐射场)和 3D Gaussian Splatting 等神经渲染技术取代。这些新方法不仅重建质量更高,还能在端侧设备上实时渲染——这是传统方法无法企及的。

图表加载中…
3D 表示方式存储效率渲染速度编辑难度2026 年趋势

点云

中等

容易

⚠️ 逐渐被替代

体素

低(内存密集)

中等

容易

⚠️ 减少使用

网格

极快

容易

✅ 仍然主流

隐式场(NeRF/SDF)

极高

慢→快(Gaussian Splatting)

困难→中等

🔥 快速增长

3D Gaussian

实时

中等

🔥 2026 年热门

💡 一句话理解

选择 3D 表示方式的实用指南:如果只需要静态模型导出 → 用网格(OBJ/GLTF)。如果需要新视角渲染 → 用 NeRF 或 3D Gaussian Splatting。如果需要空间分析和碰撞检测 → 用点云或体素。

⚠️ 常见踩坑

体素表示的内存消耗随分辨率立方增长——128³ 体素约需要 8MB,但 512³ 就需要 512MB。对于高分辨率场景,体素方法的内存瓶颈往往比计算瓶颈更严重。

2点云处理:从 PointNet 到 Point Transformer

点云是 3D 视觉中最直接的表示方式——它就是三维空间中一堆点的集合。点云可以来自激光雷达(LiDAR)、结构光传感器、ToF 相机,或者通过多视角立体视觉(MVS)从 2D 图像重建。点云处理的核心问题是:如何对这些无序、不规则分布的 3D 点进行深度学习?

PointNet(2017)是第一个直接处理点云的深度神经网络。它的核心洞察是:点云是一个集合(Set),集合的性质是对排列不变(Permutation Invariant)——无论输入点的顺序如何,输出应该相同。PointNet 通过对每个点独立应用 MLP(多层感知器),然后用最大池化(Max Pooling)聚合全局特征来实现排列不变性。这个设计简洁而优雅,但它有一个关键缺陷:PointNet 无法捕获点与点之间的局部结构关系。

PointNet++(2017)解决了局部特征提取的问题。它通过层次化的点采样和分组,在多个尺度上提取局部特征——类似于 CNN 中的多尺度感受野。具体来说,PointNet++ 首先从点云中采样一组「中心点」,然后对每个中心点找出其邻域内的所有点,对这些局部点集应用 PointNet 提取局部特征。通过多层嵌套,PointNet++ 能够捕获从局部细节到全局结构的完整特征层次。

2026 年的点云处理前沿:Point Transformer(2021)和后续的 Point Transformer v3(2024)将 Transformer 架构引入点云处理,通过自注意力机制直接建模点与点之间的关系。这些方法在 ScanNet、S3DIS 等 3D 分割基准上大幅超越了 PointNet++。此外,2026 年的端侧点云处理也取得了突破——通过模型量化和注意力稀疏化,Point Transformer 的变体已经能在移动设备上实时运行。

图表加载中…
python
import torch
import torch.nn as nn
import torch.nn.functional as F

class PointNet(nn.Module):
    """PointNet:直接处理点云的基础网络"""
    def __init__(self, num_classes=40):
        super().__init__()
        self.conv1 = nn.Conv1d(3, 64, 1)
        self.conv2 = nn.Conv1d(64, 128, 1)
        self.conv3 = nn.Conv1d(128, 1024, 1)
        self.bn1 = nn.BatchNorm1d(64)
        self.bn2 = nn.BatchNorm1d(128)
        self.bn3 = nn.BatchNorm1d(1024)
        self.fc1 = nn.Linear(1024, 512)
        self.fc2 = nn.Linear(512, 256)
        self.fc3 = nn.Linear(256, num_classes)

    def forward(self, x):
        # x: (B, 3, N) - 批次, 坐标维度, 点数
        x = F.relu(self.bn1(self.conv1(x)))
        x = F.relu(self.bn2(self.conv2(x)))
        x = self.bn3(self.conv3(x))
        # 全局最大池化:(B, 1024, N) -> (B, 1024)
        x = torch.max(x, 2)[0]
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        return self.fc3(x)
python
class PointNetSetAbstraction(nn.Module):
    """PointNet++ 集合抽象层:采样+分组+PointNet"""
    def __init__(self, npoint, radius, nsample, in_channel, mlp):
        super().__init__()
        self.npoint = npoint
        self.radius = radius
        self.nsample = nsample
        self.mlp_convs = nn.ModuleList()
        self.mlp_bns = nn.ModuleList()
        last_channel = in_channel
        for out_channel in mlp:
            self.mlp_convs.append(nn.Conv2d(last_channel, out_channel, 1))
            self.mlp_bns.append(nn.BatchNorm2d(out_channel))
            last_channel = out_channel

    def forward(self, xyz, points):
        # 最远点采样 (FPS)
        new_xyz = fps(xyz, self.npoint)
        # 球查询:找到每个中心点半径内的邻居
        grouped_points = ball_query(
            new_xyz, xyz, self.radius, self.nsample
        )
        # 对每个局部点集应用 PointNet
        for i, conv in enumerate(self.mlp_convs):
            grouped_points = F.relu(
                self.mlp_bns[i](conv(grouped_points))
            )
        # 局部最大池化
        new_points = torch.max(grouped_points, 2)[0]
        return new_xyz, new_points
方法年份局部特征计算复杂度2026 年状态

PointNet

2017

❌ 无

教学用

PointNet++

2017

✅ 层次化

中等

基线方法

PointConv

2019

✅ 卷积

中高

较少使用

Point Transformer v3

2024

✅ 自注意力

SOTA

SparseConv3D

2023

✅ 稀疏卷积

中等

工业常用

💡 一句话理解

PointNet++ 的最远点采样(FPS)是点云处理中最常用的采样策略。与随机采样相比,FPS 能更好地保持点云的空间分布均匀性,从而提升局部特征提取的质量。

⚠️ 常见踩坑

Point Transformer 的自注意力计算复杂度是 O(N²),对于大规模点云(如 LiDAR 扫描的数十万点)来说计算开销巨大。实际应用中通常需要结合体素降采样或球查询来减少注意力计算的点数。

3NeRF 神经辐射场:从 2D 照片到 3D 世界

神经辐射场(NeRF,Neural Radiance Fields)是 2020 年最震撼计算机视觉社区的论文之一。它提出了一个看似不可思议的想法:用一个神经网络来表示整个 3D 场景。给定一组从不同视角拍摄的 2D 照片,NeRF 能够学习到一个连续的 3D 场景表示,然后从任意新视角渲染出照片级真实的图像。

NeRF 的核心思想非常优雅:对于 3D 空间中的任意一点 (x, y, z) 和观察方向 (θ, φ),神经网络 f_θ 输出该点的颜色 c = (r, g, b)体密度 σ。通过从相机射线出发,沿射线对密度进行体积渲染(Volume Rendering),就能得到该视角下的像素颜色。整个训练过程只需要输入图像和相机位姿,不需要任何 3D 标注数据。

NeRF 的数学本质是一个连续的场景函数:F(x, y, z, θ, φ) → (c, σ)。训练时,NeRF 通过可微体积渲染将 3D 预测映射到 2D 像素,然后用渲染图像与真实图像的像素级 L2 损失来优化网络参数。这种端到端的优化方式使得 NeRF 能够隐式地学习 3D 几何和外观,而不需要显式地重建网格或点云。

2026 年的 NeRF 生态已经发展出数十个变体:Instant-NGP(2022)通过多分辨率哈希编码将训练时间从数小时缩短到数秒;3D Gaussian Splatting(2023)将隐式 NeRF 转换为显式的 3D 高斯表示,实现了实时渲染;MobileNeRF(2026)将 NeRF 推理压缩到移动端,在手机上就能实现新视角渲染。NeRF 已经从学术研究变成了工业级技术——Google、NVIDIA、Meta 都在产品中集成了 NeRF 渲染能力。

图表加载中…
python
def volume_rendering(rays, nerf_model, N_samples=64):
    """沿射线体积渲染"""
    # rays: (B, 6) - 射线起点 (ox, oy, oz) 和方向 (dx, dy, dz)
    origins = rays[:, :3]  # (B, 3)
    directions = rays[:, 3:]  # (B, 3)
    directions = directions / torch.norm(directions, dim=-1, keepdim=True)
    
    # 沿射线均匀采样 N_samples 个点
    t_vals = torch.linspace(0., 1., steps=N_samples, device=rays.device)
    z_vals = origins[:, 2:3] + t_vals * 10.0  # 假设深度范围 10 米
    pts = origins.unsqueeze(1) + directions.unsqueeze(1) * z_vals.unsqueeze(2)
    
    # 查询 NeRF 网络
    pts_flat = pts.reshape(-1, 3)
    raw = nerf_model(pts_flat)  # (B*N_samples, 4) -> (rgb, sigma)
    rgbs, sigmas = raw[:, :3], raw[:, 3]
    
    # 体积渲染:alpha compositing
    dists = z_vals[:, 1:] - z_vals[:, :-1]
    dists = torch.cat([dists, torch.tensor([1e10])], dim=-1)
    alpha = 1.0 - torch.exp(-sigmas * dists)
    weights = alpha * torch.cumprod(
        torch.cat([torch.ones_like(alpha[:, :1]), 1.0 - alpha + 1e-10], dim=-1),
        dim=-1
    )[:, :-1]
    
    # 加权求和得到最终像素颜色
    rgb_map = torch.sum(weights.unsqueeze(-1) * rgbs.reshape(B, N_samples, 3), dim=1)
    depth_map = torch.sum(weights * z_vals, dim=-1)
    return rgb_map, depth_map
NeRF 变体训练时间渲染速度内存2026 年成熟度

原始 NeRF

数小时

极慢(秒/帧)

学术基准

Instant-NGP

数秒~数分钟

✅ 成熟

3D Gaussian Splatting

数分钟

实时(百 FPS)

🔥 主流

MobileNeRF

数分钟

移动端实时

🔥 2026 新趋势

CityNeRF(城市场景)

数小时

中等

极大

🟡 研究阶段

💡 一句话理解

学习 NeRF 时,建议先用 Instant-NGP 上手——它的训练速度比原始 NeRF 快 1000 倍,能让你在几分钟内看到结果,大大加速学习过程。原始 NeRF 的实现更适合理解数学原理。

⚠️ 常见踩坑

NeRF 的训练需要高质量的相机位姿估计。如果 COLMAP 的位姿估计不准确(如纹理缺失区域、重复结构),NeRF 的渲染质量会严重下降。在实际应用中,位姿估计的质量往往比 NeRF 本身的架构更重要。

43D Gaussian Splatting:实时渲染的革命

3D Gaussian Splatting(3DGS)是 2023 年提出、2026 年成为主流的 3D 场景表示和渲染方法。它解决了 NeRF 的核心痛点——渲染速度太慢。3DGS 将场景表示为大量 3D 高斯椭球的集合,每个高斯包含位置、协方差(形状)、颜色和不透明度信息。渲染时,将这些高斯「泼溅(Splat)」到 2D 屏幕上,通过高效的排序和混合操作实现照片级真实渲染。

3DGS 的核心优势在于显式表示 + 可微渲染的结合:与 NeRF 的隐式函数不同,3D 高斯是显式的 3D 实体,可以直接操作、编辑和导出;同时,整个渲染管线是可微的,可以用与 NeRF 相同的方式(渲染图像与真实图像的像素损失)进行优化。

3DGS 的渲染管线分为三步:(1)高斯投影——将 3D 高斯投影到 2D 屏幕空间,得到 2D 椭圆;(2)深度排序——按深度对高斯进行排序,确保正确的遮挡关系;(3)Alpha 混合——从前到后混合高斯的颜色和不透明度,得到最终像素。由于高斯数量通常在十万到百万级别,高效的排序和混合是关键——3DGS 使用了 CUDA 加速的并行排序算法,实现了 1080p 分辨率下 100+ FPS 的实时渲染。

2026 年的 3DGS 进展包括:(1)动态场景 3DGS——扩展到高斯位置和形状随时间变化的 4D 场景;(2)压缩 3DGS——将百万级高斯压缩到几 MB,便于网络传输和移动端部署;(3)3DGS + 语言模型——用文本提示编辑 3D 场景(如「把天空改成日落」)。这些进展使得 3DGS 从学术研究快速走向了商业应用——房地产虚拟看房、电商 3D 产品展示、游戏场景生成等场景都在采用 3DGS 技术。

图表加载中…
python
# 3D Gaussian Splatting 简化实现
import torch

class Gaussian3D:
    """3D 高斯:位置 + 协方差 + 颜色 + 不透明度"""
    def __init__(self, N):
        self.means = nn.Parameter(torch.randn(N, 3))  # 位置
        self.scales = nn.Parameter(torch.randn(N, 3))  # 对数尺度
        self.rotations = nn.Parameter(torch.randn(N, 4))  # 四元数
        self.colors = nn.Parameter(torch.randn(N, 3))  # SH 系数
        self.opacities = nn.Parameter(torch.randn(N, 1))  # 不透明度

    def render(self, camera):
        # 1. 将 3D 高斯投影到 2D
        means2D = project_to_screen(self.means, camera)
        cov2D = compute_2d_covariance(
            self.means, self.scales, self.rotations, camera
        )
        # 2. 深度排序
        depths = (self.means @ camera.view_dir)
        sorted_idx = torch.argsort(depths)
        # 3. Alpha 混合渲染
        image = alpha_blend(
            means2D[sorted_idx], cov2D[sorted_idx],
            self.colors[sorted_idx],
            self.opacities[sorted_idx],
            image_size=(1920, 1080)
        )
        return image
特性NeRF3D Gaussian Splatting传统网格

渲染速度

慢(秒/帧)

实时(100+ FPS)

极快

训练速度

数小时

数分钟

N/A

渲染质量

极高

极高

取决于建模质量

存储空间

小(网络权重)

中(高斯参数)

可编辑性

困难(隐式)

中等(显式高斯)

容易

动态场景

困难

✅ 支持(4D GS)

中等

移动端

需要优化

✅ 2026 年已支持

✅ 原生支持

💡 一句话理解

如果你的项目需要「照片级真实的 3D 场景渲染」,3DGS 是 2026 年的首选方案。它在质量和速度之间取得了最佳平衡,而且工具链(如 gsplat、diff-gaussian-rasterization)已经相当成熟。

⚠️ 常见踩坑

3DGS 的场景编辑(如删除某个物体、修改材质)仍然比传统网格困难。高斯之间高度重叠,删除一部分高斯可能导致渲染伪影。如果需要频繁编辑场景,建议结合网格和 3DGS 的混合方案。

5数字孪生:3D 视觉的工业级应用

数字孪生(Digital Twin)是 3D 视觉技术在工业领域最重要的应用场景。它的核心思想是:为物理世界中的实体(建筑、工厂、城市、人体器官)创建一个精确的 3D 数字副本,在这个副本上进行仿真、预测和优化,从而指导物理实体的运行和维护。

数字孪生的构建依赖完整的 3D 视觉管线:(1)数据采集——通过激光雷达、无人机航拍、全景相机等手段获取目标环境的 3D 数据;(2)3D 重建——将采集的数据转换为精确的 3D 模型(点云 → 网格/NeRF/3DGS);(3)语义标注——为 3D 模型的各个部分添加语义信息(如「这是承重墙」、「这是管道」);(4)实时同步——通过 IoT 传感器将物理实体的实时状态映射到数字孪生上。

2026 年的数字孪生行业格局:NVIDIA Omniverse 是最成熟的数字孪生平台之一,支持大规模 3D 场景的实时渲染和物理仿真。Google 将 NeRF 技术应用到 Google Maps 中,实现了街景级别的 3D 城市重建。在工业领域,Siemens 和 Dassault 都在其数字孪生产品线中集成了 3DGS 渲染引擎,大幅提升了可视化质量和交互性能。

数字孪生的技术挑战包括:(1)大规模场景的处理——城市级别的数字孪生需要处理 TB 级别的 3D 数据;(2)实时性要求——数字孪生需要与物理实体保持毫秒级的同步延迟;(3)多模态数据融合——将 3D 几何数据与 IoT 传感器数据、业务数据融合在同一个数字孪生模型中。

图表加载中…

💡 一句话理解

构建工业级数字孪生的实用建议:先用无人机+LiDAR 获取环境的粗 3D 模型,再用 NeRF/3DGS 在关键区域补充高精度细节。不需要对整个场景使用同一精度——核心设备用高精度,周围环境用低精度,可以大幅降低数据处理成本。

⚠️ 常见踩坑

数字孪生的最大风险是「模型漂移」——数字模型与物理实体之间的偏差随时间累积。如果不定期校准和更新,数字孪生的仿真结果将越来越不可靠。建议设置自动校准机制,利用 IoT 传感器的实时数据持续修正数字模型。

6深度学习在 3D 检测与分割中的应用

3D 目标检测和分割是自动驾驶和机器人领域的核心任务。与 2D 检测不同,3D 检测不仅需要识别「这是什么物体」,还需要精确估计物体在 3D 空间中的位置、大小和朝向。这为自动驾驶的路径规划和碰撞避免提供了必要的空间信息。

基于点云的 3D 检测方法主要有两条路线:(1)基于体素的方法——将点云转换为体素网格,然后使用 3D CNN(如 VoxelNet、SECOND)进行检测。这类方法的优势是可以直接利用成熟的 2D CNN 架构扩展到 3D,但体素化的精度损失和内存开销是主要瓶颈。(2)基于点的方法——直接处理原始点云(如 PointRCNN、3DSSD),避免了体素化的精度损失,但计算效率较低。

2026 年的 3D 检测前沿:基于 Transformer 的 3D 检测方法(如 BEVFormer、CenterPoint3D)正在成为主流。这些方法的核心思想是将多视角的 2D 图像特征融合到鸟瞰图(BEV,Bird's Eye View)表示中,然后在 BEV 空间中进行 3D 检测。BEV 表示的优势在于它将复杂的 3D 空间压缩为 2D 平面,大幅降低了计算复杂度,同时保留了关键的空间关系信息。

3D 实例分割的目标是为场景中的每个物体实例生成精确的 3D 掩码。这在机器人抓取(识别并分割可抓取的物体)和医学影像分析(分割器官和病变区域)中至关重要。2026 年的 3D 实例分割方法(如 Mask3D、SoftGroup)已经达到了接近实用的精度水平,在 ScanNet 等基准数据集上 mAP 超过了 70%。

图表加载中…
方法输入检测速度精度适用场景

VoxelNet

体素化点云

中等

激光雷达

PointRCNN

原始点云

高精度需求

BEVFormer

多视角图像

自动驾驶

CenterPoint3D

体素+点云

自动驾驶

Mask3D

点云+RGB

中等

室内场景理解

💡 一句话理解

自动驾驶场景下,BEV 方法是 2026 年的最佳选择。它将多相机图像融合到统一的鸟瞰图空间中,避免了激光雷达的高成本,同时提供了足够的 3D 检测精度。特斯拉的纯视觉方案就是 BEV 路线的代表。

⚠️ 常见踩坑

BEV 方法的精度高度准确的相机外参标定。如果相机位姿存在偏差(即使是几毫米),BEV 空间中的特征融合就会出现错位,导致检测精度显著下降。在实际部署前,务必进行精确的传感器标定。

72026 年 3D 视觉最新进展盘点

2026 年上半年,3D 视觉领域出现了多个突破性进展,这些进展正在重塑 3D 重建、渲染和理解的行业格局。

进展一:端侧 NeRF 推理成为现实。MobileNeRF 和 TinyNeRF 等轻量级 NeRF 变体已经能在智能手机上实时运行。通过知识蒸馏(从大型 NeRF 教师模型到小型学生模型)和神经架构搜索(自动寻找最优的小型 NeRF 结构),端侧 NeRF 的渲染质量已经接近桌面级模型。这意味着普通用户可以在手机上拍摄几张照片,然后实时从任意角度查看 3D 场景——这是增强现实和电商 3D 展示的关键能力。

进展二:4D Gaussian Splatting 成熟。动态场景的 3DGS 扩展(4DGS)在 2026 年达到了实用水平。通过为每个 3D 高斯添加时间维度的运动轨迹参数,4DGS 可以在几秒内重建并实时渲染动态场景(如人物行走、水流、火焰)。这对于 VR/AR 内容创作、体育转播和电影制作具有巨大的商业价值。

进展三:大语言模型 × 3D 视觉。多模态大模型(如 GPT-4V、Gemini)开始具备理解和生成 3D 内容的能力。用户可以通过自然语言描述生成 3D 模型(「创建一个带有花园的两层小楼」),或者用语言编辑已有的 3D 场景(「把屋顶改成红色瓦片」)。这种「语言驱动的 3D 编辑」正在成为 3D 内容创作的新范式。

进展四:大规模城市场景重建。基于卫星图像+街景+无人机数据的城市级 3D 重建在 2026 年取得了重大进展。NVIDIA、Google 和 Mapillary 都在推进各自的城市级 NeRF/3DGS 重建项目。这些项目不仅重建了建筑的 3D 几何结构,还融合了语义信息(建筑类型、道路等级、绿化覆盖),为城市规划、自动驾驶仿真和灾害应急响应提供了强大的数字基础设施。

图表加载中…

💡 一句话理解

如果你的团队在评估 3D 视觉技术路线,2026 年的最佳策略是:静态场景用 3DGS(速度快、质量好),动态场景用 4DGS,端侧部署用 MobileNeRF/TinyNeRF,大规模城市场景用卫星+街景融合重建。

⚠️ 常见踩坑

3D 视觉技术仍在快速演进中。今天的最优方案可能在下个季度就被新方法超越。在做长期技术选型时,优先选择工具链成熟、社区活跃的方案,而不是追求 SOTA 但生态薄弱的新技术。

8扩展阅读与进一步学习

官方教程和资源:NeRF 的官方代码库(nerf-pytorch、Instant-NGP)是最好的学习起点。Instant-NGP 的 CUDA 实现虽然复杂,但其 Python 版本的简化实现(tiny-cuda-nn 的 Python 绑定)足够用于理解核心原理。3D Gaussian Splatting 的官方代码库(gaussian-splatting)提供了完整的训练和渲染管线,包括 COLMAP 位姿估计的集成脚本。

数据集推荐:(1)ScanNet——室内场景的 3D 重建和语义分割基准,包含 1500+ 扫描;(2)KITTI——自动驾驶场景的激光雷达+图像数据集,3D 检测的标准基准;(3)Tanks and Temples——户外大场景的 3D 重建基准;(4)DTU——多视角立体视觉的标准数据集,适合评估 3D 重建质量。

相关知识点:如果你对计算机视觉的 2D 基础还不熟悉,推荐阅读 cv-004「卷积操作详解」cv-001「目标检测」。如果你想深入了解渲染技术,推荐阅读 cv-008「图像生成:StyleGAN, Diffusion」

2026 年趋势:3D 视觉正在从「重建」走向「理解和生成」的融合。过去的 3D 视觉主要关注「如何从 2D 图像重建 3D 结构」,而 2026 年的前沿问题是「如何让 AI 理解 3D 场景的语义内容,并用自然语言生成和编辑 3D 模型」。这个方向的突破将彻底改变 3D 内容创作、游戏开发、建筑设计和工业制造的效率。

图表加载中…

💡 一句话理解

3D 视觉的最佳学习顺序是:先掌握 2D CNNTransformer(这是所有 3D 方法的基础),然后学习 PointNet(理解点云处理),再学习 NeRF(理解神经渲染),最后实战 3DGS(掌握 2026 年的主流工具)。

⚠️ 常见踩坑

3D 视觉的学习需要较强的数学基础(线性代数、微积分、概率论)和编程能力(Python + CUDA)。如果你是初学者,建议先用现成的工具(如 Instant-NGP 的 GUI、3DGS 的 Colab notebook)建立直觉,再深入数学和代码细节。

9实战:从多视角照片到 3D 场景的完整流程

本节通过一个完整的实战案例,演示如何使用 3DGS 从一组多视角照片重建 3D 场景。这个流程涵盖了数据采集、位姿估计、模型训练、渲染和质量评估的完整管线,是理解 3D 视觉工程实践的最佳入门案例。

场景选择:我们选择一个室内场景(如一个办公室或房间)作为重建目标。选择室内场景的原因是:(1)视角容易控制——你可以在房间内自由移动并拍摄照片;(2)光线条件相对可控——室内光线比室外更稳定;(3)场景复杂度适中——既不会太简单(一个空房间),也不会太复杂(一个繁忙的街道)。

数据采集:围绕目标场景拍摄 50-200 张照片,确保从多个角度覆盖整个场景。关键原则是:相邻照片之间应有 60%-80% 的重叠区域——这是 COLMAP 位姿估计所需的最低重叠率。拍摄时尽量保持相机高度一致,避免剧烈的曝光变化(关闭自动曝光)。

位姿估计:使用 COLMAP 从照片集中估计每个相机的位姿(位置和朝向)。COLMAP 的工作流程分为两步:(1)特征提取——从每张照片中检测 SIFT 特征点;(2)特征匹配和位姿优化——通过匹配不同照片中的相同特征点,计算出每张照片的相机位姿。位姿估计的质量直接影响 NeRF/3DGS 的重建效果——如果位姿估计错误,重建的 3D 场景会出现鬼影、模糊或结构扭曲。

训练和渲染:位姿估计完成后,将照片和位姿数据输入 3DGS 的训练管线。3DGS 首先通过 SfM 点云初始化一组高斯,然后通过梯度下降优化每个高斯的参数(位置、形状、颜色、不透明度)。训练通常需要 10-30 分钟(取决于场景复杂度和 GPU 性能),训练完成后即可从任意新视角渲染照片级真实的图像。

质量评估:使用 PSNR(峰值信噪比)、SSIM(结构相似性)和 LPIPS(感知相似度)三个指标评估重建质量。对于室内场景,PSNR 达到 28 dB 以上、SSIM 达到 0.90 以上、LPIPS 低于 0.15 通常被认为是高质量重建。

图表加载中…
bash
# 3DGS 完整实战流程

# 步骤 1:使用 COLMAP 估计相机位姿
colmap feature_extractor --database_path database.db --image_path images/
colmap exhaustive_matcher --database_path database.db
mkdir sparse
colmap mapper --database_path database.db --image_path images/ --output_path sparse/

# 步骤 2:将 COLMAP 输出转换为 3DGS 所需格式
python convert.py --colmap_path sparse/0 --images_path images/ --output_path output/

# 步骤 3:训练 3DGS 模型
python train.py -s output/ --eval --iteration 30000

# 步骤 4:从新视角渲染
python render.py -s output/ --model_path output/30000/

# 步骤 5:评估质量
python metrics.py -m output/30000/
步骤工具时间关键参数

特征提取

COLMAP

1-5 分钟

SIFT 特征点数量

特征匹配

COLMAP

2-10 分钟

匹配阈值

位姿估计

COLMAP

1-5 分钟

最小重叠图像数

格式转换

convert.py

30 秒

输入/输出路径

3DGS 训练

train.py

10-30 分钟

迭代次数(默认 30000)

渲染

render.py

1-2 分钟

新视角位姿

质量评估

metrics.py

1 分钟

PSNR/SSIM/LPIPS

💡 一句话理解

新手常见的最大错误是拍摄照片时重叠区域不足。确保相邻照片之间有 60%-80% 的像素重叠——太少会导致 COLMAP 无法匹配特征点,太多则增加不必要的计算开销。一个实用的技巧是:每拍一张照片后,移动约 30 厘米再拍下一张。

⚠️ 常见踩坑

COLMAP 的位姿估计失败是 3DGS 训练失败的最常见原因。如果训练后的渲染结果出现严重的鬼影或模糊,首先检查 COLMAP 的位姿估计是否正确——可以在 COLMAP 的 GUI 中查看重建的稀疏点云和相机位置,确认是否与真实场景一致。