개요
Gaussian Splatting은 2023년에 소개된 혁신적인 3D 표현 기법으로, 고품질의 뷰 합성과 실시간 렌더링을 가능하게 합니다. 이 기술은 NeRF와 같은 기존 방법들보다 훨씬 빠른 렌더링 속도를 제공하면서도 뛰어난 시각적 품질을 유지합니다. 이 포스팅에서는 Gaussian Splatting의 원리와 SAM 3D Objects에서의 실제 활용 방법을 자세히 살펴보겠습니다.
관련 리소스:
- 원본 논문: 3D Gaussian Splatting for Real-Time Radiance Field Rendering
- SAM 3D Objects: GitHub Repository
- gsplat 라이브러리: gsplat GitHub
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: 스케일 행렬 (대각 행렬)
렌더링 프로세스
- 프로젝션 (Projection)
- 3D 가우시안을 카메라 뷰로 프로젝션
- 2D 가우시안으로 변환
- 알파 블렌딩 (Alpha Blending)
- 깊이 순서로 정렬된 가우시안들을 알파 블렌딩
- 전통적인 포인트 클라우드 렌더링과 유사하지만 더 부드러운 결과
- 색상 계산
- 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의 장단점
장점
- 실시간 렌더링
- 60+ FPS로 부드러운 뷰 합성
- 인터랙티브 애플리케이션에 적합
- 고품질 결과
- 부드러운 전환과 사실적인 색상
- 복잡한 빛 효과 캡처
- 효율적인 저장
- 상대적으로 작은 파일 크기
- 표준
.ply형식 지원
- 빠른 학습
- NeRF 대비 훨씬 빠른 학습 시간
단점
- 메모리 사용량
- 많은 가우시안이 필요할 경우 메모리 사용량이 증가
- 대규모 장면에서는 최적화 필요
- 뷰 의존성
- 학습 시 사용된 뷰와 유사한 각도에서 최고 품질
- 극단적인 각도에서는 품질 저하 가능
- 투명도 처리
- 완전히 투명한 객체 표현에 제한적
- 반투명 효과는 알파 블렌딩으로 처리
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을 생성할 수 있게 해줍니다.
주요 특징 요약
- 실시간 렌더링: 60+ FPS
- 고품질 결과: 부드러운 전환과 사실적인 색상
- 효율적인 저장: 상대적으로 작은 파일 크기
- 빠른 생성: 단일 이미지에서 수 초 내 생성
- 다양한 응용: 게임, AR/VR, 콘텐츠 생성 등
다음 단계
- SAM 3D Objects의 데모 노트북을 실행해보세요
- 자신의 이미지로 Gaussian Splatting을 생성해보세요
- 다양한 렌더링 옵션을 실험해보세요
참고 자료
- 원본 논문: 3D Gaussian Splatting for Real-Time Radiance Field Rendering
- SAM 3D Objects: GitHub | 웹사이트
- gsplat 라이브러리: GitHub
- 3D Gaussian Splatting 원본 구현: GitHub
'On Going > Point Cloud Data' 카테고리의 다른 글
| [IMU] What is an IMU(Inertial Measurement Unit)- 관성측정 장치? (0) | 2026.03.22 |
|---|---|
| [PCD] 3D segmentation - 3D LiDAR 기반 차선 검출 프로젝트: Cylinder3D로 직접 만들며 얻은 실전 노하우 (0) | 2025.11.18 |
| [pcd] LiDAR 데이터의 noise 제거 방법론 (0) | 2025.04.15 |
| [pcd] 도로 포인트클라우드를 평면으로 정렬하는 4가지 방법: 딥러닝 전처리를 위한 접근(4. PCA기반 평면정렬) (0) | 2025.04.14 |
| [pcd] 도로 포인트클라우드를 평면으로 정렬하는 4가지 방법: 딥러닝 전처리를 위한 접근(3. DTM기반 CSF) (0) | 2025.04.14 |
댓글