5.2 KiB
5.2 KiB
Documentation
- Class name: STMFNet_VFI
- Category: ComfyUI-Frame-Interpolation/VFI
- Output node: False
- Repo Ref: https://github.com/Fannovel16/ComfyUI-Frame-Interpolation
STMFNet_VFI节点旨在执行视频帧插值,增强视频序列中帧之间过渡的平滑度。它通过生成原始素材中不存在的中间帧来实现这一点,从而增加帧率并提高整体视觉质量。
Input types
Required
- ckpt_name
- 检查点名称对于加载帧插值过程所需的预训练模型权重至关重要。它确保模型具有生成准确中间帧所需的必要参数。
- Comfy dtype: str
- Python dtype: str
- frames
- 输入帧是节点处理以创建插值帧的原始视频数据。这些帧的质量和分辨率直接影响插值的输出。
- Comfy dtype: torch.Tensor
- Python dtype: torch.Tensor
Optional
- clear_cache_after_n_frames
- 此参数确定系统在处理期间多久清除一次缓存,这有助于管理内存使用。对于长视频序列来说尤其重要,以防止内存过载。
- Comfy dtype: int
- Python dtype: int
- multiplier
- 乘数用于确定帧率将增加的倍数。然而,当前实现仅支持乘数为2。
- Comfy dtype: int
- Python dtype: int
- duplicate_first_last_frames
- 启用此选项时,它会在输出中复制第一帧和最后一帧,这可以为插值视频序列提供更平滑的开始和结束。
- Comfy dtype: bool
- Python dtype: bool
- optional_interpolation_states
- 此可选参数允许自定义插值状态,可以根据特定标准在插值过程中跳过某些帧。
- Comfy dtype: InterpolationStateList
- Python dtype: InterpolationStateList
Output types
- interpolated_frames
- STMFNet_VFI节点的输出是插值后的视频帧。这些帧是帧插值过程的结果,准备用于视频编辑或播放。
- Comfy dtype: IMAGE
- Python dtype: torch.Tensor
Usage tips
- Infra type: GPU
Source code
class STMFNet_VFI:
@classmethod
def INPUT_TYPES(s):
return {'required': {'ckpt_name': (['stmfnet.pth'],), 'frames': ('IMAGE',), 'clear_cache_after_n_frames': ('INT', {'default': 10, 'min': 1, 'max': 1000}), 'multiplier': ('INT', {'default': 2, 'min': 2, 'max': 2}), 'duplicate_first_last_frames': ('BOOLEAN', {'default': False})}, 'optional': {'optional_interpolation_states': ('INTERPOLATION_STATES',)}}
RETURN_TYPES = ('IMAGE',)
FUNCTION = 'vfi'
CATEGORY = 'ComfyUI-Frame-Interpolation/VFI'
def vfi(self, ckpt_name: typing.AnyStr, frames: torch.Tensor, clear_cache_after_n_frames=10, multiplier: typing.SupportsInt=2, duplicate_first_last_frames: bool=False, optional_interpolation_states: InterpolationStateList=None, **kwargs):
from .stmfnet_arch import STMFNet_Model
if multiplier != 2:
warnings.warn('Currently, ST-MFNet only supports 2x interpolation. The process will continue but please set multiplier=2 afterward')
assert_batch_size(frames, batch_size=4, vfi_name='ST-MFNet')
interpolation_states = optional_interpolation_states
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
model = STMFNet_Model()
model.load_state_dict(torch.load(model_path))
model = model.eval().to(device)
frames = preprocess_frames(frames)
number_of_frames_processed_since_last_cleared_cuda_cache = 0
output_frames = []
for frame_itr in range(len(frames) - 3):
if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr) and interpolation_states.is_frame_skipped(frame_itr + 1):
continue
(frame0, frame1, frame2, frame3) = (frames[frame_itr:frame_itr + 1].float(), frames[frame_itr + 1:frame_itr + 2].float(), frames[frame_itr + 2:frame_itr + 3].float(), frames[frame_itr + 3:frame_itr + 4].float())
new_frame = model(frame0.to(device), frame1.to(device), frame2.to(device), frame3.to(device)).detach().cpu()
number_of_frames_processed_since_last_cleared_cuda_cache += 2
if frame_itr == 0:
output_frames.append(frame0)
if duplicate_first_last_frames:
output_frames.append(frame0)
output_frames.append(frame1)
output_frames.append(new_frame)
output_frames.append(frame2)
if frame_itr == len(frames) - 4:
output_frames.append(frame3)
if duplicate_first_last_frames:
output_frames.append(frame3)
if number_of_frames_processed_since_last_cleared_cuda_cache >= clear_cache_after_n_frames:
print('Comfy-VFI: Clearing cache...')
soft_empty_cache()
number_of_frames_processed_since_last_cleared_cuda_cache = 0
print('Comfy-VFI: Done cache clearing')
gc.collect()
dtype = torch.float32
output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames]
out = torch.cat(output_frames, dim=0)
print('Comfy-VFI: Final clearing cache...')
soft_empty_cache()
print('Comfy-VFI: Done cache clearing')
return (postprocess_frames(out),)