Описание решений, особенно OpenCV, машинного обучения — Tensorflow и Bluetooth 5.1. Советы дляновичков, как начать работу с этими инструментами.

Введение

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

Готово к использованию

Всем нужно с чего-то начинать. Наиболее простыми в использовании являются алгоритмы с открытым исходным кодом в виде, например, библиотеки — пакета для определенного языка программирования. Мы можем прямо применить их к нашей собственной идее. Лучшее для первых проб. Стоит выйти в глубокое море неизвестного предмета. В отличие от обучения плаванию, через какое-то время каждый обнаружит, сколько нового и увлекательного он узнал. Вот почему хорошо разработанная документация и много активных пользователей обязательны. Кто-то должен передать нам знания, чем больше людей, тем лучше. Мы начнем с создания двух мобильных приложений, одного для IOS и другого для Android. Нашим выбором будет библиотека OpenCV, которая поддерживает множество операционных систем, и мы будем тестировать фреймворк Vision от Apple. В связанном репозитории вы можете найти описание тестового устройства. Приложение должно иметь следующую спецификацию. На первом экране пользователь выбирает устройство, затем подключается к нему через Bluetooth. После успешного подключения отображается предварительный просмотр камеры, а также основная диагностическая информация. Отслеживание объекта начинается с его отметки на экране. После этого телефон отправляет соответствующие инструкции контроллеру по Bluetooth. С помощью этих приложений мы протестируем два решения для отслеживания. Еще одна возможность — научиться разрабатывать программное обеспечение для самых популярных мобильных платформ. Выкладываю код приложений на репозиторий. Android-приложение использует, как описано ниже, машинное обучение, а приложение IOS упоминает OpenCV. Я настоятельно рекомендую вам создать свой собственный проект, части общего кода могут помочь решить проблемы. Перейдем к результатам.

Решение Apple, помимо предоставления отличной документации, одной из лучших, что я читал, оказалось еще хуже. Отслеживание было достаточно быстрым, чтобы работать в режиме реального времени (важная функция в моем проекте), но качество оставалось средним. Если мы создаем проект только для устройств Designed in California, стоит протестировать Vision. Выпуск пригодной для использования версии должен быть достаточно быстрым и легким. OpenCV работал намного лучше. Мы можем использовать его со многими языками программирования, что делает OpenCV действительно универсальной библиотекой. Он предоставляет нам пару алгоритмов отслеживания, которые легко изменить во время разработки кода. Стоит протестировать каждый из них. Для меня лучшим был назван KFC. Скорость и точность работы были на хорошем уровне. К сожалению, в моем проекте объекты перемещались слишком быстро, что приводило к частым ошибкам. KFC идеально подходит для простых задач. Мы можем очень быстро получить хорошие результаты, например, с отслеживанием пешеходов, автомобилей. Иногда случаются ошибки, но это отличный алгоритм в качестве отправной точки. Перспективным оказался и GOTURN, использующий машинное обучение. Однако пересылать большие, более 200 МБ, файлы, необходимые для работы и борьбы с запуском алгоритма на смартфоне, было слишком сложно. В этот момент мы добрались до моей первой ошибки. Создание мобильных приложений очень интересно, и я настоятельно рекомендую всем попробовать это, но это также создает некоторые проблемы. Гораздо проще тестировать решения на компьютере, чем писать приложения. Мы сэкономим много времени. Лучше использовать ранее записанные видео и не использовать управление Bluetooth при первых тестах. Словом, перед запуском Android Studio или Xcode стоит протестировать каждый из алгоритмов на компьютере. После этого мы можем поместить его в наше мобильное приложение. Это касается не только алгоритмов отслеживания. Мы протестируем другое решение также на ПК из-за гораздо больших вычислительных затрат. Идея состоит в том, чтобы найти характерные признаки выбранного объекта и искать их в следующем кадре видео. OpenCV также предоставляет необходимые инструменты. Метод работает более точно. Он может работать в проектах, когда точность гораздо важнее скорости обработки. Я ссылаю статью, описывающую более подробно, как это работает и как это реализовать.

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

Искусственный интеллект

