본문 바로가기
On Going/Point Cloud Data

[Gaussian Splatting] 3D 표현의 혁신과 SAM 3D Objects에서의 활용

by 에아오요이가야 2025. 11. 21.

개요

Gaussian Splatting은 2023년에 소개된 혁신적인 3D 표현 기법으로, 고품질의 뷰 합성과 실시간 렌더링을 가능하게 합니다. 이 기술은 NeRF와 같은 기존 방법들보다 훨씬 빠른 렌더링 속도를 제공하면서도 뛰어난 시각적 품질을 유지합니다. 이 포스팅에서는 Gaussian Splatting의 원리와 SAM 3D Objects에서의 실제 활용 방법을 자세히 살펴보겠습니다.

관련 리소스:


Gaussian Splatting이란?

기본 개념

Gaussian Splatting은 3D 공간을 3D 가우시안(Gaussian) 함수들의 집합으로 표현하는 방법입니다. 각 가우시안은 다음 속성을 가집니다:

  • 위치 (Position): 3D 공간에서의 중심 좌표 (x, y, z)
  • 회전 (Rotation): 쿼터니언(quaternion)으로 표현된 방향
  • 스케일 (Scale): 3D 공간에서의 크기 (σx, σy, σz)
  • 불투명도 (Opacity): 알파 값 α
  • 색상 (Color): Spherical Harmonics (SH) 계수로 표현된 뷰 의존적 색상

왜 Gaussian Splatting인가?

1. 실시간 렌더링

  • NeRF는 수백 개의 MLP forward pass가 필요하지만, Gaussian Splatting은 GPU 가속화된 래스터화를 사용하여 실시간 렌더링이 가능합니다.
  • 일반적으로 60+ FPS로 렌더링 가능합니다.

2. 고품질 뷰 합성

  • 부드러운 전환과 사실적인 색상 표현
  • 복잡한 빛과 그림자 효과 캡처

3. 효율적인 저장

  • 포인트 클라우드 형식으로 저장되어 파일 크기가 상대적으로 작습니다.
  • .ply 파일 형식으로 표준화되어 다양한 도구에서 사용 가능합니다.

4. 학습 속도

  • NeRF 대비 훨씬 빠른 학습 시간 (보통 수 분 ~ 수십 분)

기술적 원리

3D Gaussian의 수학적 표현

각 3D 가우시안은 다음과 같이 표현됩니다:

G(x) = exp(-0.5 * (x - μ)ᵀ Σ⁻¹ (x - μ))

여기서:

  • μ: 가우시안의 중심 위치 (3D 좌표)
  • Σ: 공분산 행렬 (covariance matrix)

공분산 행렬은 스케일과 회전으로부터 계산됩니다:

Σ = R * S * Sᵀ * Rᵀ

여기서:

  • R: 회전 행렬 (쿼터니언에서 변환)
  • S: 스케일 행렬 (대각 행렬)

렌더링 프로세스

  1. 프로젝션 (Projection)
    • 3D 가우시안을 카메라 뷰로 프로젝션
    • 2D 가우시안으로 변환
  2. 알파 블렌딩 (Alpha Blending)
    • 깊이 순서로 정렬된 가우시안들을 알파 블렌딩
    • 전통적인 포인트 클라우드 렌더링과 유사하지만 더 부드러운 결과
  3. 색상 계산
    • Spherical Harmonics를 사용하여 뷰 의존적 색상 계산
    • 카메라 방향에 따라 색상이 변화

Spherical Harmonics (SH)

Spherical Harmonics는 뷰 의존적 색상을 효율적으로 표현하는 방법입니다:

  • SH degree 0: 뷰 독립적 색상 (상수)
  • SH degree 1: 기본적인 뷰 의존성
  • SH degree 2+: 더 복잡한 빛 효과

SAM 3D Objects에서는 기본적으로 SH degree 0을 사용합니다 (뷰 독립적 색상).

SAM 3D Objects에서의 Gaussian Splatting

아키텍처 개요

SAM 3D Objects는 다음과 같은 파이프라인으로 Gaussian Splatting을 생성합니다:

이미지 + 마스크
    ↓
Sparse Structure 생성 (Stage 1)
    ↓
Structured Latent 생성 (Stage 2)
    ↓
Gaussian Splatting 디코딩
    ↓
Gaussian Splatting 모델 (.ply)

핵심 구성 요소

1. Gaussian 모델 클래스

SAM 3D Objects의 Gaussian 클래스는 다음과 같은 속성을 관리합니다:

class Gaussian:
    def __init__(
        self,
        aabb: list,              # 경계 박스
        sh_degree: int = 0,      # Spherical Harmonics degree
        mininum_kernel_size: float = 0.0,
        scaling_bias: float = 0.01,
        opacity_bias: float = 0.1,
        scaling_activation: str = "exp",
        device="cuda",
    ):
        # 속성 초기화
        self._xyz = None          # 위치
        self._features_dc = None  # 색상 (DC component)
        self._features_rest = None # 추가 SH 계수
        self._scaling = None      # 스케일
        self._rotation = None     # 회전 (quaternion)
        self._opacity = None      # 불투명도

