Чтобы распознавать картинки, не нужно распознавать картинки

    Посмотрите на это фото.



    Это совершенно обычная фотография, найденная в Гугле по запросу «железная дорога». И сама дорога тоже ничем особенным не отличается.

    Что будет, если убрать это фото и попросить вас нарисовать железную дорогу по памяти?

    Если вы ребенок лет семи, и никогда раньше не учились рисовать, то очень может быть, что у вас получится что-то такое:


    Упс. Кажется, что-то пошло не так.

    1. The strange way we see things


    Давайте еще раз вернемся к рельсам на первой картинке и попробуем понять, что не так.

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

    Еще один замечательный пример — как маленькие дети рисуют небо.


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

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

    На самом деле все еще хуже. Каким образом, например, на самой первой картинке с дорогой мы определяем, какая часть дороги расположена ближе к нам, а какая дальше? По мере удаления предметы становятся меньше, ок — но вы уверены, что кто-то не обманул вас, коварно разместив друг за другом последовательно уменьшающиеся шпалы? Далекие объекты обычно имеют бледно-голубоватый оттенок (эффект, который называется «атмосферная перспектива») — но предмет может быть просто окрашен в такой цвет, и в остальном казаться совершенно нормальным. Мост через железнодорожные пути, который едва видно отсюда, кажется нам находящимся позади, потому что его заслоняют фонари (эффект окклюзии) — но опять-таки, как вы можете быть уверены, что фонари просто не нарисованы на его поверхности? Весь этот набор правил, с помощью которых вы оцениваете трехмерность сцены, во многом зависит от вашего опыта, и возможно, генетического опыта ваших предков, обученных выживать в условиях нашей атмосферы, падающего сверху света и ровной линии горизонта.

    Сама по себе, без помощи мощной аналитической программы в вашей голове, наполненной этим визуальным опытом, любая фотография говорит об окружающем мире ужасно мало. Изображения — это скорее такие триггеры, заставляющие вас мысленно представить себе сцену, большая часть знаний о которой уже есть у вас в памяти. Они не содержат реальных предметов — только ограниченные, сплющенные, трагически двумерные представления о них, которые, к тому же, постоянно меняются при движении. В чем-то мы с вами — такие же жители Флатландии, которые могут увидеть мир только с одной стороны и неизбежно искаженным.
    больше перспективы
    Вообще мир вокруг прямо-таки полон свидетельств того, как перспектива все искажает. Люди, поддерживающие пизанскую башню, фотографии с солнцем в руках, не говоря уже про классические картины Эшера, или вот совершенно прекрасный пример — Комната Эймса. Тут важно понять, что это не какие-то единичные подлянки, специально сделаные для того, чтобы обманывать. Перспектива всегда показывает нам неполноценную картинку, просто как правило, мы способны ее «раскодировать». Попробуйте выглянуть в окно и подумать, что то, что вы видите — обман, искажение, безнадежная неполноценность.


    2. Images are not real, Neo


    Представьте, что вы — нейронная сеть.

    Это не должно быть очень сложно — в конце концов, как-то так оно и есть на самом деле. Вы проводите свободное время за распознаванием лиц на документах в паспортном столе. Вы — очень хорошая нейронная сеть, и работа у вас не слишком сложная, потому что в процессе вы ориентируетесь на паттерн, строго характерный именно для человеческих лиц — взаимное расположение двух глаз, носа и рта. Глаза и носы сами по себе могут различаться, какой-то один из признаков иногда может оказаться на фотографии неразличимым, но вам всегда помогает наличие других. И вдруг вы натыкаетесь вот на такое:

    image

    Хм, думаете вы. Вы определенно видите что-то знакомое — по крайней мере, в центре, кажется, есть один глаз. Правда, странной формы — он похож на треугольник, а не на заостренный овал. Второго глаза не видно. Нос, который должен располагаться посередине и между глаз, уехал куда-то совсем в край контура, а рта вы вообще не нашли — опредленно, темный уголок снизу-слева совсем на него не похож. Не лицо — решаете вы, и выбрасываете картинку в мусорное ведро.

    Так бы мы думали, если бы наша зрительная система занималась простым сопоставлением паттернов в изображениях. К счастью, думает она как-то по-другому. У нас не вызывает никакого беспокойства отсутствие второго глаза, от этого лицо не становится менее похожим на лицо. Мы мысленно прикидываем, что второй глаз должен находиться по ту сторону, и форма его обусловлена исключительно тем, что голова на фото повернута и смотрит в сторону. Кажется невозможно тривиальным, когда пытаешься это объяснить на словах, но кое-кто с вами бы на полном серьезе не согласился.

    Самое обидное, что не видно, как можно решить этот вопрос механическим способом. Компьютерное зрение сталкивалось с соответствующими проблемами очень давно, с момента своего появления, и периодически находило эффективные частные решения — так, мы можем опознать сдвинутый в сторону предмет, последовательно передвигая свой проверочный паттерн по всему изображению (чем успешно пользуются сверточные сети), можем справляться с отмасштабированными или повернутыми картинками с помощью признаков SIFT, SURF и ORB, но эффекты перспективы и поворот предмета в пространстве сцены — похоже, вещи качественно другого уровня. Здесь нам нужно знать, как предмет выглядит со всех сторон, получить его истинную трехмерную форму, иначе нам не с чем работать. Поэтому чтобы распознавать картинки, не нужно распознавать картинки. Они лживы, обманчивы и заведомо неполноценны. Они — не наши друзья.

    3. Наконец, к практике (на самом деле нет)


    Итак, важный вопрос — как бы нам получать трехмерную модель всего, что мы видим? Еще более важный вопрос — как при этом обойтись без необходимости покупать лазерный пространственный сканер (сначала я написал «чертовски дорогой лазерный сканер», а потом наткнулся на этот пост)? Даже не столько по той причине, что нам жалко, а потому, что животные в процессе эволюции зрительной системы явно каким-то образом обошлись без него, одними только глазами, и было бы любопытно выяснить, как они так.

    Где-то в этом месте часть аудитории обычно встает и выходит из зала, ругаясь на топтание по матчасти — все знают, что для восприятия глубины и пространства мы пользуемся бинокулярным зрением, у нас для этого два специальных глаза! Если вы тоже так думаете, у меня для вас небольшой сюрприз — это неправда. Доказательство прекрасно в своей простоте — достаточно закрыть один глаз и пройтись по комнате, чтобы убедиться, что мир внезапно не утратил глубины и не стал походить на плоский аналог анимационного мультфильма. Еще один способ — вернуться и снова посмотреть на фотографию с железной дорогой, где замечательно видно глубину даже при том, что она расположена на полностью плоской поверхности монитора.
    Вообще с двумя глазами все не так просто
    Для некоторых действий они, похоже, и правда приносят пользу с точки зрения оценки пространственного положения. Возьмите два карандаша, закройте один глаз и попытайтесь сдвигать эти карандаши так, чтобы они соприкоснулись кончиками грифелей где-то вблизи вашего лица. Скорее всего, грифели разойдутся, причем ощутимо (если у вас получилось легко, поднесите их еще ближе к лицу), при этом со вторым открытым глазом такого не происходит. Пример взят из книги Марка Чангизи «Революция в зрении» — там есть целая глава о стереопсисе и бинокулярном зрении с любопытной теорией о том, что два смотрящих вперед глаза нужны нам для того, чтобы видеть сквозь мелкие помехи вроде свисающих листьев. Кстати, забавный факт — на первом месте в списке преимуществ бинокулярного зрения в Википедии стоит «It gives a creature a spare eye in case one is damaged».


    Итак, бинокулярное зрение нам не подходит — и вместе с ним мы отвергаем стереокамеры, дальномеры и Kinect. Какой бы ни была способость нашей зрительной системы воссоздавать трехмерные образы увиденного, она явно не требует наличия двух глаз. Что остается в итоге?

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

    Вернемся к теме поездов, только на этот раз выглянем из окна:



    То, что мы при этом видим, называется «параллакс движения», и вкратце он заключается в том, что когда мы двигаемся вбок, близкие предметы смещаются в поле зрения сильнее, чем далекие. Для движения вперед/назад и поворотов тоже можно сформулировать соответствующие правила, но давайте их пока проигнорируем. Итак, мы собираемся двигаться, оценивать смещения предметов в кадре и на основании этого определять их расстояние от наблюдателя — техника, которая официально называется «structure-from-motion». Давайте попробуем.

    4. Наконец, к практике


    Прежде всего — а не сделали ли все, случайно, до нас? Страница «Structure from motion» в Википедии предлагает аж тринадцать инструментов (и это только опенсорсных) для воссоздания 3D-моделей из видео или набора фотографий, большинство из них пользуются подходом под названием bundle adjustment, а самым удобным мне показался Bundler (и демо-результаты у него крутые). К сожалению, тут возникает проблема, с которой мы еще столкнемся — Bundler для корректной работы хочет знать от нас модель камеры и ее внутренние параметры (в крайнем случае, если модель неизвестна, он требует указать фокусное расстояние).

    Если для вашей задачи это не проблема — можете смело бросать чтение, потому что это самый простой и одновременно эффективный метод (а знаете, кстати, что примерно таким способом делались модели в игре «Исчезнование Итана Картера»?). Для меня, увы, необходимость быть привязанным к модели камеры — это условие, которого очень хотелось бы избежать. Во-первых, потому что у нас под боком полный ютуб визуального видео-опыта, которым хотелось бы в будущем пользоваться в качестве выборки. Во-вторых (и это, может быть, даже важнее), потому что наш с вами человеческий мозг, похоже, если и знает в цифрах внутренние параметры камеры наших глаз, то прекрасно умеет приспосабливаться к любым оптическим искажениями. Взгляд через объектив широкофокусной камеры, фишай, просмотр кино и ношение окулусрифта совершенно не разрушает ваших зрительных способностей. Значит, наверное, возможен и какой-то другой путь.

    Итак, мы печально закрыли страницу с Итаном Картером википедии и опускаемся на уровень ниже — в OpenCV, где нам предлагают следующее:

    1. Взять два кадра, снятые с откалиброванной камеры.
    2. Вместе с параметрами калибровки (матрицей камеры) положить их оба в функцию stereoRectify, которая выпрямит (ректифицирует) эти два кадра — это преобразование, которое искажает изображение так, чтобы точка и ее смещение оказывались на одной горизонтальной прямой.
    3. Эти ректифицированые кадры мы кладем в функцию stereoBM и получаем карту смещений (disparity map) — такую картинку в оттенках серого, где чем пиксель ярче, тем большее смещение он выражает (по ссылке есть пример).
    4. Полученную карту смещений кладем в функцию с говорящим названием reprojectImageTo3D (понадобится еще и матрица Q, которую в числе прочих мы получим на шаге 2). Получаем наш трехмерный результат.

    Черт, похоже, мы наступаем на те же грабли — уже в пункте 1 от нас требуют откалиброванную камеру (правда, OpenCV милостиво дает возможность сделать это самому). Но погодите, здесь есть план Б. В документации прячется функция с подозрительным названием stereoRectifyUncalibrated

    План Б:

    1. Нам нужно оценить примерную часть смещений самим — хотя бы для ограниченного набора точек. StereoBM здесь не подойдет, поэтому нам нужен какой-то другой способ. Логичным вариантом будет использовать feature matching — найти какие-то особые точки в обоих кадрах и выбрать сопоставления. Про то, как это делается, можно почитать здесь.
    2. Когда у нас есть два набора соответствующих друг другу точек, мы можем закинуть их в findFundamentalMat, чтобы получить фундаментальную матрицу, которая понадобится нам для stereoRectifyUncalibrated.
    3. Запускаем stereoRectifyUncalibrated, получаем две матрицы для ректификации обоих кадров.
    4. И… а дальше непонятно. Выпрямленные кадры у нас есть, но нет матрицы Q, которая была нужна для завершающего шага. Погуглив, я наткнулся примерно на такой же недоумения пост, и понял, что либо я что-то упустил в теории, либо в OpenCV этот момент не продумали.

    OpenCV: мы — 2:0.

    4.1 Меняем план


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

    Это все прекрасно, но вообще говоря, нам не нужно. Реальные размеры предметов интересовали бы нас, если бы наша модель использовалась потом для промышленных целей, в каких-нибудь 3d-принтерах. Но мы собираемся (эта цель слегка уже расплылась, правда) запихивать полученные данные в нейросети и им подобные классификаторы. Для этого нам достаточно знать только относительные размеры предметов. Они, как мы все еще помним, обратно пропорциональны смещениям параллакса — чем дальше от нас предмет, тем меньше смещается при нашем движении. Нельзя ли как-то найти эти смещения еще проще, просто каким-то образом сопоставив обе картинки?

    Само собой, можно. Привет, оптический поток.

    Это замечательный алгоритм, который делает ровно то, что нам нужно. Кладем в него картинку и набор точек. Потом кладем вторую картинку. Получаем на выходе для заданных точек их новое положение на второй картинке (приблизительное, само собой). Никаких калибровок и вообще никаких упоминаний о камере — оптический поток, несмотря на название, можно рассчитывать на базе чего угодно. Хотя обычно он все-таки используется для слежения за объектами, обнаружения столкновений и даже дополненной реальности.

    Для наших целей мы (пока) хотим воспользоваться «плотным» потоком Гуннара Фарнебака, потому что он умеет рассчитывать поток не для каих-то отдельных точек, а для всей картинки сразу. Метод доступен с помощью calcOpticalFlowFarneback, и первые же результаты начинают очень-очень радовать — смотрите, насколько оно выглядит круче, чем предыдущий результат stereoRectifyUncalibrated + stereoBM.


    Большое спасибо замечательной игре Portal 2 за возможность строить собственные комнаты и играть в кубики. I'm doin' Science!

    Код для для этой маленькой демонстрации
    # encoding: utf-8
    
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img1 = cv2.imread('0.jpg', 0)
    img2 = cv2.imread('1.jpg', 0)
    
    
    def stereo_depth_map(img1, img2):
        # 1: feature matching
        orb = cv2.ORB()
        kp1, des1 = orb.detectAndCompute(img1, None)
        kp2, des2 = orb.detectAndCompute(img2, None)
    
        bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
        matches = bf.match(des1, des2)
        matches = sorted(matches, key=lambda x: x.distance)
    
        src_points = np.vstack([np.array(kp1[m.queryIdx].pt) for m in matches])
        dst_points = np.vstack([np.array(kp2[m.trainIdx].pt) for m in matches])
    
        # 2: findFundamentalMat
        F, mask = cv2.findFundamentalMat(src_points, dst_points)
    
        # 3: stereoRectifyUncalibrated
        _, H1, H2 = cv2.stereoRectifyUncalibrated(src_points.reshape(src_points.shape[
                                                  0], 1, 2), dst_points.reshape(dst_points.shape[0], 1, 2), F, img1.shape)
    
        rect1 = cv2.warpPerspective(img1, H1, (852, 480))
        rect2 = cv2.warpPerspective(img2, H2, (852, 480))
    
        # 3.5: stereoBM
        stereo = cv2.StereoBM(cv2.STEREO_BM_BASIC_PRESET, ndisparities=16, SADWindowSize=15)
        return stereo.compute(rect1, rect2)
    
    
    def optical_flow_depth_map(img1, img2):
        flow = cv2.calcOpticalFlowFarneback(img1, img2, 0.5, 3, 20, 10, 5, 1.2, 0)
        mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
        return mag
    
    
    def plot(title, img, i):
        plt.subplot(2, 2, i)
        plt.title(title)
        plt.imshow(img, 'gray')
        plt.gca().get_xaxis().set_visible(False)
        plt.gca().get_yaxis().set_visible(False)
    
    plot(u'Первый кадр', img1, 1)
    plot(u'Второй кадр (шаг вправо)', img2, 2)
    plot(u'stereoRectifyUncalibrated', stereo_depth_map(img1, img2), 3)
    plot(u'Первый кадр', optical_flow_depth_map(img1, img2), 4)
    
    plt.show()
    



    Итак, отлично. Смещения у нас есть, и на вид неплохие. Как теперь нам получить из них координаты трехмерных точек?

    4.2 Часть, в которой мы получаем координаты трехмерных точек


    Эта картинка уже мелькала на одной из ссылок выше.

    image

    Расстояние до объекта здесь рассчитывается методом школьной геометрии (подобные треугольники), и выглядит так: . А координаты, соответственно, вот так: . Здесь w и h — ширина и высота картинки, они нам известны, f — фокусное расстояние камеры (расстояние от центра камеры до поверхности ее экрана), и B — камеры же шаг. Кстати, обратите внимание, что мы тут слегка нарушаем общепринятые названия осей, когда Z направлена вверх — у нас Z смотрит «вглубь» экрана, а X и Y — соответственно, направлены по ширине и высоте картинки.

    Ну, насчет f все просто — мы уже оговаривали, что реальные параметры камеры нас не интересуют, лишь бы пропорции всех предметов изменялись по одному закону. Если подставить Z в формулу для X выше, то можно увидеть, что X от фокусного расстояния вообще не зависит (f сокращается), поэтому разные его значения буду менять только глубину — «вытягивать» или «сплющивать» нашу сцену. Визуально — не очень приятно, но опять же, для алгоритма классификации — совершенно все равно. Так что зададим фокусное расстояние интеллектуальным образом — просто придумаем. Я, правда, оставляю за собой право слегка изменить мнение дальше по тексту.

    Насчет B чуть посложнее — если у нас нет встроенного шагомера, мы не знаем, на какую дистанцию переместилась камера в реальном мире. Так что давайте пока немного считерим и решим, что движение камеры происходит примерно плавно, кадров у нас много (пара десятков на секунду), и расстояние между двумя соседними примерно одинаковое, т.е. . И опять же, дальше мы слегка уточним эту ситуацию, но пока пусть будет так.

    Настало время написать немного кода
    import cv2
    import numpy as np
    
    f = 300   # раз мы занимаемся визуализацией, фокус я все-таки подобрал так, чтобы сцена выглядела условно реальной
    B = 1
    w = 852
    h = 480
    
    img1 = cv2.imread('0.jpg', 0)
    img2 = cv2.imread('1.jpg', 0)
    
    flow = cv2.calcOpticalFlowFarneback(img1, img2, 0.5, 3, 20, 10, 5, 1.2, 0)
    mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    
    edges = cv2.Canny(img1, 100, 200)
    
    result = []
    for y in xrange(img1.shape[0]):
        for x in xrange(img1.shape[1]):
            if edges[y, x] == 0:
                continue
            delta = mag[y, x]
            if delta == 0:
                continue
            Z = (B * f) / delta
            X = (Z * (x - w / 2.)) / f
            Y = (Z * (y - h / 2.)) / f
            point = np.array([X, Y, Z])
            result.append(point)
    
    result = np.vstack(result)
    
    
    def dump2ply(points):
        # сохраняем в формат .ply, чтобы потом открыть Блендером
        with open('points.ply', 'w') as f:
            f.write('ply\n')
            f.write('format ascii 1.0\n')
            f.write('element vertex {}\n'.format(len(points)))
            f.write('property float x\n')
            f.write('property float y\n')
            f.write('property float z\n')
            f.write('end_header\n')
            for point in points:
                f.write('{:.2f} {:.2f} {:.2f}\n'.format(point[0], point[2], point[1]))
    
    dump2ply(result)
    



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


    Для наглядности я взял не все точки подряд, а только границы, выделенные Canny-детектором

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

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

    5. Часть, в которой ничего не получается


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

    Выглядело это примерно так:

    Лестница сминается, местами превращаясь в аморфный кусок непонятно-чего.


    Я очень долго пытался это починить, и за это время перепробовал следующее:

    сглаживать каринку с оптическим потоком: размытие по Гауссу, медианный фильтр и модный билатеральный фильтр, который оставляет четкими края. Бесполезно: предметы наоборот, еще сильнее расплывались.
    — пытался находить на картинке прямые линии с помощью Hough transform и переносить их в неизменном прямом состоянии. Частично работало, но только на границах — поверхности по-прежнему оставались такими же искаженными; плюс никуда не получалось деть мысль в духе «а что если прямых линий на картинке вообще нет».
    — я даже попытался сделать свою собственную версию оптического потока, пользуясь OpenCVшным templateMatching. Работало примерно так: для любой точки строим вокруг нее небольшой (примерно 10x10) квадрат, и начинаем двигать его вокруг и искать максимальное совпадение (если известно направление движения, то «вокруг» можно ограничить). Получилось местами неплохо (хотя работало оно явно медленнее оригинальной версии):

    Слева уже знакомый поток Фарнебака, справа вышеописаный велосипед

    С точки зрения шума, увы, оказалось ничуть не лучше.

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


    Иллюстрация к проблеме. Движение здесь — по-прежнему шаг вправо

    Давайте выберем какую-нибудь зеленую точку из картинки выше. Предположим, мы знаем направление движения, и собираемся искать «смещенного близнеца» нашей зеленой точки, двигаясь в заданном направлении. Когда мы решаем, что нашли искомого близнеца? Когда наткнемся на какой-нибудь «ориентир», характерный участок, который похож на окружение нашей начальной точки. Например, на угол. Углы в этом отношении легко отслеживать, потому что они сами по себе встречаются довольно редко. Поэтому если наша зеленая точка представляет собой угол, и мы находим похожий угол в заданной окрестности, то задача решена.

    Чуть сложнее, но все еще легко обстоит ситуация с вертикальной линией (вторая левая зеленая точка). Учитывая, что мы двигаемся вправо, вертикальная линия встретится нам только один раз за весь период поиска. Представьте, что мы ползем своим поисковым окном по картинке и видим однотонный фон, фон, снова фон, вертикальный отрезок, опять фон, фон, и снова фон. Тоже несложно.

    Проблема появляется, когда мы пытаемся отслеживать кусок линии, расположенной параллельно движению. У красной точки нет одного четко выраженного кандидата на роль смещенного близнеца. Их много, все они находятся рядом, и выбрать какого-то одного тем методом, что мы пользуемся, просто невозможно. Это функциональное ограничение оптического потока. Как нас любезно предупреждает википедия в соответствующей статье, «We cannot solve this one equation with two unknown variables», и тут уже ничего не сделаешь.
    Совсем-совсем ничего?
    Вообще, если честно, то это, наверное, не совсем правда. Вы ведь можете найти на правой картинке соответствие красной точке? Это тоже не очень сложно, но для этого мы мысленно пользуемся каким-то другим методом — находим рядом ближайшую «зеленую точку» (нижний угол), оцениваем расстояние до нее и откладываем соответствующее расстояние на второй грани куба. Алгоритмам оптического потока есть куда расти — этот способ можно было бы и взять на вооружение (если этого еще не успели сделать).


    6. Зеленые точки FTW


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

    Собственно, все оказалось вот так просто. Мы будем рассчитывать тот же самый оптический поток, но только для «зеленых», устойчивых точек. И кстати, в OpenCV о нас уже позаботились. Нужная нам штука называется поток Лукаса-Канаде.

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

    С появлением поворотов координаты X и Z у нас смешиваются. Оставим старые формулы для расчета координат относительно камеры, и будем переводить их в абсолютные координаты следующим образом (здесь — координаты положения камеры, альфа — угол поворота):





    (игрек — читер; это потому, что мы считаем, что камера не двигается вверх-вниз)

    Где-то здесь же у нас появляются проблемы с фокусным расстоянием — помните, мы решили задать его произвольным? Так вот, теперь, когда у нас появилась возможность оценивать одну и ту же точку с разных углов, он начал иметь значение — именно за счет того, что координаты X и Z начали мешаться друг с другом. На самом деле, если мы запустим код, аналогичный предыдущему, с произвольным фокусом, мы увидим примерно вот что:


    Неочевидно, но это попытка устроить обход камеры вокруг обычного кубика. Каждый кадр — оценка видимых точек после очередного поворота камеры. Вид сверху, как на миникарте.

    К счастью, у нас все еще есть оптический поток. При повороте мы можем увидеть, какие точки переходят в какие, и рассчитать для них координаты с двух углов зрения. Отсюда несложно получить фокусное расстояние (просто возьмите две вышеприведенных формулы для разных значений альфа, приравняйте координаты и выразите f). Так гораздо лучше:


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

    И, наконец, нам нужно как-то справляться с шумом, благодаря которому наши оценки положения точек не всегда совпадают (видите на гифке сверху аккуратные неровные колечки? вместо каждого из них, в идеале, должна быть одна точка). Тут уже простор для творчества, но наиболее адекватный способ мне показался таким:
    — когда у нас есть подряд несколько сдвигов в сторону, объединяем информацию с них вместе — так для одной точки у нас будет сразу несколько оценок глубины;
    — когда камера поворачивается, мы пытаемся совместить два набора точек (до поворота и после) и подогнать один к другому. Эта подгонка по-правильному называется «регистрацией точек» (о чем вы бы никогда не догадались, услышав термин в отрыве от контекста), и для нее я воспользовался алгоритмом Iterative closest point, нагуглив версию для питона + OpenCV;
    — потом точки, которые лежат в пределах порогового радиуса (определяем методом ближайшего соседа), сливаются вместе. Для каждой точки мы еще отслеживаем что-то типа «интенсивности» — счетчик того, как часто она объединялась с другими точками. Чем больше интенсивность — тем больше шанс на то, что это честная и правильная точка.

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


    Голова профессора Доуэля


    Какая-то рандомная машина

    Бинго! Дальше нужно их все запихать в распознающий алгоритм и посмотреть, что получится. Но это, пожалуй, оставим на следующую серию.

    Приложение


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

    Вообще говоря, это ведь наверняка проблема не только зрения. Это скорее правило, а не исключение — наши сенсоры не всемогущи, они постоянно воспринимают информацию об объекте частями — но любопытно, насколько все подобные случаи можно объединить в какой-то общий фреймворк? Скажем (возвращаясь к зрению), ваши глаза сейчас постоянно совершают мелкие и очень быстрые движения — саккады — перескакивая между предметами в поле зрения (а в промежутках между этими движениями ваше зрение вообще не работает — именно поэтому нельзя увидеть собственные саккады, даже уставившись в зеркало в упор). Мозг постоянно занимается упорной работой по «сшиванию» увиденных кусочков. Это — та же самая задача, которую мы только что пытались решить, или все-таки другая? Восприятие речи, когда мы можем соотнести десяток разных вариантов произношения слова с одним его «идеальным» написанием — это тоже похожая задача? А как насчет сведения синонимов к одному «образу» предмета?

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

    Очевидные соображения говорят, что когда мы пытаемся воссоздать какую-то штуку, увиденную в природе, нет смысла слепо копировать все ее составные части. Чтобы летать по воздуху, не нужны машущие крылья и перья, достаточно жесткого крыла и подъемной силы; чтобы быстро бегать, не нужны механические ноги — колесо справится гораздо лучше. Вместо того, чтобы копировать увиденное, мы хотим найти принцип и повторить его своими силами (может быть, сделав это проще/эффективней). В чем состоит принцип интеллекта, аналог законов аэродинамики для полета, мы пока не знаем. Deep learning и Ян Лекун, пророк его (и вслед за ним много других людей) считают, что нужно смотреть в сторону способности строить «глубокие» иерархии фич из получаемых данных. Может быть, мы сможем добавить к этому еще одно уточнение — способность объединять вместе релевантные куски данных, воспринимая их как части одного объекта и размещая в новом измерении?
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 104

      +17
      Крутая статья. Прочитал на одном дыхании.

      А про 3д глаз — есть более интересная идея в научных кругах: мозг строит трехмерную картинку, опираясь на микро движения глаза, т.е. влево-вправо, для всех точек изменилось — пусть и на пару десятых миллиметра — расстояние, и готово, расчёт пошел
        +2
        О, а поделитесь ссылкой, любопытно. Заранее можно, правда, подумать, что это не окончательное решение вопроса — микродвижения дают нам полезный параллакс, но чтобы составить полноценное 3d, нам все еще нужно «обойти» предмет и заглянуть «за него» с другой стороны) Эх, были бы у нас стебельчатые глаза, как неоднократно замечает тот же Марк Чангизи)
          +2
          Движения дают нам примерно всю информацию об объектах в мире. Например, многие люди (да и животные) при первом изучении незнакомого предмета начинают склонять голову, изменяя тем самым перспективу. Так же могу припомнить известную историю «У узбеков нет иллюзий!», где люди не могли опознавать предметы на картинках. В случае с компьютерным зрением ситуация ровно противоположная — все начинается именно с плоских картинок.
            0
            Разве микродвижения могут дать параллакс? Ведь центр вращения глаз находится практически в центре глаза.
            В этом смысле бинокулярность дает намного больше информации.
              +1
              Простое проверочное упражнение: закрываете один из глаз, смотрите на собственный нос и аккуратно прячете палец за нос так чтобы он был не виден, но совсем чуть-чуть, на краешке. После этого смотрите вперёд и перефирийным зрением замечательно замечаете палец. Фокус не в том, где находится центр вращения, а в том, где находится преломляющая линза. Посмотрели вперёд — хрусталик оказался чуть дальше впереди и увидел скрытое.
            0
            А вы не знаете случайно, где можно приобрести/как можно сделать недорогой детектор движения глаз, который бы мог зафиксировать движение глаз при рассматривании картинки и отрисовать потом траекторию взгляда на самой этой картинке? Нужно для хобби-проекта :)
              +3
              Если что, это называется eye-tracker.
                +3
                Спасибо, загуглю. У меня просто есть только рисунок из Детской Энциклопедии времен СССР, на который я случайно наткнулся. Там на фото какого-то натюрморта наложен этот самый eye-traking в виде черных изломанных линий туда-сюда-обратно. Я искал eye moving и прочие словосочетания из серии «это может быть то что нужно», но eye-tracker почему-то поискать не додумался.
                  +8
                  Оно?)
                  image

                  Альфред Ярбус, однако, очень известная и классическая работа по саккадам (не читал, но наслышан, как говорится). У него, правда, был очень суровый eye-tracker с присосками на глазных яблоках — надеюсь, вы справитесь как-то менее инвазивным способом.
                    +4
                    Оно! К присоскам я честно говоря морально не готов. Надеюсь с помощью всяких современных технологий вроде недорогих камер и либ компьютерного зрения можно будет обойтись без присосок и игл в глаза.
              +4
              Это вряд ли, по моему мозг одинаково хорошо строит модель, видимую только для одного глаза, и модель, видимую на фотографии где точно нет никакого микропараллакса. Гораздо важнее для воссоздания модели светотени. Как аргумент, приведу пример: для точного построения 3Д сцены на компьютере нужен сложный алгоритм рейтрейсинга с учетом всех переотражений, физичских свойст поверхностей и т.д, иначе мы тут же видим малейшую неточность. Значит, эта сенсорная информация очень важна для зрения, раз ей выделена такая детализация.
                0
                Почему сразу строит? Мы же нейросеть шопипец параллельная, а значит вполне может один кусок строить модель, а другой её дополнять исходя из накопленной базы образом… И таких «минианализаторов» может быть непонятно много, но пусть мы их все знаем. Следующая проблема — логика выбора «правильного сочетания» этих блоков и выбор «оперативной модели объекта»
                  0
                  К слову. Блоксхема AlexNet — лучшей сети для распознавания образов в 1212-ом году:
                    +2
                    К слову. Блоксхема AlexNet — лучшей сети для распознавания образов в 1212-ом году:
                    image
                    А это блоксхема GoogLeNet, лучшей уже в 2014-ом году:
                    image
                    Так что проблема «проблема — логика выбора «правильного сочетания» этих блоков» уже настала, причём так настала что писец.
                  +1
                  А про 3д глаз — есть более интересная идея в научных кругах: мозг строит трехмерную картинку, опираясь на микро движения глаза, т.е. влево-вправо, для всех точек изменилось — пусть и на пару десятых миллиметра — расстояние, и готово, расчёт пошел


                  Мозг строит 3d картинку по огромному набору признаков (известно порядка 15 разных). Какой-то один признак как главный выделить нельзя, в разных контекстах приоритет отдается разным признакам. Но чаще всего вроде все же бинокулярное зрение работает, причем у человека это комбинация двух тесно связанных признаков — конвергенции и аккомодации, и нынешнее кинотеатральное 3D воспроизводит из них только первый, почему, собственно, и имеет проблемы с хождением в массы.

                  Но конкретно саккады к 3д зрению насколько я знаю не имеют совершенно никакого отношения. При микродвижениях глаза картинка просто сдвигается одинаковым образом для всех видимых точек. Ниже в комментах писали что это просто удобный трюк для вычисления контуров на изображениях — при небольшом дрожании картинки сигнал со зрительных рецепторов на которые попадает граница предмета будет меняться, а на рецепторах не попадающих на границы он будет оставаться примерно постоянным.
                    +1
                    Да, извиняюсь, был напуган)
                    Но я однозначно читал где-то, что вот эти микроскопические сдвиги точки фокуса (при помощи микросаккад) дают возможность увидеть контуры плоскостей видимой картинки, и построить своего рода «карту высот», а уже бинокулярное зрение служит для точного определения расстояний.
                      +1
                      Более всего работает накопленный зрительный опыт. Пока человек находится в знакомой обстановке, пока видит знакомые образы, он будет правильно определять пространство вокруг даже на двумерном изображении. Мы знаем, каких размеров и формы железная дорога, столбы и деревья, именно поэтому легко воспринимаем фотографию, и спокойно можем обходиться и одним глазом в обычной обстановке. Если же показать человеку изображение, где нет знакомых образов, он точно воспримет сцену неправильно. А вот бинокулярное зрение и другие признаки уже помогают накопить этот зрительный опыт.
                    +2
                    Спасибо за интересную статью. Возможно, когда-то гугловские сервера и будут распознавать образы, считывая в секунду терабайты паттернов. Но на данном этапе развития проще обработать хэштеги «Едем в поезде в Сочи», которые уже вычислены вашей нейросетью и нейросетями ваших друзей.
                      +1
                      Это что же получается — загружая тонны персональных фото в гугл, я учу его не только мое лицо распознавать, но и помогаю ему создать собственную 3D-модель, распечатать ее на органическом принтере, создать свою копию?
                        +1
                        Не возьмусь предполагать, работает ли Гугл над этим. А вот на основе фоток туристов распознать лесополосу вдоль сочинской железной дороги — думаю, да.
                          0
                          *режим зануды* Загружая тонны персональных фото — нет, потому что у вас тут отсутствует ключевой элемент оптического потока — понимание, какой кадр в какой переходит) Так что фото — это пожалуйста, а вот видеоблогов остерегайтесь)
                            0
                            Ну, кроме оптического потока всякие методы есть, да и поток организовать из кучи фотографий лица наверное не невозможно. Фон отсечь, освещение выровнять — и вперед…
                          +2
                          Спасибо, что прочитали) Ну, обрабатывать хэштеги — тоже интересная штука, и что отдельно приятно, хорошо коммерциализируется (без иронии!). Немного грустно наблюдать, как к машинному обучению периодически относятся как к странной помести пятиногой табуретки и серебрянной пули — оно вроде как толком не работает, но дайте нам воткнуть его в фейсбук, и все френды ваши)
                          0
                          Честно говоря, это кажется грандиозным. Особенно, действительно, для систем слежения.
                            +1
                            Скажем (возвращаясь к зрению), ваши глаза сейчас постоянно совершают мелкие и очень быстрые движения — саккады — перескакивая между предметами в поле зрения (а в промежутках между этими движениями ваше зрение вообще не работает — именно поэтому нельзя увидеть собственные саккады, даже уставившись в зеркало в упор). Мозг постоянно занимается упорной работой по «сшиванию» увиденных кусочков. Это — та же самая задача, которую мы только что пытались решить, или все-таки другая?
                            Это связано с особенностью работы нейронов, фильтрующих изображение на предмет нахождения границ. Просто такая себе хардварная оптимизация, находящая резкий градиент и его направление, подобные фильтры есть и в фотошопе и, видимо, разных библиотеках CV — когда изображение смещается на пиксель-другой и вычитается из оригинала.

                            Как верное указано в статье, проблема зрения заключается вовсе не в распознавании изображений. Та картинка, что мы видим, и, как мы считаем, является реальностью — на самом деле воссозданная нашим мозгом его личная модель этой самой реальности. Мозг умеет моделировать очень хорошо, это его суть (позволяющая, в том числе, выживать организму более эффективно, чем его конкуренту с более примитивным мозгом, при прочих равных). Он постоянно дополняет и уточняет его внутреннюю модель, а уже про те объекты, из которых она состоит, мы и говорим — «мы их видим».

                            Нерешенная проблема зрения — научиться так же эффективно моделировать 3D-окружение, и эффективно постоянно вносить соответствующие поправки исходя из текущей наличной информации.
                              +1
                              Кстати, как-то наткнулся на статью про возможность распознавать 3D образы с рождения.
                              elementy.ru/news/432084?page_design=print
                              Возможно, у нас многое уже заложено с рождения, скажем так определение каких-либо объектов 3D по 2D изображению.
                              +20
                              тэг: не котики
                              Статья настолько отличная, что даже на это вопиющее неуважение к котикам можно закрыть глаза.
                                +15
                                И, между прочим, у этого есть обоснование!) Заметьте, тут везде речь шла о статичных предметах. У котиков есть печальная особенность, которая немедленно поломает нам весь алгоритм — они двигаются и могут изменять форму. Тут нужно будет составлять не просто модель, а какой-то анимированый скелет, находя на видео составные сегменты котика — голова, сочленения лап и т.д.) В общем, квест намного усложняется.
                                0
                                Мне очень понравилась идея использования синтезировать идеальную картинку с помощью компьютерной игры для проверки системы компьютерного зрения. Точно известно что на ней. Можно обучать систему в автоматическом режиме.
                                  +10
                                  … а главное, можно ожесточенно рубиться на работе в Портал, и никто слова не скажет!
                                    0
                                    Мне кажется это как раз не самая лучшая идея. Потому что на настоящих снимках нет идеально ровных границ и идеально однородных поверхностей, а значит алгоритму (типа оптического потока) будет гораздо больше за что зацепиться.
                                      +2
                                      Так это же наоборот хорошо — ошибки надо выявлять сразу же, а не маскировать.
                                        0
                                        Но может получиться так, что метод, оптимальный на синтетическом изображении, будет неоптимальным на реальном.
                                        +1
                                        Справедливости ради, в современных-то игрушках их тоже не то чтобы очень есть. Видели подборки картинок в духе «определите, где реаллайф, а где GTA V»?)
                                          0
                                          Справедливости ради, конкретно в Portal таких однородных поверхностей — куча, просто потому что это головоломка вовсе не на поиск предметов :)
                                    +16
                                    Какие-то у вас неправильные рельсы,
                                    вот настоящие рельсы

                                      +2
                                      Захватывающе!

                                      А вы пробовали использовать не движение камеры, а перемещение объекта? Ведь в реальности оба движения происходят одновременно.
                                      Я представляю, что в таком случае смещение будет ещё нагляднее: неподвижный «плоский» фон без движения и «выпуклый» объект. Тут же бонусом и отделение объекта от фона получится.

                                      Насколько гласит легенда, некоторые хищники именно так и видят: им тяжело классифицировать неподвижные предметы.

                                      Вашу систему уравнений, мне кажется, можно расширить, для каждого кадра видео:

                                      новая точка i (t+1) = (старая точка i (t) + движение точки i (t) ) * движение камеры (t)

                                      не уверен что за операция там вместо звёздочки — умножение или сложение.
                                      Добавим ограничения из физического мира:
                                      — движение точки равномерно
                                      — движение камеры равномерно (и есть априорная оценка)
                                      — движение точки совпадает с движением её «группы» (принадлежность точки группе получаются кластеризацией точек по вектору движения)

                                      В общем случае движение камеры это все 6 степеней свободы, а для точек достаточно 3.

                                      И будет полноценный решатель: видео -> трёхмерная модель пространства и камеры :-)
                                        +1
                                        Затягивал с комментом, потому что у движения объекта есть свои сложности. Вот такие:

                                        — во-первых, статическая сцена (где ничего не двигается) удобнее нам потому, что мы ее полностью контролируем. Пока мы не шагнем, все остается на месте.
                                        — во-вторых, остается вопрос определения движения. Для камеры мы можем получать ее двумя способами: прямо от моторных механизмов, которые ее двигают (от своих ног, грубо говоря), или анализировать общее смещение потока в кадре (я очень хотел добавить это в пост, но места уже явно не хватало). Как говорил Дуглас Хофштадтер, мы обычно различаем на картинке «рисунок» и «фон» — изображенный предмет и все, что просто занимает место на обоях. Вот по сдвигу фона можно довольно точно определить, куда мы двигаемся. А если фон стоит на месте, и двигается объект — тут остаются варианты.
                                        +1
                                        Спасибо за интересную статью. Весьма познавательно и хоть как то упорядачивает информацию в голове дилетанта в этой области.
                                          +1
                                          Вам спасибо, что прочитали. Если интересуетесь темой дальше — есть несколько очень простых и увлекательных книг, рассказывающих про все это на популярном уровне. Уже упоминавшийся Марк Чангизи, «Революция в зрении» (там, правда, много оригинального контента, который еще не защищен временем), и более классический Дэвид Хьюбел «Мозг, глаз, зрение» — отец нейросайнса и вообще столп-основатель. Ну и Курсера в последнее время отметилось парой отличных курсов)
                                          0
                                          Ваши наработки можно как-то применить к получению габаритных точек с видео или фото объектов, которые невозможно (или затруднительно) измерить одному человеку. Грубо говоря: взял камеру, поснимал вокруг памятника архитектуры, прогнал через программу и получил грубую форму, по кототорой потом смоделлил.
                                            +5
                                            Это гораздо круче делает Bundler. Смотрите, какие штуки получаются:
                                            pic
                                            image


                                            0
                                            Статья шикарна! Жаль, что в очередной раз забыли цитаты великих: «Ничто в биологии не имеет смысла кроме как в свете эволюции» (с) Ф. Г. Добржанский. The American Biology Teacher.
                                            В случае нейронаук можно так перефразировать, что очень многое имеет смысл только в свете того как происходит развитие системы. Сдаётся мне, что если бы вы с самого рождения ходили по комнате с одним глазом развить все описанные способности мозгу было бы конкретно сложнее. Причём таких взаимосвязей, которые нужны только на этапе обучения, в мозге полно, например дети глухие от рождения имеют проблемы с формированием представления о пространстве в котором находятся, хотя зрение у них присутствует в полном объёме.

                                            По поводу ваших алгоритмов. Буквально пару недель назад на Конференции «Нейроинформатика 2015» видел группу, которая занимается схожей темой, только у них обратная постановка задачи. Имея два кадра с камеры определить изменение координат бота. Они с задачей более или менее справляются. Пока, правда, слишком долго. Но я думаю от вашего сотрудничества может родиться что-нибудь страшно интересное. А кроме того у них на это всё есть заказчик, так что работа пойдёт не только в хабр, но и в реальный мир:

                                            neuroinfo.ru/index.php/ru/schedule/sections?year=2015#Section5
                                            46. ИВАШИНА Е. А., КОРЛЯКОВА М. О., ПРОКОПОВ Е. Ю.
                                            Калужский филиал МГТУ им. Н.Э. Баумана
                                            Формирование ассоциации нейронных сетей для решения задачи стереореконструкции в бортовой системе технического зрения
                                            Предложено решение задачи стереореконструкции координат объек-тов сцены на основе анализа стереопары их проекций. Моделирование процедуры стереореконструкции проведено в условиях виртуальной сце-ны с учетом ошибок определения координат проекций, полученных при калибровке реальной стереопары камер. Рассмотрены результаты формирования решателя на основе бустинга и модели анализа неоднородности ошибок нейростей.
                                            mkorlyakova@yandex.ru
                                              0
                                              О, это как раз очень любопытно, да. Я, к сожалению, не квалифицирован, чтобы рассуждать на биологические темы, но, например, Хьюбел пишет о таких штуках в «Глаз, мозг, зрение». Описание опыта: «возьмем новорожденного котенка, зашьем ему глаз. Подождем пять лет» уже звучит как-то очень захватывающе)

                                              Спасибо за ссылку, обязательно поинтересуюсь.
                                              +6
                                              Художники подметили эти свойства человеческого зрения ещё в начале XX века.
                                                +8
                                                Я ожидал больше Эшера в комментах) Кстати, не очень понял, что конкретно на вашей картинке играет с перспективой, поясните?

                                                А еще в копилку к художникам, например, Магритт и издевательства над окклюзией:
                                                image
                                                  +2
                                                  Выглядит как баг.
                                                +5
                                                ваши глаза сейчас постоянно совершают мелкие и очень быстрые движения — саккады — перескакивая между предметами в поле зрения (а в промежутках между этими движениями ваше зрение вообще не работает — именно поэтому нельзя увидеть собственные саккады, даже уставившись в зеркало в упор
                                                А как мы их увидим-то, если для слежения за своим зрачком нужно смотреть прямо на него не отводя взгляда? Любая саккада тут же уведёт взгляд с нужной точки.
                                                Возьмите два карандаша, закройте один глаз и попытайтесь сдвигать эти карандаши так, чтобы они соприкоснулись кончиками грифелей где-то вблизи вашего лица. Скорее всего, грифели разойдутся, причем ощутимо (если у вас получилось легко, поднесите их еще ближе к лицу)
                                                Обижаете наш интеллект! =) Подносил карандаши так близко к глазу, что вообще не мог на них чётко сфокусироваться — произвёл наводку по угловым размерам и степени расфокусировки, коснулся с первого раза.
                                                  0
                                                  Ну, у вас поле зрения все-таки имеет какую-то ширину) Вы же можете наблюдать за любыми мелкими движениям, например, абстрактного прыжка кузнечика (хотя, казалось бы, первая же саккада должна увести вас от кузнечика подальше).

                                                  Интеллекту — определенно браво; я вот так не могу) Интересно, вы занимаетесь повседневно работой с мелкими предметами?
                                                    0
                                                    У меня тоже получилось почти без сбоев. С мелкими предметами не работаю, всё больше с мышкой и клавиатурой.
                                                    Кстати, с двумя закрытыми глазами соприкоснуть кончики карандашей удаётся с вероятностью 60%. Причём когда кончики сближаются, ощущается заметное отталкивание. Не знаю, откуда оно берётся.
                                                  +3
                                                  Хочу обратить внимание автора также на методы используемые в PIV.

                                                  PIV (particle imaging velocimetry) — это метод физических измерений а аэро/гидродинамике, при котором в поток засеиваются частицы (обычно выглядит как дым), затем фотографируются скоростной камерой (с лазерной подсветкой). По паре снимков затем вычисляются поле скорости в потоке.

                                                  Сейчас там самый эффективный метод — это фурье корреляция FTC (также называется Phase Correlation, аналогичто вашему велосипеду, но благодаря преобразованию фурье производительность гораздо лучше и даёт субпиксельную точность смещения).
                                                    +1
                                                    И да, забыл написать. Там пробовали и оптический поток, но он работал плохо. Оптический поток работает хорошо на изображениях с плавными градиентами, а в PIV изображения — это куча белых точек на темном фоне.
                                                    Так что от специфики изображений будет зависеть и алгоритм вычисления смещений.
                                                    +10
                                                    Я как человек долго занимавшийся вопросами реконструкции 3D внесу диссонанс в общий хор благодарности за крутую статью :)

                                                    В плане определения облаков точек уровень статьи соответствует уровню студента-четверокурсника, недели две делавшего курсовой проект. Разреженное облако точек построить в 3D — это не проблема вообще, особенно при использовании нынешних открытых библиотек по компьютерному зрению которые львиную часть сложности прячут. Если угодно, это как написать hello world для задач CV :). Но к сожалению подобный код
                                                    а) дает паршивенькую точность
                                                    б) от него очень тяжело перейти к плотным облакам точек
                                                    в) ломается как только в него подается картинка с множеством мелких деталей и интересным освещением

                                                    Как Вы верно заметили, все это может быть совершенно неважно для Вашей задачи распознавания. Но про неё-то как раз в статье не написано практически ничего.

                                                    Интереснейшая тема, слабая реализация, будет интересно посмотреть на распознавательную часть :)

                                                    Какой бы ни была способость нашей зрительной системы воссоздавать трехмерные образы увиденного, она явно не требует наличия двух глаз. Что остается в итоге? Я ни в коем случае не готов дать точный ответ применительно к биологическом зрению...


                                                    Известно около 15 разных признаков которые использует человек для распознавания объема :). Можно посмотреть например у Шиффмана книжку «Ощущение и восприятие». Но бинокулярное зрение, а точнее комбинация конвергенции и аккомодации является одним из основных и используется, вероятно, чаще чем любой из других признаков.

                                                    уже в пункте 1 от нас требуют откалиброванную камеру… В предыдущих попытках мы, по сути, пытались определить реальное положение трехмерных точек — отсюда необходимость знать параметры камеры, матрицы, ректифицировать кадры и так далее.


                                                    Там не в триангуляции дело (ну то есть триангуляция тоже важна конечно, но это не основное). Дело в том что если мы берем точку на одном изображении, то на изображении той же сцены сделанном другой камерой с другого положения эта точка не может располагаться где угодно. Она обязательно будет лежать на одной линии. Знание фундаментальных матриц камер позволяет эту линию вычислить и, соответственно, радикально упрощает задачу поиска соответствия объекта с одного изображения на другом — достаточно просматривать не все изображение, а лишь малую его часть расположенную вдоль строго определенной линии. Попутно на этапе ректификации убирают оптические искажения геометрии, неизбежные для реальных камер — это нужно чтобы указанные линии соответствия были прямыми (а не кривыми) и опять же помогает улучшить процесс поиска соответствий.

                                                    Существует ряд техник позволяющих калибровать камеры по их изображения или по разреженному неточному облаку точек типа того который Вы вычисляете. Это часто используют в качестве промежуточного шага позволяющего перейти к поиску более точного или более плотного облака.
                                                      +5
                                                      Спасибо, критические отзывы всегда радуют) Распознавательная часть обязательно будет, просто а) она сюда унылым образом не влезала, и б) в какой-то степени ее можно представить себе, не сходя с места. Нейронной сети же совершенно все равно, какие данные анализировать — двумерные или трехмерные)

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


                                                      А вы все-таки пробовали закрыть один глаз?) Или посмотреть на плоскую распечатанную картинку, где конвергенция совершенно точно никак не работает, потому что не на чем ей?

                                                      Разреженное облако точек построить в 3D — это не проблема вообще


                                                      Совершенно не сомневаюсь, учитывая мои собственные более чем дилетантские знания в 3d-реконструкции… но все-таки, поделитесь способом, который:
                                                      — не требует двух камер и пространства (работает на отснятом заранее видео)
                                                      — не требует параметров камеры и калибровки.

                                                      Ноль сарказма, кстати, мне действительно очень интересно.

                                                      Про объяснение работы фундаментальной матрицы отдельное спасибо, в этом поле я совершенно плаваю)

                                                        0
                                                        А вы все-таки пробовали закрыть один глаз?) Или посмотреть на плоскую распечатанную картинку, где конвергенция совершенно точно никак не работает, потому что не на чем ей?


                                                        Я же пишу — там около 15 признаков. Уберите два связанные с бинокулярным зрением — останутся еще 13 и объем полностью не исчезнет. Но это совершенно не означает что убранные 2 не важны или, тем более, не используются вообще. Восприятие объема от одного глаза будет хуже и «ломаться» будет гораздо чаще.

                                                        Совершенно не сомневаюсь, учитывая мои собственные более чем дилетантские знания в 3d-реконструкции… но все-таки, поделитесь способом, который:


                                                        Их много разных и сдается мне что все наиболее интересное имеет очень сложную реализацию и закрыто как коммерческая тайна, а не доступно в виде библиотечки :). В основном используется как я понимаю для задач видеомонтажа когда в отснятое видео хочется добавить 3D-объект который будет казаться частью отснятой сцены. Я лет шесть уже этим не занимаюсь, так что мне сложно сходу посоветовать хороший вариант. Но в OpenCV все нужное вроде есть, общий принцип для простенькой реализации примерно следующий — SIFT-ом ищем соответствующие точки на изображениях, затем определяем по построенным соответствиям параметры камер с одновременной фильтрацией неверных соответствий чем-то типа RANSAC, затем по построенной калибровке ищем более плотное облако соответствий и наконец проецируем его в 3D. Для всего этого вроде в CV есть готовые ф-и, но по названиям я их Вам сейчас не подскажу :)

                                                        Попробуйте так же посмотреть литературу по camera self-calibration (automatic calibration, calibration from video)
                                                          +1
                                                          А, по поводу 15 признаков — смотрите, я косвенно затрагивал их в самом начале. Само собой, у нас есть binocular и monocular depth clues, есть атмосферная перспектива, окклюзия, шейдинг и так далее, и все это очень хорошо — но часть этих вещей (достаточно большая) работает только если у нас уже есть какой-то опыт и знание об окружающем мире. Освещенный кубик на примере с зелеными точками, например, кажется нам скорее выпуклым, чем вдавленным, потому что мы привыкли, что свет падает сверху, а не снизу. До тех пор, пока у нас нет никаких априорных знаний, мы не можем даже отличить этот шейдинг от раскраски, нанесенной на поверхность предмета.

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

                                                          Ваш пример с SIFT+RANSAC упоминался в посте как «пробовал, но что-то не получилось» (это тот, который с помощью stereoRectifyUncalibrated), так что вполне возможно, конечно, что это мне просто не хватило скилла.
                                                            0
                                                            но часть этих вещей (достаточно большая) работает только если у нас уже есть какой-то опыт и знание об окружающем мире


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

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

                                                            Ваш пример с SIFT+RANSAC упоминался в посте как «пробовал, но что-то не получилось» (это тот, который с помощью stereoRectifyUncalibrated), так что вполне возможно, конечно, что это мне просто не хватило скилла


                                                            По картинке похоже что неверно позвали stereoBM, плюс на выходе имеем более плотное облако точек — если его профильтровать оставив только «хорошо заметные» точки, то должно получиться нормально :)

                                                            Вопрос про «матрицу Q» думаю Вам должен был быть очевиден потому как Вы там дальше сами же утыкаетесь в необходимость определить фокусное расстояние камеры, причем если я правильно понял, то для ее решения вводите свою собственную процедуру «калибровки» основанную если я Вас верно понял на движении камеры строго по кругу вокруг определенной точки :).
                                                          0
                                                          А вы все-таки пробовали закрыть один глаз?) Или посмотреть на плоскую распечатанную картинку, где конвергенция совершенно точно никак не работает, потому что не на чем ей?


                                                          Мне кажется, когда мозг уже имеет представление об окружающем мире — он может сделать выводы и при неполной информации (т.е. с закрытым глазом или плоской картинкой). Недостающую информацию он «достраивает», опираясь на предыдущий опыт: знакомые очертания предметов, имеющуюся информацию об их приблизительных размерах и т.п. Ну и плюс убрав один-два из 15 инструментов, мы все еще имеем остальные в нашем распоряжении (пускай и не настолько мощные), которые тоже, кстати сказать, «обучались» в течение жизни при участии все той же конвергенции и аккомодации, в одном комплексе.

                                                          Для более ощутимого эффекта важности бинокулярного зрения можно попробовать не закрыть один глаз при разглядывании известного окружения, а завязать один глаз черной повязкой на денек и ощутить, насколько труднее станет ориентироваться, передвигаться и взаимодействовать с пространством, при этом, желательно, ранее незнакомым. Мне, например, с одним закрытым глазом с первой попытки с трудом удалось правильно оценить расстояние и взять рукой кружку, стоящую передо мной на столе.
                                                          0
                                                          Я бы ограничился одним словом: скорость. Да, нейронки здорово лагают, когда им пытаются подсунуть то, на чем они не обучались. Как, впрочем, и человек. Другое дело, что они решают узкоспециализированные задачи с высокой точностью и за приемлемое время.

                                                          Кстати, в статье идет подмена понятий. Внимательно следим за руками господина rocknrollnerd:

                                                          1)Распознавание картинок не нужно.
                                                          2)Давайте ваять SfM.
                                                          3)Дальше нужно их все запихать в распознающий алгоритм и посмотреть, что получится.
                                                          4)????
                                                          5)PROFIT!

                                                          Извините, но выглядит как «я решил угробить на порядок больше своего процессорного времени, чтобы получить красивое 3D (результатов распознавания по Вашему методу в статье обнаружено не было), вместо того, чтобы обучить узкоспециализированную нейронку, которая будет быстро отлавливать 90% физиономий исключительно в анфас». Если обучить вторую нейронку, которая будет распознавать лица только в профиль, мы удвоим количество верных распознаваний ценой еще одной обучающей выборки (алгоритм обучения ведь один и тот же).

                                                          Фундаментальное распознавание всего на свете – прекрасная и трудная задача, но она из области гомункуловарения (то бишь, моделирования человеческого мозга настолько правдоподобно, насколько это возможно), в то время как нейронки – это относительно дешевый и простой способ заменить человека автоматом.
                                                            0
                                                            Эм… как бы так выразиться-то — да, пожалуй, мне бы хотелось сделать такую штуку, чтобы распознавала все на свете) Совершенно не вижу, кстати, зачем здесь моделировать человеческий мозг насколько правдоподобно, насколько возможно — с чего такие выводы?

                                                            А ваше предложение немедленно потребует отдельной нейронки для лица, вид сзади, отдельной нейронки для лица в три четверти, а желательно вообще 360 отдельных нейронок для каждого угла зрения. И кстати, как собираетесь узнавать, какой нейронкой пользоваться? Перепробовать все по очереди? К слову о процессорном времени, пожалуй.
                                                          0
                                                          Конечно же, параллакс — ключ к распознаванию трехмерной сцены.

                                                          Вот есть интересное видео, где человек создает дисплей-«окно», за счет использования системы Head Tracking.

                                                            0
                                                            Интересно, почему бы такое не сделать на основе простейшего алгоритма распознавания лиц в видеопотоке. Таких алгоритмов же пруд пруди. Был бы просто монитор с двумя вебками.
                                                              0
                                                              Несколько лет назад светилось такое чудо на выставках. Только вот ничего «простейшего» в нем нет, это очень сложные алгоритмы и там есть проблемы с точностью которые воспринимаются как искажение визуализируемого пространства.

                                                              Но такие системы не очень интересны, поскольку эффект глубины исчезает в статике. Такие штуки интересно совмещать с обычным стерео. Но если стерео реализовывать через очки, то нет проблем прикрепить к очкам маркеры и некоторые так, собственно, и делают, причем я видел и ребят у нас в России с такой разработкой

                                                              Есть и гораздо более интересный вариант — стерео без очков. Сравнительно легко можно сделать специальный дисплей который проецирует под разными углами два разных изображения, причем с некоторыми ухищрениями эти углы можно регулировать в реальном времени и подстраивать их так чтобы разные глаза (которые всегда видят экран со слегка разных углов) видели разные изображения. Head-tracking здесь убивает двух зайцев — и ракурс подстраивает, и стерео дает без очков. Пару подобных систем возили несколько лет назад по выставкам и это действительно очень крутой вариант. Но вот не взлетело пока почему-то.

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

                                                              В итоге серебряной пули не получается, все равно остается масса малорешаемых проблем, и преимущества перед обычным стерео оказываются сравнительно небольшими и проявляющимися только что в мониторах для 3d моделирования и игр. А вот денег технология стоит куда больших чем простое стерео (себестоимость у которого — копейки, вот и производители, видимо, и не хотят в это дело вкладываться.
                                                                0
                                                                Говоря, что этот алгоритм простейшия я конечно не имел в виду, что его каждый школьник пишет. Но эта тематика очень хорошо разработана в фотокамерах, существует прорва готовых библиотек, в том числе портированных на всё что угодно. Я с такой готовой библиотекой игрался дажэ на Flash и всё отлично работало. Если бы эта тема была мне интереснее — думаю демку можно было бы накатать за день-два.

                                                                Телевизоры, которые под разными углами отдают разную картинку бывают. Используются в рекламе для Вау-эффекта, я такие видел, но по границам между разными зонами артефакты так сильно бъют в глаз, что использовать это для рабочего монитора вообще не вариант.

                                                                >> преимущества перед обычным стерео
                                                                Как человек, у которого дома стоит монитор с Nvidia 3DVision, и являющийся любителем этого дела, могу ответственно заявить, что любая технология с элементами 3D, которая позволит смотреть в монитор 5-6 часов подряд уже будет иметь как минимум одни преимущество перед обычным стерео.

                                                                >> а) не хватает контента который можно смотреть подобным образом
                                                                Сущетвуют алгоритмы, преобразующие 2d с подвижной картинков в псевдо-3d. они есть в большинстве современных 3D телевизоров и они реально крутые. Плюс в большинстве игр 3d встроенное, если конечно не вспоминать, что в большинстве игр крестик прицела сделан в плоскости экрана. На та же 3dVision эту проблему успешно решает.

                                                                >> б) в телевизор подобную штуку не поставишь — зритель может быть только один
                                                                Зато в игровой монитор — только в путь. Можно будет выглядывать из-за угла.

                                                                Так много компаний, типа той же NVidia пропихивают стандарт 3d в свои продукты с доисторических времён, как говорится, первого мехвариора, поддерживавшего шлемы VR. Причём пропихивают они всё это вопреки упорному нежеланию клиента за эти все навороты доплачивать. Анаглиф есть у любой нормальной их карточки. Могли бы и такую опцию освоить попробовать.
                                                                  0
                                                                  Телевизоры, которые под разными углами отдают разную картинку бывают. Используются в рекламе для Вау-эффекта, я такие видел, но по границам между разными зонами артефакты так сильно бъют в глаз, что использовать это для рабочего монитора вообще не вариант.


                                                                  Это варианты с фиксированными зонами, а я про дисплей где зоны движутся и на лету подстраиваются под положение зрителя

                                                                  Как человек, у которого дома стоит монитор с Nvidia 3DVision, и являющийся любителем этого дела, могу ответственно заявить, что любая технология с элементами 3D, которая позволит смотреть в монитор 5-6 часов подряд уже будет иметь как минимум одни преимущество перед обычным стерео.


                                                                  Проблемы с усталостью от просмотра стерео эта технология как раз не снимает

                                                                  Причём пропихивают они всё это вопреки упорному нежеланию клиента за эти все навороты доплачивать. Анаглиф есть у любой нормальной их карточки.


                                                                  Анаглиф как и другие софтверные решения не стоит производителю практически ничего

                                                                  Могли бы и такую опцию освоить попробовать.


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

                                                                    >> Проблемы с усталостью от просмотра стерео эта технология как раз не снимает
                                                                    Эта технология имитирует всего один аспект стерео. Картинка физически одна в оба глаза и фокусироваться нужно именно на том расстоянии на котором сходится паралакс. А значит непосредственной усталости глаз не будет.

                                                                    >> Там в играх тоже нужна поддержка, иначе полезет много артефактов. Даже с обычным стерео проблем с совместимостью много.
                                                                    Поэтому там есть специальнео меню, которое вылазит когда переключаешься на стерео. Система помнит все игры по имени, и пишет рекомендации в какой игре какие настройки поправить чтобы количество артефактов уменьшить. Например встренный в игру курсор отключить и воткнуть вместо него хардвейрный. Некоторых, правда, таких как WorldOfTanks не спасти.

                                                                    >> Анаглиф как и другие софтверные решения не стоит производителю практически ничего
                                                                    Анаглиф то да, но люба 3dVision карточка умеет отдавать два стереокадра по шнуру D-HDMA, на частотах кадров больше 100Гц. Реализовывать такую поддержку во всех картах на уровне железа во всех картах фирмы это явный перерасход усилий при том на сколько мало народу этим на самом деле пользуется.
                                                                      0
                                                                      Они что и матрицу налету механически перестраивают? Ну подождём, конечно, посмотрим.


                                                                      Один из вариантов вроде да, механически двигал, но могу ошибаться, давно дело был :). Но это вообще говоря совершенно не обязательно. Подобные мониторы строятся из двух элементов — условно говоря обычного дисплея и маски/линзового растра. Для смещения ракурсов нужно сдвинуть один из этих элементов относительно другого, а это можно реализовывать и простым движением картинки на дисплее влево-вправо. Там только что с разрешением матриц проблемы, движение-то дискретно по пикселям (соседние пиксели относятся к разным кадрам, так что интерполяция не прокатит). Их раньше и обходили двигая маски/линзы (т.к. там движение может быть сколь угодно плавным). Сейчас к счастью пошла волна мониторов со сверхвысоким разрешением, думаю что она даст очень большой толчок вперед подобным системам.

                                                                      Картинка физически одна в оба глаза и фокусироваться нужно именно на том расстоянии на котором сходится паралакс. А значит непосредственной усталости глаз не будет.


                                                                      Интересный довод, возможно. Но тогда и ощущения глубины не будет. Я не уверен что если человек будет ощущать глубину, то он не будет пытаться сфокусироваться на «ожидаемом» положении этой глубины или не испытывать конфликта между двумя разными ощущениями глубины (из движения глубина одна, из бинокулярного зрения — другая). Но конфликт здесь менее физиологичен чем с аккомодацией, так что возможно действительно напрягать он будет значительно меньше.
                                                              0
                                                              На хабре была статья, где похожим образом рисовали чайник, выглядящий находящимся частично с этой стороны экрана.
                                                              +2
                                                              Пару замечаний по физиологии для уточнения по поводу бинокулярного зрения.

                                                              У Дэвида Хьюбела «Мозг, глаз, зрение» обратите внимание на такую информацию:
                                                              «В поле 17 примерно половину нейронов составляют бинокулярные клетки»
                                                              Именно те клетки, которые лучше всего реагируют на сигналы от обоих глаз.
                                                              ( для тех, кто не читал подобного рода литературу, был такой исследователь Бродман, поделил кору на поля — картировал,
                                                              для зрительного восприятия выявил свои области — поля)

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

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

                                                              А фото, в свою очередь, при такой ситуации, будет выглядеть более глубоким, так как убирается диспаратность, которая обращала наше внимание на то, что это фото, а не реальность и оно находится прямо перед нами.
                                                                0
                                                                Для этого, я думаю, можно использовать зеркала, хотя это ещё та задачка, ведь надо смотреть из одной точки…
                                                                +1
                                                                Если вы тоже так думаете, у меня для вас небольшой сюрприз — это неправда. Доказательство прекрасно в своей простоте — достаточно закрыть один глаз и пройтись по комнате, чтобы убедиться, что мир внезапно не утратил глубины и не стал походить на плоский аналог анимационного мультфильма.

                                                                Мне кажется, вы немного путаете. В том смысле, что если человек 20+лет накапливал опыт и собирал библиотеку 3д-образов двумя глазами, то на момент, когда он глаза закроет, большинство паттернов уже будет у него в мозгу, и тут закрывай глаз или не закрывай — с уже проанализированными картинками можно работать и одним глазом.

                                                                Поэтому это не может считаться доказательством. Вот если бы был пример человека, который с детства имел только один глаз, и он видел всё плоско — это уже было бы ближе (хотя и в этом случае мозг мог адаптироваться именно с помощью алгоритмов, основанных на параллаксе. Но возможно, это именно вспомогательный алгоритм, когда основной — бинокулярный — дает сбой). 100% проверить можно было бы с помощью приборов, которые возвращают зрение слепым. То есть если человек никогда ничего не видел, а потом ему дать возможность видеть (через одну камеру) — то будет возможность точно узнать, достаточно ли этого для восприятия объема.
                                                                  0
                                                                  Очень много комментариев на эту тему, в том числе и мимо хабра, поэтому придется написать куда-то в одно место. Выбор пал на вас)

                                                                  — вы правы в том, что это не строгое доказательство, в том случае, если мы допускаем, что есть несколько алгоритмов восприятия глубины, и какие-то из них просто «набивают библиотеку» опытом, а когда библиотека уже есть, могут спокойно отключиться и никто не заметит потери. Причем «не заметит» сказано еще и очень мягко. Когда мы смотрим на экран в кинотеатре, наше бинокулярное зрение вообще никак нам не помогает (весь экшн происходит на плоскости экрана), и мы не чувствуем никакого дискомфорта, никакой необходимости перестраиваться, мы вообще не замечаем каких-то отличий — вплоть до того, что как в пелевинской метафоре про телевизор, не всегда можем понять, сами ли мы двигаемся по миру, или уставились лицом в экран, показывающий нам всю картинку. Опять же, не строгое доказательство, но заставляет слегка задуматься на тему того, почему такой важный элемент восприятия, как вы утверждаете, так легко выключается?
                                                                  — у большого количества животных глаза смотрят по обе стороны головы. Мы ведь не считаем, что они все не осознают, что находятся в трехмерном мире, и ходят по плоскому миру мультиков? Опять же, вы можете сказать, что эти животные пользуются другим методом — параллакса или еще каким. Но зачем тогда нам смотрящие вперед глаза? Если они не дают никакого ощутимого профита по сравнению со, скажем, зрением птиц, то почему они закрепились в ходе эволюции? А если дают — почему они появились только у части животных? Общераспространенное мнение (по крайней мере, в моем учебнике биологии) говорило, что вперед смотрящие глаза нужны хищникам, чтобы лучше ориентироваться и хватать добычу — и это, как несложно заметить, не очень согласуется с тем что существует куча хищников, обладающих глазами по бокам головы, и им норм.
                                                                  — что-то уже больше похожее на доказательство — что будет, если залепить глаз новорожденному котенку? А ничего не будет. Через непродолжительный период он сможет восстановить нормальное поведение, не будет врезаться в стены и в целом будет таким же котом, как и остальные.
                                                                    +1
                                                                    что будет, если залепить глаз новорожденному котенку? А ничего не будет. Через непродолжительный период он сможет восстановить нормальное поведение, не будет врезаться в стены и в целом будет таким же котом, как и остальные.


                                                                    В цитируемой статье вообще-то написано

                                                                    The behavioural effects of an early period of monocular deprivation can be extremely profound. However, it is possible to achieve a high degree of recovery, even to normal levels of visual acuity, by prompt imposition of certain regimes of part-time reverse occlusion where the initially non-deprived eye is occluded for only part of each day in order to allow a daily period of binocular visual exposure

                                                                    Т.е. с одним глазом от рождения получаем явно ненормального кота с «экстремально большими» изменениями в поведении
                                                                    Но если дать ему смотреть двумя глазами какое-то время, даже непродолжительное, то кот может вернуть поведение намного ближе к норме. Дальше однако уточняется что полноценное стереовосприятие при этом похоже все равно не восстанавливается
                                                                      0
                                                                      Упс. My bad, что-то я правда невнимательно читал аннотацию. Временно откатываю этот довод, пока не соберу больше источников) Два предыдущих остаются, кстати.
                                                                      0
                                                                      Опять же, не строгое доказательство, но заставляет слегка задуматься на тему того, почему такой важный элемент восприятия, как вы утверждаете, так легко выключается?

                                                                      Пример с котенком это и есть это утверждение, так что остается только одно — что они находятся по разные стороны. Но это тоже не аргумент. Возможно, что два глаза просто упрощают восприятие — известно же, что ящерицы видят в 2д, а третье измерение «достраивают» у себя в мозгу. То есть для них 3д — это умозрительная вещь (как для нас — 4д пространство). А у нас два глаза позволяют разгрузить мозг.

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

                                                                        Только в первом случае это реальный (глубокий) окружающий мир, а во втором — приклеенный к стене экран, где показывается то же самое, что и за окном.

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

                                                                        *печально* Вопросы громкие и назойливые, но вообще, если быть отвратительно честным, у меня нет здесь доказательств, пока я не вырастил ребенка (или кота) с телевизором, привязанным к голове. Наверное, наиболее убедительным мне все-таки кажется довод про животный мир — почему ящерица не сдвинула себе два глаза вперед, если это облегчает расчеты и позволяет облегчить мозг? Не то чтобы это было офигеть какое преобразование. Не говоря уже о том, что наверное, можно будет выкинуть неслабую часть мозга (занятую расчетами), которой у ящерицы и так не очень-то…
                                                                          0
                                                                          Значит 360 градусов обзора ящерице нужнее. А насчет телевизора скажу просто — адаптация. Вспомните эксперимент того ученого, который сделал очки, которые переворачивали изображение — вы же помните, что мы видим мир «перевернутым».
                                                                    +1
                                                                    Не могу похвастаться, что все понял, но читать было интересно. Хабр — торт.
                                                                      0
                                                                      Статья интересная, с точки зрения «как своими руками собрать 3д треккер».

                                                                      У меня есть несколько сомнений/вопросов:
                                                                      1) Я не смог распознать машинку на втором облаке точек. «Продолговатый предмет» — да, но машина как-то не распознается.
                                                                      Вы попробуйте отмешить эти «малоплотные» поинтклауды — без текстур очень затруднительно даже человеку понять «что это такое».
                                                                      С текстурами конечно уже будет гораздо веселей — подозреваю, что это следующий этап вашего плана.

                                                                      2) Насчет мозгов и прочего — человек просто невероятно неточен. Закрой глаза на миг — и ты уже не сможешь воспроизвести только что увиденный предмет в объеме — ошибешься и с размерами, и с пропорциями, и даже с формой (если это не что-то, с чем ты имеешь дело каждый день).
                                                                      А тут компьютер с его точной кординатой точной точки. Мне кажется нужны какие-то вольности. Не точки, а области, с каким-то допуском, и т.п.

                                                                      Можно провести эксперимент — загнать одноглазого в раскрашенную графитти пещеру, с очень сильным рельефом и равномерным освещением. Она даже может быть раскрашена в клеточку. Даже с двумя глазами, думаю, будет не просто определить форму, объем, расстояние, и т.п. А с одним — так вообще.
                                                                      Эксперимент можно провести на экране — сгенерировав глубину по нойзу, и наложив поверх любую замысловатую текстуру, а потом проехавшись поездом-камерой по рельсам вдоль — и посмотреть что одним глазом удастся воссоздать (в отличие от знакомых нам зеленых полей с облаками и деревьями).

                                                                      В целом интересно — продолжайте.

                                                                      По софту:
                                                                      Agisoft Photoscan (там фотограмметрия в чистом виде, для фото, но можно и кадры из видео подсунуть).
                                                                      какойнибудь 3d camera tracker — из последнего After Effects или лучше Nuke — там можно не знать никаких параметров камеры, автоматом по видео определяются, строятся точки, плотный поинтклауд потом и мешинг с текстурингом.
                                                                      Единственное, что рекомендую — предварительно денойзить видео от шума и зерна, и брать оригиналы без сжатия. И самое главное — не забывать про Lens Distortion, иначе будет сильный расколбас в поинтклаудах.
                                                                        0
                                                                        — и это, как несложно заметить, не очень согласуется с тем что существует куча хищников, обладающих глазами по бокам головы, и им норм.

                                                                        Даже у этих хищников всегда есть довольно обширное перекрытие полей зрения для точной оценки расстояния до объекта.
                                                                        А если этого нет, то значит точное расстояние до объекта определяется преимущественно не зрением.
                                                                        К слову, у многих травоядных почти нет перекрытия полей зрения или оно незначительно.
                                                                        Зато панорамности достаточно, чтобы к ним трудно было подобраться незамеченным.
                                                                          –1
                                                                          У вас начало про одно, конец про другое.

                                                                          Навскидку такую задачу можно решить двумя путями:
                                                                          1. Построить point cloud и потом либо пройтись скользящим окном, либо матчить 3D дескрипторы, либо использовать ICP.
                                                                          2. Multi-view object detection\recognition.

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

                                                                          И как говорят в этом видео видят не глаза, видит мозг.
                                                                          –3
                                                                          > Главная проблема, о которую мы немедленно споткнулись — там, например, пересекаются параллельные прямые.

                                                                          Финиш. Прямые параллельны в ПРОСТРАНСТВЕ, а пересекаются их ПРОЕКЦИИ на фото.
                                                                            +1
                                                                            Помню примерно 10 лет назад работал я в геймдеве, и работал я над квестом по визуалу чем-то похожем на Сибирь. Стояла задача перемещения 3Д обьекта по высокодетализованной, но статичной 3Д сцене.
                                                                            Решение было найдено через проекции картинки на 3д «сетку карты глубины». Один в один как у вас с кубиками на первой гифке.
                                                                            В итоге начал играться с построениями таких сеток, в том числе через паралакс.
                                                                            При высокой плотности кадров — почти никаких проблем, до тех пор пока сетка не начинает разбиваться на отдельные 3д обьекты.

                                                                            А вообще алгоритм можно применить немного по другому — снимать с неподвижной точки например дорогу, или небо. А потом «игнорировать» все обьекты(пиксели) что задетектили смещение.
                                                                            И можно за минуту получить чистое небо и пустые улицы. Без перекрытий центра города и силуэтов длинной выдержки.
                                                                              0
                                                                              А вообще алгоритм можно применить немного по другому — снимать с неподвижной точки например дорогу, или небо. А потом «игнорировать» все обьекты(пиксели) что задетектили смещение.
                                                                              И можно за минуту получить чистое небо и пустые улицы. Без перекрытий центра города и силуэтов длинной выдержки.
                                                                              В Фотошопе: File -> Scripts -> Statistics -> Median
                                                                                0
                                                                                Дизайнеры по коридору направо.
                                                                                  +1
                                                                                  Если секс, то только стоя, в гамаке и на лыжах?
                                                                                    –1
                                                                                    Плохой ответ. Правильный — habrahabr.ru/post/237423/
                                                                                      –1
                                                                                      Ответ пытается донести мысль, что для перечисленных задач уже существуют готовые инструменты, позволяющие получить быстро прототип решения и поиграться. Я только обозначил наличие таких инструментов в одном популярном софте. А с какой целью Вы настойчиво предлагаете изобретать велосипед?
                                                                                        0
                                                                                        В той статье автор не догадался использовать медианный фильтр…
                                                                                          0
                                                                                          Ему об этом в комментариях подсказали.
                                                                                          Зато автор примерно обьяснил и показал на примере как работают математики такого рода.
                                                                                          Вон оно отличие дизайнеров, системных интегратов и аутоматоров от классических программистов — желание понимать суть происходящего, копаться и велисапедить.
                                                                                          Вы же понимаете как работает медианный фильтр?
                                                                                          Молча складывает? Откидывает что-то по квантилям? Добавляет другой магии? Сколько вариантов магии?
                                                                                            +2
                                                                                            Для того, чтобы понимать, как работает медианный фильтр, не обязательно учить язык программирования.
                                                                                              +1
                                                                                              Но для того, чтобы увидеть, как работают его разные варианты, и понять, почему они работают именно так, неплохо бы его изучить, чтобы иметь возможность экспериментировать. Особенно если не все интересующие варианты реализованы во всяких фотошопах.
                                                                                              +1
                                                                                              Зато автор примерно обьяснил и показал на примере как работают математики такого рода.
                                                                                              Не выдавайте желаемое за действительное. Автор той статьи ставил перед собой другую, сугубо утилитарную цель: "В конечном итоге ничего подходящего я так и не нашел, и в итоге решил написать такое ПО самому, благо что все выглядело весьма легко."
                                                                                              В результате он потратил время на создание своего велосипеда и сделал его не совсем правильно, а ведь достаточно было просто подсказать ему про фотошоп.
                                                                                                0
                                                                                                Ок, но фотошоп не может являться допустимым решением, так как привязан к некой платформе, лицензии, не имеет АПИ и не запускается с консоли.
                                                                                                А вот решение на ImageMagic/OpenCV/Perl/Python/и.т.д — может.
                                                                                                  +1
                                                                                                  фотошоп не может являться допустимым решением, так как привязан к некой платформе, лицензии, не имеет АПИ и не запускается с консоли.
                                                                                                  Вполне может являться решением в рамках задачи, допускающей такие ограничения.

                                                                                                  решение на ImageMagic/OpenCV/Perl/Python/и.т.д — может.
                                                                                                  Да, это более гибкий, но и трудоемкий в адаптации к нужному решению инструментарий. Странно сразу за него хвататься, когда задачу можно решить более простыми средствами. Более простые средства, это необязательно фотошоп, но тот же ImageMagic против OpenCV или OpenCV против голого C++ или C++ против ассемблера, например. Простыми эти средства стали за счет специализаций под наиболее распространенные задачи. Поэтому, разумно при решении задачи поинтересоваться, насколько она уникальна и есть ли для нее приемлемые готовые решения. Вроде, очевидные вещи.
                                                                                  0
                                                                                  Что касается первого фото и рассуждений об эффектах перспективы: двояковыпуклая линза (хрусталик) в фокус проецирует то, что максимально удалено, по мере приближения проекция отступает от фокуса (конечно, если не рассматривать центральную ось). На мой взгляд, нет более простого варианта оптического прибора и более простого критерия удаленности (и в т.ч. снижения важности для жизнедеятельности), поэтому он и выбран в процессе отбора. А искажения граней куба просто признаются несущественными на фоне решения этой задачи. Предметы, расположенные вблизи и на оси зрения, практически не искажаются и не напрягают мозг.
                                                                                    +2
                                                                                    Получив 3д модель, и фото в профиль так и не появится второй глаз, так что проблемы у алгоритма распознования будут все еще довольно большие. Разве что сможет догадаться, что возможно видит часть лица…
                                                                                      0
                                                                                      Шикарно, спасибо за статью!
                                                                                        0
                                                                                        Присоединюсь, шикарная статья!
                                                                                        Это же почти готовый алгоритм для системы наведения.
                                                                                          +1
                                                                                          Представьте, что вы — нейронная сеть. Это не должно быть очень сложно — в конце концов, как-то так оно и есть на самом деле.

                                                                                          Узнаю стиль Питера Уоттса :)
                                                                                            +2


                                                                                            «Представьте, что вы — машина.

                                                                                            … да, я понимаю. Но представьте, что вы другая машина.»
                                                                                            0
                                                                                            Спасибо за хорошую статью и ваш труд!

                                                                                            Вместо того, чтобы копировать увиденное, мы хотим найти принцип и повторить его своими силами (может быть, сделав это проще/эффективней).


                                                                                            На мой взгляд, вы слишком заостряете внимание на визуальной составляющей и трёхмерных координатах. В реальности же мозг создаёт приближённую объектную трёхмерную модель. Попробуйте закрыть глаза, и ведь всё равно некоторое время вы будете ощущать окружающее пространство и предметы вокруг себя. Если же вы вы чего-то касаетесь или слышите, то так же представлете форму и положение объекта.

                                                                                            Банально, без зеркала нельзя рассмотреть свои зубы, но в мозгу есть их трёхмерная модель, созданная с помощью осязания. Мы знаем особенности и положение каждого зуба. Примечательно и то, что эта модель даже слегка может отличаться от визуальной (бывает, в зеркале зубы кажуться не совсем такими, какими их чувствует язык).

                                                                                            Хотя бинокулярный эффект и эффект перемещения играют некоторую роль, на мой взгляд, это не основные факторы, ведь по двумерной фотографии мозг запросто восстанавливает положения объектов в пространстве.

                                                                                            Что касается зрения, сначала анализируются примитивы: линии, области света и тени, цвета, после чего распознаются фигуры и контуры. Затем это всё кластеризуется в более сложные образы знакомых нам предметов. На основании привычных нам размеров и теней выводится их относительное местоположение друг к другу, а после этого приближённая трёхмерная модель. Ведь мы можем построить её даже по детскому рисунку из статьи!

                                                                                            Более того, мозг способен строить объёмные модели вообще по чему угодно, только дайте побольше деталей для образа, воображение всё доделает. Взгляните на тесты Роршаха. Как можно научить компьютер что-то распознавать в них, если использовать только трёхмерное моделирование точками?

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

                                                                                            Буду рад услышать и другие рассуждения по этому поводу!

                                                                                            Only users with full accounts can post comments. Log in, please.