EMA-VFI Frame Interpolation
Invent frames between frames with motion, not crossfades
- images
- ema_vfi_model
- images
- frame_count
Frame interpolation is how you raise a sequence's frame rate without re-rendering it: instead of crossfading one frame into the next (which smears anything that moves), a motion-based interpolator works out where things actually moved between the two frames and draws the in-between frame with that motion accounted for. That's what this node does, using the EMA-VFI network - a well-trodden video-interpolation architecture that WAS Suite v3 vendors and runs on torch, on ComfyUI's own device.
Reach for it when you generated a video at a low frame rate and want it smooth, when you want a convincing slow-mo by interpolating up before dropping the playback rate, or when you need to double a sequence before feeding a downstream stage. It's the same class of tool the community uses to push short model outputs up toward cinematic frame rates, and WAS ships it so you don't need a separate EMA-VFI pack to do it.
How it works
You feed it an ordered batch of frames - at least two, all the same size - plus an ema_vfi_model from EMA-VFI Model Loader (the loader is where the checkpoint is chosen), and a multiplier: 2 puts one new frame in every gap, 4 puts three. The maths is simple: a run of n frames at multiplier m comes back as (n - 1) * m + 1 frames, originals included.
Here's the checkpoint gotcha, and it's the one that will bite you: a multiplier above 2 needs one of the ours_t checkpoints. The plain ours weights were trained to land a new frame exactly halfway between two inputs; the _t variants were trained to land anywhere between them, which is what multiplying by 4 or 8 actually asks of the network. Pick ours and ask for 4 and you're going to get told no - either cap the multiplier at 2 or switch to an ours_t model in the loader.
The inputs and outputs that matter
images- the sequence in order, minimum two frames, all the same size.ema_vfi_model- from the loader. One loader can feed several interpolation nodes, because the loader builds the network once and keeps it for the life of the process.multiplier- 2 to 8. Above 2, see above.
Outputs: images, the longer sequence; and frame_count, how many frames came back counting the originals - handy for driving a Save Video node or checking the arithmetic before you hand the batch onward.
Installing it - the weights are the whole install
The pack itself is the usual WAS Node Suite v3 story: ComfyUI Manager → search WAS Node Suite v3, or clone into custom_nodes. The network architecture ships inside the pack, but the weights do not, and nothing downloads unless you let it. Two routes:
- Turn on auto-download - set
network: trueunderfeatures:in the pack'sconfig.yaml(written on first start at<ComfyUI user dir>/was-node-suite/config.yaml). The checkpoint is then fetched on the first run that needs it from the pack's own mirror of the EMA-VFI release weights. - Or place a checkpoint in
ComfyUI/models/EMA-VFI/yourself and restart so it appears in the loader's list. The four released files areours,ours_small, and their_tvariants - thesmallones are faster and less accurate, the_tones are the any-timestep models a high multiplier needs.
If a run stops with a message naming a missing checkpoint, that's not a broken install - that's the network toggle being off and the file not being where the pack looks. Fix one of those two things and it just runs.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The sequence to interpolate, in order. Needs at least two frames, all the same size. | |
| ema_vfi_model | EMA_VFI_MODEL | The interpolation network, from EMA-VFI Model Loader, which is where the checkpoint is chosen. One loader can feed several nodes so the network is built once. | |
| multiplier | INT | 22–8 | How many times the frame rate goes up. 2 puts one new frame in each gap, 4 puts three. Above 2 needs an 'ours_t' checkpoint. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | The longer sequence, originals included. A run of n frames at multiplier m answers (n - 1) * m + 1 frames. |
| frame_count | INT | How many frames came back, counting the originals. |