Scene Flow
Поток сцены — это поле трёхмерного движения сцены: вектор смещения для каждой видимой точки между кадрами, оцениваемый по стереоданным, RGB-D или данным LiDAR.
Поток сцены — это трёхмерное поле движения сцены: для каждой видимой точки поверхности задаётся 3D-вектор от её положения в одном кадре до положения в следующем. Сундар Ведула, Саймон Бейкер и их коллеги из Университета Карнеги-Меллона ввели этот термин в статье 1999 года Three-Dimensional Scene Flow, определив его как 3D-аналог оптического потока. Поток сцены объединяет геометрию и движение: он сообщает системе компьютерного зрения, где находится каждая точка и с какой скоростью в метрах она движется, в том числе к камере или от неё. Поэтому это ключевой сигнал для автономных транспортных средств и робототехники, где необходимо распознавать движение автомобиля, выезжающего на дорогу, или человека, ступающего на траекторию.
Поток сцены и оптический поток#
Оптический поток — это проекция потока сцены на плоскость изображения: он показывает, насколько каждый пиксель смещается влево или вправо, вверх или вниз, но ничего не говорит о движении вдоль линии визирования камеры. Поэтому два объекта с одинаковым оптическим потоком могут двигаться совершенно по-разному. Поток сцены восстанавливает недостающую составляющую с помощью оценки глубины в оба момента времени: каждый пиксель проецируется обратно на луч зрения до измеренной глубины:
import numpy as np
K_inv = np.linalg.inv(np.array([[500.0, 0, 320], [0, 500.0, 240], [0, 0, 1]])) # inverse camera intrinsics
# Two objects with identical optical flow: each moves from pixel (400, 240) to (410, 240) in 0.1 s
for name, depth_before, depth_after in [("cyclist crossing", 8.0, 8.0), ("car approaching", 8.0, 6.0)]:
# Back-project each pixel along its viewing ray to the measured depth
before = depth_before * K_inv @ np.array([400, 240, 1.0])
after = depth_after * K_inv @ np.array([410, 240, 1.0])
# Scene flow is the 3D displacement of the same surface point
flow = after - before
print(f"{name}: scene flow {flow.round(2)} m, speed {np.linalg.norm(flow) / 0.1:.1f} m/s")Оба объекта смещаются вправо на 10 пикселей, но велосипедист перемещается вбок на 0,16 м со скоростью 1,6 м/с, а автомобиль за десятую долю секунды приближается на 2 м со скоростью 20,1 м/с. На расстоянии 6 м и при скорости сближения 20 м/с автомобиль достигнет камеры через 0,3 секунды.
Поток сцены также отличается от отслеживания объектов, при котором отслеживаются идентификаторы объектов в виде ограничивающих рамок, и от отслеживания точек, при котором выбранные 2D-точки отслеживаются на протяжении нескольких кадров. Оценка скорости в Ultralytics YOLO работает на уровне отслеживания в 2D: она отслеживает каждую рамку и преобразует её смещение в пикселях в км/ч, используя единый масштаб метров на пиксель для всего изображения. Это работает, когда камера смотрит на дорогу сверху, а транспорт движется параллельно изображению.
Как оценивают поток сцены#
Метод зависит от входных данных. Стереокамера даёт карты смещений в оба момента времени и оптический поток между кадрами. Именно такую конфигурацию использует бенчмарк потока сцены KITTI, выпущенный Морицем Менце и Андреасом Гайгером в 2015 году: 200 обучающих и 200 тестовых дорожных сцен. Камеры RGB-D и LiDAR формируют два облака точек, которые часто объединяют с изображениями камер посредством слияния данных сенсоров. Сети, например FlowNet3D, обучаются напрямую сопоставлять точки между этими облаками. Для одной камеры используют монокулярную оценку глубины, полученную с помощью обучения, и оптический поток для каждой пары кадров.
Когда камера движется, кажется, что все неподвижные точки тоже движутся. Поэтому полная система также оценивает собственное движение камеры — обычно с помощью визуальной SLAM или одометрии — и считает точки с несовпадающим потоком независимо движущимися. Дорожные сцены состоят преимущественно из твёрдых тел, поэтому такие методы, как поток сцены объектов Менце и Гайгера и RAFT-3D, объединяют пиксели в несколько твёрдых тел, движущихся как единое целое. Это стабилизирует оценки на лишённых текстуры кузовах автомобилей. Сложнее всего обрабатывать перекрытия: точки, появляющиеся или исчезающие между кадрами, невозможно сопоставить.
Моделям глубокого обучения нужны плотные эталонные данные, которые реальные сенсоры не могут получить, поэтому при обучении широко используют синтетические данные. Наборы данных Фрайбургского университета по потоку сцены, включая FlyingThings3D, содержат десятки тысяч стереокадров с точными данными о смещении, оптическом потоке и изменении смещения. FlowNet3D, обученную только на FlyingThings3D, удалось перенести на реальные сканы LiDAR из KITTI.
Примеры применения в реальных условиях#
- Мобильные роботы: Роботы, работающие в складских помещениях и на тротуарах рядом с людьми, используют трёхмерное движение ближайших препятствий, чтобы предсказать, где те окажутся через секунду, и скорректировать маршрут.
- Реконструкция динамической сцены: гауссово сплаттинг-представление 4D и динамические нейронные радиационные поля моделируют движущуюся сцену, обучаясь перемещению каждой точки или гауссианы во времени. Полученный поток сцены позволяет воспроизводить записанное видео с новых ракурсов.
- Автономное вождение: Поток сцены на данных LiDAR отделяет движущиеся автомобили и пешеходов от неподвижного окружения в последовательных сканах. В 2021 году в Waymo Open Dataset появились разметки потока сцены: размеченных кадров там примерно в 1 000 раз больше, чем в более ранних наборах реальных данных по потоку сцены.










