Machine learning
Marina Glayboroda
6287

Автоматический заказ воды с помощью технологий ИИ

Занимаясь разработкой различных приложений с использованием технологий ИИ хочется поэкспериментировать с автоматизацией собственного офиса. Мы попробовали определить, кто чаще моет посуду, и нам это удалось. Теперь, может, автоматизировать процесс заказа воды в офис?

В закладки

Сейчас у нас нет офис-менеджера, и бывают дни, когда «ответственный» за доставку может забыть её заказать ввиду более важных на этот период рабочих дел. Впоследствии мы страдаем, так как даже чаю попить невозможно.

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

Подумали об осуществлении, прикинули затраченное время и приступили.

Какие технологии пригодятся

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

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

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

Схематично весь процесс заказа выглядит так:

На практике все немного сложнее. Разберем.

Computer Vision, чтобы определить пустые бутылки

Для определения пустых бутылок мы взяли YOLO 3: Real-Time Object Detection. You only look once (YOLO) — это нейронная сеть для обнаружения объектов в режиме реального времени, написанная на языке C. Работает она достаточно точно и быстро: на видеокарте Pascal Titan X обработка изображений происходит при кадровой частоте 30 FPS и имеет mAP 57,9% на COCO test-dev. Также сеть не требует огромного датасета для обучения.

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

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

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

Вот так выглядит разница между крышками пустой и полной бутылок
Результат работы сети на датасете из 14 картинок. Указанные на изображении дата и время являются некорректными

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

Результат работы сети на датасете из 42 картинок. Указанные на изображении дата и время являются некорректными

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

Natural Language Processing, чтобы поговорить с оператором

Что пригодится, если звонить и вести диалог с оператором будет не человек? Технология NLP, она же «обработка естественной речи». Здесь нам пригодился наш прошлый проект — Pizza Bot.

Для обработки речи мы попробовали три сервиса: Google Cloud Speech-to-Text, Amazon Transcribe и Yandex SpeechKit. С каждым из них можно реализовать два варианта обработки аудио и перевода его в текст.

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

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

Для этого можно сравнивать абсолютные величины амплитуд звука. Если оператор что-то говорит, а затем идет тишина и продолжается 0,5 секунд, то считать фразу законченной и отправлять её на обработку.

Мы выбрали первый вариант и использовали облачное решение Google Cloud Speech-to-Text, которое распознает человеческую речь в режиме реального времени, и переводит её в текст. Также API умеет извлекать из слов смысл и анализировать контекст.

Когда бот получил фразу, системе необходимо её обработать и принять решение, что ответить. За обработку у нас отвечает сервис Dialogflow, а за озвучивание принятого решения — технология Text-to-Speech, которая преобразовывает текст в речь. Мы использовали сервис Google Cloud Text-to-Speech, включающий в себя множество естественно звучащих голосов для различных языков.

Диалог бота и оператора службы доставки воды

В заключение

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

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

Написать
{ "author_name": "Marina Glayboroda", "author_type": "self", "tags": ["python","nlp","machinelearning","cv","camera","ai"], "comments": 45, "likes": 51, "favorites": 27, "is_advertisement": false, "subsite_label": "ml", "id": 63397, "is_wide": true, "is_ugc": true, "date": "Wed, 03 Apr 2019 19:21:06 +0300", "is_special": false }
0
{ "id": 63397, "author_id": 268380, "diff_limit": 1000, "urls": {"diff":"\/comments\/63397\/get","add":"\/comments\/63397\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/63397"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 332941, "last_count_and_date": null }
45 комментариев
Популярные
По порядку
Написать комментарий...
7

Оператора предупредили что ему будет робот позванивать?

Ответить
1

Вы подняли такой важный этический вопрос: а почему вы считаете, что следует предупреждать?

Ответить
1

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

Гугл дуплекс предупреждает об этом.

Ответить
0

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

Ответить
0

Ну буквально это ложь, вы создаете впечатление человека, хотя это вовсе не человек.

Это как в полицейской одежде и останавливать машины и просить документы: "Мы никого не обманываем, вы сами подумали, что мы из полиции"

Проще и эффективнее было-бы сообщение им писать, чем тратить ресурсы на войс-бота.

Ответить
0

Это не корректное сравнение. Переодеваясь в полицейского, человек имеет злой умысел. Его цель - нажива. Мы же автоматизировали процесс заказа воды. Мы платим за нее то, что должны и не имеем скрытых мотивов.

Ответить
2

Не переживайте, это просто бот. Он ругается, что его не представляют нигде, вот и борется за свои права

Ответить
0

Обман тоже не очень классно, конечно, не так как воровать.
Но сказать вначале "здравствуйте, это бот по заказу воды" сделает этот звонок дружелюбнее и уважительнее к консультанту.

Ответить
0

У меня сложилось впечатление что оператор предупрежден, голос робота распознать не сложно, а он делает вид что все в порядке. Или ему каждый день роботы звонят?

Ответить
0

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

Ответить
6

Ахаха... обожаю забивать микроскопом гвозди! У меня один знакомый использовал OpenCV для того, чтобы контролировать когда закипит чайник... Чайник электрический, а значит в момент его отключения, будет снижаться энергопотребление и размыкаться сеть. Триггер же есть для сигнала. По поводу воды... ОСМОС на полгода позволяет забыть об этом в офисе.

Ответить
1

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

Ответить
1

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

Ответить
2

Вы крутые :)