После тестирования готовых решений для отслеживания объектов мы попробуем решить нашу задачу более интуитивно. Мотивация в том, как люди могут следить за предметом. Было бы здорово создать программу длиной всего в одно короткое предложение. Если у кого-то есть такой код и он каким-то образом не стал популярным, немедленно свяжитесь со мной! Возвращаясь к теме, наш метод будет подражать людям. Почти каждый раз, когда мы направляем свой интерес на какой-то объект и тем самым отслеживаем его, мы выбираем какие-то особые черты. Моя идея алгоритма состоит в том, чтобы выделить маски одного цвета на объекте (используя модель HSL), а затем найти их в следующем кадре видео. Мы можем создать программу такого типа, например, на C++, снова используя OpenCV. К сожалению, идея оказалась слишком сложной. Цветовые маски, как признаки, слишком сильно различались в отдельных случаях. Я не делюсь решением, потому что это была пустая трата времени. Нужно создать что-то еще. Между тем, стоит упомянуть о выборе языка программирования. Я выбрал C++, потому что это был самый известный для меня язык, однако лучше не торопиться и изучить что-то более удобное для пользователя. В дальнейшем мы будем кодировать на Python. Это значительно продлит жизнь клавиатуры из-за простоты и сэкономит нам много времени.

Есть еще один метод, имитирующий наш мозг. Это наше ключевое слово — искусственный интеллект, машинное обучение. О чем это все? После безуспешного просмотра Интернета и чтения недостаточных определений, я хотел бы поделиться тем, которое мне подходит. Основная задача искусственного интеллекта — автоматически создать некий набор правил. Это противоположность кодированию. Программист собирает данные, а не пишет правила. Вот и все! Компьютер обрабатывает данные и таким образом «придумывает», какой результат он должен вернуть. На следующем этапе этого проекта будет использоваться описанное машинное обучение (нейронная сеть). С помощью детектора мы будем находить объекты определенного типа (например, человек, лошадь) и выяснять, какие из них идентичны в следующих кадрах видео. Это решение будет работать, когда мы будем отслеживать определенное количество категорий объектов. Нам нужно сначала обнаружить их, чтобы потом сравнить.

Мы создадим программу, используя фреймворк Tensorflow. Google построил платформу с большой документацией и большим количеством активных пользователей — благодаря этим двум функциям мы легко адаптируемся в новой среде. Кроме того, в начале я предлагаю вам выбрать наложение Keras, что значительно упрощает использование фреймворка. Совсем скоро будет выпущена более новая версия — Tensorflow 2.0, а вместе с ней и другие улучшения. Новичкам обязательно стоит использовать Keras! Первая версия алгоритма позволит обнаруживать всадников и позволит пользователю выбрать одного из них для начала отслеживания. В следующем кадре наш правый объект будет ближайшим к предыдущему положению. Я не первый, кто использует эту идею. Единственное, что нам нужно сделать, это рассчитать расстояние между объектами в следующем кадре. Исключение сравнения объектов значительно упрощает нашу задачу. Для нужд проекта я создал специальный детектор объектов. Решение после сжатия было действительно быстрым и точным. Только когда объекты закрывались или двигались слишком быстро, были некоторые ошибки. Во второй версии я попытался повысить точность, написав специальные правила. Один из них заключался в следующем, когда объект будет накрыт, начиная с правой стороны, он снова появится с другой стороны предмета покрытия, так же и в другую сторону. Далее, расстояние, на котором отображается объект в следующем кадре, связано со скоростью движения. В какой-то момент правила слишком усложнились, а результаты улучшились лишь незначительно. Обычно мне удавалось повысить точность в разрабатываемых в данный момент случаях и снизить ее в других. Я использовал модель, прямо противоположную выбранной ранее. Добро пожаловать снова искусственный интеллект! С его помощью, после обнаружения объекта, программа должна создать таблицу признаков и сравнить ее с признаками из следующего кадра. Наименее другой таблицей будет объект, который мы отслеживаем. Вот как должно работать сравнение объектов.

