Назад
62

Знакомство с 3D CV

62

Предисловие

Эта статья предназначена для знакомства и комфортного погружения в область 3D CV. Из нее вы узнаете, что стоит за популярными аббревиатурами SfM, SLAM, NeRF — и какие задачи они решают. Мы специально опустим некоторые детали и уточнения, и расскажем про них в будущих статьях, если получим позитивный отклик.

А для начала давайте поймем, какие задачи решает 3D CV.

Задачи

Автомобили и роботы

Это первое что приходит на ум. И если автомобили только готовятся к массовому использованию и накатывают километры тестов, то автономных роботов используют уже давно. Роботы — это различные пылесосы и газонокосилки, дроны, милые доставщики Яндекса, робособаки Boston Dynamics, манипуляторы на заводах Теслы, роборуки, станки на производстве и так далее.

И всем автономным машинам необходимо ориентироваться в пространстве: вычислять расстояние до объектов, строить 3D карты, детектировать объекты, сегментировать поверхности, а некоторым даже предсказывать поведение объектов на 3D сцене.

VR/AR

Позиционирование в пространстве современных VR/AR устройств основано на восприятии мира через камеры, лидары, гироскопы, акселерометры и прочие датчики.

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

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

В эту же главу можно отнести задачи, в которых нам необходимо отсканировать объект. Например, получить 3D-модель человека и затем отобразить ее в игру или в виртуальную переговорную комнату. Работая с человеком, мы скорее всего будем использовать параметрическую модель, которая накладывает ограничение на результат сканирования. Например, рука не должна расти из ноги, а голова не может повернуться на 180 градусов. Затем мы даже можем анимировать результат нашего сканирования, сделав скан полноценным игровым персонажем.

При этом даже сканирование не анимируемого объекта часто является сложной задачей. Особенно когда перед инженерами встают вопросы:

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

Алгоритмы и инструменты

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

Чем больше сенсоров, тем проще построить “3D слепок” окружения. Самый сложный случай — когда у вас всего одна камера. С двумя уже проще, добавим лидар и сможем быстро и точно оценить расстояние до ближайших объектов, а с радаром оценим расстояние и до дальних.

Модель камеры

Радары и лидары — дорогие устройства, поэтому зачастую приходится обходиться обычными камерами и строить 3D карту по RGB картинкам. Но как по 2D фотографиям воссоздать 3D объект?

Для этого нам нужно получить математическую модель камеры, чтобы знать как 3D точки пространства переводить в 2D координаты пикселей на фото.

Полная модель включает в себя внутренние параметры:

  • матрицу проекции объектива,
  • параметры модели дисторсии (искажений) объектива, и внешние параметры:
  • матрица позиции и ориентации камеры в пространстве.

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

Пример изображения с камеры с сильной дисторсией (прямые линии перестают быть прямыми на фото)

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

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

Structure from Motion (SfM)

После калибровки вы получите функцию, которая позволит отображать 3D точки в 2D координаты изображения. А значит можно будет делать и обратное действие. Но с той лишь оговоркой, что 2D точка обратно будет проецироваться в луч.

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

Проецирование двух 3D точек на 2D плоскость изображения (image plane). Источник

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

Бинокулярная стереосистема камер. Источник

Таким образом, имея несколько фотографии одного объекта/места с разных ракурсов, можно триангулировать точки и строить трехмерный слепок этого объекта — в этом и суть техники Structure from Motion (структура из движения).

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

При помощи SfM можно реконструировать не только отдельные объекты, но и целые города. Существует проект под названием BigSFM, цель которого — воссоздать реконструкцию всего мира по фотографиям из интернета. На сайте проекта есть визуализация результата реконструкции Хорватского города Дубровник

Чтобы проделать подобную работу придется:

  • скачать фотографии из интернета;
  • вычислить внутренние параметры камеры, на которую была сделана каждая фотография (тут поможет информация из EXIF);
  • найти ключевые точки на фотографиях (например, при помощи SIFT);
  • найти пары схожих фотографий, предполагая, что там запечатлен один и тот же объект (для ускорения можно использовать Bag-of-Words);
  • отфильтровать ложные соответствия (RANSAC);
  • построить граф схожести фотографий, проредив узлы, ведь нам не нужны 1000 фотографий одной и той же достопримечательности;
  • выбрать первую пару изображений, откалибровать камеры, вычислить положение точек методом триангуляции;
  • добавлять новые изображения до достижения желаемого результата.

SLAM

Когда у нас нет заранее собранных фотографий и мы хотим решать задачу SfM одновременно с тем, как движемся и снимаем изображения, на помощь приходят методы из класса SLAM (Simultaneous Localisation And Mapping).

