Kuinka luimme Amazon Go -palvelun 36 tunnissa

John Choi, minä, projektilaitteemme, Ruslan Nikolaev ja Soheil Hamidi esittelyssä!

Kollegani ja minä halusimme luoda jotain, joka saisi ihmiset menemään “vau” viimeisimmässä hackathonissa.

Koska jäljitelmä on imarteen syvin muoto ja IoT: lla on uskomattoman hauskaa työskennellä, päätimme luoda oman version Amazon Go -sovelluksesta.

Ennen kuin selitän, mitä sen tekeminen tarvitsi, tässä on 3 minuutin esittely siitä, mitä rakensimme!

Meitä oli neljä. Ruslan, upea täyspinoinen kehittäjä, jolla oli kokemusta työskentelystä Pythonin kanssa. John, uskomattoman iOS-kehittäjä. Soheil, toinen hieno täyspinoinen kehittäjä, jolla oli kokemusta Raspberry Pi: stä. Ja lopuksi, minä olin Android-kehittäjän harjoittelujakson lopussa.

Tajusin nopeasti, että projektiin sisältyy paljon liikkuvia osia. Amazon Go toimii reaaliaikaisten läheisyysantureiden perusteella yhdessä asiakkaiden ja heidän kärryjensä reaaliaikaisen tietokannan kanssa.

Halusimme myös viedä asiat askeleen pidemmälle ja tehdä pääsy- ja poistumiskokemukset saumattomiksi. Halusimme antaa ihmisten tulla ja poistua myymälästä tarvitsematta napauttaa heidän puhelimiaan.

Jotta käyttäjät olisivat kiinnostuneita kuluttajalähtöisiksi tuotteiksi, sovelluksemme tarvitsisi hyvin muotoiltua käyttöliittymää, kuten oikea Amazon Go.

Päivää ennen hackathonia koonnin näennäissuunnitteluasiakirjan, jossa hahmoteltiin, mitä meidän piti tehdä 36 tunnin määräajassa. Yhdistin tiimimme vahvuudet ja käsillä olevat laitteet. Koko kiireellisesti koottu suunnitteludokumentti näkyy alla.

EZShopissa, Amazon Go -versiossamme, oli kuusi pääkomponenttia.

Pikakaavio vatkasin visualisoimalla tämän projektin komponentit

Kairosin kasvojentunnistussovellus

Kairos-kasvojentunnistusliittymä oli meille perustavanlaatuinen komponentti. Se käytti kykyä tunnistaa ja tallentaa ainutlaatuisia kasvoja. Siinä oli kaksi käyttämäämme sovellusliittymää: / ilmoittautuminen ja / vahvistus.

/ ilmoittautuminen kuvataan seuraavasti:

Ottaa kuvan, löytää kasvot sen sisällä ja tallentaa kasvot luomaasi galleriaan.

Rekisteröimme kaikki uudet asiakkaat yhdeksi “EZShop” -galleriaksi. Ainutlaatuinen face_id -attribuutti palautetaan ja tallennetaan asiakkaan rekisteröidyn nimen kanssa reaaliaikaiseen tietokantaan.

Kun halusimme vahvistaa potentiaalisen asiakkaan kuvan, lähetämme sen / vahvistaa päätepisteeseen. Tämä palauttaa face_id: n suurimmalla todennäköisyydellä ottelussa.

Reaalimaailman toteutuksessa olisi todennäköisesti ollut parempi idea käyttää natiivisti toteutettua kasvojentunnistusta TensorFlow-verkon kanssa verkon sovellusliittymän sijasta. Mutta aikarajoitteidemme vuoksi sovellusliittymä palveli meitä erittäin hyvin.

Reaaliaikainen Firebase-tietokanta

Firebase-tietokanta oli toinen pala palapelissämme. Jokainen muu komponentti oli vuorovaikutuksessa sen kanssa reaaliajassa. Firebase mahdollistaa räätälöityjen muutoskuuntelijoiden luomisen tietokannan kaikkiin tietoihin. Tämä ominaisuus yhdessä helpon asennusprosessin kanssa teki siitä käytön, jota ei tarvita.