Отлично для этой задачи подойдет особый вид нейронной сети — классификатор объектов. Бьюсь об заклад, каждому из вас приходилось когда-то разгадывать Google Captcha. Чтобы доказать, что мы не роботы, нам нужно было выбрать кадры, содержащие, например, автомобили, светофоры и т. д. Google использует эти данные для бесплатного обучения классификаторов! Как именно работает инструмент, который мы собираемся использовать? Классификаторы создают таблицы признаков с большим количеством чисел непосредственно перед окончательным результатом. Упрощая свою структуру, они состоят из многих слоев. Все они, кроме конечного, сводят изображение к упомянутой таблице с числами. Последний слой должен обработать таблицу до определенного результата. Например, это собака, а это кошка. Очень рекомендую видео от Google, объясняющее, как они работают. Итак, достаточно отрезать последний слой классификатора (модели) и мы получаем искомый список признаков для данного изображения. Я создал сеть со следующей структурой. На вход подаются два изображения объектов, например конкурента с первого кадра и со второго кадра. Модель обрабатывает изображения до двух наборов чисел. После этого его последний слой, использующий наборы, так же, как и классификатор, возвращает окончательный результат. Конкурент с первого изображения такой же, как конкурент со второго изображения или наоборот. Подробное описание с кодом доступно на репозитории. Более того, вместо детектора, маркирующего объекты в прямоугольной рамке, я выбрал детектор, печатающий точную маску. Мы получим лучшие результаты, если объект будет закрыт (изображение выше). Я смог обучить описанную сеть с точностью до 85%, чего все равно было недостаточно. Сбор большего количества данных почти наверняка улучшит его. (graph) Возможно, в будущем сеть получит дальнейшее развитие. Я призываю вас создать свой собственный проект с использованием искусственного интеллекта. Это очень интересная тема. Код в репозитории может вам помочь. Я также рекомендую свою собственную сеть. Возможно вместе нам удастся повысить точность.

Радиоволны

Сбор необходимых данных для обучения нейронных сетей — настоящая головная боль. Представляете, нам нужно вырезать 6000 изображений одинаковых машин, кошмар! Я не удивлен, что Google начал использовать нас. Чтобы облегчить боль, связанную с вырезанием 6001-го изображения Toyota Prius, давайте перейдем к следующей идее. Вместо камеры телефона мы выберем радиоволны. Отслеживаемый объект должен быть оснащен специальным передатчиком. Чтобы указать, куда устройство должно направить камеру, необходимо определить только направление приема волн. Мы начнем с простого решения, основанного на радаре. Вы можете использовать направленную антенну, прикрепленную к двигателю, вращающему ее. В легком гугле можно найти много видов проектов антенн. Дополнительно будем использовать WIFI модуль, хватит даже USB. Результаты тестов, к сожалению, оказались слишком неоднозначными. Нам нужен гораздо более точный метод, который оказался доступным с Bluetooth. В январе 2019 года был анонсирован следующий стандарт Bluetooth 5.1. А вместе с ним и новая надежда — пеленгация (угол прихода, угол съезда). Вкратце: один из этих методов использует антенную решетку, размещенную на небольшом расстоянии, на одной плате. Он измеряет характеристики принимаемой радиоволны каждой антенной. С помощью этих данных мы можем довольно легко рассчитать направление принимаемого сигнала. Рекомендую прочитать официальную статью. Описанный метод проще, чем, например, использование антенн, расположенных далеко друг от друга, и измерение точного момента приема сигнала. Никто не хотел бы накрыть тренировочную площадку подключенными антеннами, а потом еще и их синхронизировать. Решение работает и на большем расстоянии, чем, скажем, RFID, используемый для отслеживания рабочих на складе. Сейчас я создаю новое устройство для тестирования. Я хотел бы создать модуль, готовый к использованию, например, с Arduino. Точность очень хорошая, и нам не нужно беспокоиться о времени обработки. Недостатки, безусловно, более высокая стоимость и точность на большем расстоянии. Вероятно, описанный метод будет страдать от помех, создаваемых препятствиями. Хотя использование Bluetooth, вероятно, лучший выбор в случае моего проекта. В ближайшее время проведу тесты и проверю все на практике.

Сводка

Казалось бы, легкая задача слежения за объектом на самом деле намного сложнее. В общем, лучшего метода для всех случаев не существует. Выбор оптимального решения требует определения рабочей среды и приоритетов. Все дело в золотой середине. Самые простые методы — это готовые к использованию алгоритмы. Когда мы работаем только с одной категорией отслеживаемых объектов, стоит задуматься о машинном обучении и детекторе. Когда мы можем собрать большой объем данных, наиболее перспективным является создание собственной нейронной сети. Более того, Bluetooth 5.1 также является хорошим решением. Надеюсь, что это краткое описание проекта мотивирует вас на работу и поможет в решении будущих задач.