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

Например, к таким зданиям относится наша Инженерно-технологическая школа №777 г. Санкт-Петербург. Мы столкнулись с такой проблемой, что когда нашу школу посещают гости и родители, то им сложно найти нужный кабинет или другое необходимое место. Каждый находит свой выход из данной ситуации, кто-то бесконечно спрашивает работников здания, а кто-то просто блуждает по бескрайним коридорам. Проанализировав данную проблему, мы решили сделать для таких посетителей навигатор по нашей школе. Но простой навигатор с картой внутри здания не актуален, что не скажешь об одной из новых и быстроразвивающихся технологий дополненной реальности (AR). Наш навигатор разрабатывался с технологией AR, методами компьютерного зрения и машинного обучения. Он поможет сориентироваться и найти точное место, куда необходимо пройти посетителям нашей школы.

Цель


Цель — создание универсального помощника в ориентировании по зданию.

Основные задачи:

  • Упростить ориентирование по школе новых учеников, родителей и гостей;
  • Сделать приложение универсальным, чтобы в последствии оно поддерживало навигацию не только по нашей школе, но и по любым другим зданиям во всем мире;
  • User-friendly интерфейс, понятный каждому;

AR — Дополненная реальность


Сейчас с каждым годом появляются все новые и новые технологии, одна из таких технология дополненной реальности или просто AR. Сначала самое первое его ознакомление, произошло, когда всем известная компания “Google” решила сделать свои очки с дополненной реальностью. Тогда технология AR начала развиваться неимоверно быстро. Когда Google отказались от своего проекта “Google glass”, пришла новая эпоха масок, которые распознавали наше лицо и превращали его в знаменитостей. Затем покемоны захватили обе реальности и люди проходили километры в поисках самого крутого персонажа.

А совсем недавно компании “Google” и “Apple” представили свои движки для AR это ARCore и ARKit соответственно, из этого можно сделать вывод, что технология AR станет еще доступней для развития и создания все новых и новых приложений и игр.

Что же такое AR?


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

Также дополненную реальность (augmented reality, AR) надо уметь отличать от виртуальной (virtual reality, VR) и смешанной (mixed reality, MR).

В чем же их основные отличия?


В AR виртуальные цифровые объекты проецируются на реальное окружение, в отличии от виртуальной реальности.

Виртуальная реальности — это созданный цифровыми техническими средствами мир, передаваемый человеку через органы чувств.

Смешанная реальность является чем-то среднем между VR и AR и объединяет в себе оба подхода.

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

Перспективы развития


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

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

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

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

Планирование работы


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

Для данной модели нам пришлось решить 2 основные задачи:

  • детектирование букв на изображении;
  • распознавание букв.

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

После долгих споров мы пришли к единому мнению – детектор текста должен решать задачу регрессии, т.е. модель должна предсказывать, где потенциально расположена буква. Затем мы смоделировали нейронную сеть, состоящую из двух слоев не включая входного и выходного слоя, но тогда мы столкнулись с проблемой: данных на выходу стало очень много, из-за этого у нас появилась проблема – проблема переобучения, и мы пришли к выводу что нам нужна другая архитектура и подход к задаче, после долгой дискуссии мы пришли к выводу что нам нужно детектировать не буквы сразу, а сначала слова, а только потом буквы. И тут мы потратили довольно много времени для изменения базы данных и потом добавили еще одну нейросеть в каскад, из-за этого наш коэффициент (мы выбрали метрику Mean Squared Error) снизился на 40%, но все же действительный результат был далеко от желаемого, поэтому мы решили переписать архитектуры 2 нейронных сетей для этого нам пришлось разобрать “ансамбль” и понять как каждая сеть работает поодиночке и понять зачем нам нужен каждый параметр у каждой сети. Затем мы поняли, что вместо того, чтобы уменьшать количество параметров, можно изменить подход к задаче, и наша команда изменила модель: теперь это одна сверточная нейронная сеть, при этом подходе у нас снизился коэффициент ошибки на 30% и скорость прогона через сеть возросла.

Задача детектирования символов решена, осталось решить задачу распознавания символов, само распознавание символов была для нашей команды не новой задачей, мы натренировали сверточную нейросеть которая по архитектуре была схожа с нейросетью LeNet и получили на тестовом датасете коэффициент ошибки 99%(т.е. нейронная сеть почти не ошибалась). Но на практике это оказалось неприемлемым решением так как на вход этой сети должна поступать картинка фиксированного разрешения, а на практике на вход могут поступать разные картинки с разным разрешением, и тут наша команда задумалась и решила натренировать ту же нейронную сеть но только на картинах с достаточно большим разрешением, настолько большим что можно было точно предполагать что большего разрешения на вход нейросети подано не будет, но тут же мы от этой идеи отказались потому что мы пытаемся изменить разрешение картинки подаваемой на вход в архитектуру которая не подразумевает изменения разрешения изображения, получается теперь нам надо думать еще и над архитектурой распознавания букв, и мы поняли что лучшим решением было – взять за основу архитектуры – потомка нейронной сети LeNet – ResNet от компании Microsoft эта архитектура подразумевает, что в нее будет поступать изображения с разным разрешением.

