Обновленная версия этой статьи Pseudo-LiDAR была опубликована на сайте https://www.thinkautonomous.ai/blog/?p=pseudo-lidar-stereo-vision-for-self-driving-cars

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

Алгоритмы обнаружения препятствий, такие как YOLO или RetinaNet, предоставляют двухмерные ограничивающие прямоугольники, определяющие положение препятствий на изображении с помощью ограничивающих прямоугольников. Сегодня большинство алгоритмов обнаружения объектов основаны на монокулярных камерах с RGB-подсветкой и не могут определить расстояние до каждого препятствия.

Чтобы определить расстояние до каждого препятствия, инженеры объединяют камеру с датчиками LiDAR (Light Detection And Ranging), которые используют лазеры для получения информации о глубине. Выходы компьютерного зрения и LiDAR объединяются с помощью Sensor Fusion.

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

Монокуляр против стереозрения

Псевдо-LiDAR использует геометрию для построения карты глубины и объединяет ее с обнаружением объектов для определения расстояния в 3D.

Оценка глубины за 5 шагов

С 2 камер мы можем получить расстояние до объекта. Это принцип триангуляции, и это основная геометрия Stereo Vision. Вот как это работает:

  1. Стереокалибровка - получение основных параметров с камеры.
  2. Эпиполярная геометрия - определите трехмерную геометрию нашей установки.
  3. Отображение несоответствия - вычисление карты несоответствия.
  4. Отображение глубины - вычисление карты глубины.
  5. Оценка расстояния до препятствий - поиск объектов в 3D и сопоставление с картой глубины.

В этой статье мы узнаем, как выполнить эти 5 шагов для построения алгоритма обнаружения трехмерных объектов, цель состоит в том, чтобы для каждого объекта мы могли оценить положение X, Y, Z.

📩 Прежде чем мы начнем: Я приглашаю вас присоединиться к списку рассылки, оставив свой адрес электронной почты ниже! Это то, чем я занимаюсь ежедневно в течение 2 лет, и это помогло десяткам тысяч инженеров освоить передовые навыки. "Присоединиться здесь."

1. Стереокалибровка - внутренняя и внешняя калибровка

При просмотре любого изображения в Интернете вполне вероятно, что камера откалибрована. Каждой камере нужна калибровка. Калибровка означает преобразование трехмерной точки (в мире) с координатами [X, Y, Z] в двухмерный пиксель с координатами [X, Y].

Результат этого шага прост: нам нужны внутренние и внешние параметры камеры. Они будут использоваться позже для определения расстояния.

Как создаются изображения?

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

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

Несколько строк назад я упомянул, что цель калибровки камеры - найти внутренние и внешние параметры. Я также сказал, что цель калибровки - помочь нам взять 3D-точку и преобразовать ее в пиксель, создав таким образом изображение.

Итак, вот как работает калибровка камеры на одном изображении:

Процесс калибровки камеры

Внешняя калибровка

Внешняя калибровка - это преобразование мировых координат в координаты камеры. По сути, мы говорим: «Вот точка в 3D в определенной системе координат. Какими были бы координаты этой точки, если бы мы смотрели из кадра камеры? ». Точка в мире поворачивается к кадру камеры, а затем переводится в положение камеры. Внешние параметры называются R (матрица вращения) и T (матрица перевода).

Вот формула:

Формула внешней калибровки

Внутренняя калибровка

Внутренняя калибровка - это преобразование координат камеры в пиксельные координаты. Когда у нас есть точка в 3D, мы используем внутренние параметры для преобразования этой 3D точки в пиксель. Это делается с помощью фокусного расстояния. Внутренний параметр - это матрица, которую мы называем K.

Вот формула преобразования мира в изображение:

K - внутренняя матрица. Он включает f, фокусное расстояние и (u₀, v₀) - оптический центр: это внутренние параметры.

Окончательная формула

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

Вот окончательная формула, которую мы используем:

