Optical Flow
Оптический поток оценивает перемещение каждого пикселя между двумя видеокадрами в виде поля векторов движения. Классические методы и методы глубокого обучения, сферы применения и примеры кода для OpenCV.
Оптический поток — это видимое перемещение яркостных структур между двумя изображениями, обычно соседними кадрами видео. Алгоритм оптического потока оценивает для каждого пикселя первого кадра двумерный вектор смещения (dx, dy), указывающий, где содержимое этого пикселя окажется во втором кадре. Результат, называемый полем потока, отражает движение движущихся объектов и самой камеры, что позволяет системам компьютерного зрения стабилизировать видео, оценивать собственное движение камеры, интерполировать кадры и распознавать действия. Поток измеряет то, что видит камера, а не истинное трехмерное движение: идеально однородная сфера, вращающаяся на месте, не создает потока, а движущаяся тень создает поток там, где ничего физически не движется.
Как оценивается оптический поток#
Большинство методов исходят из постоянства яркости — предположения, что точка сохраняет ту же интенсивность при движении. Линеаризация дает одно уравнение на пиксель: Ix·u + Iy·v + It = 0, где Ix, Iy и It — производные изображения по x, y и времени, а (u, v) — неизвестный поток. Одного уравнения недостаточно, чтобы определить две неизвестные величины: это проблема апертуры. Если смотреть на прямой край через небольшое окно, можно измерить только движение перпендикулярно краю. Классические методы добавляют второе предположение, чтобы решить эту проблему:
- Метод Лукаса — Канаде (1981): Предполагает, что поток постоянен в небольшом окне, и решает уравнения для всех пикселей окна методом наименьших квадратов. Метод работает, если окно содержит градиенты в двух направлениях, например в углах, поэтому обычно его применяют для разреженного потока на выбранных характерных точках.
- Метод Хорна — Шунка (1981): Предполагает, что поле потока гладкое по всему изображению, и решает задачу глобальной оптимизации, получая плотный поток для каждого пикселя.
Оба предположения нарушаются при больших перемещениях, поэтому на практике поток оценивают от грубого масштаба к точному на пирамиде изображений: перемещение на 16 пикселей при полном разрешении соответствует перемещению на 2 пикселя на три уровня ниже:
В OpenCV реализованы пирамидальный метод Лукаса — Канаде для разреженных точек и алгоритм плотного потока Гуннара Фарнебака 2003 года на основе полиномиального разложения. Этот код сдвигает случайную текстуру на известную величину и восстанавливает движение с помощью плотного потока Фарнебака:
import cv2
import numpy as np
# A smooth random texture, then the same texture moved 3 px right and 2 px down
rng = np.random.default_rng(0)
texture = cv2.GaussianBlur(rng.random((240, 320)), (0, 0), 3)
frame1 = cv2.normalize(texture, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
frame2 = np.roll(frame1, shift=(2, 3), axis=(0, 1))
# Dense Farneback optical flow: one (dx, dy) displacement vector for every pixel
flow = cv2.calcOpticalFlowFarneback(
frame1, frame2, None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.2, flags=0
)
print(f"flow field shape: {flow.shape}")
print(f"median motion: dx={np.median(flow[..., 0]):.2f}, dy={np.median(flow[..., 1]):.2f} pixels")Он выводит flow field shape: (240, 320, 2) и median motion: dx=3.00, dy=2.00 pixels: двухкомпонентный вектор для каждого из 76 800 пикселей, восстанавливая горизонтальный сдвиг на 3 пикселя и вертикальный на 2 пикселя.
Методы глубокого обучения#
FlowNet в 2015 году показал, что сверточную нейронную сеть можно обучить оценивать поток сквозным образом на синтетических обучающих данных, поскольку для реального видео редко доступны эталонные значения потока. PWC-Net объединил идеи классических методов — пирамиду, деформацию и объем стоимости — в компактной сети. RAFT, получившая награду за лучшую статью на ECCV 2020, сопоставляет каждый пиксель первого кадра с каждым пикселем второго в объеме корреляции и многократно уточняет единое поле потока высокого разрешения с помощью рекуррентных обновлений. Обучаемые методы намного лучше классических справляются с большими смещениями, размытием движения и областями без текстуры, а torchvision поставляется с предварительно обученными моделями RAFT. Точность оценивают по средней ошибке конечной точки (EPE) — среднему расстоянию в пикселях между предсказанными и истинными векторами потока — на таких наборах тестов, как MPI Sintel и KITTI 2015.
Оптический поток и смежные понятия#
- Сопровождение объектов: Отслеживает целые объекты с постоянными идентификаторами на протяжении множества кадров, тогда как оптический поток описывает попиксельное движение между двумя кадрами и ничего не знает об объектах. Трекеры используют поток как дополнительный сигнал: в режиме track Ultralytics YOLO трекеры TrackTrack (по умолчанию) и BoT-SORT оценивают движение камеры с помощью разреженного потока Лукаса — Канаде (
gmc_method: sparseOptFlow): отслеживают до 400 угловых точек в кадре с половинным разрешением, подбирают к ним поворот, масштаб и перенос с помощью RANSAC, а затем сдвигают все предсказанные рамки треков на эту величину движения перед сопоставлением с новыми детекциями. - Отслеживание точек: Отслеживает выбранные точки на протяжении длинных видео, в том числе при перекрытиях, вместо оценки движения каждого пикселя между двумя кадрами.
- Поток сцены: Трехмерное движение точек в пространстве, оцениваемое по стереоданным или данным о глубине. Оптический поток — это его проекция на плоскость изображения.
- Векторы движения видеокодека: Кодировщики H.264, HEVC и AV1 хранят по одному вектору движения на блок, выбирая его для минимизации количества битов, необходимых для кодирования кадра, поэтому он часто отличается от истинного движения.
Примеры применения в реальных условиях#
- Стабилизация видео: Доминирующий поток по всему кадру выявляет дрожание камеры, которое программа компенсирует, деформируя каждый кадр в противоположном направлении.
- Интерполяция кадров: При создании замедленного видео и преобразовании частоты кадров промежуточные кадры синтезируются перемещением пикселей на часть расстояния вдоль их векторов потока.
- Автономные транспортные средства и дроны: Поток помогает визуальной одометрии, а скорость расширения потока объекта предупреждает о приближающемся столкновении.
- Распознавание действий: Двухпоточная сеть 2014 года распознавала действия по пространственному потоку одиночных кадров и временному потоку, на вход которого подавалась последовательность из 10 соседних полей оптического потока.