В итоге после того как мы натренировали нейронную сеть, коэффициент ошибки у нас стал равным 95% — да это немного меньше чем при архитектуре LeNet но это работает, потом мы вспомнили что нам надо распознавать не все буквы, а только цифры и решили добавить перед определением символа еще одну модель которая будет определять является ли определяемый символ цифрой или буквой, так как эта модель решает задачу классификации и классифицирует только 2 класса, то нейросеть было брать за основу бессмысленно и поэтому мы взяли за основу архитектуры логистическую регрессию, после добавления этой модели в “ансамбль” и переобучения нейронной сети (только на цифры) у нас коэффициент ошибки стал +- 97% что очень не плохо, на этой “ноте” мы решили закончить работу над распознаванием символов и, как итог у нас получился такой “ансамбль”:

Исходная картинка -> Сверточная нейронная сеть, которая определяет расположение слов -> Сверточная нейронная сеть, которая определяет расположение букв -> логистическая регрессия, которая определяет буква на картинке или цифра -> ResNet, которая определяет конечную цифру

Но затем у нас стояла еще одна проблема: проблема с отслеживанием геолокации. Сначала мы подумали, что это одна из самых легких задач и оказались неправы. Первым делом мы как настоящие программисты пошли по пути наименьшего сопротивления и просто отслеживали GPS геолокацию у объекта — не сработало, погрешность была настолько большая что это нас ни в коем случае не устраивало, мы решили подумать над другими вариантами определения геолокации и решили подключить сервис от компании Яндекс — Яндекс Локатор, но он оказался не рабочий, т.е. совсем не рабочий сервис в котором нельзя подключить API, нашей следующей мыслью было подключение фреймворка mapbox для движка Unity (именно на нем мы решили разработать наш проект), после того как мы удачно подключили этот фреймворк, изучили его возможности и написали простой GPS трекер — результат был уже лучше, но погрешность была все еще большой, из-за этого мы продолжили поиск решений и после внимательного чтения документации мы нашли, что у полученного значения существует погрешность 15%, нас это не устраивало, тем более у этого подхода был очень большой недостаток — он использовал GPS, а мы делаем навигатор по школе, значит в закрытом помещении, значит GPS сигнал будет либо очень слабым либо не будет вообще + GPS поддерживается не на всех устройствах, именно поэтому мы сменили подход и перешли от глобального распознавания к локальному на основе Visual Positioning System у этого метода тоже есть свои минусы, но они никак не влияли на нашу работу, поэтому система отслеживания геолокации была готова.

Практическая значимость


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

Функционал


Что же умеет наше приложение:

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

Реализация приложения


Приложение было написано на одном самых популярных движков под названием “Unity”, с использованием языка программирования C#, а также с использованием Python и библиотеки TensorFlow, по мимо всего выше перечисленного был использован пакетный менеджер Anaconda.

Как пользоваться данным приложением?


Предположим, я родитель и пришел на родительское собрание, мне нужно попасть в 339 кабинет, кабинет информатики. Я зашел в школу и должен отсканировать, как я уже повторюсь QR-код с таблички. Затем после успешной загрузки приложения я попаду в главное меню:

image

После этого я могу перейти в меню инструкции, чтобы узнать, как пользоваться приложением:

image

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

image

Стрелка в правом верхнем углу позволяет нам вернуться назад, в главное меню, если же система распознала номер кабинета, то вокруг таблички появляется рамка, а потом окно подтверждения:

image

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

Далее “родителю” надо выбрать пункт назначения и тут у него есть 2 варианта либо вписать номер кабинета, либо же выбрать его тип и найти потом в списке:

image

image

После этого “родителю” надо следовать указателям на камере.

Когда же вы придете к месту назначения, навигатор оповестит вас об этом.

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

План 1 этажа

image


План 2 этажа

image

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

Видеоролик вы можете посмотреть по данной ниже ссылке:


Вывод


При слаженной командной работе, достаточном времени и умениях применять soft skills любой проект можно реализовать.

Над приложением работали:

Василенко Илья — программист (backend)

Парфеньев Демид — Дизайнер

Лунев Даниил — Unity разработчик (frontend)

Пуртов Михаил — Data Miner, креативщик

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

Наша команда PYC верит, что Habr`у понравится наш проект.

С уважением команда PYC.

Инструменты


Unity + C#

Python + пакетный менеджер Anaconda + библиотека для создания нейронных сетей TensorFlow + библиотека для создания моделей машинного обучения scikit-learn

Immersal — Библиотека которая реализует VPS

Список литературы


Сайт, посвященный Tensorflow
Сайт, посвященный Immersal
Сайт, посвященный C#
Сайт, посвященный Python

*Данная публикация не претендует на рекламу нашего приложения, ибо его даже нет в открытых источниках и оно работает лишь в пределах школы