Train Sequence
One gaussian splat per frame, warm-started so it doesn't flicker
- frameset
- perceptual_model
- sequence
- turnaround
This is where the pipeline finally produces the thing you came for. Everything upstream - validating a clip, inventing 32 camera angles, matting them, carving hulls - exists to give this node a frameset. It fits one 3D gaussian splat per frame of that frameset and writes a sequence you can play, render and export. A moving person becomes a moving cloud of gaussians, with no rig, no mesh, and no skinned skeleton underneath - which is why the representation is great for rendered output and useless as a game asset.
The reason it works at all is the warm start. The first frame trains from scratch. Every later frame starts from the previous frame's gaussians and refines them, which is what keeps a sequence from flickering: you're not solving an independent problem 121 times, you're tracking one solution through time. That single design choice is the difference between a splat sequence and a slideshow of inconsistent blobs.
What it does with your frameset
The trainer runs in the managed backend environment (tools/run_splat_training.py, driven from core/splatting/training/) and takes the frameset's frame IDs explicitly, so training exactly the range you exported. The perceptual model you connect is used as a loss during refinement - the reason silhouettes stay crisp rather than smearing into the background.
Two options change what gets optimised:
clean (on by default) prunes after every frame: gaussians that are near-invisible, needle-shaped, or floating outside the person's silhouette in most cameras get removed. Turn it off and you keep every artefact the optimiser produced, which is occasionally what you want when chasing a specific look.
motion (on by default) is the smarter one. Before each frame, it moves the previous frame's gaussians using the body pose the views were generated from - skeleton.npz in the frameset. A moving arm therefore starts where it actually is, instead of being faded out in one place and regrown in another. If your frameset has no skeleton.npz (an interrupted export, or a hand-assembled dataset), the node says so in the console and warm-starts in place.
Inputs and outputs
frameset from Export Frameset or Load Frameset, perceptual_model from Splat Perceptual Model Loader, quality (draft / standard / best), and name - the output folder under ComfyUI/output/, which is never overwritten: a repeat training run gets a numbered suffix, so my_shot_002 is not a bug.
quality is the one setting to think about. draft is "a couple of minutes, proves the dataset is right" in the author's words, and that's exactly how to use it - the guide tells you to start with an export range of 0–20 and draft training. standard is the normal choice. best doubles the per-frame refinement for final renders.
Optional: retrain forces a fresh folder even when a matching result already exists. Without it, identical inputs, settings, seed, model hashes and pack version reuse the finished sequence instantly - a signature file in the output folder is what makes that safe rather than accidental.
Out come sequence (into Sequence Player, Sequence Preview, Sequence Frame, Sequence Info or Load Sequence later) and turnaround - a 3-degree-per-frame orbit rendered while the subject moves, as an IMAGE batch. That second output is the honest showreel shot, and it's ready for Create Video.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/mickmumpitz/ComfyUI-SplatKit
python_embeded/python.exe -m pip install -r ComfyUI-SplatKit/requirements.txt
Restart, or ComfyUI Manager → "ComfyUI-SplatKit". Then the part that actually matters here: the trainer lives in the isolated backend, built once by running installer.bat from the pack's GitHub Releases page inside the custom node folder. Windows x64, NVIDIA, ComfyUI 0.34+. Finally, VGG-19 weights in models/splatkit/4danyone/, selected in Splat Perceptual Model Loader - training refuses to start without them, which is the good kind of refusal.
When it breaks
- "Connect Splat Perceptual Model Loader and select VGG-19 weights." Fires before the GPU does anything. The dropdown only lists
.safetensorsfiles with "vgg" in the filename from that folder. - "The 4D backend is missing, incomplete or needs an update." Re-run the installer. Trainer code changes apply straight from the checkout, but generator/dependency updates need a rebuild.
- A sequence that flickers despite
motionbeing on. Check forskeleton.npzin the frameset folder; without it, advection is silently skipped and the console says so. - Long runs and a busy GPU. The node unloads ComfyUI's models and empties the cache before handing over, because both processes share the card - but it can't unload other applications.
- Cost. Frames are cheap to add and expensive in aggregate. Export 0–20, train
draft, look at it in Sequence Player, and only then extend the range atstandard. Widening the export later only fills in the missing frames, so nothing you already paid for is wasted.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| frameset | SPLATKIT_FRAMESET | From Export Frameset or Load Frameset. | |
| perceptual_model | SPLATKIT_PERCEPTUAL_MODEL | From Splat Perceptual Model Loader. | |
| quality | COMBO | standard | draft: a couple of minutes, proves the dataset is right. standard: the normal choice. best: doubles the per-frame refinement for final renders. |
| name | STRING | my_shot | Output folder under ComfyUI/output/. Never overwritten: a repeat gets a numbered suffix. |
| retrainopt | BOOLEAN | false | Train into a new folder even when a matching result exists. |
| cleanopt | BOOLEAN | true | After every frame, remove gaussians that are near-invisible, needle-shaped, or floating outside the person's silhouette in most cameras. Off keeps everything the optimiser produced. |
| motionopt | BOOLEAN | true | Before every frame, move the previous frame's gaussians with the body pose the views were generated from (skeleton.npz in the frameset), so a moving arm starts where it is instead of being faded out and regrown. Off warm-starts in place. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| sequence | SPLATKIT_SEQUENCE | — |
| turnaround | IMAGE | — |