Machine learning Marina Glayboroda
5412

Нейробармен из Raspberry Pi с использованием нейронных сетей

Мы компания Hey Machine Learning. И мы продолжаем всячески автоматизировать наш офис. У нас уже и вода заказывается, и известно, кем моется посуда. Но наступило лето, вместе с ним и корпоративы. Что бы кто ни говорил, но отдых — важная часть рабочего процесса. И если «делу время, а потехе час», то давайте автоматизируем этот час.

В закладки

Раньше мы использовали только камеры и алгоритмы, но в этом проекте решили пойти дальше и добавили микрокомпьютер Raspberry Pi 3 Model B.

Мы сконструировали автономное устройство, которое с помощью компьютерного зрения умеет распознавать лица и жесты «палец вверх» и «палец вниз», а также запоминать пользователей.

Используя рекомендательную систему на основе лайка и дизлайка, мы наделили устройство способностью составлять персонализированную карту коктейлей, а с помощью микрокомпьютера и дополнительных деталей — наливать эти коктейли.

В итоге у нас получился офисный робот-бармен, которого мы назвали Бендер.

Бендер

А теперь подробно о том, как мы это сделали.

Железо Бендера

Чтобы собрать нашего мини-робота, мы купили несколько необходимых деталей:

Необходимые детали

Из всего этого следует выделить микрокомпьютер Raspberry Pi 3 Model B. Он был представлен в феврале 2016 года, это самая ранняя модель Raspberry Pi третьего поколения.

Raspberry Pi 3 Model B

Одноплатный компьютер версии Pi 3 B оснащен ARM-процессором Broadcom BCM2837. Устройство имеет 1 ГБ оперативной памяти, разъемы HDMI и Ethernet, четыре USB-порта, а также встроенный модуль беспроводной связи Wi-Fi и Bluetooth.

Четырехъядерного процессора достаточно для создания различных электронных устройств: от радиоприемников и медиаплееров до роботов и «умных» домов.

Основные элементы платы Raspberry Pi 3 Model B

Raspberry Pi 3 — мощное устройство, но его ресурсов недостаточно для всех нейросетевых вычислений. Поэтому мы ускорили его с помощью Intel Movidius Neural Compute Stick.

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

Устройство оборудовано процессором Vision Processing Unit (VPU) Myriad 2, который обладает производительностью 100 гигафлопс и энергопотреблением 1 Вт. Такие характеристики позволяют Movidius работать полностью автономно, без доступа к интернету и облачным сервисам.

Для распознавания лиц и жестов мы использовали оригинальную камеру Raspberry Pi Camera Module V2, оснащенную 8-мегапиксельной матрицей Sony IMX219. Устройство имеет фиксированный фокус и позволяет записывать видео в трёх режимах: 1080p30, 720p60 и VGA90.

Raspberry Pi Camera Module V2

Чтобы определять наличие стакана в устройстве и активировать систему, встроили ультразвуковой дальномер HC-SR04. Он определяет расстояние до объектов, генерируя звуковые импульсы на частоте 40 кГц и слушая эхо.

Ultrasonic sensor HC-SR04

Программная часть Бендера

Что касается возможностей робобармена — тоже по порядку.

Компьютерное зрение

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

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

Чтобы работать с Movidius, мы взяли открытую библиотеку компьютерного зрения OpenCV и фреймворк OpenVINO с модулями dnn и dldt, предназначенных для работы с нейросетями.

Для рекомендательной системы также необходимо распознавать жесты лайка и дизлайка. С этой целью мы создали систему на основе компактной нейронной сети для обнаружения объектов Tiny-YOLO 3, которая умеет распознавать жесты «палец вверх» и «палец вниз». Проект получил название Rate Me и доступен для скачивания с GitHub.

Сеть для Rate Me тренировали с помощью фреймворка Darknet на 3000 размеченных в LabelImg изображениях. Также, чтобы запустить алгоритм на языке программирования Python, мы использовали DNN-модуль библиотеки OpenCV.

В итоге решение имеет mAP = 85,19%, среднее IoU = 73,89% и работает со скоростью 6–7 FPS на процессоре Intel Core TM i5-4300M при частоте 2.60 ГГц.

Именно на основе оценок пользователя «лайк» и «дизлайк» система составляет персональную карту коктейлей.

Следует также отметить, что мини-бармен постоянно считывает кадры с камеры. Каждое изображение прогоняется через модифицированную нейросеть SqueezeNet, которую мы решили использовать из-за заявленной высокой точности распознавания.

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

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

Когда мини-бармен видит человека, не показывающего никаких жестов, и распознает этого человека, он должен ему приготовить коктейль. Но прежде чем наливать что-то, нужно проверить наличие стакана на необходимой позиции. Это мы делаем с помощью ультразвукового дальномера HC-SR04.