Вы можете заметить, что внешняя матрица была изменена, это потому, что умножение матриц требует соответствия форм матрицы; а это было не так. Таким образом, мы перешли к однородным координатам. Вы можете узнать больше о полной формуле в моем курсе Stereo Vision.

Затем давайте посмотрим, как это работает с OpenCV.

Калибровка камеры: Stereo Vision и OpenCV

Как правило, для этого мы используем шахматную доску и автоматические алгоритмы. Когда мы это делаем, мы сообщаем алгоритму, что точка на шахматной доске (например, 0,0,0) соответствует пикселю на изображении (например: 545, 343).

Пример калибровки

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

Как правило, калибровка необходима для устранения искажения изображения. Модели камеры-обскуры включают искажение, «эффект GoPro». Чтобы получить исправленное изображение, необходима калибровка. Искажение может быть радиальным или тангенциальным. Калибровка помогает не искажать изображение.

Калибровка изображения

В моем курсе Stereo Vision я изучаю основы калибровки в моно и стерео режимах. Мы также увидим, как не искажать изображения и как вычислять дополнительные матрицы, такие как основные и фундаментальные матрицы, используемые для таких приложений, как 3D-реконструкция. Вот ссылка, чтобы узнать больше.

А пока, чтобы узнать больше о калибровке, перейдите по этой ссылке.

👉 В конце процесса калибровки у вас есть два исправленных изображения с параметрами K, R и T:

2. Эпиполярная геометрия - стереозрение

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

В стереосистеме у нас есть две камеры, обычно выровненные на одной высоте. Итак, как мы можем использовать установку и геометрически спроектировать систему?

Как стереокамеры могут оценить глубину?

Представьте, что у вас есть две камеры, левая и правая. Эти две камеры выровнены по одной оси Y и Z. По сути, единственная разница заключается в их значении X.

Теперь взгляните на следующую стереосистему, где две камеры CL (камера слева) и CR (камера справа) смотрят на препятствие O. С помощью геометрии мы найдем расстояние до него. .

Стерео настройка

Наша цель - оценить значение Z, расстояние до точки O (представляющей любой пиксель на изображении).

  • X - ось выравнивания
  • Y высота
  • Z - глубина
  • xL соответствует точке на изображении левой камеры. xR одинаков для правого изображения.
  • b - базовая линия, это расстояние между двумя камерами.

Взяв левую и правую камеру соответственно, мы можем получить два уравнения на этом рисунке, используя аналогичные треугольники.

Если вы примените теорему о похожих треугольниках, вы поймете, что мы можем прийти к двум уравнениям:

  • Для левой камеры:

  • Для правильной камеры:

Когда мы делаем математику, мы можем быстро прийти к Z и даже можем вычислить X и Y.

3. Стерео диспаратность и отображение

Что такое несоответствие?

Несоответствие - это разница в расположении изображения одной и той же трехмерной точки с двух разных углов камеры.

Конкретно, если я возьму боковое зеркало слева, изображение в пикселях (300, 175); Я могу найти это на правом изображении в пикселях (250, 175).

В этом примере xL = 300 и xR = 250. Несоответствие называется xL-xR; или здесь 50 пикселей. Он оценивается путем отправки двух изображений в функцию.

👉 Благодаря стереовидению мы можем оценить глубину любого объекта при условии, что мы проведем правильную калибровку матрицы.

Формула выглядит следующим образом:

Вычислите это для каждого пикселя, и вы получите карту несоответствия! Как видите, близкие объекты светлее, чем удаленные объекты, представленные более темными цветами. У нас уже есть чувство глубины!

Стерео согласование

Почему «эпиполярная геометрия»?

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

Чтобы решить эту проблему -

  • Возьмите пиксель на левом изображении
  • Теперь, чтобы найти этот пиксель на правом изображении, просто найдите его на эпиполярной линии. Нет необходимости в 2D-поиске, точка должна быть расположена на этой линии, и поиск сужается до 1D.

Как и в приведенном выше примере, зеркало находится на одинаковой высоте из-за стереокалибровки и выпрямления. У нас есть только одномерный поиск. Это потому, что камеры выровнены по одной оси.

