Превращаем робот-пылесос в универсального солдата

Все началось с увлечения глубоким обучением, нейронными сетями и далее по списку. Я посмотрел пару курсов, поучаствовал в соревновании на Kaggle… «чем бы еще заняться?». Тут мимо как раз по своим делам проползал робот-пылесос (Xiaomi Vacuum Cleaner V1) и подкинул интересную идею…

exp6sxbcrzavjargqrt6zhenkzu.jpeg


Длинное вступление

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

Мне стало интересно, что собой представляет машинное обучение. Спустя год, могу сказать — тема поразительно объемная. Давайте разберемся, какие конкретно аспекты доступны для применения в жизни и бизнесе.


  1. Классическое машинное обучение.
    Коротко: все, что было до появления хайпа глубокого обучения (Deep Learning). Если у вас табличные данные по продажам, клиентам, транзакциям и вы хотите увеличить продажи, привлечь клиентов, распознать фроды, вам сюда. Вот неплохие лекции, помогающие понять, как анализировать данные и использовать методы вроде случайного леса, K-means или XGBoost. Мне также понравились микрокурсы на Kaggle и сопутствующее соревнование по предсказанию цены дома. Пожалуй, любой бизнес, у которого есть реальные клиенты (а значит база данных) может применять эти методы. Там много интересного.
  2. Deep Learning.
    Беспилотные авто, беспилотные авто и замена головы Джека Николсона на голову Джима Керри. Но если погрузиться глубже, любая голова пойдет кругом. Здесь распознавание лиц, эмоций, положения тела, вытаскивание семантики из видео и всяческие преобразования видеопотока. Авто-транскрипция и авто-перевод, определение болезней и сорняков, ну вы поняли, практически что угодно. Кроме компьютерного зрения есть еще обработка естественного языка (NLP), обработка и симуляция аудио потока, игровые нейронные сети GAN. Какой бы аспект глубокого обучения вы не выбрали, можете потратить время на:


  • Углубление в детали архитектуры нейронных сетей.
    Эта область, на мой взгляд, ближе всего к науке и требует соответствующего багажа знаний по математике и информатике. Если вам не терпится поэкспериментировать с новой убойной функцией активации, наворотить кастомных слоев, и чтобы learning rate не просто банально уменьшался, а закручивался в трубочку, то эта область глубокого обучения для вас. Открывайте свежие научные статьи и начинайте экспериментировать. С точки зрения бизнеса, такими вещами могут заниматься компании, готовые конкретно вкладываться в ресерч. Для шапочного знакомства на ютубе есть лекции стенфордского университета.


  • Углубление в детали инфраструктуры.
    Обучение заточенных на распознавание образов нейронных сетей требует машинных ресурсов. Выбор железа широкий и ограничен только размером кошелька. Думаю, GTX 1070 Ti можно считать хорошим стартом, но не забывайте, что одной лишь видеокартой не решить всех проблем, ибо данные еще нужно подготовить и скормить нейросети. Слабый CPU или медленный жесткий диск может стать бутылочным горлышком вашей системы. Поэтому прикупите дополнительно i5 процессор, 16 гигов оперативки и твердотельный жесткий диск. Клавиатура, так и быть, сойдет самая дешевая. Другой вариант, Google Cloud, Azure, AWS, Kaggle опять же. Облачные сервисы предлагают десятки, если не сотни вариантов, с начальной ценой где-то около 50 центов в час за K80 (примерно тоже, что и GTX 1070 Ti). Гугл дает 300$ депозит, на котором можно потренироваться. Azure дает 200$, с Амазоном не приходилось иметь дела. Мне приглянулся вариант Гугла, потому что можно быстро менять видеокарты («А, гулять так гулять. Сегодня будет V100»). Конечно, по сравнению с зарплатами рок-стар дата сайнтестов из вашего ресерч отдела, эти траты будут сущими копейками. Небольшой лайфхак, при подключении к машине в облаке используйте проброс портов: you_user@your_host -L 8888:127.0.0.1:8888. Это позволит запускать удаленный Jupyter на локальном компе. Отдельно хочется сказать про гугловские TPU. Их можно использовать совершенно бесплатно прямо из Google Colab, но сможете ли вы их использовать, вот в чем вопрос. Когда работаешь с более менее стандартными моделями, все выглядит красиво, но кастомные модели ведут себя непредсказумемо, если вобще запускаются.


  • Углубление в реализацию в продакшене.
    Эксперименты с архитектурой и участие в соревнованиях, весьма полезные штуки, но в реальности не так уж важно, дает ваша модель точность 85% или 87%. Для беспилотных авто или мобильных приложений в таком случае будет важнее скорость принятия решения, а для медицинских нужд скорее всего низкий уровень ошибок второго рода («Здоров! Давай, до свидания!»). То есть на первый план выходит определение приоритетов. Плюс, куча технических вопросов: как выкатить и обеспечить непрерывную работу в продуктовой среде, как дообучать модель на новых данных, как мониторить и оценивать результаты работы, как вылавливать и фиксить баги, наконец. Все эти проблемы мы уже имеем с нормальным ПО, но теперь они выходят на другой уровень. Уже появляются инструменты для контроля версий (Git-LFS, Saturn Cloud), заточенные специально под машинное обучение, но общепринятых стандартов пока не существует, в чем безусловно есть своя романтика. Еще один лайфхак: если держать гиперпараметры в отдельных конфиг файлах, то можно легко восстановить успешные эксперименты.


  • Использование готовых моделей и transfer learning.
    Самая простая и привлекательная часть машинного обучения, для тех, кто хочет увидеть, как же это все работает в реальности. Готовых моделей достаточно, пара десятков строк кода и вуаля: разноцветные квадратики бегают по экрану. Не нужно тратить время и ресурсы на тренировку модели с нуля. Есть даже готовые решения в железе, если хочется распознавания on-site (вот кстати отличный обзор на них). Кажется, бери да пользуйся, но и тут есть свои ньюансы. Готовые модели тренированы на стандартных датасетах. Поэтому, чтобы узнать, кто ворует сметану у вашего бизнеса: кот Васька или кот Семен, придется таки тюнинговать модель (transfer learning). Возможно, баба Маша с метлой обойдется бизнесу гораздо дешевле.