Если стакан на месте, тогда система передает данные рекомендательной системе, которая и выбирает релевантный коктейль. Потом устройство его готовит и ждет оценку.

Рекомендательная система

Рекомендательная система (РС) — это алгоритм, который на основе данных о пользователе подбирает наиболее релевантные для него товары и услуги, а в нашем случае — алкогольные коктейли. Обычно в РС используют один из двух подходов: коллаборативную фильтрацию или рекомендации на основе контента.

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

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

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

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

Данные пользователя

Рекомендации для пользователя

Еще важный момент. Количество бутылок в устройстве ограничено. Чтобы создать карту, необходимо знать, какие конкретно коктейли делать. Распарсив сайт TheCocktailDB, мы получили датасет из 578 различных напитков. Теперь его необходимо почистить и привести в требуемый вид.

Мы проверили ингредиенты и напитки на дубликат, а также преобразовали различные типы алкоголя в общие наименования: например, белый, золотой и темный ром стали просто ромом, бурбон и скотч — виски.

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

Полностью проработав данные, мы выбрали те коктейли, в которых совпадение алкогольных напитков максимальное. В нашем боте восемь позиций для бутылок: их заняли биттер, ром, джин, бурбон, вермут, Coca-Cola, апельсиновый сок и тоник. Из такого сета, с добавлением различных нельющихся компонентов, можно создать 57 коктейлей. Для начала достаточно.

Также в полученном мини-датасете мы привели все пропорции к миллилитрам, так как в изначальном наборе присутствовали такие меры, как галлон, унция, американская столовая ложка и прочее.

Часть итогового датасета

Результат

С тем, как работает Бендер, можно ознакомится в видеоролике ниже.

#machinelearning #ai #cv #ml #python #camera

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Marina Glayboroda", "author_type": "self", "tags": ["python","ml","machinelearning","cv","camera","ai"], "comments": 22, "likes": 34, "favorites": 35, "is_advertisement": false, "subsite_label": "ml", "id": 75910, "is_wide": true, "is_ugc": true, "date": "Thu, 18 Jul 2019 19:47:58 +0300" }
{"average":25685,"one":95,"ten":75}
Сколько денег вы откладываете в месяц?
Ответьте и узнаете, сколько копят другие.
0 ₽
70 000+ ₽
0 ₽
{ "id": 75910, "author_id": 268380, "diff_limit": 1000, "urls": {"diff":"\/comments\/75910\/get","add":"\/comments\/75910\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/75910"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 332941, "last_count_and_date": null }
22 комментария

Популярные

По порядку

Написать комментарий...
4

Кайф. Люблю, когда в ML и CV врывается синяя изолента и нужно спаять MVP на макетной плате. Не останавливайтесь!

Ответить
0

Только вперёд 🙃

Ответить
0

И да, раздел «Разработка» по дефолту у всех выключен, поэтому тут просмотров будет мало. Чтобы люди увидели, лучше писать в популярные разделы, тем более тут не столько про программирование.

Ответить
0

А в какие конкретно, вы считаете, лучше публиковать? Заранее спасибо!)

Ответить
2

Технически отлично заморочились, ещё бы внешний вид причесать :)

Ответить
2

Спасибо!)
Но главное же то, что внутри!)))) А снаружи улучшить всегда можно)

Ответить
2

Спасибо. Это прекрасно :)

Ответить
0

Спасибо))

Ответить
2

Можно такой же заказать для Лонг Айленда?

Ответить
0

Да, конечно)))

Ответить
1

Добрый день. А можете поподробнее рассказать как берете разный алкоголь из разных бутылок и отправляете его в насос?

Ответить
1

В таблице написано, что было закуплено 8 насосов. Похоже, что каждый отдельный компонент коктейля на отдельном трубопроводе.

Ответить
0

Не заметил. Спасибо.

Ответить
1

Если немного подробнее, то внутри коробки стоит восемь насосов — по штуке на бутылку. Насосы подключены к реле, которым управляет Raspberry Pi. Микрокомпьютер через реле включает насосы, каждый из которых соответствует необходимой по рецепту бутылке, на определённое время, за которое успевает прокачаться нужное количество миллилитров с бутылки.

Ответить
1

Вы молодцы! Респект вам) С удовольствием прочитал данный пост)

Ответить
1

Спасибо!

Ответить
1

Это круто! Вдохновили на изучение Raspberry, тоже хочу такого бармена но без распознавания, я в семье один пьяница. Да и круто было бы управлять им с мобилы, еще бы как-то решить проблему с добавлением льда.

Ответить
0

Спасибо за отзыв! Приконектить систему к смартфону легко, а вот со льдом - чуть сложнее, но тоже возможно)

Ответить
1

Спасибо за интереснейший кейс.
Опубликовал на форуме https://armpc.ru/f про одноплатные компьютеры.

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Голосовой помощник выкупил
компанию-создателя
Подписаться на push-уведомления
{ "page_type": "default" }