Как пресъздадохме Amazon Go за 36 часа

Джон Чой, аз, нашият апарат за проекти, Руслан Николаев и Сохеил Хамиди на нашата демонстрация!

Моите колеги и аз искахме да създадем нещо, което да накара хората да „се уау“ на най-новия ни хакатон.

Тъй като имитацията е най-искрената форма на ласкателство и IoT е невероятно забавно да се работи, решихме да създадем своя собствена версия на Amazon Go.

Преди да обясня какво е било необходимо за това, ето 3-минутната демонстрация на това, което изградихме!

Бяхме четирима. Руслан, страхотен пълен стак разработчик, който имаше опит в работата с Python. Джон, невероятен разработчик на iOS. Soheil, друг страхотен пълен стак разработчик, който имаше опит с Raspberry Pi. И накрая, имах и мен, в края на стажа за програмисти за Android.

Бързо разбрах, че има много движещи се части към този проект. Amazon Go работи на базата на сензори за близост в реално време във връзка с база данни в реално време за клиенти и техните колички.

Също така искахме да направим нещата крачка напред и да направим безпроблемното влизане / излизане. Искахме да пуснем хората да влязат и да излязат от магазина, без да е необходимо да докосват телефоните си.

За да ангажираме потребителите като потребител, насочен към потребителите, нашето приложение ще се нуждае от добре изработен потребителски интерфейс, като истинския Amazon Go.

В деня преди хакатона съставих документ за псевдо-дизайн, който очертава какво трябва да направим в рамките на 36-часовия срок. Включих силните страни на нашия екип и оборудването под ръка. Пълният набързо сглобен дизайнерски документ можете да видите по-долу.

Имаше шест основни компонента към EZShop, нашата версия на Amazon Go.

Бърза диаграма, която щях да визуализирам компонентите на този проект

API за разпознаване на лица Kairos

API за разпознаване на лица на Kairos беше основен компонент за нас. Тя абстрахира възможността за идентифициране и съхраняване на уникални лица. Той имаше два API, които използвахме: / регистрация и / проверка.

/ регистрацията се описва като:

Прави снимка, намира лицата в нея и съхранява лицата в галерия, която създавате.

Записахме всички нови клиенти в единна галерия „EZShop“. Уникален атрибут face_id ще бъде върнат и съхраняван с регистрираното име на клиента в нашата база данни в реално време.

Когато искахме да потвърдим изображението на потенциалния клиент, ще го изпратим до / потвърди крайната точка. Това ще върне face_id с най-голяма вероятност за съвпадение.

В реализация в реалния свят вероятно би било по-добра идея да се използва вътрешно реализиран тръбопровод за разпознаване на лица с TensorFlow вместо мрежов API. Но предвид нашите ограничения във времето, API ни служи много добре.

Реална база данни Firebase

Базата данни на Firebase беше още едно основно парче за нашия пъзел. Всеки друг компонент взаимодейства с него в реално време. Firebase позволява да се създават персонализирани слушатели на промени върху всякакви данни в базата данни. Тази функция, в съчетание с лесния процес на настройка, я направи непроменима.

Схемата беше невероятно проста. Базата данни съхранява масив от елементи и масив от потребители. Следва пример на скелет JSON на нашата база данни:

{
  "елементи": [
    {
      "item_id": 1,
      "item_name": "Soylent",
      "item_stock": 1,
      "цена": 10
    }
  ],
  „потребители“: [
    {
      "face_id": 1,
      "name": "Subhan Nadeem",
      "in_store": невярно,
      "количка": [
        1
      ]
    }
  ]
}

Нови потребители ще бъдат добавени към масива от потребители в нашата база данни след регистриране в Kairos API. При влизане или излизане булният атрибут на in_store на клиента ще бъде актуализиран, което ще бъде отразено в потребителските интерфейси на мениджъра и личните приложения.

Клиентите, които вземат артикул, ще доведат до актуализиран запас на артикули. След като разпознае кой клиент е взел кой артикул, идентификационният номер на артикула ще бъде добавен към масива на клиента.

Бях планирал облачен хост Node / Flask сървър, който да насочва цялата активност от едно устройство към друго, но екипът реши, че е много по-ефективно (макар и по-хакнат) всички да работят директно върху базата данни на Firebase.

Мениджър и приложения за лични клиенти

Джон, бидейки магьосника на iOS, който е той, завърши тези приложения през първите 12 часа от хакатона! Той наистина превъзхожда проектирането на удобни за потребителя и достъпни приложения.

Приложението за мениджър

Това приложение за iPad регистрира нови клиенти в нашата база данни Kairos API и Firebase. Той също така показа всички клиенти в магазина и инвентара на артикулите в магазина. Възможността да се взаимодейства директно с базата данни на Firebase и да се наблюдават промените, направени в нея (например, когато атрибутът на клиента in_store се промени от истински на фалшив) направи този сравнително безболезнен процес. Приложението беше чудесно допълнение към клиента към нашата демонстрация.