Эпиполярная линия

Это потому, что камеры выровнены по одной оси. Как работает Stereo Matching?

Проблема соответствия, также известная как эпиполярный поиск, может быть решена разными способами:

  • Использование локальных подходов
  • Использование глобальных подходов
  • Использование полуглобальных подходов
  • Использование глубокого обучения

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

Теперь, учитывая наши два исходных изображения, вот что мы получили:

4. Стереозрение - от неравенства к картам глубины.

👉 У нас есть две карты несоответствия, которые в основном говорят нам, каков сдвиг в пикселях между двумя изображениями. У нас также есть матрица проекции для каждой камеры: P_left и P_right.

Чтобы оценить глубину, нам нужно оценить K, R и t.

По формуле:

Функция OpenCV с именем cv2.decomposeProjectionMatrix () может сделать это и получить K, R и t из P; для каждой камеры.

Карта глубины

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

Карта глубины сообщит нам расстояние до каждого пикселя изображения, используя другое изображение и карту несоответствия.

Процесс следующий:

  • Получите фокусное расстояние 𝑓 из матрицы 𝐾
  • Вычислить базовую линию 𝑏, используя соответствующие значения из векторов трансляции 𝑡
  • Вычислите карту глубины изображения, используя нашу предыдущую формулу и рассчитанную карту диспаратности d:

Формула Stereo Vision

Мы делаем это вычисление для каждого пикселя и получаем карту глубины!

5. Оценка глубины препятствия.

У нас есть карта глубины для каждой камеры! Теперь представьте, что мы объединяем это с алгоритмом обнаружения препятствий, таким как YOLO. Такие алгоритмы возвращают для каждого препятствия ограничивающую рамку с 4 числами: [x1; y1; х2; y2]. Эти числа представляют собой координаты верхней левой точки и нижней правой точки поля.

Мы можем запустить этот алгоритм, например, на левом изображении, а затем использовать левую карту глубины.

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

Баум! Мы только что построили псевдолидар!

Благодаря стереовидению мы знаем не только препятствия на изображении, но и расстояние до них! Это препятствие находится на расстоянии 22,75 метра от нас!

Приложения Stereo Vision - как вы используете Stereo Vision?

Stereo Vision - это то, что превращает 2D-обнаружение препятствий в 3D-обнаружение препятствий с помощью простой геометрии и одной дополнительной камеры. Сегодня большинство развивающихся «периферийных» платформ рассматривают Stereo Vision, например, новый Open CV AI Kit или интеграции с картами Raspberry и Nvidia Jetson.

Простая и элегантная вещь состоит в том, что вы можете начать работу в Stereo Vision с помощью OpenCV ... а затем получить гораздо больше, добавив нейронные сети. Поскольку это в основном геометрия, единственное место, где мы будем использовать нейронные сети, - это поиск несоответствия (шаг 3).

Что касается затрат, он остается относительно дешевым по сравнению с использованием LiDAR и по-прежнему предлагает отличные характеристики. Мы называем это «псевдо-LiDAR», потому что он может заменить LiDAR в своих функциях: обнаруживать препятствия, классифицировать их и локализовать их в 3D.

Это еще не все. В курсе Stereo Vision мы также занимаемся гораздо более продвинутыми вещами, такими как 3D-реконструкция. Если у нас есть расстояние до каждого пикселя, мы можем воссоздать 3D-облако точек следующим образом:

Stereo Vision также является хорошей альтернативой LiDAR. В моей статье Stereo Vision vs Sensor Fusion: какой подход лучше? , Сравниваю, как использую оба подхода, и результаты!

Наконец, если вы хотите узнать, как реализовать это самостоятельно, и преобразовать из 2D-инженера в 3D-инженера по компьютерному зрению, я приглашаю вас получать мои личные ежедневные электронные письма о компьютерном зрении и беспилотных автомобилях. И посетите мой курс MASTER STEREO VISION: Убийственные подходы к псевдо-лидарам и трехмерному компьютерному зрению .