Именно SLAM системы живут внутри роботов и машин, которые пытаются куда-то доехать и никуда не врезаться. SLAM нужен и для VR шлемов, которые хотят показывать картинку в 90fps и реактивно позиционироваться в пространстве. Или для приложений дополненной реальности, которые водят вас по городу в поисках места, где вы можете вкусно покушать.

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

Например, если робот движется по помещению, то ему важно точно определять границы объектов, чтобы не врезаться в углы, тонкие ножки стульев и т.д. — нужна плотная реконструкция пространства и достаточно 10fps.

Но если мы мотаем головой в vr шлеме, то нам важен высокий fps, ведь на первом месте скорость и плавность, а плотностью карты ключевых точек можно пожертвовать и работать с разреженной. Задача глобальной консистентности карты тоже сильно облегчена — в конце концов, мы находимся в одной и той же комнате.

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

И для каждой из описанных выше ситуаций подходят свои подклассы SLAM-алгоритмов.

Неявная геометрия (для друзей просто NeRF)

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

В гонке за реалистичностью картинки индустрия развлечений столкнулась с проблемой: на создание реалистичной сцены уходит уйма времени и денег, нужно в явном виде задать всю геометрию в виде сеток полигонов, сделать UV-развётки, нарисовать для каждого объекта десяток разных текстур для моделирования свойств его поверхности, выставить свет. А для достижения фотореализма ещё и рендерить каждый кадр по 3 дня.

Пример интерфейса в Cinema 4D. Источник

Бой устоям трёхмерной графики дали математики, придумавшие представлять трёхмерную сцену не как набор текстурированных полигонов, а виде нейронной сети. Идея следующая: что если мы обучим нейронную сеть, которая сможет по координатам x,y,z в пространстве говорить есть ли там объект и какого цвета его часть в этой координате. Такой подход окрестили Neural Radiance Fields (нейронные поля светимости, то есть сетью предсказывать каким цветом “светится” точка) или кратко NeRF.

Многослойный персептрон принимает на вход координаты точки и углы под которыми точку видит камера. Сеть предсказывает цвет и прозрачность данной точки. Источник.

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

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

На странице, посвященнной статье Representing Scenes as Neural Radiance Fields for View Synthesis есть несколько наглядных видео-примеров с результатами работы модели.

Но как же обучить такую нейронную сеть? Ещё одно преимущество данного семейства методов заключается в простоте сбора данных для обучения. Достаточно иметь набор фотографий объекта. Для каждой картинки можно определить положение камеры, с которой она сделана, с помощью SfM (например, используя COLMAP). А затем обучать сетку, пуская лучи из пикселей этих камер и сравнивать получился ли в них такой же цвет как на фото. Камер много, фотографий много, сеть вынуждена воссоздать 3D сцену так, чтобы всем камерам удовлетворять.

Кажется, что обучение может занять много времени, но современные методы позволяют обучать модели неявной геометрии, такие как NeRF, за считанные секунды: InstanNGP. Кстати неявная геометрия это не только NeRF. Да даже NeRF это не только восстановление объекта по фото.

С помощью методов неявной геометрии можно восстанавливать поверхность объекта, например если мы хотим его потом распечатать на 3D принтере. Такие методы как DeepSDF позволяют произвести сканирование объекта проще и точнее, чем классические подходы. Для этого нейронная сеть предсказывает не цвет и прозрачность точки пространства, а расстояние до ближайшей “поверхности” в этой точке. Для пространсва внутри объекта такие расстояния будут отрицательными, снаружи положительными. То есть мы получим непрерывное пространство, в каждой координате которого мы можем сказать внутри или снаружи объекта эта координата находится. Такое пространство после обучения можно преобразовать в классическую сетку полигонов с помощью алгоритма Marching Cubes. Для этого мы сканируем пространство кубиком с заданным шагом и заменяем участки на предзанные наборы полигонов в зависимости от значений пространства на вершинах куба.

Современные нейронные сети используя методы неявной геометрии могут генерировать 3D сцену по текстовому описанию. Источник.

Из последних достижений в данной области хочется отметить, что современные модели позволяют не останавливать полёт фантазии на сканировании уже существующих объектов. Такие методы как DreamFusion позволяют сгенерировать 3D сцену только по её текстовому описанию! И всё это стало возможным благодаря появлению методов неявной геометрии.

Если вам интересно и дальше погрузиться в тему 3D CV, то поставьте, пожалуйста, реакцию под тг-постом с этой статьей. А лучше напишите в комментариях, какая тема вам интереснее всего из 3D CV — возможно, ее мы и разберем следующей!

Телеграм-канал

DeepSchool

Короткие посты по теории ML/DL, полезные
библиотеки и фреймворки, вопросы с собеседований
и советы, которые помогут в работе

Открыть Телеграм

Увидели ошибку?

Напишите нам в Telegram!