2. Structured Latent Decoder

Structured Latent를 Gaussian Splatting으로 변환하는 디코더:

class SLatGaussianDecoder(SparseTransformerBase):
    def to_representation(self, x: sp.SparseTensor) -> List[Gaussian]:
        """
        Sparse Tensor를 Gaussian Splatting으로 변환

        Args:
            x: 네트워크 출력 [N x * x C] sparse tensor

        Returns:
            Gaussian 객체 리스트
        """
        # Voxel 좌표를 3D 위치로 변환
        xyz = (x.coords[x.layout[i]][:, 1:].float() + 0.5) / self.resolution

        # 각 속성 추출 및 설정
        # - 위치 (xyz)
        # - 색상 (features_dc)
        # - 스케일 (scaling)
        # - 회전 (rotation)
        # - 불투명도 (opacity)

        return [Gaussian(...)]

3. 렌더링 엔진

SAM 3D Objects는 두 가지 렌더링 백엔드를 지원합니다:

  • gsplat: 최신 gsplat 라이브러리 사용
  • inria: 원본 3D Gaussian Splatting 구현
def render(
    viewpoint_camera,
    pc: Gaussian,
    pipe,
    bg_color: torch.Tensor,
    backend="gsplat",  # 또는 "inria"
):
    if backend == "gsplat":
        # gsplat 라이브러리 사용
        render_colors, render_alphas, meta = rasterization(
            means=means3D,
            quats=rotations,
            scales=scales,
            opacities=opacity,
            colors=colors,
            sh_degree=sh_degree,
            viewmats=viewmats,
            Ks=intrinsics,
            width=width,
            height=height,
            backgrounds=bg_color,
        )
    elif backend == "inria":
        # 원본 구현 사용
        rasterizer = GaussianRasterizer(...)
        rendered_image, radii = rasterizer(...)

    return rendered_image

실제 사용 예시

기본 사용법

import sys
sys.path.append("notebook")
from inference import Inference, load_image, load_single_mask

# 모델 로드
config_path = "checkpoints/hf/pipeline.yaml"
inference = Inference(config_path, compile=False)

# 이미지와 마스크 로드
image = load_image("path/to/image.png")
mask = load_single_mask("path/to/masks", index=0)

# Gaussian Splatting 생성
output = inference(image, mask, seed=42)

# PLY 파일로 저장
output["gs"].save_ply("output.ply")
print("Gaussian Splatting saved to output.ply")

다중 객체 통합

from inference import Inference, load_image, load_masks, make_scene

inference = Inference("checkpoints/hf/pipeline.yaml")

# 여러 마스크 로드
masks = load_masks("path/to/masks")

# 각 객체에 대해 Gaussian Splatting 생성
outputs = [inference(image, mask, seed=42) for mask in masks]

# 장면으로 통합
scene_gs = make_scene(*outputs)

# 통합된 장면 저장
scene_gs.save_ply("scene.ply")

비디오 렌더링

from inference import render_video, ready_gaussian_for_video_rendering
import imageio

# Gaussian Splatting 로드
gs = output["gs"]

# 비디오 렌더링을 위한 준비
gs_ready = ready_gaussian_for_video_rendering(gs)

# 회전하는 비디오 생성
video = render_video(
    gs_ready,
    r=1.5,              # 카메라 거리
    fov=60,             # 시야각
    resolution=512,      # 해상도
    num_frames=300,      # 프레임 수
    pitch_deg=0,         # 피치 각도
    yaw_start_deg=-90    # 시작 요 각도
)["color"]

# GIF로 저장
imageio.mimsave("output.gif", video, format="GIF", duration=1000/30, loop=0)

인터랙티브 시각화

from inference import interactive_visualizer

# Gradio 기반 인터랙티브 뷰어 실행
interactive_visualizer("output.ply")

Gaussian Splatting의 장단점

장점

  1. 실시간 렌더링
    • 60+ FPS로 부드러운 뷰 합성
    • 인터랙티브 애플리케이션에 적합
  2. 고품질 결과
    • 부드러운 전환과 사실적인 색상
    • 복잡한 빛 효과 캡처
  3. 효율적인 저장
    • 상대적으로 작은 파일 크기
    • 표준 .ply 형식 지원
  4. 빠른 학습
    • NeRF 대비 훨씬 빠른 학습 시간