Приложението за лично пазаруване

След като клиентът се регистрира, ние ще предадем телефон с това приложение, инсталирано на клиента. Те ще влязат с лицето си (Кайрос би разпознал и удостоверявал). Всички актуализации на количката им ще бъдат показани на телефона незабавно. При излизане от магазина клиентът също ще получи известие по телефона на този телефон, като посочва общата сума, която е похарчил.

Поставка за предмети, сензори и камера

Soheil и Ruslan работиха неуморно в продължение на часове, за да усъвършенстват дизайна на апаратите за рафтове и на основните скриптове Pi Python.

Апаратът за багажник за артикули. Три позиции, разположени на редици, кула за охранителната камера и ултразвукови сензори, разположени отзад

Имаше три позиции, разположени в редове. В края на два реда беше прикрепен ултразвуков сензор за близост. Имахме само два ултразвукови сензора, така че на третия ред имаше светлинен сензор под елементите, който не работеше толкова безпроблемно. Ултразвуковите сензори бяха свързани към Raspberry Pi, които обработваха показанията на разстоянието от следващия най-близък обект чрез прости скриптове на Python (или най-близкият елемент, или в края на стелажа). Светлинният сензор засече състояние „тъмно“ или „светло“ (тъмно, ако елементът е отгоре, светли по друг начин).

Когато елементът се повдигне, отчитането на сензора ще се промени и ще предизвика актуализация на запасите на продукта в базата данни. Камерата (телефон с Android), разположена в горната част на кулата, ще засече тази промяна и ще се опита да разпознае клиента да вдига артикула. Тогава артикулът незабавно ще бъде добавен към количката на този клиент.

Камери за вход и изход

Реших да използвам телефони с Android като камери за разпознаване на лице, поради моята относителна експертиза с Android и лесното свързване на телефоните, които осигуряват при заснемане на изображения и обработката им.

Телефоните бяха поставени от двете страни на статив за камера, от едната страна на входа на магазина, а другата на изхода на магазина.

Статив за камера, два телефона и много касета

Google има невероятно полезен Face API, който реализира естествен тръбопровод за откриване на човешки лица и други свързани с тях полезни атрибути. Използвах този API за обработка на тежки повдигания за разпознаване на лицето.

По-специално, API предоставя приблизително разстояние на открито лице от камерата. След като лицето на клиента е на близко разстояние, аз ще направя моментна снимка на клиента, за да го проверя с API на Kairos, за да се уверя, че клиентът съществува в нашата база данни, и след това да актуализирам базата данни на Firebase със статуса на клиента в магазина.

Добавих и персонализиран поздрав от текст към реч при разпознаване на клиента. Това наистина се обади на всички, които го използват.

Резултатът от това изпълнение може да видите тук:

След като клиентът излезе от магазина, състоянието на откриване на изхода на приложението за Android е отговорно за извличането на артикулите, които клиентът е взел от базата данни, изчисляването на общата сума, която клиентът е похарчил, и след това изпращане на push известие към личното приложение на клиента чрез Облачно съобщение на Firebase.

От 36 часа спахме около 6. Прекарахме цялото си време в затворена стая в средата на центъра на Торонто. Имаше безброй разочароващи грешки и пречки за изпълнение, които трябваше да преодолеем. В нашата демонстрация имаше някои грешки, които вероятно сте забелязали, например камерите, които не разпознават няколко души в един и същи кадър.

Бихме искали също така да внедрим допълнителни функции, като например да откриваме клиентите да поставят артикулите обратно на багажника и да добавим по-голямо разнообразие от елементи.

Нашият проект в крайна сметка спечели първо място на хакатона. Поставихме интерактивен щанд за един час (замъкът с кутия Chipotle, който може да се види на заглавната снимка) и имахме над сто души да се разходят през нашия магазин. Хората щяха да се регистрират със снимка, да влязат в приложението за пазаруване, да влязат в магазина, да вдигнат артикул, да излязат и да бъдат уведомени незабавно за сметката си. Без касиери, без линии, без разписки и много приятно потребителско изживяване.

Ходене на клиент през нашия магазин

Гордеех се с начина, по който нашият екип игра към силните страни на всеки индивид и създадохме добре съставен IoT проект за цял стак за период от няколко часа. Това беше невероятно възнаграждаващо чувство за всички и това е нещо, което се надявам да повторя в кариерата си в бъдеще.

Надявам се, че това ви даде известна представа за това, което се случва зад кулисите на голям, бързо прототипиран и хакатен хакатонен проект като EZShop.

Следвайте ме в Twitter и Medium, ако се интересувате от по-задълбочени и информативни изписвания като тази! Винаги съм готов да се свързвам и да уча от други разработчици на софтуер.

Проектът е с отворен код и може да бъде намерен в Github тук. Внимавайте, хакатоновият код не е хубав!