Оптический поток / Optical Flow

Содержание лекции:

1. Что такое оптический поток / Optical Flow?

2. Виды оптического потока

3. Методы определения оптического потока

4. Функции OpenCV для вычисления оптического потока

1. Что такое оптический поток / Optical Flow?

Оптический поток- это технология, которая работает с видео и позволяет обнаружить смещение частей кадра относительно следующего кадра видео.

Области применения оптического потока

  1. Во-первых, это обнаружение движения, так как оптический поток позволяет обнаруживать смещение частей кадра, а смещение частей кадра обусловлено наличием движения в кадре.
  2. Вторая область - слежение за объектами или трекинг объектов. Для начала нужно знать положение объекта, после чего можно следить за изменением его положения путём трекинга.
  3. Следующая область - визуальная одометрия: оценка положения устройства/робота. Напр. данная технология используется в оптических мышах, чтобы определять изменение положения мыши, а также в умных автомобилях для построения карты местности.
  4. Следующая область - сжатие видео. С увеличением разрешения видео становится актуальным применение технологий, которые позволяют уменьшить итоговый размер видео. В частности, с использованием технологий оптического потока и нейронных сетей можно получить более высокое качество видео на выходе без существенного изменения его размера относительно популярных кодеков.
  5. Также совместно с нейросетями оптический поток используется для семантической сегментации. Так как оптический поток позволяет обнаружить участки кадра, на которых происходит движение, то это позволяет более точно выделить объект в кадре.

2. Виды оптического потока

Sparse/выборочный

Во-первых, это выборочный оптический поток, или по-английски Sparse.

Выборочный оптический поток позволяет следить только за заранее определёнными точками на кадре. Точки можно как определить вручную, либо использовать для этого какой-либо алгоритм, напр. для выбора наиболее подходящих ключевых точек.

Dense/плотный

Вторым видом оптического потока является плотный или Dense оптический поток.

Данный вид оптического потока используется для слежения за всеми пикселями кадра.

На примере можно увидеть, что вектора построены не для всех пикселей, это сделано для того, чтобы было видно кадр. Для векторов в таком случае берётся значение из соответствующего пикселя или вычисляется среднее значение по окрестности.

Отличия выборочного и плотного потоков

Выборочный:

  • Позволяет определить вектор перемещения только интересующих ключевых точек.
  • Работает быстрее, так как вычислительные ресурсы расходуются только на интересующие точки.
  • Подходит для вычислений на CPU.

Плотный:

  • Позволяет обнаружить движение в любой части кадра.
  • Позволяет более точно определить вектора перемещения, так как учитывается перемещение соседних пикселей.
  • Эффективен на GPU.

Какие ключевые точки лучше использовать?

Теперь посмотрим, какие ключевые точки больше всего подходят для оптического потока.

Этот же принцип подходит и при выборе ключевых точек при решении других задач, например, для создания панорам.

Выделяют три варианта положения точек:

  1. Идеально - углы, то есть ключевая точка попадает на вершину угла.
  2. Менее точно - грани.
  3. Ещё менее точно - монотонные области, например, небо. Обычно в таких областях отсутствуют ключевые точки.

3. Методы определения оптического потока

1. Выборочный:

  • Алгоритм Лукаса - Канаде - на самом деле, технически, тоже плотный.

2. Плотный:

  • Farneback Optical Flow.
  • DIS/Dense Inverse Search Optical Flow.
  • Brox Optical Flow.
  • Множество других реализаций и модификаций представленных методов.

Алгоритм Лукаса - Канаде

Посмотрим особенности алгоритма Лукаса - Канаде:

  1. Работает только с хорошими признаками, поэтому выборочный.
  2. Слабо устойчив к:
  • Изменению освещённости.
  • Быстрому перемещению объектов.
  • Особенностям ракурса камеры.

Особенности ракурса камеры

О каких особенностях ракурса камеры идёт речь:

  1. В кадр попадает только часть объекта.
  2. Иллюзии на плоскости за счёт особенностей перспективы.

Стоит отметить, что Optical Flow также может давать некорректный результат, если слежение выполняется за объектом, который может менять форму во время движения, напр. за человеком.

Farneback Optical Flow