Ответить
0

Спасибо ^_^

Ответить
1

Подумали и решили проблему! Здорово! Может пригодится)
А для канцтоваров нечто можно сделать? Часто сталкиваемся с тем ,что бумага кончилась и пр)

Ответить
2

Конечно можно - поменяйте завхоза!

Ответить
0

Зачем? Если можно элегантно решить проблему)

Ответить
0

Вы правда считаете колхоз с распознаванием - элегантным решением проблемы бестолкового завхоза? ))

Ответить
0

Можно) Если для бумаги, то распознавать высоту стопки: когда она достигнет минимального заданного предела – сообщать/заказывать. Все, что человек может увидеть - может увидеть и камера. Главное – освещение и качество изображения.

Ответить
1

А, если имеется в виду бумага в рулонном исполнении? Задача то поважней чем чаю попить!

Ответить
0

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

Ответить
0

С бумагой – можно. Это будет реально за счет того, что пачки складываются в стопку. Относительно воды: а когда количество заказываемых бутылок увеличится, расширять платформу? А если не увеличится? Используя ИИ достаточно изменить три параметра: количество полных бутылок, пустых бутылок и заказываемых.

Ответить
0

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

Ответить
1

Заказывают обычно у тех с кем уже контракт. К тому же этот рынок очень конкурентный и выигрыш 5% цены того не стоит.

Ответить
1

Заплачу немножечко денежек за имплементацию такого к нам в офис (бутыли выглядят так же, только их обычно штук 15-20), камеру сам поставлю как скажете, вместо звонков просто алерт в слак нужен. Напишите мне на почту, умоляю ceo@fireart.studio

Ответить
0

Как часто воду заказываете, в среднем?

Ответить
1

В том и проблема что сложно понять периодичность. Так-то по договору нам привозят раз в месяц 10 штук, но вот сейчас выходил на кухню смотрю 2 бутыля осталось из 10, а я помню что привозили вроде недавно. Звоню спросить когда следующая доставка, говорят 16 числа. А значит с понедельника мы полторы недели будем без воды. Если бы я сейчас не заказал допдоставку, была бы проблема с кассовым разрывом воды.

Заказывать дополнительную доставку можно, но нужно это делать за 3 рабочих дня ДО, потому что пока они ещё привезут. Плюс постоянно меняется потребление, допустим новые сотрудники появились, или какая неожиданность пришло лето и потребление вырастает в 2 раза резко.

А если б был алерт который говорит "Согласно последним данным водологов, потребление воды последнюю неделю на уровне 1.3 бутля в день, через 3 дня вода закончится, закажите ещё милорд (казне хватит 7 бутлей до новой плановой доставки)". Было б круто :)

Ответить
0

Ну тут все просто, милорд, раз в неделю считаете количество оставшихся полных бутылок, если их меньше трех - делаете заказ на 10. Тоже самое и с остальными ресурсами, но параметры подбираете под скорость расхода и срока доставки.
А камера на кухне - вещь полезная :)

Ответить
1

У меня 30 сотрудников и помимо работабщего бизнеса 2 стартапа из разных сфер жрущие нереальное количество времени и внимания, думаете мне не хватает приключений настолько что я хочу раз в неделю ходить на кухню считать бутылки? :D

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

