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



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


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


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


  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, не верещал как сумасшедший, а сообщал что-нибудь убедительно и с достоинством.

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



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



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


Цель достигнута: пылесос разговаривает. Я рад, что не стал городить слишком много сразу всего. Следующий шаг связать распознавание образов с потоком, регулирующим движение, а также попробовать transfer learning.


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


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

Комментарии (11)


  1. GeorgKDeft
    25.11.2019 10:02

    Говорящий пылесос это хорошо. Правда есть уже аналоги


  1. mr_brain1979
    25.11.2019 11:33

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


    1. DaemonGloom
      25.11.2019 12:19

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


      1. mr_brain1979
        25.11.2019 12:33

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


    1. ViTTyler
      26.11.2019 09:18
      +1

      Продам душу за робот-пылесос, который не будет жрать носки и провода)))


  1. ASTAPP
    25.11.2019 14:03

    >> игровые нейронные сети GAN
    GAN — это Generative Adversarial Nets. Штука, которая позволяет генерить изображения, к играм не имеет отношения.


    1. Jajaka Автор
      26.11.2019 09:30

      Точно. Не знаю, почему в они смешались в моей голове.


  1. Bik-14
    26.11.2019 09:19
    +2

    Круто, когда то из пары пылесос + коптер хотел сделать тандем для доставки напитков к компьютеру.)
    А потом мне прострелили колено…
    а не то, женился. Но может когда нибудь руки все таки дойдут


  1. diogen4212
    26.11.2019 09:19
    +1

    захотелось робот-пылесос со звуком Hello из Dark Souls
    (а в конце он определил собаку на светлом фоне как «person 79%» и поздоровался с ней… нейронки такие нейронки, не видать нам робоавтомобилей)


    1. Jajaka Автор
      26.11.2019 09:46

      Думал про Dark Souls, когда мудохался экспериментировал с TPU. Тоже хардкор.
      А люди в темноте рубашку на стуле за person принимают:), но в целом да довольно топорно работает. Такое отсутствие кратковременной памяти, как у человека с обсессивно-компульсивным расстройством, который судорожно проверяет одно и тоже по сотне раз. Рельный человек ясно осознает, что если секунду назад, это была собака, то она никак не может в следующую секунду стать человеком.
      Еще один момент, который существенно отличает такие сети от человеческого сознания: невозможность динамически генерировать классы и подклассы. Надо идти и ручками их прописывать.


      1. diogen4212
        26.11.2019 10:18

        отсутствие кратковременной памяти

        В принципе, можно решить таймаутом на распознавание в несколько секунд или построением карты пространства в 3D, чтобы было понятно, какой объект в каких примерно координатах и где сейчас находится пылесос + рассчитывать примерную траекторию движения объектов. Наверное, можно прийти к набору if..else и множеству параметров, которые скажут, что объект «собака» перемещается быстро и хаотично по горизонтали, объект «человек» более медленный или вообще остаётся на месте, но может перемещаться вверх, а столы и стулья всегда остаются на месте. Таким образом, при распознавании следует учитывать не только визуальное сходство, но и примерную вероятность положения в пространстве.
        невозможность динамически генерировать классы и подклассы

        Если показывать ей не только собак и людей, но и бога Анубиса, а потом ещё раз обучить на своих же результатах, она вполне сможет выделить его в отдельный класс «50% человек 50% собака» ))