Ahmed Doghri Logo Image
Ahmed Doghri

splatgrade

A beautiful splat can still be structurally broken. splatgrade localizes giants, duplicates and floaters before rendering, and now reads the binary PLY that real splatting pipelines actually write.

splatgrade Gaussian point cloud inspection ring
splatgrade working browser demo

Rendered Quality Hides Scene Defects

A camera path can conceal giant primitives, duplicates, floaters, weak opacity, and unstable bounds until the scene reaches another renderer or another viewpoint.

splatgrade parses real PLY fields, resolves the common log-scale and opacity encodings, and reports robust scene statistics alongside localized findings.

The Demo

The 36-Gaussian fixture earns grade D and a score of 49: two giant primitives, three duplicate pairs, four low-opacity Gaussians, and two floaters, each pinned to an index.

The gate catches structural artifact risk. Perceptual quality still depends on view coverage, appearance, renderer settings, and someone actually looking at it.

A Corrupted Scene Slipped Through Clean

A quality gate fooled by the exact corruption it exists to catch is worse than no gate. The parser zipped each vertex row's values against the declared property list without checking the lengths matched. A row truncated mid-write, missing its trailing opacity, zipped short and filled the gap with a default of full opacity. The corrupted scene scored 100, grade A, with zero findings. Separately, a hand-edited header with a bare element line crashed the parser outright instead of being rejected.

Both are fixed: a row with fewer fields than its properties is rejected, and an uninterpretable header line produces a clear error rather than a silent default or a crash.

It Couldn't Open a Real Splat File

Auditing this page, I checked what the parser accepts: format ascii 1.0, and a clean error for everything else. Tidy, and useless. Inria's exporter, nerfstudio, and the viewers that read them all write binary_little_endian. The gate could not open a single scene produced by an actual splatting pipeline, which is a strange property for a tool meant to sit in front of one.

It reads binary little- and big-endian now, with the full PLY scalar type table instead of assuming every field is a float. The fixtures hold the same 36-Gaussian scene written both ways, with a realistic 3DGS property layout: normals, spherical-harmonic DC terms, opacity, log scales, and a rotation quaternion. Both encodings grade identically: D, score 49, the same two giant primitives.

Truncated binary bodies are rejected with the byte counts rather than quietly producing a short scene, and an unsupported property type is named in the error instead of guessed at. 12 tests pass across Python 3.10 through 3.13.

Research Basis

Current 3DGS quality research emphasizes view-dependent and structural distortions that conventional image metrics can miss. Read the 3D Gaussian Splatting quality assessment work.

Try It

No dependencies:

git clone https://github.com/ahmeddoghri/splatgrade && cd splatgrade
pip install -e .
splatgrade demo
splatgrade scan tests/fixtures/scene_binary.ply      # binary 3DGS layout
splatgrade scan your_scene.ply
splatgrade serve                                     # workbench on :8090

Tools Used

Python
3D Gaussian Splatting
PLY
Robust Statistics
Parser Hardening
Web Canvas
Docker