Come abbiamo ricreato Amazon Go in 36 ore

John Choi, io, il nostro apparato del progetto, Ruslan Nikolaev e Soheil Hamidi alla nostra demo!

I miei colleghi e io volevamo creare qualcosa che avrebbe fatto andare le persone "wow" al nostro ultimo hackathon.

Poiché l'imitazione è la forma più sincera di adulazione e l'IoT è incredibilmente divertente con cui lavorare, abbiamo deciso di creare la nostra versione di Amazon Go.

Prima di spiegare cosa ci è voluto per fare questo, ecco la demo di 3 minuti di ciò che abbiamo costruito!

Eravamo in quattro. Ruslan, un grande sviluppatore full-stack che aveva esperienza di lavoro con Python. John, un fantastico sviluppatore iOS. Soheil, un altro grande sviluppatore full-stack che ha avuto esperienza con Raspberry Pi. E infine, ero io, alla fine di uno stage per sviluppatori Android.

Mi sono reso rapidamente conto che c'erano molte parti mobili in questo progetto. Amazon Go funziona sulla base di sensori di prossimità in tempo reale insieme a un database in tempo reale dei clienti e dei loro carrelli.

Volevamo anche fare un ulteriore passo avanti e rendere l'esperienza di entrata / uscita senza soluzione di continuità. Volevamo consentire alle persone di entrare e uscire dal negozio senza dover toccare i loro telefoni.

Per coinvolgere gli utenti come un prodotto rivolto al consumatore, la nostra app avrebbe bisogno di un'interfaccia utente ben realizzata, come il vero Amazon Go.

Il giorno prima dell'hackathon, ho messo insieme un documento pseudo-design che delineava cosa dovevamo fare entro la scadenza di 36 ore. Ho incorporato i punti di forza del nostro team e dell'attrezzatura a portata di mano. Di seguito è possibile vedere l'intero documento di progettazione assemblato in fretta.

C'erano sei componenti principali in EZShop, la nostra versione di Amazon Go.

Un diagramma veloce che ho preparato visualizzando i componenti di questo progetto

L'API di riconoscimento facciale di Kairos

L'API di riconoscimento facciale di Kairos è stata una componente fondamentale per noi. Ha sottratto la capacità di identificare e memorizzare volti unici. Aveva due API che abbiamo usato: / iscriviti e / verifica.

/ iscriviti è descritto come:

Scatta una foto, trova i volti al suo interno e li archivia in una galleria che crei.

Abbiamo iscritto tutti i nuovi clienti in una singola galleria "EZShop". Un attributo univoco face_id verrebbe restituito e archiviato con il nome registrato del cliente nel nostro database in tempo reale.

Quando volevamo verificare l'immagine di un potenziale cliente, la postavamo sull'endpoint / verifica. Ciò restituire face_id con la più alta probabilità di una partita.

In un'implementazione del mondo reale, probabilmente sarebbe stata un'idea migliore utilizzare una pipeline di riconoscimento facciale implementata in modo nativo con TensorFlow anziché un'API di rete. Ma visti i nostri limiti di tempo, l'API ci ha servito molto bene.

Il database di Firebase in tempo reale

Il database di Firebase è stato un altro pezzo fondamentale del nostro puzzle. Ogni altro componente ha interagito con esso in tempo reale. Firebase consente di creare listener di modifiche personalizzati su tutti i dati all'interno del database. Questa caratteristica, unita al semplice processo di installazione, ne ha fatto un gioco da ragazzi.

Lo schema era incredibilmente semplice. Il database ha archiviato una matrice di elementi e una matrice di utenti. Di seguito è riportato un esempio di scheletro JSON del nostro database:

{
  "elementi": [
    {
      "item_id": 1,
      "item_name": "Soylent",
      "item_stock": 1,
      "prezzo": 10
    }
  ],
  "utenti": [
    {
      "face_id": 1,
      "name": "Subhan Nadeem",
      "in_store": false,
      "carrello": [
        1
      ]
    }
  ]
}

I nuovi utenti verrebbero aggiunti alla matrice di utenti nel nostro database dopo essersi registrati con l'API di Kairos. All'entrata o all'uscita, l'attributo booleano in_store del cliente verrebbe aggiornato, il che si rifletterebbe nell'interfaccia utente dell'app e del gestore.

I clienti che prelevano un articolo porterebbero a uno stock di articoli aggiornato. Dopo aver riconosciuto quale cliente ha ritirato quale articolo, l'ID dell'articolo verrà aggiunto all'array del carrello del cliente.

Avevo programmato un server Node / Flask ospitato nel cloud che avrebbe indirizzato tutte le attività da un dispositivo all'altro, ma il team ha deciso che era molto più efficiente (anche se più confuso) per tutti lavorare direttamente sul database Firebase.

Il gestore e le app personali dei clienti

John, essendo il mago iOS che è, ha terminato queste applicazioni nelle prime 12 ore dell'hackathon! Si è davvero distinto nel progettare app facili da usare e accessibili.

L'app Manager

Questa applicazione per iPad ha registrato nuovi clienti nel nostro database API e Firebase di Kairos. Ha inoltre mostrato tutti i clienti nel negozio e l'inventario degli articoli del negozio. La capacità di interagire direttamente con il database Firebase e osservare le modifiche apportate ad esso (ad es. Quando l'attributo in_store di un cliente cambia da vero a falso) ha reso questo processo relativamente indolore. L'app è stata un'ottima aggiunta rivolta al cliente alla nostra demo.

