Одноглазый глубиномер

    Недавно вышла интересная статья от FaceBook о том как можно делать неплохой 3D с монокулярных камер. Статья не очень применимая на практике. Но по качеству картинки завораживает:

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


    Начнём с основ. Существует несколько способов снять 3D:

    • Активная 3д камера (лидар, проекционная, TOF). Излучаем-измеряем.

    • Стерео камера. Оцениваем глубину из геометрии.

    • Монокулярные. Используем для оценки глубины либо опыт, либо сдвиг камеры.

    В этой статье мы будем разбирать монокулярное. В чём его сложность? Да вот:

    Эта картинка очень хорошо описывает основную проблему. Даже человек не может оценить глубину с одного ракурса.Что-то может, но точность будет не очень + возможна масса ошибок.

    Как с этим борются? Камера должна двигаться, а место действия не должно меняться. Алгоритмы которые могут собрать из это картинку называются  “SLAM”. Логика там более-менее одинаковая (описываю грубо):

    • На первом кадре выделяем набор фич и кладём их в общий мешок.

    • На каждом новом кадре выделяем фичи, сравниваем их с фичами из мешка.

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

    Вот пример того как это работает из далёкого 2014 года (но вообще было и сильно раньше):

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

    Но это не сложно исправить замерив хотя бы один объект.

    Хорошие SLAM-алгоритмы появились ещё лет десять назад. Сейчас вы можете найти их в AR Core или ARKit, которые доступны почти на каждом телефоне. Вот как это будет выглядеть прямо из коробки без всяких лидаров:

    Эти же алгоритмы используются в:

    • Алгоритмах восстановления 3Д по серии кадров (фотограмметрия)

    • Алгоритмах дополненной реальности для редактирования видео

    • Алгоритмах ориентации в дронах

    • И прочее и прочее…

    Из лучших доступных OpenSource алгоритмов такого плана сейчас есть COLMAP. Он удобно упакован, много исследователей используют его для создания базового решения.
    Но в чём проблем таких алгоритмов?

    Все SLAM алгоритмы не дают достаточную плотность 3D:

    colmap
    colmap
    LSD-SLAM
    LSD-SLAM

    Как с этим борются?

    Подходов много. Раньше были аналитические, а сейчас более популярные - через нейронные сети. Собственно, о двух-трех самых популярных и интересных мы и поговорим.
    Мы будем говорить именно про самые популярные. Почему не про “самые точные”? Это интересный вопрос. Если мы говорим “самые точные”, то мы должны, например, формализовать по какому датасету сравниваем точности. Таких датасетов много.
    Но вот суровый минус - они все специфичные. И зачастую сети имеющие хорошие точности на таких датасетах - работают только на них. Хорошим примером является KITTY:

    Сети оптимизированные и хорошо обученные по нему - будут не очень хорошо работать на других данных.

    При этом зачастую восстановление 3Д это уже не простой констракт плана “проверить на датасете глубину”, а что-то более сложное, такое как “проверить точность восстановления объекта”, или “оценить точность на всей видеопоследовательности”. И тут уже датасетов будет мало, сложно по ним бенчмаркаться.

    Если посмотреть на какой-нибудь сабтаск оценки глубины - Depth Estimation, то по каждому “конкурсу” будет всего одна-две работы.
    Так что смысла говорить о самом точном нет. И я буду рассказывать, на свой взгляд о “самом интересном и полезном”, что показывает разные подходы.

    MiDaS

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

    • Смогли одновременно обучаться на множестве датасетов с разнородными данными. На стереофильмах, на данных с датчиков глубины, на сканах местности, и.т.д.

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

    • Смогли сделать эту модель достаточно быстрой

    Кроме того MiDaS доступен из коробки на разных платформах:

    И то и то можно запустить минут за десять. А результат? В первом приближении как-то так:

    Видно, что тут оценка глубины есть в каждой точке. Но сразу видно что:

    • Видна нестабильность глубины от кадра к кадру

    • Нет абсолютных значений размера (что типично для монокулярных задач)

    • Глубина достаточно неплохо обрабатывается, в том числе для объектов на похожем фоне

    Но, естественно, доверять однозначно таким вещам нельзя:

    Полный скан

    Устранить дрожание во время кадра можно за счёт учёта соседних кадров и нормировки за их счёт. И тут на помочь приходят ранее упомянутые SLAM алгоритмы.С их помощью строят профиль перемещения камеры, делают привязку каждого кадра к общему плану.
    Есть несколько алгоритмов которые такое реализуют. Например Атлас и DELTAS

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

    Второй примерно так же, но чуть сложнее:

    Есть чуть более хитрые подходы, когда нейронная сеть оценивает глубину как Мидас, и проецирует напрямую в TSDF.
    Какая точность у таких методов? Конечно куда меньше чем у любой аппаратуры оснащенной нормальным 3D сканером. Например очередной сканер на iPhone’овском лидаре:

    Consistent Video Depth Estimation

    Можно ли добиться большего, но с монокулярной камеры? Да, можно. Но для этого надо отправляться в сторону алгоритмов которые оценивают глубину по серии кадров в последовательности. Примером такого алгоритма может быть “Consistent Video Depth Estimation”.
    Его особенностью является интересный подход, когда берётся два снимка из последовательности, для которых через ранее упомянутый SLAM оценивают сдвиг. После чего эти два снимка служат инпутом для обучения модели под текущее видео:

    Да-да, для каждого видео обучается (дообучается) отдельная модель.И как-бы основной минус такого подхода - его время. Расчет занимает 4-5 часов на 10-секундное видео. Но результат восхищает:

    Почему я привожу тут видео из примеров? Банально. Потому что запустить эту конструкцию, даже при наличии colab  по своему видео я не смог.

    Но на текущий момент такая штука показывает State-Of-Art в распознавании глубины в видео. А больше примеров можно посмотреть тут.

    В формате видео

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

    Заключение

    В целом, на мой взгляд, для серьёзных задач монокулярный depth не нужен. И в будущем, скорее всего, везде где нужен будет хороший depth - проще будет использовать какой-нибудь лидар, благо точность растет, а цена падает. И в лидарах и в стереокамерах вовсю используются те же самые нейросети. Только вот в лидарах и стереокамерах есть оценка реальной глубины по одному кадру - что делает их априори точнее.
    Но это не отменяет того что сегодня Monocular Depth уже используется в десятках применений где он удобнее. И, возможно, в будущем, за счёт повышения качества, он станет использоваться ещё чаще.

    p.s.

    В последнее время делаю много мелких статей/видеороликов. Но так как это не формат Хабра - то публикую их на своём канале (телега, вк). На Хабре обычно публикую, когда рассказ становится уже более самозамкнутым, иногда нужно 2-3 разных мини-рассказа на соседние темы.

    Recognitor
    Computer Vision and Machine Learning
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 11

      –1
      куда современные технологии пришли

      А что собственно современного или вообще интересного?

      При движущейся (с соблюдением некоторых простейших условий) камере для пары снятых через некоторый временной интервал имеем стандартный случай случай стереопары. Далее — как обычно, feature matching, disparity map,…

      Я для себя уже несколько лет снимаю такие стереопары одной камерой, более того — КАЖДЫЙ это может, просто с рук и чем угодно — телефоном, зеркалкой,… Даже если у вас СЕЙЧАС нечем смотреть — со внуками полюбуетесь и самому будет интересно.
        +4
        Нет. Это не стерео пара.вам заведомо неизвестно ни расстояние между снимками, ни изменение ориентации. Тут нужно как минимум 3 снимка. Дальше для произвольной, некалиброванной камеры добавляется ещё куча параметров, которые нужно оценить и рассчитать.
          +1
          Видео даёт множество «точек съёмки», создание 3D это уже обработка полученных данных. В астрофизике задачи и по сложнее бывают, когда смещение земли относительно наблюдаемого объекта стремится к нулю))
        0
        Самое первое приложение камеры от google добавляло очень приличный эффект боке как раз таким способом — при съемке телефон смещался на 5-10 см. Было это лет 5 или более назад, работало на очень слабом железе — так что в основе было что-то совсем простое. Это конечно не SLAM, но если цель делать фотоэффекты с монокулярной камерой — больше и не нужно. Алгоритмы глубины те же, что для мультикамер + есть промежуточные кадры — как следствие стереобазу можно варьровать, избежать затенения и получить более четкое разделение.
          +7
          8 лет назад, программа моя, жена тоже моя :)
          www.youtube.com/watch?v=-6V---caG9k
            +3
            Класс. Для 2012 года прекрасно. То что я в 2010-2011 году запускал было сильно хуже.
            Но согласитесь, что тот же «Consistent Video Depth Estimation» — неплохой прогресс с тех пор?:)
              +1
              Да, очень неплохо. Но мееедленнноооо. Впрочем иногда это и неважно.
            0
            можно же еще реконструировать 3D только из одного 2D изображения, используя самообучающуюся нейронную сеть. То есть сначала создается 3D, потом с помощью трассировки лучей строится двумерная фотография этой модели из некоторой точки обзора. Затем она сравнивается со входным изображением.

            Вот один из примеров. https://arxiv.org/abs/1807.09259
              0
              Ну, там не всегда трассировка. Есть напрямую сетки которые в воксельный объем проецируют. Только вот у таких задач есть одна проблема — не понятно зачем на практике оно.

              На прошлом коллоквиуме новогоднем, который Лемпицкий устраивает, я общался с автором одного из State-of-art алгоритмов на тот период (к сожалению не помню как его звали, помню что из Германии группа). И у них это прямо проблема. Очень мало где реально нужны эти алгоритмы. Они смогли какую-то задачу придумать чтобы на практике попробовать, и это был большой прогресс.
              Но на практике проще либо использовать нормальный 3D на вход, либо использовать какой-нибудь SLAM алгоритм. Либо, если объект фиксированный, то использовать известную 3д модель, и её натягивать.

              Так что решил вообще не трогать этот сегмент.
                +1
                В моей задаче нужно с помощью нейронной сети измерить фенотип растения, то есть измерить параметры. Желательно при этом также иметь трехмерную модель, чтобы демонстрировать ее биологам. И тут как раз планируется использовать уже созданную для конкретного растения 3д модель, натягивать ее на конкретную фотографию, и как раз из параметров этого подгона определять искомые величины.

                В этой задаче как бы не обязательно подавать 3д на вход. Но честно говоря, мне кажется, что лаборатория хочет просто повыеживаться, и показать, смотрите, что мы можем не только решить поставленную биологами задачу, но еще и сделать это только с одного изображения, с монокамеры и без обучения. Чтобы было какое-то новшество еще и в сегменте компьютерного зрения. Аргументируется это тем, что дорого и долго делать по нескольку фотографий.
                  +1
                  Боже. Вообще растения — самый треш для 3D. Даже для хороших сканеров.
                  Но если пробовать натянуть готовую модельку — то это наверное сильно проще. Мы часто для анализа параметров 3D объектов так делали. Но это сильно более стабильные объекты чем растения были.

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

            Самое читаемое