Изменения

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

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

29 076 байт добавлено, 17:43, 23 января 2021
Прогнозирование глубины без датчиков: использование структуры для обучения без учителя по монокулярным видео (2019)
'''Карта глубины''' (англ. 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>). Проекторы обычно работают в инфракрасном спектре, чтобы не мешать пользователям. Поскольку камера и проектор смещены друг относительно друга, то и полоски также будут смещаться пропорционально расстоянию до объекта. Измеряя это смещение, мы можем рассчитывать расстояние до объекта. Вполне понятны сложности, с которыми можно столкнуться при использовании этого метода: это необходимость настройки и калибровки проектора, и проблема того, что нам нужно относительно благоприятное освещение. К примеру, солнце может засветить полосы, и что-то распознать будет тяжело. == Построения карты глубины по стереопаре == Идея, лежащая в основе построения карты глубины по '''стереопаре''', проста. Для каждой точки на одном изображении выполняется поиск [[Ключевые точки изображения|парной ей точки]]<sup>[на 21.01.21 не создан]</sup> на другом изображении. А по паре соответствующих точек можно выполнить [[Триангуляция полигонов (ушная + монотонная)|триангуляцию]] и определить координаты их [[Отображения|прообраза]] в трехмерном пространстве. Зная трехмерные координаты прообраза, глубина вычисляется как расстояние до плоскости камеры. Парную точку нужно искать на эпиполярной<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. Результат построения карты смещений по двум картинкам.<ref name="img2"> "Основы стереозрения" Рис. 3 [https://habr.com/ru/post/130300/]</ref>]] После того, как изображения '''ректифицированы''', выполняют поиск соответствующих пар точек. Для каждого пикселя одной картинки с координатами <math>(x_0, y_0)</math> выполняется поиск пикселя на другой картинке. При этом предполагается, что пиксель на второй картинке должен иметь координаты <math>(x_0 - d, y_0)</math>, где <math>d</math> — величина называемая смещением. Поиск соответствующего пикселя выполняется путем вычисления максимума функции отклика, в качестве которой может выступать, например, [[Корреляция случайных величин|корреляция]] окрестностей пикселей. В результате получается карта смещений, пример которой приведен на рис. 2.  Собственно значения глубины обратно пропорциональны величине смещения пикселей. == Использование нейронных сетей == Существует множество методов, использующих нейронные сети. Приведём пару примеров таких решений. === Построение с помощью свёрточных нейронных сетей === Используем [[Сверточные нейронные сети|сверточные нейронные сети]] для построения карты глубины следующим образом<ref name="cnn_rew"> Xiaobai Ma, Zhenglin Geng, Zhi Bie "Depth Estimation from Single Image Using CNN-Residual Network" [http://cs231n.stanford.edu/reports/2017/pdfs/203.pdf]</ref>: * '''Создаем карту смещений''': используя два изображения с камер, близко расположенных друг к другу, создаем карту различий, точно так же как в методе построения по стереопаре. * '''Ищем реальную карту глубины для обучения''': с помощью карты смещений, можем построить карту глубины <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 для <math>d_i</math>, т.е. <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-Scale Deep Network" стр. 5</ref>  * '''Обучение свёрточной нейронной сети''': далее идёт обычное обучение нейронной сети по карте различий путем обратного распространения ошибки, оптимизируя заданную выше функцию потерь. В итоге, по обученной нейронной сети мы можем создавать карту глубины, не проводя расчётов для поиска карт смещения и имея только изображение объекта или пространства. <ref name="cnn">Реализация, основанная на свёрточных нейронных сетях [https://www.kaggle.com/kmader/cnn-for-generating-depth-maps-from-rgb-images]</ref> Также возможно использование усложнённых архитектур свёрточных нейронных сетей типа '''DenseNet'''. '''DenseNet'''<ref name="DenseNet">Оригинальная статья описывающая DenseNet [https://arxiv.org/abs/1611.09326]</ref> {{---}} это свёрточная нейронные сеть, в которой выход каждого из слоев подаётся на вход всем слоям, лежащих ниже. === Построение с помощью капсульных нейронных сетей === Свёрточные нейронные сети способны регистрировать только наличие какого-либо объекта на картинке, не кодируя его ориентацию и положение. Но '''капсульные нейронные сети''' (англ. Capsule Neural Network)<ref name="CapsNet">Sara Sabour, Nicholas Frosst, Geoffrey E. Hinton "Dynamic Routing Between Capsules" [https://arxiv.org/pdf/1710.09829.pdf]</ref> лишены этого недостатка. [[Файл: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 (2018)=== Так же есть архитектуры, решающие данную задачу и без обучения на карте смещений, построенной с помощью двух изображений. Одной из таких является '''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 net2.jpg|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$ плоских поверхностей, каждая поверхность задаётся тремя параметрами <math>P_i</math>: нормальная, прямая и сдвиг. Функцию ошибки определим следующим образом: <math>L = \sum_{i=1}^{K} \min_{j \in [1, \hat K]} \| \hat P_j - P_i \|</math>, где <math>\hat K, \hat P_i</math> и <math>K, P_i</math>, предсказанные и реальные количество и параметры плоскостей, соответственно. * [[Сегментация изображений|'''Сегментация плоскости''']]: ищем группы пикселей, каждая из которых характеризует один смысловой объект. Используем перекрёстную энтропию<ref name="cross-entropy"> О перекрёстной энтропии [https://ml-cheatsheet.readthedocs.io/en/latest/loss_functions.html]</ref>, как функцию потерь. * '''Неплоская карта глубины''': ищем одно-канальную (или неплоскую) карту глубины, то есть карту глубины, где каждый пиксель, либо на глубине 0, либо на глубине 1.Авторы обучали и тестировали данные на NYUv2<ref>Датасет NYUv2[https://cs.nyu.edu/~silberman/datasets/nyu_depth_v2.html]</ref>. === Обучение без учителя поиска карты глубины из видео (2017) === Авторы данной статьи <ref name="cvrp_dnn">Tinghui Zhou, Matthew Brown, Noah Snavely, David G. Lowe "Unsupervised Learning of Depth and Ego-Motion from Video" [https://arxiv.org/abs/1704.07813v2]</ref> предлагают методику оценки глубины одной картинки без учителя и движения камеры из беспорядочной видео нарезки.  [[Файл:Dnn.jpeg|thumb|400px| Рисунок 5. Aрхитектура сети на базе DispNet <ref name="cvrp">Tinghui Zhou, Matthew Brown, Noah Snavely, David G. Lowe "Unsupervised Learning of Depth and Ego-Motion from Video" Figure 4</ref>]] Будем использовать сверточные нейронные сети c глубиной одного вида и многовидовой камерой из неупорядоченного видеоряда. Метод базируется на синтезе видов. Сеть загружает фото объекта в игру качестве данных ввода и выводит глубину пикселя. Вид объекта может быть синтезирован исходя из глубины на каждого пикселя снимка позиционирования и четкости ближнего вида. Синтез может быть дифференцирован с виртуальной реальностью CNN по геометрии и модулям позиционирования.Авторы взяли на вооружение архитектуру DispNet<ref name="dispNet"> Nikolaus Mayer, Eddy Ilg, Philip Hausser, Philipp Fischer "A Large Dataset to Train Convolutional Networksfor Disparity, Optical Flow, and Scene Flow Estimation" [https://arxiv.org/pdf/1512.02134.pdf]</ref>, которая сконструирована в виде энкодера и декодера с пропущенными соединениями и многомасштабными блоками предсказания. Функция активации ReLU отслеживает все сверточные слои кроме предсказанных.Вид объекта со всех источников формирует входные данные в сеть позиционной оценки. На выходе получается относительная позиция между видом объекта и видом каждого источника. Сеть состоит из двух 7 шаговых сверток за которым следует свертка 1 х 1. За исключением последнего слоя свертки, где применяется нелинейная активация, все другие отслеживаются функцией активации ReLU. Сеть объяснимых предсказаний дает доступ к первым пяти закодированным слоям сети позиционирования. За ней следуют 5 слоев обратной свертки с многомасштабными блоками предсказаний. Кроме слоев предсказаний все уровни свертки и обратной свертки отслеживаются ReLU. Авторы проверяли данную методику на KITTY<ref> Датасет kitty[http://www.cvlibs.net/datasets/kitti/]</ref>. === Неконтролируемая оценка глубины монокуляра с консистенцией слева направо (2017) === [[Файл:Samplers.jpg|thumb|240px| Рисунок 6. Примерная архитектура сети с консистенцией слева направо <ref name="cvrp2017">Clément Godard, Oisin Mac Aodha, Gabriel J. Brostow "Unsupervised Monocular Depth Estimation with Left-Right Consistency" Figure 3 </ref>]] В данной работе<ref name="leftrigth"> Clément Godard, Oisin Mac Aodha, Gabriel J. Brostow "Unsupervised Monocular Depth Estimation with Left-Right Consistency" [https://arxiv.org/abs/1609.03677v3]</ref> предлагается сверточная нейронная сеть, обученная выполнять оценку глубины одного изображения без реальных данных. Авторы предлагают сетевую архитектуру, которая выполняет сквозную оценку глубины изображения, полученного с 1 камеры, без учителя, что обеспечивает согласованность глубины слева направо внутри сети.Сеть оценивает глубину, выводя смещения, которые искажают левое изображение, чтобы соответствовать правому. Левое входное изображение используется для вывода смещений слева направо и справа налево. Сеть генерирует предсказанное изображение с обратным отображением с помощью билинейного сэмплера. Это приводит к полностью дифференциальной модели формирования изображения.Сверточная архитектура вдохновлена так же DispNet'ом. Она состоит из двух частей—кодера и декодера. Декодер использует пропуск соединений из блоков активации кодера, чтобы распознавать детали с высоким разрешением. Сеть предсказывает две карты смещений — слева направо и справа налево.В процессе обучения сеть генерирует изображение путем выборки пикселей из противоположного стереоизображения. Модель формирования изображения использует сэмплер изображений из пространственной трансформаторной сети (STN) для выборки входного изображения с помощью карты смещений. Авторы обучали и тестировали данные на KITTY. === Прогнозирование глубины без датчиков: использование структуры для обучения без учителя по монокулярным видео (2019) === [[Файл:ego.jpeg|thumb|500px| Рисунок 7. Сравнение обычного метода построения карты глубин с помощью эго-движения и предложенного в статье, который использует движения для различных 3D объектов <ref name="aaaif">Vincent Casser, Soeren Pirk, Reza Mahjourian, Anelia Angelova "Depth Prediction Without the Sensors: Leveraging Structure for Unsupervised Learning from Monocular Videos" Figure 2 </ref>]] '''Визуальная одометрия''' <ref name="визуальная одометрия">Статья о визуальной одометрии[https://en.wikipedia.org/wiki/Visual_odometry]</ref> {{---}} метод оценки положения и ориентации робота или иного устройства в пространстве с помощью анализа последовательности изображений, снятых установленной на нем камерой. Данная статья <ref name="aaai"> Vincent Casser, Soeren Pirk, Reza Mahjourian, Anelia Angelova "Depth Prediction Without the Sensors: Leveraging Structure for Unsupervised Learning from Monocular Videos" [https://arxiv.org/abs/1811.06152v1]</ref> посвящена задаче обучения без учителя глубины сцены и визуальной одометрии робота, где наблюдение обеспечивается видеозаписями с одной камеры. Это делается путем введения геометрической структуры в процесс обучения. Он включает в себя моделирование сцены и отдельных объектов, одометрии камеры и движения объектов, изучаемых с помощью монокулярных видеовходов. Авторы вводят модель движения объекта, которая имеет ту же архитектуру, что и сеть определения визуальной одометрии. Она принимает последовательность изображений RGB в качестве входных данных и дополняется предварительно вычисленными масками сегментации экземпляров. Работа модели движения заключается в том, чтобы научиться предсказывать векторы трансформации каждого объекта в трехмерном пространстве. Это создает видимость наблюдаемого объекта в соответствующем целевом кадре. Авторы проверяли прогнозирование глубины на KITTY.
== См. также ==
== Источники информации ==
* Чугунов Р.А. Чугунов, Кульневич А.Д. Кульневич, Аксенов С.В. Аксенов "Методика построения карт глубины стереоизображения с помощью капсульной нейронной сети" //Доклады Томского государственного университета систем управления и радиоэлектроники. – 2019. – Т. 22. – №. 1.[filehttps://cyberleninka.ru/tmparticle/mozilla_frak0n/metodika-postroeniya-kart-glubiny-stereoizobrazheniya-s-pomoschyu-kapsulnoy-neyronnoy-seti/viewer] * Alhashim I., Wonka P. High quality monocular depth estimation via transfer learning. arXiv 2018 //arXiv preprint arXiv:1812.11941.[https://arxiv.org/pdf/1812.11941.pdf] * Eigen D., Puhrsch C., Fergus R. Depth map prediction from a single image using a multi-scale deep network //Advances in neural information processing systems. – 2014. – Т. 27. – С. 2366-2374. [https://arxiv.org/pdf/1406.2283.pdf] * Prakash S., Gu G. Simultaneous localization and mapping with depth prediction using capsule networks for uavs //arXiv preprint arXiv:1808.05336. – 2018. [https://arxiv.org/pdf/1808.05336.pdf] * Ma X., Geng Z., Bie Z. Depth Estimation from Single Image Using CNN-Residual Network //SemanticScholar. – 2017. [https://www.semanticscholar.org/paper/Depth-Estimation-from-Single-Image-Using-Network-Geng/d79e7fc68e088f094a22910049117e586705bb7d?p2df] [[Категория:Машинное обучение]] [[Категория: Компьютерное зрение]]
Анонимный участник

Навигация