L'app per lo shopping personale

Una volta registrato il cliente, passeremo un telefono con questa app installata al cliente. Avrebbero effettuato l'accesso con il loro volto (Kairos avrebbe riconosciuto e autenticato). Eventuali aggiornamenti al loro carrello verrebbero mostrati immediatamente sul telefono. All'uscita dal negozio, il cliente riceverà anche una notifica push su questo telefono indicante l'importo totale speso.

Portaoggetti, sensori e videocamera

Soheil e Ruslan hanno lavorato instancabilmente per ore per perfezionare il design dell'apparato scaffale e gli script Pi Python sottostanti.

L'apparato rack. Tre elementi posizionati in file, una torre per la telecamera di sicurezza e sensori a ultrasuoni posizionati nella parte posteriore

C'erano tre elementi posizionati in file. Alla fine di due file, è stato attaccato un sensore di prossimità ad ultrasuoni. Avevamo solo due sensori a ultrasuoni, quindi la terza fila aveva un sensore di luce sotto gli oggetti, che non funzionava perfettamente. I sensori a ultrasuoni erano collegati al Raspberry Pi che elaborava le letture della distanza dall'oggetto più vicino successivo tramite semplici script Python (l'elemento più vicino o la fine del rack). Il sensore di luce ha rilevato uno stato "scuro" o "chiaro" (scuro se l'elemento era sopra di esso, luce altrimenti).

Quando un articolo veniva sollevato, la lettura del sensore cambiava e innescava un aggiornamento dello stock dell'articolo nel database. La fotocamera (telefono Android) posizionata nella parte superiore della torre rileverà questa modifica e tenterà di riconoscere il cliente che ritira l'oggetto. L'articolo verrebbe quindi immediatamente aggiunto al carrello del cliente.

Telecamere di ingresso e uscita

Ho scelto di utilizzare i telefoni Android come fotocamere per il riconoscimento facciale, a causa della mia relativa esperienza con Android e dei telefoni di facile accoppiamento forniti durante l'acquisizione di immagini e l'elaborazione.

I telefoni erano truccati su entrambi i lati di un treppiede, un lato all'ingresso del negozio e l'altro all'uscita del negozio.

Un treppiede per fotocamera, due telefoni e un sacco di nastro

Google ha un'API Face incredibilmente utile che implementa una pipeline nativa per rilevare volti umani e altri attributi utili correlati. Ho usato questa API per gestire il sollevamento pesante per il riconoscimento facciale.

In particolare, l'API ha fornito una distanza approssimativa di un viso rilevato dalla fotocamera. Una volta che il volto di un cliente si trovava a una distanza ravvicinata, farei un'istantanea del cliente, lo verificherei rispetto all'API di Kairos per assicurarmi che il cliente esistesse nel nostro database, quindi aggiornerei il database Firebase con lo stato in-store del cliente.

Ho anche aggiunto un messaggio di saluto personalizzato al riconoscimento del cliente. Questo ha davvero sorpreso tutti quelli che l'hanno usato.

Il risultato di questa implementazione può essere visto qui:

Una volta che il cliente ha lasciato il negozio, lo stato di rilevamento dell'uscita dell'applicazione Android era responsabile del recupero degli articoli raccolti dal cliente dal database, del calcolo dell'importo totale speso dal cliente e quindi dell'invio di una notifica push all'app personale del cliente tramite Firebase Cloud Messaging.

Delle 36 ore abbiamo dormito per circa 6. Abbiamo trascorso tutto il nostro tempo confinati in un'aula nel centro di Toronto. Ci sono stati innumerevoli bug frustranti e blocchi stradali di implementazione che abbiamo dovuto superare. Ci sono stati alcuni bug nella nostra demo che probabilmente hai notato, come le telecamere che non riconoscono più persone nello stesso scatto.

Ci sarebbe anche piaciuto implementare funzionalità aggiuntive, come rilevare i clienti che rimettono gli oggetti nel rack e aggiungono una più ampia varietà di articoli.

Il nostro progetto ha vinto il primo posto all'hackathon. Abbiamo allestito uno stand interattivo per un'ora (il castello di Chipotle box che si può vedere nella foto del titolo) e abbiamo fatto camminare oltre un centinaio di persone nel nostro negozio. Le persone si iscrivevano con una foto, accedevano all'app dello shopping, entravano nel negozio, prendevano un oggetto, uscivano e venivano immediatamente informati del loro conto. Niente cassieri, nessuna linea, nessuna ricevuta e un'esperienza utente molto piacevole.

Passeggiare con un cliente attraverso il nostro negozio

Ero orgoglioso del modo in cui il nostro team ha giocato ai punti di forza di ogni individuo e creato un progetto IoT full-stack ben messo insieme nel giro di poche ore. È stata una sensazione incredibilmente gratificante per tutti, ed è qualcosa che spero di replicare nella mia carriera in futuro.

Spero che questo ti abbia dato un'idea di ciò che accade dietro le quinte di un progetto hackathon di grandi dimensioni, rapidamente prototipato e hacky come EZShop.

Seguimi su Twitter e Medium se sei interessato a approfondimenti più approfonditi e informativi come questo! Sono sempre aperto al collegamento e all'apprendimento da altri sviluppatori di software.

Il progetto è open-source e può essere trovato su Github qui. Attenzione, il codice hackathon non è carino!