Nodes/Steerable Motion/Remove and Interpolate Frames πŸŽžοΈπŸ…’πŸ…œ
ComfyUI Node

Remove and Interpolate Frames πŸŽžοΈπŸ…’πŸ…œ

The frame surgery node that saves your Steerable Motion loop

By banodocoΒ·Created 3 years agoΒ·Updated 11 months agoΒ· 975
Remove and Interpolate Frames πŸŽžοΈπŸ…’πŸ…œ
  • images
  • image
β—„frames_to_drop[8, 16, 24]β–Ί

Every Steerable Motion run ends the same way: 90% of the frames are beautiful, and then there's that one. A melted face, a double-exposure, a frame where the IP-Adapter weight schedule flipped and the model had no idea what to draw. One bad frame in a loop is worse than twenty mediocre ones - your eye finds it every single pass. Remove and Interpolate Frames πŸŽžοΈπŸ…’πŸ…œ is the surgical fix: you tell it which frame indices are garbage, and it cuts them out and has Google's FILM model rebuild them from the neighbors.

What it actually does

It's a small node, and that's the point. It takes an IMAGE batch (a video is just a batch of frames in ComfyUI), removes the frames you list, and for each removed frame runs FILM frame interpolation on the two frames around it - frame N-1 and N+1, multiplier 2 - and splices the freshly-made middle frame back in. FILM is Google's old but very good optical-flow interpolation model, and it's exactly the right tool here: a human-made motion between two adjacent frames reads far more naturally than whatever the sampler would have drawn next.

You give it two inputs: images (the batch) and frames_to_drop (a string that must parse as a Python list, default [8, 16, 24]). It returns image, one IMAGE batch of the same length as what went in. Watch the default values - the pack's own workflows drop 8, 16 and 24, because that's where the keyframe handoffs in a Smooth n' Steady run tend to land wrong.

Where it lives in the workflow

In the AnimateDiff side of Steerable Motion (see steerable-motion_smooth-n-steady.json and creative_interpolation_example.json in the repo), this node sits after the sampler, between the raw generation and VHS_VideoCombine. Its sibling BatchCreativeInterpolation even hands it the frame list directly: the FRAMES_TO_DROP output of that node feeds straight into frames_to_drop here. The idea is that you run the travel once, spot the bad indices in the preview, and then re-run just the cleanup instead of regenerating the whole clip. It's also handy outside the pack entirely - any video batch with a glitched frame is fair game.

Install and the one model it needs

Install is the standard pack dance: ComfyUI Manager β†’ search "Steerable Motion", or cd ComfyUI/custom_nodes && git clone https://github.com/banodoco/steerable-motion, then restart. The pack's own requirements.txt is a single line (matplotlib), so you won't hit dependency hell from this repo - but it vendors Fannovel16's ComfyUI-Frame-Interpolation inside its own imports/ folder, and that's where FILM lives. That means you still need the film_net_fp32.pt model file. Grab it through Manager's model search or drop it in the Frame Interpolation models folder, or the node will throw a model-not-found error the first time it tries to fix a frame.

Gotchas that will bite

  • frames_to_drop must be a valid list literal. [8, 16, 24] works; 8, 16, 24 without brackets won't parse.
  • First and last frames are safe. The node refuses to touch index 0 or the final frame, since there's no neighbor on both sides. Don't try to "fix" a bad first frame with this - that's a re-generation job.
  • Don't ask it to drop adjacent frames. Each drop is rebuilt from the frames around it, so if you drop 16 and 17, the new 16 gets built from neighbors that include a frame you just replaced. Inspect first, then list.

One light aside: this node is why Steerable Motion runs can feel like darkroom work rather than push-button video. That's the deal with the whole pack - it's a paintbrush, not a printer. But when you find the one ruined frame in an otherwise perfect travel, this is the brush you'll thank for existing.

CategorySteerable-Motion

Inputs (2)

NameTypeDefaultDescription
imagesIMAGEβ€”
frames_to_dropSTRING[8, 16, 24]β€”

Outputs (1)

NameTypeDescription
imageIMAGEβ€”