단점

  1. 메모리 사용량
    • 많은 가우시안이 필요할 경우 메모리 사용량이 증가
    • 대규모 장면에서는 최적화 필요
  2. 뷰 의존성
    • 학습 시 사용된 뷰와 유사한 각도에서 최고 품질
    • 극단적인 각도에서는 품질 저하 가능
  3. 투명도 처리
    • 완전히 투명한 객체 표현에 제한적
    • 반투명 효과는 알파 블렌딩으로 처리

SAM 3D Objects의 특별한 기능

1. 4배 해상도 Gaussian Splatting

SAM 3D Objects는 고해상도 버전도 제공합니다:

output = inference(image, mask, seed=42)

# 기본 해상도
output["gs"].save_ply("output.ply")

# 4배 해상도 (선택적)
if "gs_4" in output:
    output["gs_4"].save_ply("output_4x.ply")

2. 정렬 및 정규화

from inference import ready_gaussian_for_video_rendering

# 비디오 렌더링을 위한 정렬 및 정규화
gs_ready = ready_gaussian_for_video_rendering(
    gs,
    in_place=False,      # 원본 보존
    fix_alignment=True   # 정렬 수정
)

3. 포즈 정보 포함

Gaussian Splatting과 함께 객체의 포즈 정보도 제공됩니다:

output = inference(image, mask)

# 포즈 정보
rotation = output["rotation"]      # Quaternion [1, 4]
translation = output["translation"] # 위치 [1, 3]
scale = output["scale"]            # 크기 [1, 3]

# 이 정보를 사용하여 객체를 장면에 배치 가능

응용 분야

1. 3D 콘텐츠 생성

  • 단일 이미지에서 3D 모델 생성
  • 가상 현실/증강 현실 콘텐츠

2. 제품 시각화

  • E-commerce 제품 3D 모델
  • 인터랙티브 제품 뷰어

3. 게임 개발

  • 빠른 프로토타이핑
  • 배경 객체 생성

4. 영화/애니메이션

  • 빠른 3D 에셋 생성
  • 프리비주얼라이제이션

5. 건축/인테리어

  • 가구 및 장식품 3D 모델
  • 가상 인테리어 디자인

고급 기법

1. 가우시안 최적화

학습 과정에서 가우시안의 수와 위치가 최적화됩니다:

  • Split: 큰 가우시안을 작은 가우시안으로 분할
  • Clone: 중요한 영역에 가우시안 복제
  • Prune: 불필요한 가우시안 제거

2. 적응적 밀도 제어

SAM 3D Objects는 객체의 복잡도에 따라 가우시안 밀도를 자동 조절합니다:

# 복잡한 객체: 더 많은 가우시안
# 단순한 객체: 적은 가우시안

3. 다중 해상도 지원

# 다양한 해상도로 저장 가능
output["gs"].save_ply("low_res.ply")      # 기본 해상도
output["gs_4"].save_ply("high_res.ply")  # 4배 해상도

성능 비교

렌더링 속도

방법 렌더링 속도 품질
NeRF ~1 FPS ⭐⭐⭐⭐⭐
Instant-NGP ~10 FPS ⭐⭐⭐⭐
Gaussian Splatting 60+ FPS ⭐⭐⭐⭐⭐

파일 크기

일반적인 객체의 경우:

  • Mesh (GLB): ~5-50 MB
  • Gaussian Splatting (PLY): ~10-100 MB
  • NeRF (체크포인트): ~100-500 MB

학습 시간

  • NeRF: 수 시간
  • Instant-NGP: 수십 분
  • Gaussian Splatting: 수 분 ~ 수십 분

최적화 팁

1. 해상도 조절

# 낮은 해상도로 빠른 렌더링
video = render_video(
    gs,
    resolution=256,  # 기본 512
    ...
)

2. 프레임 수 조절

# 적은 프레임으로 빠른 생성
video = render_video(
    gs,
    num_frames=60,  # 기본 300
    ...
)

3. 백엔드 선택

# gsplat이 일반적으로 더 빠름
render(..., backend="gsplat")

학습 자료

논문

코드

튜토리얼

결론

Gaussian Splatting은 3D 표현 분야에서 혁신적인 기술로, 실시간 렌더링과 고품질 뷰 합성을 동시에 제공합니다. SAM 3D Objects는 이 기술을 활용하여 단일 이미지에서 고품질의 3D Gaussian Splatting을 생성할 수 있게 해줍니다.

주요 특징 요약

  1. 실시간 렌더링: 60+ FPS
  2. 고품질 결과: 부드러운 전환과 사실적인 색상
  3. 효율적인 저장: 상대적으로 작은 파일 크기
  4. 빠른 생성: 단일 이미지에서 수 초 내 생성
  5. 다양한 응용: 게임, AR/VR, 콘텐츠 생성 등

다음 단계

  • SAM 3D Objects의 데모 노트북을 실행해보세요
  • 자신의 이미지로 Gaussian Splatting을 생성해보세요
  • 다양한 렌더링 옵션을 실험해보세요

참고 자료

댓글