Frame Interpolation
Интерполяция кадров создаёт новые кадры между существующими, повышая частоту кадров или создавая эффект замедленного движения. Методы на основе оптического потока, ядер и генеративных моделей.
Интерполяция кадров, также называемая интерполяцией видеокадров (VFI), — это задача компьютерного зрения, в которой между двумя существующими кадрами видео создаются новые. Вставка одного кадра между каждой парой удваивает частоту кадров: видео с 30 FPS превращается в видео с 60 FPS, а вставка нескольких кадров создаёт эффект замедленного движения из обычного видео. Она повышает временное разрешение видео — аналог сверхвысокого разрешения во временной области — и заполняет только промежутки между существующими кадрами, в отличие от предсказания видео, которое экстраполирует кадры после последнего.
Как работает интерполяция кадров#
Усреднение двух кадров создаёт шлейфы — двойное изображение всего, что двигалось. Методы на основе потока оценивают оптический поток, то есть движение каждого пикселя между двумя кадрами, перемещают части каждого кадра на соответствующее расстояние к целевому моменту времени и смешивают два результата. Самая сложная проблема — перекрытия: область фона, открывшаяся за идущим человеком, присутствует только в одном из кадров, поэтому модели глубокого обучения, например Super SloMo, также предсказывают карты видимости, определяющие, из какого кадра берётся каждый выходной пиксель.
Оптического потока Фарнебака из OpenCV достаточно, чтобы показать эффект на реальном видео. Пример кода исключает средний кадр из трёх, восстанавливает его по соседним кадрам и оценивает оба метода по пиковому отношению сигнал/шум (PSNR):
import cv2
import numpy as np
# Read three consecutive frames of people walking and hold out the middle one
cap = cv2.VideoCapture("https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov")
f0, f1, f2 = (cap.read()[1] for _ in range(3))
g0, g2 = (cv2.cvtColor(f, cv2.COLOR_BGR2GRAY) for f in (f0, f2))
# Estimate dense optical flow in both directions between the outer frames
flow02 = cv2.calcOpticalFlowFarneback(g0, g2, None, 0.5, 3, 15, 3, 5, 1.2, 0)
flow20 = cv2.calcOpticalFlowFarneback(g2, g0, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Warp each outer frame halfway along its flow, then average the two warps
h, w = g0.shape
grid = np.dstack(np.meshgrid(np.arange(w), np.arange(h))).astype(np.float32)
warp0 = cv2.remap(f0, grid - 0.5 * flow02, None, cv2.INTER_LINEAR)
warp2 = cv2.remap(f2, grid - 0.5 * flow20, None, cv2.INTER_LINEAR)
middle = cv2.addWeighted(warp0, 0.5, warp2, 0.5, 0)
# Score both against the real middle frame: flow interpolation vs. plain blending
blend = cv2.addWeighted(f0, 0.5, f2, 0.5, 0)
print(f"Blend: {cv2.PSNR(blend, f1):.1f} dB, flow interpolation: {cv2.PSNR(middle, f1):.1f} dB")Выводится Blend: 22.3 dB, flow interpolation: 29.5 dB: перемещение каждого кадра на половину расстояния вдоль его движения позволяет восстановить исключённый кадр на 7,2 дБ точнее, чем усреднение. В бенчмарках модели оцениваются так же: набор троек Vimeo-90K содержит 73 171 трёхкадровый клип, в котором модель должна предсказать средний кадр; качество измеряется с помощью PSNR и SSIM.
Методы интерполяции на основе обучения#
- Сети на основе потока: Super SloMo (2018) предсказывает поток и видимость для любого момента времени между двумя кадрами, а RIFE (2022) напрямую оценивает поток для промежуточного момента и работает в 4–27 раз быстрее Super SloMo и DAIN.
- Сети на основе ядер: SepConv (2017) предсказывает разделимые свёрточные ядра для каждого выходного пикселя и применяет их к фрагментам двух входных кадров, объединяя оценку движения и смешивание за один шаг.
- Модели для больших перемещений: FILM от Google (2022) использует общие веса на разных масштабах пирамиды признаков, поэтому большое перемещение на мелком масштабе обрабатывается так же, как небольшие перемещения, которым модель обучается на более грубых масштабах; для обучения достаточно троек кадров.
- Генеративные модели: Интерполяторы на основе диффузии, например LDMVFI (2024), создают средний кадр, устраняя шум в латентном представлении, обусловленном двумя входными кадрами, вместо деформации их пикселей.
- Интерполяция на основе событий: Time Lens (2021) добавляет изменения яркости, которые событийная камера фиксирует между двумя кадрами и которые раскрывают фактическое движение в этом промежутке.
Примеры применения в реальных условиях#
- Генерация игровых кадров: NVIDIA DLSS Multi Frame Generation вставляет до пяти сгенерированных кадров на каждый отрисованный кадр на GPU GeForce RTX 50 Series; для генерации каждого кадра нужен следующий отрисованный кадр, что увеличивает задержку.
- Видеомонтаж: Видеоредакторы создают эффект замедленного движения из стандартного видео и преобразуют видео с частотой 24 или 30 FPS для дисплеев с частотой 60 или 120 Гц — это та же интерполяция движения, которую телевизоры применяют для сглаживания движения.
- Анимация: Модели интерполяции создают промежуточные рисунки для нарисованных от руки ключевых кадров, а генераторы видео могут создавать целые клипы, начинающиеся и заканчивающиеся двумя заданными кадрами.
Отслеживание объектов применяет ту же идею к положениям, а не к пикселям. Когда объект появляется снова после того, как его не было видно несколько кадров, трекер OC-SORT в режиме track Ultralytics (tracker="ocsort.yaml") линейно интерполирует виртуальные рамки для пропущенных кадров и повторно обрабатывает их с помощью фильтра Калмана, исправляя оценку скорости, которую он использует, чтобы сопоставить объект со следующим обнаружением YOLO26.










