EMA-VFI, released checkpoints as safetensors
The four checkpoints released with EMA-VFI, converted from the original pickles to safetensors and nothing else. The weights are unchanged, tensor for tensor.
Upstream: https://github.com/MCG-NJU/EMA-VFI. This is a mirror, not a new model. All credit for the network and the training belongs to its authors.
Why this exists
The originals are distributed as bare state_dict pickles inside a Google Drive folder.
That is two problems for anyone building on them. A pickle executes arbitrary code when it is
loaded, and a Drive folder gives out per-file links that are not stable enough to script
against, so tools end up telling people to fetch a file by hand.
Safetensors cannot execute anything on load, and a Hub URL stays put.
The files
| File | Size | Parameters | Quality | Multiplier above 2 |
|---|---|---|---|---|
ours_t.safetensors |
250.5 MiB | 65.66M | best | yes |
ours.safetensors |
250.5 MiB | 65.66M | best | no |
ours_small_t.safetensors |
55.3 MiB | 14.49M | lower | yes |
ours_small.safetensors |
55.3 MiB | 14.49M | lower | no |
Take ours_t unless you have a reason not to. The _t pair was trained to land anywhere
between two frames, so it can do 3x, 4x and beyond. The other two only ever land halfway, which
limits them to a multiplier of 2. The small pair is a narrower network: quicker, and visibly
weaker on fast motion.
Provenance
Every file was downloaded from the authors' own Drive folder, 16jUa3HkQ85Z5lb5gce1yoaWkP-rdCd0o,
linked from the upstream README. No third-party mirror was used.
| Original | SHA-256 of the source pickle |
|---|---|
ours_t.pkl |
c09e82d193e303d7b91f1e36bf535886b820cb56105574355211d60a6b557a99 |
ours.pkl |
f9085bb32d8b2eaa70eb1df08cc25bc7e973c50a74d74fb593ebe0d5e100a11f |
ours_small_t.pkl |
ad845671f7250d408937718aca19eaf87aa1ca79215070f7641eea332b703233 |
ours_small.pkl |
ef0e455a7fe75c24d415bbcd83c29a9c0134ba853942bde0cd4dc4ed01e3f98f |
Each hash is repeated in its safetensors file's own metadata, under source_sha256, alongside
the architecture the weights belong to. conversion_report.json in this repo records the whole
run.
What was checked before publishing
- Loaded with
torch.load(weights_only=True), which refuses arbitrary pickle opcodes, so a payload would have raised rather than run. - Built the network at the matching size and required
load_state_dict(strict=True), which proves the tensors really are this architecture and that none is missing or spare. - Reloaded each converted file and required the same strict fit, then compared every tensor
against the original with
torch.equal. All exact.
What the conversion changed
Two things, both mechanical, and both what a loader had to do anyway:
- The
module.prefix is stripped. The originals were saved from aDataParallelwrapper, so every key carried it. attn_maskandHWare dropped. These are shifted-window buffers the backbone registers duringforwardfrom whatever padded size it is given, so a saved pair belongs to the resolution it was trained at and is wrong at any other. Upstream's own loader drops them too. 8 such keys in the full models, 4 in the small ones.
Everything else is byte-identical, float32 throughout.
Use it in ComfyUI
With WAS Node Suite and its EMA-VFI Frame Interpolation node, either way round.
Let it fetch. Set features.network: true in the pack's config.yaml, pick a checkpoint in
the node's menu and queue the graph. The file is downloaded once into ComfyUI/models/EMA-VFI
and kept. Nothing is fetched at startup, only on the run that needs it.
Or place it yourself. Download the file and put it here:
ComfyUI/models/EMA-VFI/ours_t.safetensors
Create the EMA-VFI directory if it is not there, and restart ComfyUI. The checkpoint list is
read when the node builds its schema, so a file added while ComfyUI is running does not appear
until it restarts.
Keep the filename as it is. The node picks the architecture from the name, so a renamed file will not be recognised.
Use it in plain torch
The network itself is not in this repo. Take it from upstream, or from
modules/vendor/ema_vfi in WAS Node Suite, then:
from safetensors.torch import load_file
state = load_file("ours_t.safetensors")
net.load_state_dict(state, strict=True) # no prefix to strip, no keys to drop
Licence
Apache-2.0, as released by the authors: "This project is released under the Apache 2.0 license."
The full text is in LICENSE beside these files.
Citation
@inproceedings{zhang2023extracting,
title={Extracting motion and appearance via inter-frame attention for efficient video frame interpolation},
author={Zhang, Guozhen and Zhu, Yuhan and Wang, Haonan and Chen, Youxin and Wu, Gangshan and Wang, Limin},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={5682--5692},
year={2023}
}