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

Главная идея

Этот подход был впервые представлен Zhou et al. В этом документе". Идея состоит в том, чтобы повторно спроецировать пиксели с текущего временного шага t на другой временной шаг tʹ. Это повторное проецирование представляет собой одно большое преобразование координат, при котором мы находим, где каждый пиксель в изображении на временном шаге t принадлежит изображению на временном шаге t '. Временной шаг t ’ принадлежит набору временных шагов, которые не являются текущим временным шагом t. Как правило, t ’ состоит только из временных шагов t-1 и t + 1 для выполнения этого повторного проецирования. Использование большего количества временных шагов имеет тенденцию вносить слишком много ошибок из предположений, которые делает алгоритм, которые я объясню позже.

Соответствующие местоположения в t ’, как правило, не являются целыми числами. Некоторые пиксели даже вылетают, из-за чего они больше не попадают в обычную сетку изображения. Когда у нас есть местоположения пикселей с плавающей запятой на временном шаге t ', мы затем используем билинейную интерполяцию, чтобы интерполировать, какие значения RGB должны быть в этих местах, используя исходное изображение t '. Поскольку это те же пиксели из текущего временного шага t, , мы предполагаем, что по мере того, как эти пиксели перемещаются во времени, сцена по-прежнему будет выглядеть так же. Таким образом, наши потери происходят из-за минимизации разницы между нашим вновь синтезированным изображением в процессе повторного проецирования и нашим исходным изображением на временном шаге t. Пытаясь сделать два изображения одинаковыми, наши нейронные сети вынуждены учиться правильно перепроектировать точки. Мы называем это нашей потерей фотометрической согласованности.

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

  1. Окружающая среда статична, что означает, что все движения пикселей происходят из-за движения эго-машины («эго» означает «вы»). Итак, кроме вас самих, нет движущихся объектов. Хотя, чтобы исправить это, мы можем фактически совместно изучить движение объекта с позой и глубиной, которые я объясню в более позднем посте.
  2. Между кадрами нет окклюзии / дезакклюзии. Это никогда не будет правдой, поэтому всегда вносит ошибку в обучение. Всегда возможно, что пиксель на одном временном шаге больше не виден на другом временном шаге или наоборот.
  3. Все поверхности ламбертовские, то есть пиксели всегда будут выглядеть одинаково, независимо от того, под каким углом мы их смотрим.
  4. Между окружающей средой и эго-машиной существует относительное движение. Вы не можете снимать видео с фотоаппарата и ожидать от него чего-нибудь полезного. Неподвижные видеокадры приводят к бесконечному количеству решений для решения уравнения повторного проецирования, что делает процесс повторного проецирования неоднозначным по своей сути. Вот почему алгоритм называется структурой из движения. Мы изучаем структуру окружающей среды, изучая глубину, но это возможно только при наличии относительного движения.
  5. На изображении достаточно текстуры, чтобы сделать фотометрические потери значимыми. Если бы вы снимали на видео идеально белую стену, независимо от того, насколько вы перемещали камеру, все значения пикселей были бы (255, 255, 255). Это означает, что мы можем повторно спроецировать любой пиксель на временном шаге t в любое место на временном шаге t ’, и мы всегда будем получать одни и те же потери. Это потому, что фотометрические потери только пытаются минимизировать различия в значениях RGB. Если все значения RGB одинаковы, у него нет возможности узнать, как пиксели перемещались во времени.

Понимание уравнения повторного проецирования

Уравнение повторного проецирования показано ниже:

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

Определение переменных:

K - Внутренняя матрица камеры 3x3. Он сопоставляет координаты 3D-камеры с координатами 2D-изображения. Для быстрого ознакомления щелкните здесь: http://ksimek.github.io/2013/08/13/intrinsic/.

t - вектор трансляции 3x1. Он переводит точку из кадра координат камеры на текущем временном шаге t в некоторый другой временной шаг .

R - 3x3 матрица вращения. Он поворачивает точку из кадра координат камеры с текущего временного шага t на другой временной шаг tʹ.

z - скаляр 1х1. Глубина в конкретном пикселе или, точнее, насколько далеко этот пиксель от начала координат камеры по оси z.

p - вектор 3x1. Расположение пикселя как вектора в однородном формате [u, v, 1]. По соглашению мы используем (u, v) для обозначения (x, y) местоположения пикселя, и мы используем (x, y, z) для обозначения местоположений в системах координат, которые используют реальные физические единицы, такие как метры. .

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

  1. Он берет пиксель на текущем временном шаге t и проецирует его обратно из системы координат 2D-изображения в систему координат 3D-камеры, используя обратную внутреннюю матрицу и глубину.
  2. Он вращает и переводит нашу точку в системе координат камеры на временном шаге t в другую систему координат камеры на временном шаге tʹ.
  3. Наконец, он применяет внутреннюю матрицу камеры для отображения точки в системе координат камеры на временном шаге обратно в пиксель в плоскости изображения.

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

Еще одна важная вещь, которую следует отметить, заключается в том, что при изучении позы (R, t) мы изучаем только информацию с шестью степенями свободы: три угла поворота и три члена перевода, а не все 9 записей в матрице поворота 3x3. Мы вручную составляем полученные углы поворота в матрицу вращения. Это гарантирует, что сеть узнает действительную матрицу вращения.

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