Изменения

Перейти к: навигация, поиск

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

2597 байт добавлено, 23:36, 20 января 2021
Построение с помощью PlanetNet
'''Карта глубины''' (англ. depth map) — это изображение, на котором где для каждого пикселя вместо цвета хранится его расстояние до камеры.<ref name="def">Alexey Kurakin "Основы стереозрения"[https://habr.com/ru/post/130300/]</ref>
В компьютерной 3D-графике и [[Компьютерное зрение|компьютерном зрении]] карта глубины представляет собой изображение или канал изображения, содержащий информацию о расстоянии поверхностей объектов сцены от точки обзора.
== Мотивация ==
Карта глубины изображения содержит в себе информацию о расстоянии между различными объектами или частями объектов, представленных на данном изображении. Эта информация может быть полезна для во многих областях. * Для создания 3D-сенсоровсенсеров. Такие сенсоры, способные Они способны строить трёхмерную картину своего окружения, используются для [[Оценка положения|ориентации]] автономного робота в пространстве или . * Для систем, использующих технологии дополненной и виртуальной реальности. Например, камеры, которые фиксируют действия пользователя при игре в видеоигру, использующую технологию видеоиграх с технологией виртуальной реальности. Нельзя не отметить, беспилотные автомобили * В беспилотных автомобилях, которые так же также используют карты глубин для ориентации на дороге. Также  * Для обработки фотографий. Например, карты глубин используют для размытия фона на фотографии, чтобы добиться более чёткого выделения на ней человека<ref name="expls">Примеры из "Research Guide for Depth Estimation with Deep Learning"[https://www.kdnuggets.com/2019/11/research-guide-depth-estimation-deep-learning.html]</ref>.
== Методы построения карты глубины ==
== Построение с помощью специальных камер глубин ==
[[Файл:ToF.jpg|thumb|250px| рис. Рисунок 1. Пример работы ToF-камеры.]]
* '''ToF-камеры''' (англ. Time of Flight). Следующий способ получения глубины интереснее. Он Данный метод основан на измерении задержки света. Фактически нам нужно измерить задержку, с которой свет возвращается в каждую точку. Либо, если у нас Имея несколько сенсоров с разным временем накопления заряда, то, и зная сдвиг по времени относительно источника для каждого сенсора и снятой яркости вспышки, мы можем рассчитать сдвиг и, соответственно, расстояние до объекта. Причем, причем увеличивая количество чем больше сенсоров — увеличиваем задействовано, тем выше точностьметода.
* '''Структурированные световые камеры''' (aнгл. Structured light camera). Это один из самых старых и дешёвых способов построить карту глубин. Основная идея крайне проста. Ставим рядом проектор, который создает, например, горизонтальные (а потом и вертикальные) полоски и рядом камеру, которая снимает картину с полосками. В некоторых вариантах используются используется псевдослучайный набор точек (MS Kinect{{---}} бесконтактный сенсорный игровой контроллер, для консолей Xbox 360, Xbox One и персональных компьютеров под управлением ОС Windows<ref name="kinect"> О MicriSoft Kinect [https://en.wikipedia.org/wiki/Kinect]</ref>.). Проекторы обычно работают в инфракрасном спектре, очевидно, чтобы не мешать пользователям. Поскольку камера и проектор смещены друг относительно друга, то и полоски также будут смещаться пропорционально расстоянию до объекта. Измеряя это смещение, мы можем рассчитывать расстояние до объекта. Вполне понятны проблемысложности, с которыми можно столкнуться при использовании этого метода: это необходимость настройки и калибровки проектора, и проблема того, что нам нужно относительно благоприятное освещение. К примеру, солнце может засветить полосы, и что-то распознать будет тяжело.
== Построения карты глубины по стереопаре ==
Идея, лежащая в основе построения карты глубины по '''стереопаре''', очень проста. Для каждой точки на одном изображении выполняется поиск [[Ключевые точки|парной ей точки ]] на другом изображении. А по паре соответствующих точек можно выполнить [[Триангуляция полигонов (ушная + монотонная)|триангуляцию]] и определить координаты их [[Отображения|прообраза]] в трехмерном пространстве. Зная трехмерные координаты прообраза, глубина вычисляется как расстояние до плоскости камеры.
Парную точку нужно искать на эпиполярной<ref name="Epipolar">Информация о эпиполярной геометрии[https://ru.qaz.wiki/wiki/Epipolar_geometry]</ref> линии. Соответственно, для упрощения поиска изображения выравнивают так, чтобы все эпиполярные линии были параллельны сторонам изображения (обычно горизонтальны). Более того, изображения выравнивают так, чтобы для точки с координатами <math>(x_0, y_0)</math> соответствующая ей эпиполярная линия задавалась уравнением <math>x = x_0</math>. Тогда для каждой точки, соответствующую ей парную точку, нужно искать в той-же строчке на изображении со второй камеры. Такой процесс выравнивания изображений называют '''ректификацией''' (rectification).
[[Файл:Stereo.png|thumb|300px| рис. Рисунок 2. Результат построения карты смещений по 2 картинкам.<ref name="img2"> "Основы стереозрения" Рис. 3 [https://habr.com/ru/post/130300/]</ref>]]
После того, как изображения '''ректифицированы''', выполняют поиск соответствующих пар точек. Для каждого пикселя одной картинки с координатами <math>(x_0, y_0)</math> выполняется поиск пикселя на другой картинке. При этом предполагается, что пиксель на второй картинке должен иметь координаты <math>(x_0 - d, y_0)</math>, где d — величина называемая смещением. Поиск соответствующего пикселя выполняется путем вычисления максимума функции отклика, в качестве которой может выступать, например, [[Корреляция случайных величин|корреляция]] окрестностей пикселей. В результате получается карта смещений, пример которой приведен на рис. 2.
== Использование нейронных сетей ==
Существует множество решений данной проблемыметодов, использующих нейронные сети. Приведём пару примеров таких решений.
=== Построение с помощью свёрточных нейронных сетей ===
Используем [[Сверточные нейронные сети|сверточные нейронные сети]] для построения карты глубины следующим образом:
* '''Создаем карту смещений''': используя 2 два изображения с камер, близко расположенных друг у к другу, создаем карту различий, точно так же как в методе построения по стереопаре.
* "'''Ищем реальную карту глубины для обучения"''': с помощью карты смещений, можем построить карту глубины <math>y</math> вышеописанным способом. Также допустимы другие способы построения карты глубины для обучения нейронной сети.
* '''Функция потерь''': определим [[Функция потерь и эмпирический риск|функцию потерь]], для предсказанной карты <math>\hat y</math>, <math>d_i = log( y_i) - log (\hat y_i)</math>, <math>\lambda \in [0, 1]</math> и <math>n </math> - количество пикселей. Где <math>L(y, \hat y) = \frac{1}{n} \sum\limits_{i} d^2_i - \frac{\lambda}{n^2}(\sum\limits_{i} d_i)^2</math>, где <math>y_i</math> и <math>\hat y_i</math> это гиперпараметр i пискель для для реальной карты глубин и для предсказанной карты, соответственно. Гиперпараметр <math>\lambda</math>, который нужен для того, чтобы функция потерь меньше росла при большом количестве пикселей, предсказание для которых достаточно близко к реальному. Например, если <math>\lambda = 0</math>, то мы просто придём к оптимизации в L2. для <ref name="loss"math>David Eigen, Christian Puhrsch, Rob Fergus "Depth Map Prediction from a Single Imageusing a Multi-Scale Deep Network" стр. 5d_i</refmath , т.е. <math>L(y, \hat y) = \frac{1}{n} \sum\limits_{i} d^2_i </math>.<ref name="loss">David Eigen, Christian Puhrsch, Rob Fergus "Depth Map Prediction from a Single Imageusing a Multi- \frac{\lambda}{n^2}(\sum\limits_{i} d_i)^2Scale Deep Network" стр. 5</mathref>
* '''Обучение свёрточной нейронной сети''': далее идёт обычное обучение нейронной сети по карте различий путем обратного распространения ошибки, оптимизируя заданную выше функцию потерь.
В итоге, по обученной нейронной сети мы можем создавать карту глубины, не проводя расчётов для поиска карт смещения и имея только изображение объекта или пространства. <ref name="cnn">Реализация, основанная на свёрточных нейронных сетях [https://www.kaggle.com/kmader/cnn-for-generating-depth-maps-from-rgb-images]</ref>
Также возможно использование усложнённых архитектур свёрточных нейронных сетей типа '''DenseNet'''<ref name=""> Ibraheem Alhashim, Peter Wonka "High Quality Monocular Depth Estimation via Transfer Learning" [https://arxiv.org/pdf/1812.11941.pdf]</ref>.
'''DenseNet'''<ref name="DenseNet">Оригинальная статья описывающая DenseNet [https://arxiv.org/abs/1611.09326]</ref> {{---}} это свёрточная нейронные сеть, в которой выход каждого из слоев подаётся на вход всем слоям, лежащих ниже.
=== Построение с помощью капсульных нейронных сетей ===
Сверточные нейроные сети имеют недостаток в распознавании объектов на картинке. Нейронные Свёрточные нейронные сети способны регистрировать только наличие какого -либо объекта на картинке, не кодируя его ориентацию и положение. Но '''капсульные нейронные сети''' (англ. Capsule Neural Network) лишены этого недостатка.
[[Файл:capsnet.jpg|thumb|400px| рис. Рисунок 3. Структура капсульной нейронной сети <ref name="img"> "Design and Investigation of Capsule Networks for Sentence Classification" Figure 2. [https://www.mdpi.com/2076-3417/9/11/2200/htm]</ref>.]]
"Капсульная нейронная сеть" состоит из капсул или групп нейронов, чтобы идентифицировать закономерности в изображении. Эта информация поступает в виде векторов, содержащих ориентацию и положение узоров на изображении, которое затем принимается капсулами более высокого уровня. Капсулы более высокого уровня обрабатывают эту информацию из нескольких капсул более низкого уровня и впоследствии выдают прогноз. Капсулы одного уровня не имеют связей друг с другом и вычисляют информацию независимо друг от друга. Капсулы образуется образуются путем разделения выходных данных из сворачивающего свёрточного слоя. Мы делим наш трехмерный вектор на капсулы методом "нарезания" таким образом, чтобы в каждой капсуле была информация о каждом пикселе, т.е. по трехмерной координате.
Состояние нейронов капсульной нейронной сети внутри изображения фиксирует свойство области или объекта внутри изображения: его положение и ориентацию.
Использование капсульной нейронной сети аналогично с использованию обычных свёрточных сетей, описанное описанному выше.
В целом, данная сеть показывает более точные результаты предсказания глубины.
 
=== Построение с помощью PlanetNet ===
 
Так же есть архитектуры, решающие данную задачу и без обучения на карте смещений, построенной с помощью двух изображений. Одной из таких является '''PlaneNet'''.
 
'''PlaneNet'''<ref name="planetNet"> Chen Liu, Jimei Yang, Duygu Ceylan, Ersin Yumer, Yasutaka Furukawa "PlaneNet: Piece-wise Planar Reconstruction from a Single RGB Image" [https://arxiv.org/abs/1804.06278v1]</ref> {{---}} глубокая нейронная сеть, построенная на расширенных остаточных сетях (aнгл. Dilated Residual Networks или DRN)<ref name="drn"> Fisher Yu, Vladlen Koltun, Thomas Funkhouser "Dilated Residual Networks" [https://arxiv.org/abs/1705.09914]</ref>. Она получает карту глубин путем композиции выходов трех подзадач:
 
[[Файл:plane_net.png|thumb|500px| Рисунок 4. Прогнозируемые PlaneNet параметры по одной rgb картинке: cегметация плоскости, параметры плоскостей, неплоская карта глубины<ref name="img4"> Chen Liu, Jimei Yang, Duygu Ceylan, Ersin Yumer, Yasutaka Furukawa "PlaneNet: Piece-wise Planar Reconstruction from a Single RGB Image" Figure 2.</ref>.]]
 
* '''Параметры плоскостей''': пытаемся предсказать количество плоскостей K, а после ищем на изображение K плоских поверхностей, каждая поверхность задаётся тремя параметрами: нормальная, прямая и сдвиг.
 
* [[Сегментация изображений|'''Сегментация плоскости''']]: ищем группы пикселей, каждая из которых характеризует один смысловой объект.
 
* '''Неплоская карта глубины''': ищем одно-канальную (или неплоскую) карту глубины, то есть карту глубины, где каждый пиксель, либо на глубине 0, либо на глубине 1.
== См. также ==
Анонимный участник

Навигация