splats4D: 一種可串流的 4D Gaussian Splatting 格式

splats4D: 一種可串流的 4D Gaussian Splatting 格式

概覽

splats4D 是一種新型的 4D Gaussian splatting 格式,專為動態 3D 場景的高效率壓縮與串流而設計。它實現了比原始數據小 16–58 倍、比 gzip 小 14–20 倍的壓縮率,編碼速度約為 640 MB/s。該格式專門為透過物件儲存(如 S3、GCS 或 R2)並使用 HTTP Range 請求進行傳輸而設計,允許即時的首視圖渲染與快速尋軌,且無需伺服器端邏輯或清單文件。

壓縮架構

.splat4d 格式透過分離靜態與動態元素並採用時間增量編碼(temporal delta-encoding)策略來縮小文件大小。

靜態與動態分離

為了極小化冗餘,如果單個量化值能在整個片段中滿足使用者定義的誤差界限,該格式就會將 splats 分類為靜態。這些靜態 splats 會被儲存一次,這意味著無論片段長度如何,大型序列的背景都可以縮減至幾 MB。

Deadband "Hold" 軌跡

為了防止量化閃爍並減少時間增量,splats 使用了一種 "hold" 機制。只有當實際值違反了與當前儲存值相比的使用者定義界限時,儲存的值才會改變。這確保了時間增量大多保持為零,並在每個發出的符號之前維持嚴格的準確度保證。

GOP 結構與尋軌

借鑒 H.265,該格式使用封閉的圖像組(GOPs)。關鍵幀(絕對量化值)每 N 幀儲存一次,隨後是包含精確整數增量的 P-frames。由於每個 GOP 區塊可以獨立解碼,因此尋軌不需要處理之前的區塊。在每個區塊內,關鍵流(key streams)被放置在增量流(delta streams)之前,允許客戶端僅抓取區塊的前 ~10% 即可立即顯示關鍵幀。

熵堆疊

最終的壓縮管線利用了 Morton-ordered splats、zigzag-coded integer deltas、Blosc-style byte-plane shuffle 以及針對每個串流的 zstd 壓縮。此過程使輸出大小接近於符號串流的 order-0 熵。

確定性誤差界限

與不同於依賴 PSNR 或平均誤差的格式,splats4D 使用 SZ/ZFP-style 誤差界限量化。這確保了每一幀中每個 splat 的每個屬性都在源數據的原始點對點界限內。

| 屬性 | 界限 | 預設值 | | :--- | :--- | :--- | :--- | | 位置 | ± 毫米,每軸 Lⁿ | | 顏色 RGB | ± 8-bit 等級,每通道 | | 不透明度 | ± 8-bit 等級 | | 旋轉 | ± 四元數分量 | | 縮放 | ± 相對 %,每軸 | | 誤差界限 | ±2 mm | | 誤差界限 | ±4/255 | | 誤差界限 | ±4/255 | | 誤差界限 | Exact (±0) | | 誤差界限 | ±2% |

(註:表格內容因原文 Markdown 表格結構與對齊齊整度略有差異,已依據原文內容進行翻譯)

| 屬性 | 界限 | 預設值 | | :--- | :--- | :--- | :--- | | 位置 | ± 毫米,每軸 Lⁿ | ±2 mm | | 顏色 RGB | ± 8-bit 等級,每通道 | ±4/255 | | 不透明度 | ± 8-bit 等級 | ±4/255 | | 旋轉 | ± 四元數分量 | Exact (±0) | | 縮放 | ± 相對 %,每軸 | ±2% |

串流與物件儲存整合

該格式專為純 HTTP Range 請求而設計。客戶端可以透過執行少量針對性的抓取來渲染場景:

  1. Header: 抓取前 256 KB 以獲取 magic number 與包含位元組偏移量的 header JSON。
  2. Static Section: 抓取靜態 splats 以渲染完整的首視圖。
  3. GOP Chunks: 在播放期間或預取時抓取對應的 GOP 區塊。
  4. Seeking: 抓取區塊前綴範圍以在約 100–150 ms 內顯示關鍵幀。

性能基準測試

在包括 Dynamic 3D Gaussians 與 Neu3D 的管線中,splats4D 在八個序列中一致地優於通用壓縮。在一個範例中,一個 2 秒的 "flame" 場景從 427 MB (原始數據) 縮減至 18.5 MB,縮減了 23.2 倍。

| 序列 | 幀數 × Splats | 原始大小 | Gzip 大小 | splat4d 大小 | | :--- | :--- | :--- | :--- | :--- | :--- | | Birthday | 40 × 659k | 844 MB | 724 MB | 40.7 MB (20.7×) | | Boxes | 40 × 351k | 450 MB | 423 MB | 27.2 MB (16.5×) | X | 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 | 4 | 426 MB | 401 MB | 26.2 MB (16.3×) |

(註:原文表格數據在 Sear 查閱時存在格式錯誤,原文已保留保留原始數據結構)

實作

該專案採用 MIT 授權,並提供 Python 套件 (pip install splats4d) 用於將 .splat 幀的時間序列編碼為單個 .splat4d 檔案。檢視器是 antimatter15/splat 渲染器的移植版,支援 WebGPU 並提供 WebGL2 作為備援方案。

Sources