AI-интерполяция кадров видео (Frame Interpolation)
Сталкивались с рывками при замедлении видео? Обычное дублирование кадров не спасает — на быстрых движениях получается стробоскоп. Мы используем AI-интерполяцию на основе optical flow: нейросеть дорисовывает промежуточные кадры, превращая 24fps в 60 или 120fps без потери качества. Разберём на практике, как это работает и какие подводные камни.
RIFE — практический инструмент
RIFE (Real-Time Intermediate Flow Estimation) — самый быстрый open-source метод. На RTX 3080 в 1080p достигает ~30 кадров/секунду при 2x интерполяции. Библиотека доступна на GitHub.RIFE: Real-Time Intermediate Flow Estimation
import torch import numpy as np import cv2 from pathlib import Path # Загрузка RIFE модели (IFNet) from model.RIFE_HDv3 import Model def interpolate_video_rife( input_path: str, output_path: str, multiplier: int = 2, # 2x, 4x, 8x — только степени двойки в RIFE scale: float = 1.0, # масштаб для optical flow (0.5 при слабом 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 # Преобразование в тензоры 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) # Padding до кратного 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) # Синтезируем (multiplier-1) промежуточных кадров 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 для сложных сцен
RIFE теряет качество на сценах с окклюзиями и нелинейными движениями. EMA-VFI (Event-based Motion-Aware VFI) — точнее, но медленнее в 3–4 раза. Наш опыт показывает, что для киновидео с резкими сменами ракурсов EMA-VFI даёт более чистую картинку.
Как избежать артефактов при интерполяции?
Ghosting — полупрозрачный двойник объекта. Возникает при быстрых движениях, где optical flow даёт ошибку. Решение: уменьшить scale или переключиться на EMA-VFI.
Warping artifacts — деформация текста и резких краёв. RIFE плохо работает с текстом на экранах. Решение: маскировать статичные регионы и не интерполировать их.
Мерцание на shot cuts — RIFE не детектирует смену сцены и синтезирует кадр между двумя разными сценами. Необходима предобработка: определение shot boundaries через PySceneDetect.
from scenedetect import detect, ContentDetector, AdaptiveDetector def find_scene_cuts(video_path: str, threshold: float = 27.0) -> list[int]: """ Возвращает номера кадров, где происходит смена сцены. threshold=27: стандартный для 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 Какой метод интерполяции выбрать для вашего проекта?
| Метод | Скорость 1080p 2x | SSIM | Артефакты | Применение |
|---|---|---|---|---|
| Дублирование кадров | Мгновенно | — | Рывки | Не использовать |
| DAIN | ~5fps | 0.942 | Средние | Архивное видео |
| RIFE v4.6 | ~30fps | 0.961 | Ghosting на быстрых | 24→48fps |
| EMA-VFI | ~8fps | 0.971 | Минимальные | Киновидео |
| Film (Google) | ~3fps | 0.978 | Минимальные | Максимум качества |
Выбор зависит от приоритета: скорость или качество. Для live-трансляций RIFE незаменим, для постпродакшена лучше EMA-VFI или Google Film.
Что входит в нашу работу
Мы не просто запускаем готовую модель. В deliverables входят:
- анализ исходного видео и подбор архитектуры (RIFE / EMA-VFI / кастомная)
- пайплайн с предобработкой (detect shot cuts, маски статичных регионов)
- оптимизация под ваше железо (GPU, batch size, FP16/INT8)
- интеграция через REST API или видеоплеер
- документация и обучение вашей команды
- поддержка на этапе внедрения
Почему стоит доверить интерполяцию профессионалам
Наш опыт — 10+ лет в Computer Vision и более 20 проектов по видеоаналитике и генерации контента. Мы гарантируем, что итоговое видео будет без рывков и артефактов, даже при 8x замедлении. Оценим ваш проект за один день. Свяжитесь для консультации — поможем подобрать оптимальный метод под вашу задачу.
Сроки
| Задача | Срок |
|---|---|
| API-сервис frame interpolation (RIFE) | 1–2 недели |
| Pipeline с детекцией shot cuts + интерполяция | 2–4 недели |
| Fine-tuning под специфический тип видео | 6–10 недель |
Оптимизация пайплайна: батчинг, FP16 и память GPU
На практике узкое место — не вычисление optical flow, а передача тензоров между CPU и GPU. Оптимизация пайплайна даёт ускорение в 2–4 раза без потери качества.
Ключевые параметры:
- FP16 (Half precision): включите
fp16=Trueв коде выше. Скорость растёт на 40–60% на современных GPU (Ampere, Ada Lovelace), потеря SSIM — менее 0.002. - Батчинг пар кадров: вместо обработки пары кадров по одной, группируем по 4–8 пар. Утилизация GPU растёт с 30–40% до 80–90%.
- Предварительная загрузка кадров: используем
DataLoaderсprefetch_factor=4для асинхронного чтения с диска, пока GPU обрабатывает текущий батч. - Экспорт в TensorRT: для production-среды экспортируем RIFE в TensorRT INT8. Ускорение дополнительно 1.5–2x при незначительном падении качества.
Мониторинг GPU: инструмент nvidia-smi dmon -s u показывает утилизацию в реальном времени. Целевой показатель — выше 75% на протяжении обработки.
Закажите внедрение AI-интерполяции и получите плавное видео без компромиссов. Наши инженеры помогут интегрировать решение в ваш workflow.







