Так как же робот «видит»?
Основные методы навигации
Если бы вы отправляли робота исследовать Марс, какую технологию вы бы использовали, чтобы помочь этому роботу самостоятельно перемещаться?
Чтобы этот робот мог самостоятельно перемещаться, он должен делать несколько вещей: во-первых, он должен собирать информацию, а во-вторых, он должен уметь задавать себе вопросы. Наконец, нужен способ найти решение.
Робот должен уметь спрашивать себя:
"Где я? Куда я иду и как я туда доберусь? »
Это ключевой вопрос, который марсоход НАСА Кьюриосити задал себе на Марсе. У людей есть глаза и мозг для обработки сенсорной информации, поэтому обычно мы переходим к поиску решения. Но робота нужно строить с нуля. Какие технологии доступны для понимания своего окружения? Еще до того, как он начнет двигаться, как робот может видеть?
Какой робот нам нужен?
В области робототехники марсоход Curiosity от НАСА классифицируется как мобильный (не привязанный к одному месту) и автономный (может перемещаться без контроля человека). Дроны с автопилотом и беспилотные автомобили также принадлежат к этому семейству.
В этой статье я рассмотрю только визуальный подход, позволяющий роботам собирать сенсорные данные об окружающей среде. . Это означает, что у нашего робота установлена камера, которая выполняет роль его глаз. Мы увидим, как этот оснащенный камерой робот может определять, где он находится, и даже строить карту исключительно на основе того, что он видит.
Что означает «робот знает, где он находится»?
Короткий ответ:
- Робот может точно определить свое местоположение на данной карте;
- и знать, в каком направлении он смотрит
Начнем с того, как мы, люди, позиционируем себя. Сначала мы осматриваемся и ищем ориентиры, которые можно найти на карте, которую мы держим. В городе мы, вероятно, будем искать известные здания, магазины или перекрестки вокруг нас и искать соответствующие символы на карте (банк, туалет и т. Д.). На основании того, что эти символы находятся в положении, соответствующем тому, что мы видим, мы можем приблизительно определить свое местоположение на карте. Если бы мы хотели быть точными, мы могли бы достать лазерные указки, компас и использовать тригонометрию.
Как робот оказывается на карте
Робот может найти себя так же, как люди:
- Ищите близлежащие достопримечательности;
- Определить ориентиры на карте;
- Используйте известное положение ориентира, чтобы определить его положение и ориентацию.
Разница в том, что роботу с камерой нужно научить распознавать предметы на карте. Итак, как робот понимает, что он видит?
Мы, люди, видим изображение как совокупность объектов, которые мы придаем значение.
Для робота изображение в виде необработанных данных - это просто сетка цифр.
«Глаза» робота, его камера могут воспринимать визуальную информацию, но робот должен знать, как превратить эти 0 и 1 в значение? Он не умеет идентифицировать яблоко, камень или здание.
Давайте оставим идею «понимания» изображения. Есть ли способ «обмануть» и заставить робота не понимать изображение, но при этом он может выбрать какой-нибудь ориентир для поиска на своей собственной карте? Ответ: да.
Роботы, использующие визуальный подход, могут определять свое местоположение, не «понимая» визуальные эффекты, которые они воспринимают.
Если мы используем элементы изображения в качестве ориентиров, а карта состоит из набора элементов изображения, связанных с информацией о местоположении робота, робот может определить свое местоположение. Я объясню ниже.
Использование функций изображения для определения ориентиров
Так что же такое функция изображения? Прежде чем ответить на этот вопрос, давайте задумаемся, что такое ориентир.
Из Википедии,
«Ориентир - это узнаваемый естественный или искусственный объект, используемый для навигации, объект, который выделяется из своего окружения и часто виден с большого расстояния».
Другими словами, ориентир выглядит иначе, чем его окружение - обычно из-за различимого размера или высоты.
Элемент изображения имеет те же характеристики, что и ориентир, это небольшая область изображения, которая выглядит иначе, чем его окружение. Это может быть значение внутри этого региона, которое намного больше или меньше, чем его окружение. И нетрудно понять, что особенности изображения обычно находятся в точках / углах / вершинах объекта, поскольку эти области имеют резкое изменение значения изображения во всех направлениях.
Рисунок 3а. Эйфелева башня - образец хорошей достопримечательности, поскольку она уникальна и способна выделяться на фоне окружающей среды.
Рисунок 3b. Напротив, дома в усадьбе - плохие ориентиры. Учитывая только фасад дома, мы не узнаем, какому дому этот фасад принадлежит.
Что считается хорошими и плохими качествами? Пример.
Рис. 4. Приведенные выше изображения являются исходными изображениями, а изображения под ними показывают части изображения, которые считаются хорошими отличительными признаками (красные области означают хорошие особенности, а синие области подразумевают плохие особенности).
Хороший элемент изображения, который может служить ориентиром, в идеале должен иметь одну и ту же часть объекта с одним и тем же элементом изображения, независимо от того, как этот объект захватывается камерой. Мы бы хотели, чтобы эта обнаруженная функция изображения оставалась неизменной даже при изменении угла обзора и / или изменении условий освещения.
Очень сложно получить идеальную функцию изображения, однако есть способы практически разработать функцию изображения, которая приведет к очень похожей функции изображения, даже если есть изменение в размере объекта или изображение повернуто.
Чтобы разработать функцию изображения, мы хотим знать две вещи:
- как найти черту на изображении; а также
- как это описать, например в матрице
Рис. 5. Чтобы проиллюстрировать, как выглядят особенности изображения и его дескрипторы, мы можем запустить детектор SIFT (масштабно-инвариантное преобразование признаков) [⁴] и наложить обнаруженные особенности с иллюстрацией дескрипторов поверх исходного изображения. Желтые круги указывают на расположение функций. Зеленая сетка 4x4 показывает патч изображения, используемый для вычисления дескрипторов. Ориентация сетки позволяет нам использовать ориентацию объекта и стрелки внутри сетки, показывающие нам локальную ориентацию внутри участка изображения. В отличие от того, что мы собираемся обсудить в следующем отрывке, вместо описания функции изображения исключительно с помощью значений пикселей фрагмента изображения, дескриптор SIFT хранит информацию о градиенте / ориентации элемента изображения. Это делает функцию SIFT менее подверженной изменению условий освещения.
Как определить особенности изображения?
Один из способов поиска деталей на изображении - поиск резких изменений в соседних пикселях во всех направлениях [¹].
Рисунок 6. Изображение, показывающее значение RGB пикселя изображения. Когда мы увеличиваем изображение до небольшой области, мы видим множество цветных квадратов.
Было бы идеально, если бы мы могли каждый раз фотографировать один и тот же объект с одного и того же расстояния. Однако, если мы сделаем снимок с разным расстоянием до объекта, мы обнаружим, что получаем совершенно другой набор функций для каждого изображения. Поскольку мы меняем расстояние до объекта, размер снимаемого объекта будет меняться; чем ближе мы делаем снимок, тем больше размер объекта появляется на изображении. При увеличении масштаба некоторые углы больше не будут считаться углами.
Точно так же, если мы отойдем от объекта, некоторой части объекта, скажем, пятна, которое слишком велико, чтобы рассматривать его как угол перед станет углом. В общем, обнаружение особенностей изображения на основе локального резкого изменения пикселя зависит от размера объекта. Когда мы находим особенности таким образом, лучше варьировать размер изображения, чтобы убедиться, что у нас есть особенности изображения обложки, которые также соответствуют разному размеру объекта. [²]
Описание функции изображения
Хорошо, теперь мы знаем, как находить особенности изображения, и мы можем найти их на изображении, что дальше? После обнаружения функции изображения нам нужно придумать способ ее описания, то есть записать, как выглядит эта функция. Самый простой способ, вероятно, - нарисовать квадрат 7x7 с центром в элементе изображения и использовать эти 49 пикселей внутри квадрата в качестве дескриптора этого элемента. Если мы хотим, чтобы один и тот же объект, но с другим цветом описывался одним и тем же (или, по крайней мере, аналогичным) способом, вместо сохранения патча изображения 7x7 со всем значением RGB мы могли бы использовать значение шкалы серого [²].
Рисунок 7. На рисунке показано, как описать функцию изображения с помощью фрагмента изображения. По сути, нам просто нужно обрезать небольшую область изображения рядом с элементом изображения (вот патч изображения 15x15), преобразовать его в шкалу серого и сохранить значения пикселей в заранее определенном порядке (здесь слева вверх и сверху вниз.)
После того, как мы создали дескриптор для каждой функции изображения, мы можем начать думать о том, как сравнить две функции изображения, чтобы определить, похожи ли они на них.
Мы можем сделать это, вычтя один дескриптор из другого. (который вычисляет 49 вычитаний, если мы используем патч изображения 7x7 в качестве дескриптора), берет абсолютное значение [³] и затем суммирует разницу. У нас есть название для этого - SAD (Сумма абсолютной разности).
Рис. 8. Иллюстрация, показывающая, как вычисляется SAD между 2 фрагментами изображения 3x3. Сначала вычисляется абсолютная разница между пикселями в одном и том же месте (они имеют одинаковый цвет), наконец, нам просто нужно просуммировать эти различия.
Итак, что это значит, если значение SAD между двумя дескрипторами невелико? Это означает, что два дескриптора выглядят одинаково - значение SAD между двумя идентичными дескрипторами равно нулю. Следовательно, мы можем использовать значение SAD для определения сходства характеристик изображения. И мы могли бы выбрать пороговое значение, когда значение SAD между двумя функциями ниже этого значения (например, 100), мы можем считать, что эти две функции практически одинаковы.
Что делать, если изображение снято под другим углом?
Дескриптор, инвариантный к повороту
Теперь представьте себе два изображения. Один из них повернут на 30 градусов дальше другого. Вероятно, мы могли бы найти один и тот же набор функций изображения среди этих двух изображений. Однако это может привести к очень разным дескрипторам изображения между парой функций, и это нехорошо, поскольку на самом деле они относятся к одной и той же части объекта. Чтобы решить эту проблему, мы должны найти способ определить ориентацию изображения. И мы могли бы сделать это, вычислив градиентные изображения.
∑
Градиентное изображение описывает, как изображение изменяется. Это очень легко вычислить, просто вычислив разницу между значением градации серого соседнего пикселя. Пиксель каждого градиентного изображения состоит из двух компонентов: x и y. Компонент x показывает, как пиксель изменяется по горизонтали, в отличие от правого и левого пикселей; компонент y показывает, как пиксель изменяется по вертикали, и рассчитывается по разнице между пикселем выше и пикселем ниже.
Таким образом, каждый пиксель изображения градиента фактически говорит нам, насколько сильно пиксель изменяется как в горизонтальном, так и в вертикальном направлении. С помощью тригонометрии мы могли вычислить ориентацию (угол, который представляет собой арктангенс вертикального изменения, деленный на горизонтальное изменение) для каждого пикселя. Точно так же мы могли бы суммировать все x-компоненты и y-компоненты градиентного изображения соответственно и эти две суммы, чтобы вычислить ориентацию для данного изображения.
Как только мы узнаем, как определить ориентацию изображения изображение, мы также можем сделать это с патчем изображения, который мы использовали в качестве дескриптора изображения. Теперь вместо того, чтобы просто использовать патч изображения, мы используем патч повернутого изображения для описания функции. Патч повернутого изображения означает, что мы выбираем патч изображения 7x7 после того, как мы повернули изображение, чтобы сместить его ориентацию; скажем, вычисленная ориентация фрагмента изображения составляет 15 градусов по часовой стрелке, нам нужно предварительно повернуть изображение на 15 градусов против часовой стрелки, прежде чем выбирать фрагмент изображения. Таким образом, когда мы сравниваем два дескриптора, мы сравниваем их в одной ориентации.
Рис. 9. На иллюстрации показаны фрагменты изображения обычного изображения Сиднейского оперного театра и повернутого изображения, расположенные в одном элементе изображения. Если мы вычислим SAD на этих двух патчах, это покажет большую разницу. Однако, допустим, мы можем определить ориентацию обоих изображений, т.е. мы знаем, что изображение справа повернуто на 90 градусов по часовой стрелке, а затем мы можем предварительно повернуть правое изображение на 90 градусов против часовой стрелки, прежде чем снимать фрагмент изображения. В этом случае у нас будет 2 идентичных патча изображения на одном и том же элементе изображения.
Резюме
Вышеупомянутый метод имеет недостаток, заключающийся в том, что робот зависит от хорошо налаженной карты; если робота отправили на Марс, а у нас еще нет карты, то этот способ не сработает.
В другом посте я подробнее расскажу о том, как робот может исследовать и строить карту на месте в следующей части.
Сноски
[¹]: пиксель (элемент изображения) - это изображение, которое может быть представлено в виде числовой сетки. Каждый маленький квадрат сетки - это пиксель. Одно или несколько значений могут быть связаны с пикселем, и обычно каждое из них будет представлять одну интенсивность цвета. Поскольку разные цвета могут быть составлены только из красного, зеленого и синего цветов, наиболее типичный формат пикселя будет состоять из трех чисел, каждое из которых представляет интенсивность цвета каждого из этих цветов.
[² ]: Один простой способ вычислить значение шкалы серого из значения RGB - взять максимальное значение среди значений RGB в качестве значения шкалы серого.
[³]: Абсолютное значение положительного числа - это само по себе, и абсолютное значение отрицательного числа - это соответствующее число без знака минус.
[⁴]: В этой статье мы представляем две основные концепции, используемые SIFT: инвариантность к масштабу и инвариантность вращения.
Создаете приложение? Наши бесплатные инструменты разработчика и бэкэнд с открытым исходным кодом упростят вашу работу.