Kaavio oli uskomattoman yksinkertainen. Tietokantaan tallennettiin joukko kohteita ja joukko käyttäjiä. Seuraava on esimerkki tietokannastamme JSON-luuranko:

{
  "tuotteet": [
    {
      "item_id": 1,
      "item_name": "Soylent",
      "item_stock": 1,
      "hinta": 10
    }
  ],
  "käyttäjät": [
    {
      "face_id": 1,
      "nimi": "Subhan Nadeem",
      "in_store": väärä,
      "ostoskori": [
        1
      ]
    }
  ]
}

Uusia käyttäjiä lisätään tietokantaamme olevaan käyttäjäryhmään rekisteröinnin jälkeen Kairos-sovellusliittymällä. Saapuessaan tai poistuessa asiakkaan boolean in_store -attribuutti päivitetään, mikä heijastuu ylläpitäjän ja henkilökohtaisen sovelluksen käyttöliittymiin.

Asiakkaat, jotka noutavat tuotteen, johtaisivat päivitettyyn tuotevarastossa. Tunnistettuaan, mikä asiakas valitsi minkä esineen, tuotteen tunnus lisätään asiakkaan ostoskoriin.

Olin suunnitellut pilvipalvelimen ylläpitämää Node / Flask -palvelinta, joka ohjaa kaiken toiminnan yhdestä laitteesta toiseen, mutta ryhmä päätti, että kaikille on paljon tehokkaampaa (vaikkakin enemmänkin onnettomuutta) työskennellä suoraan Firebase-tietokannassa.

Johtaja- ja henkilökohtaiset asiakassovellukset

John, koska hän on iOS-velho, hän on valmistunut nämä sovellukset hackathonin 12 ensimmäisen tunnin aikana! Hän todella hienosti suunnittelussa käyttäjäystävällisiä ja helppokäyttöisiä sovelluksia.

Manager-sovellus

Tämä iPad-sovellus rekisteröi uusia asiakkaita Kairos API- ja Firebase-tietokantaan. Se näytti myös kaikki kaupan asiakkaat ja myymälätavaroiden varastot. Mahdollisuus olla vuorovaikutuksessa suoraan Firebase-tietokannan kanssa ja tarkkailla siihen tehtyjä muutoksia (esim. Kun asiakkaan in_store-ominaisuus muuttuu totta vääriksi) teki tästä suhteellisen kivutonta prosessia. Sovellus oli loistava asiakaslähtöinen lisä demonamme.

Henkilökohtainen ostossovellus

Kun asiakas on rekisteröity, luovutamme puhelimen, jossa tämä sovellus on asennettu asiakkaalle. He kirjautuvat sisään kasvoillaan (Kairos tunnistaa ja todentaa). Mahdolliset päivitykset ostoskoriinsa näkyvät puhelimessa heti. Poistuessaan myymälästä asiakas saa myös puhelimeen push-ilmoituksen, jossa ilmoitetaan käytetyn kokonaismäärän.

Tuoteteline, anturit ja kamera

Soheil ja Ruslan työskentelivät väsymättä tuntikausia parantaakseen tavaran hyllylaitteen ja sen alla olevien Pi Python-skriptien suunnittelua.

Tuotetelinelaite. Kolme riviin sijoitettua tuotetta, torni turvakameralle ja ultraäänianturit takaosaan

Siellä oli kolme riviä. Kahden rivin loppuun kiinnitettiin ultraääni-läheisyysanturi. Meillä oli vain kaksi ultraäänianturia, joten kolmannella rivillä oli esineiden alla valoanturi, joka ei toiminut yhtä saumattomasti. Ultraäänianturit kytkettiin Raspberry Pi: hen, joka käsitteli etäisyyden lukemat seuraavasta lähimmästä esineestä yksinkertaisten Python-skriptien avulla (joko lähin esine tai telineen pää). Valoanturi havaitsi “tumman” tai “vaalean” tilan (tumma, jos esine oli sen päällä, valaise muuten).

Kun esine nostettiin, anturin lukema muuttui ja käynnistää päivityksen kohteen varastosta tietokannassa. Tornin yläosaan sijoitettu kamera (Android-puhelin) havaitsisi tämän muutoksen ja yrittäisi tunnistaa tuotteen noutavan asiakkaan. Tuote lisätään sitten heti kyseisen asiakkaan ostoskoriin.

