System Development 3D-реконструкции через Gaussian Splatting
3D Gaussian Splatting (3DGS) — революционный метод 2023 года, который совмещает качество NeRF с возможностью рендеринга в реальном времени (100+ FPS). Сцена представляется набором миллионов 3D гауссиан с атрибутами: позиция, форма, прозрачность, цвет (сферические гармоники). Рендеринг — быстрая растеризация гауссиан, а не дорогостоящий ray marching NeRF.
Принцип работы
Инициализация: SfM облако точек (COLMAP) → каждая точка становится начальным 3D Gaussian. Optimization: градиентный спуск по позициям, формам и цветам гауссиан так чтобы они воспроизводили входные фотографии. Адаптивный densification: разделение маленьких гауссиан и удаление прозрачных — модель адаптирует количество гауссиан автоматически.
# gaussian-splatting (официальная реализация + nerfstudio)
from nerfstudio.configs.method_configs import method_configs
# 3DGS через nerfstudio
# ns-train splatfacto --data ./processed
# Параметры оптимизации
config = method_configs['splatfacto']
config.pipeline.model.num_downscales = 2 # прогрессивное обучение
config.pipeline.model.densify_grad_thresh = 0.0002
config.pipeline.model.densify_size_thresh = 0.01
config.max_num_iterations = 30000
gsplat: Python библиотека для 3DGS
import gsplat
import torch
class GaussianSplattingReconstruction:
def __init__(self):
self.means = None # [N, 3] позиции
self.quats = None # [N, 4] ориентации (quaternions)
self.scales = None # [N, 3] масштабы
self.opacities = None # [N, 1] прозрачность
self.colors = None # [N, 3] базовый цвет или SH коэффициенты
def render(self, camera_pose: torch.Tensor,
intrinsics: dict,
width: int, height: int) -> torch.Tensor:
"""Рендеринг сцены с заданной позиции камеры"""
renders, alphas, _ = gsplat.rasterization(
means=self.means,
quats=self.quats,
scales=self.scales,
opacities=torch.sigmoid(self.opacities),
colors=self.colors,
viewmats=camera_pose.unsqueeze(0),
Ks=build_K(intrinsics).unsqueeze(0),
width=width,
height=height,
near_plane=0.01,
far_plane=100.0,
render_mode='RGB'
)
return renders[0] # [H, W, 3]
Сравнение 3DGS vs NeRF
| Параметр | 3D Gaussian Splatting | NeRF (Instant-NGP) |
|---|---|---|
| Скорость рендеринга | 100–200+ FPS | 5–30 FPS |
| Качество (PSNR) | 27–32 dB | 26–31 dB |
| Время обучения | 30–60 мин | 15–30 мин |
| Размер модели | 500MB–2GB | 50–500MB |
| Редактирование сцены | Проще (гауссианы) | Сложнее |
| Прозрачные объекты | Хуже | Хуже |
4D Gaussian Splatting (динамические сцены)
Расширение для видео и движущихся объектов — добавление временного измерения:
# 4D-GS: каждая гауссиана имеет временную траекторию
# Применение: спортивные видео, медицинские симуляции, VFX
from fourDGaussians import FourDGaussianModel
model = FourDGaussianModel(
sh_degree=3,
deformation_type='MLP' # MLP аппроксимация деформации
)
# Training на видео-последовательности с известными позициями камер
Integration с 3D редакторами
Экспорт гауссиан в формат .ply (совместимый с SuperSplat, GSplat редакторами):
import numpy as np
from plyfile import PlyData, PlyElement
def export_gaussians_to_ply(means, colors, scales, output_path: str):
"""Экспорт 3DGS в Polycam/SuperSplat совместимый PLY"""
vertex_data = np.zeros(len(means), dtype=[
('x', 'f4'), ('y', 'f4'), ('z', 'f4'),
('red', 'u1'), ('green', 'u1'), ('blue', 'u1'),
('scale_0', 'f4'), ('scale_1', 'f4'), ('scale_2', 'f4'),
])
vertex_data['x'] = means[:, 0]
vertex_data['y'] = means[:, 1]
vertex_data['z'] = means[:, 2]
vertex_data['red'] = (colors[:, 0] * 255).astype(np.uint8)
vertex_data['green'] = (colors[:, 1] * 255).astype(np.uint8)
vertex_data['blue'] = (colors[:, 2] * 255).astype(np.uint8)
ply = PlyData([PlyElement.describe(vertex_data, 'vertex')], text=False)
ply.write(output_path)
Applications 3DGS
- E-commerce: фотореалистичный 360° просмотр товара в браузере в реальном времени (WebGL через three-gaussian-splats)
- Архитектурные туры: виртуальные экскурсии по объектам
- VFX и кино: быстрые 3D-активы из фотосессии
- Digital twin: документация промышленных объектов
| Задача | Срок |
|---|---|
| Pipeline для object capture | 3–4 недели |
| WebGL viewer + облачный сервис | 6–9 недель |
| 4D/динамические сцены | 10–16 недель |







