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 | Мінімальні | Максимум якості |
Вибір залежить від пріоритету: швидкість чи якість. RIFE в 3-4 рази швидший за EMA-VFI, але EMA-VFI на 0.01 вище по SSIM та знижує ghosting на 50% порівняно з RIFE. Для live-трансляцій RIFE незамінний, для постпродакшну краще EMA-VFI або Google Film.
Як впровадити AI-інтерполяцію: покрокова інструкція
- Надайте зразки відео. Ми аналізуємо тип контенту, частоту кадрів, роздільну здатність.
- Обираємо модель. Для живого відео — RIFE, для кіно — EMA-VFI.
- Налаштовуємо пайплайн. Додаємо детекцію shot cuts, маски статичних регіонів, оптимізацію під ваше GPU.
- Інтегруємо API. REST API або вбудовування в плеєр.
- Тестуємо. Оцінюємо якість на вашому контенті, коригуємо параметри.
Що входить у нашу роботу
Ми не просто запускаємо готову модель. У deliverables входять:
- аналіз вихідного відео та підбір архітектури (RIFE / EMA-VFI / кастомна)
- пайплайн з попередньою обробкою (detect shot cuts, маски статичних регіонів)
- оптимізація під ваше залізо (GPU, batch size, FP16/INT8)
- інтеграція через REST API або відеоплеєр
- документація та навчання вашої команди
- підтримка на етапі впровадження
Чому варто довірити інтерполяцію професіоналам
Наш досвід — 10+ років у Computer Vision, 5 років на ринку AI-рішень, 20+ успішних проєктів з відеоаналітики та генерації контенту. Ми гарантуємо, що підсумкове відео буде без ривків та артефактів, навіть при 8x сповільненні. Оцінимо ваш проєкт за один день. Впровадження AI-інтерполяції знижує витрати на ручну обробку до 70%. Зв'яжіться з нами для консультації — допоможемо підібрати оптимальний метод під вашу задачу.
Терміни та вартість
| Задача | Термін | Вартість |
|---|---|---|
| API-сервіс frame interpolation (RIFE) | 1–2 тижні | від $5000 |
| Pipeline з детекцією shot cuts + інтерполяція | 2–4 тижні | від $12000 |
| 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.







