Temporal Smooth (flow blend)
The anti-flicker blender, without all the face stuff
- image
- IMAGE
Temporal Smooth is the one node in the Temporal Face Detailer pack that has nothing to do with faces. It's a standalone optical-flow temporal blend for any sequence of frames. Feed it any IMAGE batch - an upscaler output, an AnimateDiff pass, whatever is shimmering frame to frame - and it warps each frame toward its neighbors, blending so real motion survives but random sampling shimmer doesn't.
That shimmer is the classic video-fix problem: each frame is generated independently, so what should be a static patch of texture pulses and crawls instead. A naive temporal average fixes it by smearing everything into mush. This node instead computes dense optical flow between adjacent frames, warps the running result along the motion, and only blends where the flow is trustworthy.
How it works
The mechanism is the same flow-guided EMA that runs inside Tracked Face Detail - this is the standalone, reusable version of it. Farneback optical flow is estimated between adjacent frames, and a per-pixel confidence map is derived from how well the warped previous frame actually predicts the next one. That's the occlusion awareness: where something is moving (or appearing/disappearing), confidence drops, so the blend doesn't drag ghost trails across the motion. It's bidirectional by default - a forward pass and a backward pass, averaged - which is what removes shimmer in both directions along the timeline.
The flow_backend dropdown picks the estimator: farneback (default, light, CPU) or raft_small / raft_large (torchvision RAFT, much cleaner flow on fast motion at some VRAM/time cost). RAFT inputs are capped at 512 px, the weights load lazily and are freed after the run, and any failure - missing weights, OOM - automatically falls back to Farneback with a printed warning. It can never hard-fail your render.
Inputs and output
image- the frame batch to smooth.strength(0.5 default) - how much of the warped running result each frame absorbs. 0 is a passthrough; the node also returns its input unchanged for single frames orstrength <= 0.bidirectional(true default) - off it is, you get a one-way pass, which is cheaper and occasionally less ghost-prone.flow_backend- farneback / raft_small / raft_large.
One IMAGE out. Simple node.
Where to put it
It's already applied inside Tracked Face Detail on the face crops (that's the flow_strength widget), so you don't add this to the detailer. Use the standalone node for everything else: the README's canonical spot is between any upscaler or AnimateDiff output and Video Combine, or after the detailer for an extra full-frame pass - Tracked Face Detail image → Temporal Smooth image → Video Combine.
Where people get burned
Real motion gets soft. If your video has fast pans or action, Farneback flow starts losing track and the smoothing smears - switch to raft_small first, and only then dial strength down. The other trap is applying it at full strength to footage that barely moved: you can "lose" fine texture detail that was actually stable, because the EMA damps everything that isn't confirmed by the flow. For subtle cleanups, 0.3–0.5 is a saner range than the 0.5 default suggests.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| strength | FLOAT | 0.500–1 | — |
| bidirectional | BOOLEAN | true | — |
| flow_backend | COMBO | farneback | 3 options: farneback, raft_small, raft_large |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |