splats4D: 스트리밍 가능한 4D 가우시안 스플래팅 포맷
splats4D: 스트리밍 가능한 4D 가우시안 스플래팅 포맷
개요
splats4D는 동적 3D 씬의 고효율 압축 및 스트리밍을 위해 설계된 새로운 4D 가우시안 스플래팅 포맷입니다. 원시 데이터보다 16–58배, gzip보다 14–20배 작은 압축 비율을 달성하며, 인코딩 속도는 약 640 MB/s입니다. 이 포맷은 HTTP Range 요청을 이용한 객체 스토어(S3, GCS, R2 등) 전송에 특화되어 있어 서버‑사이드 로직이나 매니페스트 파일 없이 즉시 첫 화면 렌더링과 빠른 시킹이 가능합니다.
압축 구조
.splat4d 포맷은 정적 요소와 동적 요소를 분리하고 시간적 델타 인코딩 전략을 사용하여 파일 크기를 줄입니다.
정적·동적 분할
중복을 최소화하기 위해, 전체 클립에 걸쳐 사용자 정의 오류 한계 내에서 단일 양자화 값으로 만족하는 스플랫은 정적으로 분류됩니다. 이러한 정적 스플랫은 한 번만 저장되므로, 긴 시퀀스의 배경도 몇 메가바이트 수준으로 축소될 수 있습니다.
데드밴드 "Hold" 트랙
양자화 플리커를 방지하고 시간적 델타를 줄이기 위해 스플랫은 "hold" 메커니즘을 사용합니다. 저장된 값은 실제 값이 현재 저장된 값에 대한 사용자 정의 한계를 위반할 때만 변경됩니다. 이는 시간적 델타가 대부분 0이 되게 하며, 각 심볼이 방출되기 전 정확도에 대한 엄격한 보장을 유지합니다.
GOP 구조와 시킹
H.265에서 영감을 받아, 포맷은 폐쇄된 그룹 오브 피처스(GOP)를 사용합니다. 키프레임(절대 양자화 값)은 매 N 프레임마다 저장되고, 그 뒤에 정확한 정수 델타로 구성된 P‑프레임이 이어집니다. 각 GOP 청크는 독립적으로 디코딩되므로 시킹 시 이전 청크를 처리할 필요가 없습니다. 키 스트림은 각 청크 내 델타 스트림 앞에 배치되어, 클라이언트가 청크의 첫 ~10%만 가져와도 키프레임을 즉시 표시할 수 있습니다.
엔트로피 스택
최종 압축 파이프라인은 Morton 순서의 스플랫, 지그재그 코딩된 정수 델타, Blosc 스타일의 바이트‑플레인 셔플, 그리고 스트림별 zstd 압축을 활용합니다. 이 과정은 출력 크기를 심볼 스트림의 0차 엔트로피에 가깝게 만듭니다.
결정론적 오류 한계
PSNR이나 평균 오류에 의존하는 포맷과 달리, splats4D는 SZ/ZFP 스타일의 오류‑제한 양자화를 사용합니다. 이는 모든 프레임의 모든 스플랫 속성이 원본에 대해 결정론적이고 점별적인 한계 내에 있음을 보장합니다.
| Attribute | Bound | Default |
|---|---|---|
| Position | ± millimeters, Lⁿ per axis | ±2 mm |
| Color RGB | ± 8-bit levels per channel | ±4/255 |
| Opacity | ± 8-bit levels | ±4/255 |
| Rotation | ± quaternion component | Exact (±0) |
| Scale | ± relative %, per axis | ±2% |
스트리밍 및 객체 스토어 통합
이 포맷은 순수 HTTP Range 요청을 위해 설계되었습니다. 클라이언트는 소수의 타깃 fetch만으로 씬을 렌더링할 수 있습니다:
- Header: 매직 넘버와 바이트 오프셋을 포함한 헤더 JSON을 얻기 위해 처음 256 KB를 가져옵니다.
- Static Section: 첫 화면을 완전하게 렌더링하기 위해 정적 스플랫을 가져옵니다.
- GOP Chunks: 재생 중 또는 프리페치 시 해당 GOP 청크를 가져옵니다.
- Seeking: 청크 프리픽스 범위를 가져와 약 100–150 ms 내에 키프레임을 표시합니다.
성능 벤치마크
Dynamic 3D Gaussians와 Neu3D 등 다양한 파이프라인의 8개 시퀀스에서 splats4D는 일반 압축보다 일관되게 우수한 성능을 보였습니다. 예를 들어 2초 길이의 "flame" 씬은 427 MB(원시)에서 18.5 MB로 감소했으며, 압축 비율은 23.2×에 달합니다.
| Sequence | Frames × Splats | Raw Size | Gzip Size | splat4d Size |
|---|---|---|---|---|
| Birthday | 40 × 659k | 844 MB | 724 MB | 40.7 MB (20.7×) |
| Boxes | 40 × 351k | 450 MB | 423 MB | 27.2 MB (16.5×) |
| Flame | 40 Ó 334k | 427 MB | 367 MB | 18.5 MB (23.2×) |
| Juggle | 150 Ó 337k | 1616 MB | 1515 MB | 83.4 MB (19.4×) |
| Sear | 40 Ó 109k | 16.9× | 8.2 MB | |
| Softball | 40 Ó 336k | 430 MB | 404 MB | 25.9 MB (16.6×) |
| Tennis | 40 Ó 333k | 426 MB | 401 MB | 26.2 MB (16.3×) |
구현
이 프로젝트는 MIT 라이선스를 따르며, .splat 프레임 시계열을 단일 .splat4d 파일로 인코딩하는 Python 패키지(pip install splats4d)를 제공합니다. 뷰어는 antimatter15/splat 렌더러를 포팅한 것으로, WebGPU를 기본으로 WebGL2 폴백을 지원합니다.
SUMMARY:
splats4D 포맷은 원시 데이터보다 16‑58배, gzip보다 14‑20배 작은 스트리밍 가능한 4D 가우시안 스플래팅 압축 방식을 제공하며, 결정론적 오류 한계와 HTTP Range 기반 스트리밍을 특징으로 합니다.
TITLE:
splats4D: 스트리밍 가능한 4D 가우시안 스플래팅 포맷