Sisään- ja poistokamerat

Päätin käyttää Android-puhelimia kasvojentunnistuskameroidemme suhteellisen kokemukseni vuoksi Androidille ja helpoille kytkentäpuhelimille kuvan ottamisessa ja käsittelemisessä.

Puhelimet oli kiinnitetty kamerajalustan molemmille puolille, toinen puoli kaupan sisäänkäynnin kohdalla ja toinen kaupan poistumistieltä.

Kamerajalusta, kaksi puhelinta ja paljon nauhaa

Googlella on uskomattoman hyödyllinen Face API -sovellus, joka toteuttaa alkuperäisen putkilinjan ihmisten kasvojen ja muiden niihin liittyvien hyödyllisten ominaisuuksien havaitsemiseksi. Käytin tätä sovellusliittymää käsittelemään raskas nosto kasvojen tunnistamiseen.

Erityisesti API toimitti havaitun kasvon likimääräisen etäisyyden kamerasta. Kun asiakkaan kasvot olivat lähellä etäisyyttä, otan tilannekuvan asiakkaasta, tarkistan sen Kairos-sovellusliittymää vastaan ​​varmistaakseni, että asiakas on tietokannassamme, ja päivitän sitten Firebase-tietokannan asiakkaan myymälätilaan.

Lisäsin myös henkilökohtaisen tervehdyksen tekstiin puheeksi asiakkaan tunnistamisen yhteydessä. Se todella päätyi heittämään kaikille käyttäjille.

Toteutuksen tulos näkyy täällä:

Kun asiakas poistui myymälästä, Android-sovelluksen poistumistunnistustila oli vastuussa asiakkaiden keräämien esineiden hakemisesta tietokannasta, asiakkaan kuluttaman kokonaismäärän laskemisesta ja työntöilmoituksen lähettämisestä asiakkaan henkilökohtaiseen sovellukseen kautta Firebase Cloud Messaging.

36 tunnista nukkui noin 6. Vietimme koko aikamme vain luokkahuoneessa keskellä Toronton keskustaa. Oli lukemattomia turhauttavia virheitä ja toteutuksen esteitä, jotka meidän oli ylitettävä. Demossa oli joitain virheitä, jotka todennäköisesti huomasit, kuten kamerat, jotka eivät tunnista useita ihmisiä samassa kuvassa.

Olisimme myös halunneet ottaa käyttöön lisäominaisuuksia, kuten havaita asiakkaat asettamaan tavarat takaisin telineelle ja lisäämään laajemman valikoiman tuotteita.

Projektimme lopulta voitti ensimmäisen sijan hackathonilla. Perustimme tunniksi interaktiivisen boksin (Chipotle-ruudun linna, joka näkyy otsikkokuvassa), ja yli sata ihmistä käveli myymälämme läpi. Ihmiset ilmoittautuvat kuvalla, kirjautuvat ostossovellukseen, kävelevät kauppaan, hakevat esineen, kävelevät ulos ja saavat ilmoituksen laskustaan ​​heti. Ei kassaa, ei linjoja, ei kuitteja ja erittäin nautittava käyttökokemus.

Asiakkaan käveleminen myymälämme kautta

Olin ylpeä siitä, kuinka joukkueemme pelasi kunkin yksilön vahvuuksiin ja loi hyvin koottu täyden pino IoT-projektin muutaman tunnin kuluessa. Se oli uskomattoman palkitseva tunne kaikille, ja se on jotain, jonka toivon toistavan tulevaisuudessani urallasi.

Toivottavasti tämä antoi sinulle jonkinlaisen kuvan siitä, mitä tapahtuu suuren, nopeasti prototyyppisen ja hacky hackathon -projektin, kuten EZShop, kulissien takana.

Seuraa minua Twitterissä ja Mediumissa, jos olet kiinnostunut tämänkaltaisista syvällisemmistä ja informatiivisemmista kirjoituksista! Aion aina olla yhteydessä muihin ohjelmistokehittäjiin ja oppia niistä.

Projekti on avoimen lähdekoodin ja löytyy Githubista täältä. Varoita, hackathon-koodi ei ole hieno!