55 Commits

Author SHA1 Message Date
Ethanfel 2d96d5aa5d fix: catch all exceptions when importing cupy, not just ImportError
An installed-but-broken cupy (e.g. incompatible with NumPy 2.5, which
removed the 'bool8' alias) raises a TypeError during its own import, not
an ImportError. The narrow `except ImportError` guard let that propagate
and crashed the entire node import chain.

Broaden the guard to `except Exception` in all three CUDA-kernel modules
so any import-time failure disables cupy and falls back to the
pure-PyTorch implementations.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 19:51:28 +02:00
Ethanfel 0c62c6eef4 docs: add cupy-fallback implementation plan
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 10:27:52 +02:00
Ethanfel 83e4b5dd98 perf: add torch.compile to PyTorch fallback kernels
Wraps _pytorch_softsplat and _pytorch_costvol with torch.compile
for ~6x speedup on ROCm/non-cupy setups. Falls back to eager
execution gracefully if compilation fails.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 10:13:30 +02:00
Ethanfel 2e75e2d076 fix: handle None from cupy.cuda.get_cuda_path() in cuda_launch
cupy.cuda.get_cuda_path() can return None when CUDA_HOME is not set
and cupy can't auto-detect it. Fall back to /usr/local/cuda.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 02:20:20 +02:00
Ethanfel c08fe58fe7 feat: make cupy optional in install.py
cupy is now a best-effort install for NVIDIA users. Non-CUDA setups
(ROCm, CPU) skip cupy and use PyTorch fallback kernels instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 02:12:03 +02:00
Ethanfel 9e84890877 feat: remove cupy requirement gate from model loading
Models now fall back to pure-PyTorch implementations when cupy is unavailable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 02:11:30 +02:00
Ethanfel 2e98e453a4 Add pure-PyTorch fallback for BIM-VFI cost volume kernel
When cupy is unavailable, the costvol_func.forward() now falls back to a
pure-PyTorch implementation using unfold + dot product instead of raising
a RuntimeError. The CUDA/cupy kernel path is preserved unchanged for when
cupy is available. This allows BIM-VFI to run on systems without cupy
(including CPU-only setups), matching the pattern used for the softsplat
fallbacks in SGM-VFI and GIMM-VFI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 02:09:56 +02:00
Ethanfel daf0304243 Add pure-PyTorch fallback for GIMM-VFI softsplat forward warp
Make cupy import optional (try/except), replace @cupy.memoize with a
dict cache, add _pytorch_softsplat() using scatter_add for bilinear
splatting, and update forward() dispatch to fall back to PyTorch when
cupy is unavailable or tensor is on CPU.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 02:07:08 +02:00
Ethanfel 5ce7b0edcb fix: use dtype-preserving cast in SGM-VFI softsplat fallback
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 02:05:24 +02:00
Ethanfel 8d8407ec9d Add pure-PyTorch fallback for SGM-VFI softsplat forward warp
Make cupy import optional so the module loads without cupy installed.
Replace @cupy.memoize decorator with a simple dict cache to avoid
crash at import time. Add _pytorch_softsplat() using scatter_add_
as a fallback when cupy is unavailable or tensors are on CPU.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 01:59:23 +02:00
Ethanfel 91947c0b8c Use actual input frame count for all_on_gpu and chunk_size estimates
Replace hardcoded 199-frame assumption with 2*N-1 from the actual
images input, giving accurate VRAM/RAM estimates for any batch size.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:56:57 +01:00
Ethanfel c4b69321bb Reorder VFI Optimizer outputs: images first, settings second
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:54:00 +01:00
Ethanfel f1da0f7876 Add images passthrough output to VFI Optimizer
Avoids needing a dual link from the image source — the optimizer
passes images through so they can be connected directly to the
Interpolate node.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:53:28 +01:00
Ethanfel 27c5bcf362 Fix total_mem → total_memory attribute on CudaDeviceProperties
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:33:45 +01:00
Ethanfel d2e7db49c7 Bump version to 1.1.0
Publish to Comfy registry / Publish Custom Node to registry (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:16:11 +01:00
Ethanfel 9f66233b53 Add VFI Optimizer node for auto-tuning hardware settings
Benchmarks the user's GPU with the actual model and resolution via a
single calibration frame pair, then outputs optimal batch_size,
chunk_size, keep_device, all_on_gpu, and clear_cache_after_n_frames
as a connectable VFI_SETTINGS type. All 8 Interpolate/SegmentInterpolate
nodes accept the new optional settings input — existing workflows
without the optimizer work unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:15:48 +01:00
Ethanfel 7257c1aa4d Fix SVG license labels not rendering in GitHub README
Remove text-anchor="end" (likely stripped by GitHub's SVG sanitizer,
pushing text off-screen). Use left-aligned positioning instead, increase
font size and color brightness for visibility.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:44:47 +01:00
Ethanfel ebece55ed7 Add license labels to model comparison SVG
BIM-VFI shows "Research only" in amber, others show "Apache 2.0".

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:39:42 +01:00
Ethanfel a60fb2a25e Redesign README: add SVG model comparison, reorganize by priority
Move installation to top, add shields.io badges, create visual model
comparison chart, use collapsible sections for node reference, condense
acknowledgments into a table with citations in a collapsible block.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:37:50 +01:00
Ethanfel c178f756da Expand cupy install guide in README
Add step-by-step instructions, CUDA version table, troubleshooting
section, and note that EMA-VFI works without cupy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:25:36 +01:00
Ethanfel fb921ae620 Remove cupy auto-install from __init__.py
No more pip calls at import time. Users get a clear error with
install instructions from the Load node if cupy is missing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:24:06 +01:00
Ethanfel 4723dc329d Add cupy check to Load nodes with install instructions
BIM-VFI, SGM-VFI, and GIMM-VFI Load nodes now check for cupy at
load time and raise a clear error with the user's CUDA version and
the exact pip install command. Updated README with step-by-step
cupy install instructions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:15:44 +01:00
Ethanfel 8fe382e5ec Remove auto-install of all deps except cupy
Dependencies are now handled by pyproject.toml / requirements.txt
via ComfyUI Manager or pip. Only cupy is auto-installed at load time
since it requires matching the PyTorch CUDA version; failures produce
a warning instead of crashing. Also added timm to requirements.txt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:13:01 +01:00
Ethanfel 8311fd0261 Add ComfyUI registry publishing workflow and pyproject.toml
Publish to Comfy registry / Publish Custom Node to registry (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 23:28:21 +01:00
Ethanfel 396dafeefc Fix warp cache buildup when all_on_gpu is enabled
The all_on_gpu guard was preventing warp cache clearing and
torch.cuda.empty_cache() from ever running, causing unbounded
VRAM growth during long interpolation runs. Cache clearing now
runs on the clear_cache_after_n_frames interval regardless of
the all_on_gpu setting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:27:47 +01:00
Ethanfel 13a89c5831 Add console logging to all VFI interpolation nodes
Log mode/params, pass progress, chunk count, and output frame count
for BIM-VFI, EMA-VFI, SGM-VFI, and GIMM-VFI interpolation nodes.
Segment nodes also log their input frame range and target fps output range.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 21:14:11 +01:00
Ethanfel 2f1cc17f5c Add oversampled image output to all VFI Interpolate nodes
Second IMAGE output exposes the full power-of-2 oversampled frames
before target FPS selection. Identical to the first output when
target_fps=0. Document the new output in README.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 17:39:58 +01:00
Ethanfel b2d7d3b634 Update README: document target FPS mode, fix repo URL, update concat description
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 17:06:55 +01:00
Ethanfel adc4451716 wf update 2026-02-13 22:55:30 +01:00
Ethanfel 6dd579dcc7 Add target FPS mode to all VFI models and remove concat preview
Add source_fps/target_fps inputs to all 4 Interpolate and Segment nodes
(BIM, EMA, SGM, GIMM). When target_fps > 0, auto-computes optimal
power-of-2 oversample, runs existing recursive t=0.5 interpolation,
then selects frames at target timestamps. Handles downsampling (no
model calls), same-fps passthrough, and high ratios (e.g. 3→30fps).
Segment boundary logic uses global index computation for gap-free
stitching. When target_fps=0, existing multiplier behavior is preserved.

Remove video preview from TweenConcatVideos: drop preview input,
delete web/js/tween_preview.js, remove WEB_DIRECTORY from __init__.py.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 22:51:04 +01:00
Ethanfel e253cb244e Add GIMM-VFI to README: comparison table, nodes, acknowledgements, license
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:13:48 +01:00
Ethanfel d642255e70 Add GIMM-VFI support (NeurIPS 2024) with single-pass arbitrary-timestep interpolation
Integrates GIMM-VFI alongside existing BIM/EMA/SGM models. Key feature: generates
all intermediate frames in one forward pass (no recursive 2x passes needed for 4x/8x).

- Vendor gimm_vfi_arch/ from kijai/ComfyUI-GIMM-VFI with device fixes
- Two variants: RAFT-based (~80MB) and FlowFormer-based (~123MB)
- Auto-download checkpoints from HuggingFace (Kijai/GIMM-VFI_safetensors)
- Three new nodes: Load GIMM-VFI Model, GIMM-VFI Interpolate, GIMM-VFI Segment Interpolate
- single_pass toggle: True=arbitrary timestep (default), False=recursive like other models
- ds_factor parameter for high-res input downscaling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 13:11:45 +01:00
Ethanfel 3c3d4b2537 Fix typo in example workflow filename (lopp → loop)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:03:12 +01:00
Ethanfel e43a499ba0 Add example workflow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 00:02:47 +01:00
Ethanfel a67b5b62ae Add frontend JS for TweenConcatVideos video preview
The gifs ui dict requires custom JS to render — ComfyUI doesn't
handle it natively. Adds a minimal video preview widget that uses
ComfyUI's /view endpoint to play the concatenated video on the node.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:54:29 +01:00
Ethanfel 769da2586e Fix SGM-VFI auto-download: correct file extension .pth → .pkl
The Google Drive folder contains .pkl files but the default model
name used .pth, causing the post-download existence check to fail.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:45:13 +01:00
Ethanfel d935462e24 Support relative paths and robust preview in TweenConcatVideos
Relative output_directory values are now resolved against ComfyUI's
output directory. Video preview is skipped with a warning when the
output path is outside the output tree (frontend can't serve it).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:30:48 +01:00
Ethanfel aa85f523f2 Add optional video preview to TweenConcatVideos
Uses ComfyUI's ui/gifs return dict to show the concatenated video
directly on the node, matching the VHS Video Combine pattern.
Togglable via a preview boolean input (default True).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:16:01 +01:00
Ethanfel fc4efb8b17 Rename BIMVFIConcatVideos to TweenConcatVideos
The concat node is model-agnostic (just joins video segments via
ffmpeg), so it shouldn't be under BIM-VFI. Now accepts any model type
as the dependency input and lives under the video/Tween category.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:12:16 +01:00
Ethanfel e37cc3dd2e Rename project to ComfyUI-Tween
Update logger names, install prefixes, README clone instructions, and
error messages to reflect the new repo name. Model-specific node names
and categories (BIM-VFI, EMA-VFI, SGM-VFI) are unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:08:54 +01:00
Ethanfel 42ebdd8b96 Add SGM-VFI (CVPR 2024) frame interpolation support
SGM-VFI combines local flow estimation with sparse global matching
(GMFlow) to handle large motion and occlusion-heavy scenes. Adds 3 new
nodes: Load SGM-VFI Model, SGM-VFI Interpolate, SGM-VFI Segment
Interpolate. Architecture files vendored from MCG-NJU/SGM-VFI with
device-awareness fixes (no hardcoded .cuda()), relative imports, and
debug code removed. README updated with model comparison table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:02:48 +01:00
Ethanfel 1de086569c Add EMA-VFI (CVPR 2023) frame interpolation support
Integrate EMA-VFI alongside existing BIM-VFI with three new ComfyUI nodes:
Load EMA-VFI Model, EMA-VFI Interpolate, and EMA-VFI Segment Interpolate.

Architecture files vendored from MCG-NJU/EMA-VFI with device-awareness
fixes (removed hardcoded .cuda() calls), warp cache management, and
relative imports. InputPadder extended to support EMA-VFI's replicate
center-symmetric padding. Auto-installs timm dependency on first load.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 22:30:06 +01:00
Ethanfel 0133f61d47 Add delete_segments option to Concat Videos node
Cleans up individual segment files after successful concatenation,
preventing leftover files from polluting subsequent runs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:11:55 +01:00
Ethanfel 98c558b1b0 Add BIM-VFI Concat Videos node for joining segment outputs
Adds a new node that concatenates segment video files (produced by
VHS Video Combine) into a single video using ffmpeg's concat demuxer
with -c copy (no re-encoding). The model input acts as a sequencing
signal to ensure all segments finish before concatenation begins.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:06:52 +01:00
Ethanfel 7cf7162143 Add BIM-VFI Segment Interpolate node for bounded peak RAM
Processes numbered segments of the input batch so users can chain
multiple instances with Save nodes between them, freeing each segment's
output before the next starts. Model pass-through output forces
sequential execution via ComfyUI's dependency graph.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:13:02 +01:00
Ethanfel 7278688d08 Add cupy auto-install warning to README
First startup may appear to hang while cupy (~800MB) installs.
Document manual fallback for environments where auto-install fails.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:32:21 +01:00
Ethanfel 3e8148b7e2 Add chunk_size for long video support, fix cache clearing, add README
- chunk_size input splits input into overlapping segments processed
  independently then stitched, bounding memory for 1000+ frame videos
  while producing identical results to processing all at once
- Fix cache clearing logic: use counter instead of modulo so it triggers
  regardless of batch_size value
- Replace inefficient torch.cat gather with direct tensor slicing
- Add README with usage guide, VRAM recommendations, and full
  attribution to BiM-VFI (Seo, Oh, Kim — CVPR 2025, KAIST VIC Lab)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:08:42 +01:00
Ethanfel 993a3a72b1 Add batch processing support for faster frame interpolation
Processes multiple frame pairs simultaneously instead of one-by-one.
New batch_size input (1-64) lets users trade VRAM for speed.
Refactored pyr_level logic into shared _get_pyr_level() helper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:54:40 +01:00
Ethanfel 69a4aebfe7 Add auto_pyr_level toggle to select pyramid level by resolution
When enabled (default), automatically picks the optimal pyr_level
based on input height: <540p=3, 540p=5, 1080p=6, 4K=7.
When disabled, uses the manual pyr_level value.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:51:29 +01:00
Ethanfel 4e6f9eb896 Respect user's pyr_level setting at all resolutions
Previously the user's pyr_level was overridden for >=540p content.
Now the setting is always used, with the tooltip recommending values
per resolution instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:50:29 +01:00