Ответить
0

Дима, тогда Вам просто необходим завхоз - человек, который решает вопросы по хозяйству офиса. Также изветстен как менеджер по офису, обычно это симпатичная девушка ). Если 30 сотрудников в офисе - ей хватит работы на fulltime.

Ответить
3

Мммм... Я в Варшаве девушке такой буду платить допустим 5 злотых (это в Варшаве норм ЗП для офис-менеджера), плюс налоги, место, медстраховки, спортбенефиты и прочие плюшки, в итоге она будет обходиться в 8000 навскидку. Это где-то 2300 долларов в месяц или $27600 в год. А сколько мне единоразово будет стоить несколько автоматизированных процессов которые её заменят?

Штуки 3 я уже решил с помощью CRM в связке с Zapier и слаком.

А самое главное, ОНА ЖЕ БУДЕТ ПИТЬ ЭТУ ВОДУ ТОЖЕ :D

Ответить
0

Ну вообще-то за $2300 она же не только будет воду заказывать, верно?
Обычно у нее масса обязанностей - разбирать почту, отвечать на звонки, заказывать еду, контролировать уборку офиса, встречать гостей, заказывать билеты, организовывать корп. мероприятия, несложная деловая переписка. Или Вы это сами все делаете и Вас это устраивает?

"ОНА ЖЕ БУДЕТ ПИТЬ ЭТУ ВОДУ ТОЖЕ"
Возьмите миниатюрную девушку, ей маленькой бутылочкм на весь день хватит )).

Ответить
0

У нас нет почты которую нужно разбирать, не нужно отвечать на звонки, заказывать еду. Уборку офиса не надо контролировать, аутсорсеры бизнес-центра справляются и без контроля. Гостей у нас почти нет, а если кто и придет, то его встретит тот кто пригласил. Билеты заказывать не надо. Мероприятия организовывать тоже. Деловую переписку ведут специально обученные люди - account executive, sales manager, project manager, BD. Сам я делаю то что могу делать только я, занимаюсь развитием и стратегией, немного операционкой.

Так что ума не приложу зачем такая девушка, разве что для красоты, но это сексизм и заменяется вазоном с красивым растением :)

Ответить
0

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

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

Ответить
0

Я уже обьяснял, логика и мотивы собственника совсем не такие. Вы просто не понимаете

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

Ответить
0

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

Ответить
3

Что вы ко мне прицепились, я говорю я вертел держать это в голове и мне не упал завхоз. Что не ясно :)

Я свой способ ведения дел никому не навязываю

Ответить
1

Прикольно! Мне также нужно сделать в холодильнике. Как кончается колбаса, молоко, яйца итд, бот сразу звонит в Ашан и делает заказ курьеру. :D

Ответить
0

Интересная идея. Можно такое сделать, но камер потребуется больше, чем одна)

Ответить
0

mAP 57% означает что в половине случаев сетка ошибается? Или я не прав? Если да, то это значит каждое второе обращение в сервис ложное?

Ответить
1

Intersection over Union (IoU) вычисляется как отношение:
в числителе - область пересечения между предсказанной ограничительной рамкой (то есть то, как ее нарисовала сеть, определяя объект) и ground-truth ограничительной рамкой (то есть то, как мы вручную разметили этот объект);
в знаменателе - область объединения, то есть область, охватываемая как предсказанной ограничительной рамкой, так и ground-truth ограничительной рамкой.

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

Mean average precision (mAP) рассчитывается как среднее значение между трешхолдами (порогами) IoU от 0.5 до 1 (шаг порога 0.1). IoU 0.5 показал высокую точность, что уже является отличным результатом. Далее рассчитывалась точность и для других порогов (трешхолдов), но с каждым повышением порога точность работы модели снижается. А 57,9% — это среднее значение между просчитанными IoU.

То есть это хороший результат, и она ошибается намного реже, чем в половине случаев.

Ответить
0

Приезжает такой курьер - "Примите воду". А ему - "Извини, дядька, это все ИИ напутал, недообучился, вот и заказал, дурачок. Но мы его уже наказали, скормили еще 1000 фоток пустых бутылей."

Ответить
0

а я бы с помощью поплавкового датчика решил бы :)

Ответить
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": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "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, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }