How to Create Smooth Videos with AI Frame Interpolation and Optical Flow
Struggling with stuttering when slowing down video? Simple frame duplication doesn't help—on fast motion you get a strobe effect. We use AI interpolation based on optical flow: the neural network draws intermediate frames, turning 24fps into 60 or 120fps without quality loss. Let’s break down how it works and what pitfalls to watch for. Starting from $500, you can get a custom solution tailored to your needs.
RIFE — Practical Tool for Frame Interpolation
RIFE (Real-Time Intermediate Flow Estimation) is the fastest open-source method. On an RTX 3080 at 1080p, it achieves ~30 frames/second at 2x interpolation. The library is available on GitHub.RIFE: Real-Time Intermediate Flow Estimation
Our benchmarks show RIFE is 6x faster than DAIN and 4x faster than EMA-VFI, but EMA-VFI achieves 0.01 higher SSIM.
Step-by-Step Implementation:
- Analyze source video (FPS, resolution, codec).
- Choose model: RIFE for speed, EMA-VFI for quality.
- Preprocess: detect scene cuts with PySceneDetect to avoid flickering.
- Run interpolation with optimal parameters (scale, FP16, batching).
- Post-process: mask static regions to reduce warping.
import torch
import numpy as np
import cv2
from pathlib import Path
# Load RIFE model (IFNet)
from model.RIFE_HDv3 import Model
def interpolate_video_rife(
input_path: str,
output_path: str,
multiplier: int = 2, # 2x, 4x, 8x — only powers of 2 in RIFE
scale: float = 1.0, # scale for optical flow (0.5 on weak GPU)
fp16: bool = True
) -> None:
device = torch.device('cuda')
model = Model()
model.load_model('train_log', -1)
model.eval().device(device)
cap = cv2.VideoCapture(input_path)
fps = cap.get(cv2.CAP_PROP_FPS)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out_fps = fps * multiplier
writer = cv2.VideoWriter(
output_path,
cv2.VideoWriter_fourcc(*'mp4v'),
out_fps, (w, h)
)
ret, prev_frame = cap.read()
while ret:
ret, curr_frame = cap.read()
if not ret:
break
# Convert to tensors
I0 = torch.from_numpy(prev_frame).permute(2,0,1).float() / 255.0
I1 = torch.from_numpy(curr_frame).permute(2,0,1).float() / 255.0
if fp16:
I0 = I0.half()
I1 = I1.half()
I0 = I0.unsqueeze(0).to(device)
I1 = I1.unsqueeze(0).to(device)
# Pad to multiple of 32
pad_h = (32 - h % 32) % 32
pad_w = (32 - w % 32) % 32
I0 = torch.nn.functional.pad(I0, [0, pad_w, 0, pad_h])
I1 = torch.nn.functional.pad(I1, [0, pad_w, 0, pad_h])
writer.write(prev_frame)
# Synthesize (multiplier-1) intermediate frames
for i in range(1, multiplier):
t = i / multiplier
with torch.no_grad():
middle = model.inference(I0, I1, scale=scale)
mid_np = (middle[0].float().cpu().permute(1,2,0).numpy()
* 255).astype(np.uint8)
writer.write(mid_np[:h, :w])
prev_frame = curr_frame
writer.write(prev_frame)
cap.release()
writer.release()
EMA-VFI for Complex Scenes
RIFE loses quality on scenes with occlusions and non-linear motion. EMA-VFI (Event-based Motion-Aware VFI) is more accurate but 3-4 times slower. Our experience shows that for cinema video with abrupt angle changes, EMA-VFI produces a cleaner picture.
How to Avoid Interpolation Artifacts?
Ghosting — a semi-transparent duplicate of an object. Occurs with fast motion where optical flow makes errors. Solution: reduce scale or switch to EMA-VFI.
Warping artifacts — deformation of text and sharp edges. RIFE handles text on screens poorly. Solution: mask static regions and do not interpolate them.
Flickering on shot cuts — RIFE does not detect scene changes and synthesizes a frame between two different scenes. Preprocessing is required: detect shot boundaries using PySceneDetect.
from scenedetect import detect, ContentDetector, AdaptiveDetector
def find_scene_cuts(video_path: str, threshold: float = 27.0) -> list[int]:
"""
Returns frame numbers where scene changes occur.
threshold=27: standard for ContentDetector.
"""
scene_list = detect(
video_path,
ContentDetector(threshold=threshold)
)
cut_frames = []
for scene in scene_list:
cut_frames.append(scene[0].get_frames())
return cut_frames
Choosing the Right AI Frame Interpolation Method for Your Project
| Method | Speed 1080p 2x | SSIM | Artifacts | Use Case |
|---|---|---|---|---|
| Frame duplication | Instant | — | Stuttering | Do not use |
| DAIN | ~5fps | 0.942 | Moderate | Archive video |
| RIFE v4.6 | ~30fps | 0.961 | Ghosting on fast motion | 24→48fps |
| EMA-VFI | ~8fps | 0.971 | Minimal | Cinema video |
| Film (Google) | ~3fps | 0.978 | Minimal | Maximum quality |
The choice depends on priority: speed or quality. For live broadcasts, RIFE is irreplaceable; for post-production, EMA-VFI or Google Film is better.
Deliverables and What's Included in the Work
We don't just run a ready-made model. Deliverables include:
- analysis of the source video and architecture selection (RIFE / EMA-VFI / custom)
- pipeline with preprocessing (shot cut detection, static region masks)
- optimization for your hardware (GPU, batch size, FP16/INT8)
- integration via REST API or video player
- full documentation of the pipeline and API
- training for your team on using the system
- access to the code repository
- support during implementation phase and beyond
Pricing starts at $500 for basic projects, with savings of up to 60% compared to traditional frame duplication. For complex projects involving custom model training, prices start at $5,000. Typical project costs range from $500 to $5,000 depending on complexity.
Why Trust Professionals with Interpolation?
Our experience: 10+ years in Computer Vision and over 20 projects in video analytics and content generation. We guarantee the final video will be free of stuttering and artifacts, even at 8x slowdown. We will assess your project within one day. Contact us for a consultation — we'll help choose the optimal method for your task.
Frame Interpolation Timelines
| Task | Timeline |
|---|---|
| API service for frame interpolation (RIFE) | 1-2 weeks |
| Pipeline with shot cut detection + interpolation | 2-4 weeks |
| Fine-tuning for specific video type | 6-10 weeks |
Pipeline Optimization: Batching, FP16, and GPU Memory
In practice, the bottleneck is not optical flow computation but transferring tensors between CPU and GPU. Pipeline optimization yields 2-4x speedup without quality loss.
Key parameters:
- FP16 (Half precision): enable
fp16=Truein the code above. Speed increases by 40-60% on modern GPUs (Ampere, Ada Lovelace), SSIM loss under 0.002. - Batching frame pairs: instead of processing one pair at a time, group 4-8 pairs. GPU utilization rises from 30-40% to 80-90%.
- Prefetching frames: use
DataLoaderwithprefetch_factor=4for async disk reading while GPU processes the current batch. - Export to TensorRT: for production environments, export RIFE to TensorRT INT8. Additional 1.5-2x speedup with minimal quality drop.
GPU monitoring: the nvidia-smi dmon -s u tool shows utilization in real time. Target: above 75% during processing.
Additional Optimization Details
For high-resolution videos (4K), consider splitting the frame into tiles to fit in GPU memory. Use overlapping tiles to avoid seam artifacts. The tiling approach can handle 4K at 2x interpolation on an RTX 3090.
Another detail: When using FP16, ensure your GPU supports it natively. Older GPUs (Pascal) may experience slowdowns due to emulation.
Order AI interpolation implementation and get smooth video without compromise. Our engineers will help integrate the solution into your workflow.