Напомню, что это метод плотного вида оптического потока. Особенности данного метода:

  1. Эффективен на GPU.
  2. Подходит для реализации трекинга объектов на GPU.

Данный метод используется в нашей система распознавания номеров для трекинга.

DIS Optical Flow

Другой метод плотного оптического потока. Особенности этого метода:

  1. Быстрый, эффективен при использовании на слабом CPU.
  2. Заметно выделяет объект целиком, а не только его границу.

Данный метод используется в нашей системе подсчёта пассажиров, которая запускается на процессоре видеорегистратора.

Brox Optical Flow

Следующий метод плотного оптического потока. Особенности этого метода:

  1. Даёт более точный результат.
  2. Более устройчив к шуму.

При своих достоинствах этот метод менее производителен, чем DIS Optical Flow.

4. Функции OpenCV для вычисления оптического потока

Обработка видео

Класс cv2.VideoCapture.

Метод read.

Код результата можно опустить.

Класс cv2.VideoCapture:

vc = cv2.VideoCapture('video.mp4')

Метод read:

_, frame = vc.read()

frame - изображение в формате OpenCV. Первое значение - код результата, можно игнорировать.

Вывод результата

Кадр можно вывести с помощью функции cv2.imshow.

cv2.imshow('frame', frame)

Вывод на экран происходит во время ожидания ввода - cv2.waitKey.

cv2.waitKey(1)

Вывод результата: полностью

while True:

    _, frame = vc.read()

    if frame is None:

        break

    cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == 27: # 27 - Escape

        break

Sparse Optical Flow

Перед применением функций для вычисления оптического потока необходимо преобразовать изображение в ч/б.

Вычисление положение хороших ключевых точек - cv2.goodFeaturesToTrack.

Преобразование изображение в ч/б - cv2.cvtColor с флагом cv2.COLOR_BGR2GRAY:

frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Вычисление положение хороших ключевых точек - cv2.goodFeaturesToTrack:

feature_params = dict(maxCorners = 100, qualityLevel = 0.3, minDistance = 7, blockSize = 7)

p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)


Применение метода Лукаса - Канаде - cv2.calcOpticalFlowPyrLK.

Применение метода Лукаса - Канаде - cv2.calcOpticalFlowPyrLK:

lk_params = dict(winSize  = (15,15), maxLevel = 2, criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

p1, st, err = cv2.calcOpticalFlowPyrLK(previous_frame_gray, frame_gray, p0, None, **lk_params)

Farneback Optical Flow

Применение метода Farneback Optical Flow - cv2.calcOpticalFlowFarneback.

Применение метода Farneback Optical Flow - cv2.calcOpticalFlowFarneback:

flow = cv2.calcOpticalFlowFarneback(previous_frame_gray, frame_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)

Чувствительность к шуму

Стоит отметить особенную чувствительность оптического потока к шуму. В частности, это касается предварительно уменьшенных изображений, так как может появиться эффект пикселизации.

Для обхода этого эффекта можно использовать флаг cv2.INTER_AREA при изменении размера изображения, тогда в результате получится плавное изображение.

result = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA)

Также для уменьшенного изображения плотный оптический поток будет вычисляться быстрее.

Визуализация результата

Вывод линии - cv2.line:

image = cv2.line(image, (x0, y0), (x1, y1), (R, G, B), thickness)

Вывод круга - cv2.circle:

image = cv2.circle(image, (x, y), radius, (R, G, B), thickness)

При thickness равной -1 выводится круг с заливкой.


Практическое задание:
1. Загрузить и воспроизвести видео из материалов лекции (предоставить скрин экрана: код + кадр воспроизведения + вывод консоли)
  • Вывести в консоль:
  • Размеры видеокадра
  • Кол-во кадров
  • Частоту кадров
2. * Воспроизвести видео с вашей веб-камеры и записать его 3-5сек, предоставить код + видео (Выполнить задание, если есть техническая возможность)


cap = cv2.VideoCapture(0) # Захват видео с веб-камеры

Материалы для задания
Домашнее задание:

Выбрать вариант применения оптического потока и применить его к видео (из материалов лекции). Предоставить код и результирующее видео с оптическим потоком

Материалы для задания



Завершить и продолжить  
Обсуждение

0 Комментарии