Основная часть

Тут мы возвращаемся к началу поста. К тому времени, когда мимо проехал робот-пылесос, мне хотелось сделать простое функционирующее приложение или устройство с использованием машинного зрения. Так появилась идея, дать пылесосу еще один канал связи с внешним миром.
Если прикрутить к нему небольшую камеру, можно использовать готовые модели или натренировать свою. Возможностей применения полно. От точечной очистки загрязнений до преследования пса. Можно придумать какую-нибудь игру в физическом пространстве с использованием GAN или поиграться с NLP моделями и научить его разговаривать на манер голосового помощника. Короче, время обучить собственного домашнего робота.

Начинать конечно нужно с простых вещей. Например, поискать на Хабре, что уже сделано до нас. Оказывается «у ней внутре» Ubuntu 14.04, а значит, при наличии рута, можно, например, управлять с джойстка. Если дернуть данные лидара, то под рукой окажется не много ни мало, прототип беспилотного авто.
Выбор начинается уже на этом этапе. Взять готовую камеру с вайфаем и акуумулятором или плату для inference вроде Jetson Nano? А может собрать камеру, вайфай и аккум на Raspberry Pi? Каждый подход по своему интересен, но я старался держаться основной цели: сделать простое функционирующее устройство с использованием машинного обучения, поэтому выбрал первый вариант.

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

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


  • Модель (я использовал одну из готовых моделей TensorFlow model zoo) распознает объект и кладет его название в очередь.
  • Другой поток забирает название объекта из очереди и формирует URL к звуковому файлу.
  • Путь передается пылесосу, а тот стучится по полученному адресу за файлом по ftp или http.
  • В папке каждого объекта несколько файлов для разнообразия. Файл выбирается случайным образом. Кроме того, есть параметр вероятности воспроизведения звука, чтобы пылесос, фиксируя Гектора на скорости 10 fps, не верещал как сумасшедший, а сообщал что-нибудь убедительно и с достоинством.

На схеме выглядит вот так:

pbfo2gpzxacynuq_vzswmh4-tcm.jpeg

Вот так работает:



Промежуточный итог

Цель достигнута: пылесос разговаривает. Я рад, что не стал городить слишком много сразу всего. Следующий шаг связать распознавание образов с потоком, регулирующим движение, а также попробовать transfer learning.
Искусственный интеллект, тема настолько объемная, что сложно определить, за что взяться в первую очередь. На мой взгляд не существует единой точки входа. Совсем не обязательно начинать с вычисления сложных производных или курсов программирования на Python (хотя и то и другое безусловно полезно). Выбирайте то, что интересно лично вам, и да пребудет с вами сила довести начатое до конца.

P.S. Детали реализации лежат в репозитории. Комментарии и пулл реквесты приветствуются.

© Habrahabr.ru