36時間でAmazon Goを再作成した方法

ジョン・チェ、私、プロジェクト装置、ルスラン・ニコラエフ、ソハイル・ハミディ、デモで!

私の同僚と私は、最新のハッカソンで人々を「すごい」ものにする何かを作りたかったのです。

模倣はお世辞の誠実な形であり、IoTは非常に楽しい作業であるため、独自のバージョンのAmazon Goを作成することにしました。

これを作成するのに必要なことを説明する前に、構築したものの3分間のデモです

私たちは4人いました。 Ruslanは、Pythonでの作業経験のある優れたフルスタック開発者です。ジョン、素晴らしいiOS開発者。 Raspberry Piの経験があるもう1人の優れたフルスタック開発者であるSoheil。そして最後に、Android開発者のインターンシップの最後に私がいました。

このプロジェクトには多くの動く部分があることにすぐに気付きました。 Amazon Goは、リアルタイムの近接センサーと顧客とそのカートのリアルタイムデータベースに基づいて動作します。

また、さらに一歩踏み込んで、出入りのエクスペリエンスをシームレスにしたいと考えました。私たちは、人々が自分の電話をタップすることなく店に出入りできるようにしたかったのです。

消費者向け製品としてユーザーを引き付けるには、アプリには本物のAmazon Goのような巧妙なユーザーインターフェイスが必要です。

ハッカソンの前日に、36時間の期限内に何をする必要があるかをまとめた疑似設計ドキュメントをまとめました。私たちのチームの強みと手元の装備を取り入れました。急いで組み立てられた完全な設計ドキュメントを以下に示します。

Amazon GoのバージョンであるEZShopには、6つの主要なコンポーネントがありました。

このプロジェクトのコンポーネントを視覚化した簡単な図

Kairos顔認識API

Kairos顔認識APIは、私たちにとって基本的なコンポーネントでした。ユニークな顔を識別して保存する機能を抽象化しました。 / enrollと/ verifyの2つのAPIを使用しました。

/ enrollは次のように記述されます:

写真を撮り、その中の顔を見つけ、作成したギャラリーに顔を保存します。

すべての新規顧客を単一の「EZShop」ギャラリーに登録しました。一意のface_id属性が返され、リアルタイムデータベースに顧客の登録名とともに保存されます。

潜在的な顧客の画像を検証する場合、/ verifyエンドポイントにPOSTします。これにより、一致する確率が最も高いface_idが返されます。

実際の実装では、おそらく、ネットワークAPIの代わりに、TensorFlowでネイティブに実装された顔認識パイプラインを使用することをお勧めします。しかし、時間の制約を考えると、APIは非常に役立ちました。

リアルタイムFirebaseデータベース

Firebaseデータベースは、パズルのもう1つの基本的な要素でした。他のすべてのコンポーネントは、リアルタイムでそれと対話しました。 Firebaseでは、データベース内の任意のデータに対してカスタマイズされた変更リスナーを作成できます。その機能は、簡単なセットアッププロセスと相まって、使用するのが簡単です。

スキーマは非常にシンプルでした。データベースには、アイテムの配列とユーザーの配列が格納されていました。以下は、データベースのJSONスケルトンの例です。

{
  「アイテム」:[
    {
      「item_id」:1
      「item_name」:「Soylent」、
      「item_stock」:1
      「価格」:10
    }
  ]、
  「ユーザー」:[
    {
      「face_id」:1
      「name」:「Subhan Nadeem」、
      「in_store」:false、
      「カート」:[
        1
      ]
    }
  ]
}

Kairos APIに登録した後、データベース内のユーザーの配列に新しいユーザーが追加されます。入場または退店すると、顧客のブール値のin_store属性が更新され、マネージャーおよび個人用アプリのUIに反映されます。

顧客が商品を受け取ると、商品在庫が更新されます。どの顧客がどの商品を引き取ったかを認識すると、その商品のIDが顧客のカート配列に追加されます。

すべてのアクティビティをあるデバイスから別のデバイスにルーティングするクラウドホストNode / Flaskサーバーを計画していましたが、チームは全員がFirebaseデータベースで直接作業する方がはるかに効率的(ハッキングが多い)であると判断しました。

マネージャーおよび個人顧客アプリ

彼がiOSウィザードであるJohnは、ハッカソンの最初の12時間でこれらのアプリケーションを完成させました!彼はユーザーフレンドリーでアクセスしやすいアプリの設計に本当に優れていました。

マネージャーアプリ

このiPadアプリケーションは、新しい顧客をKairos APIおよびFirebaseデータベースに登録しました。また、店舗内のすべての顧客と店舗アイテムの在庫も表示しました。 Firebaseデータベースと直接対話し、データベースへの変更を確認する機能(たとえば、顧客のin_store属性がtrueからfalseに変更されたとき)により、これは比較的簡単なプロセスになりました。このアプリは、デモに加えて、顧客向けの優れたものでした。

パーソナルショッピングアプリ

顧客が登録されたら、このアプリをインストールした電話を顧客に渡します。彼らは自分の顔でログインします(カイロは認識して認証します)。カートの更新は、電話ですぐに表示されます。店を出ると、顧客はこの電話でプッシュした通知を受け取り、消費した合計金額を通知します。

アイテムラック、センサー、カメラ

SoheilとRuslanは、アイテムシェルフ装置と基礎となるPi Pythonスクリプトの設計を完成させるために、何時間も精力的に働きました。

アイテムラック装置。列に配置された3つのアイテム、セキュリティカメラ用のタワー、および背面に配置された超音波センサー

行に配置された3つのアイテムがありました。 2列の最後に、超音波近接センサーが取り付けられました。超音波センサーは2つしかなかったので、3番目の行にはアイテムの下に光センサーがありましたが、これはシームレスに機能しませんでした。超音波センサーは、単純なPythonスクリプト(最も近いアイテムまたはラックの端)を介して、次に近いオブジェクトからの距離の読み取り値を処理するRaspberry Piに接続されました。光センサーは、「暗い」または「明るい」状態(アイテムがその上にある場合は暗い、そうでない場合は明るい)を検出しました。

アイテムが持ち上げられると、センサーの読み取り値が変更され、データベース内のアイテムの在庫が更新されます。塔の上部に配置されたカメラ(Androidフォン)は、この変更を検出し、アイテムを拾い上げている顧客を認識しようとします。アイテムはすぐにその顧客のカートに追加されます。

入口カメラと出口カメラ

Androidの相対的な専門知識と、画像を撮影して処理する際に簡単に結合できる携帯電話のおかげで、私はAndroid携帯を顔認識カメラとして使用することを選択しました。

携帯電話はカメラの三脚の両側、店舗の入り口と店舗の出口に設置されました。

カメラの三脚、2台の電話、大量のテープ

Googleには、人間の顔やその他の関連する有用な属性を検出するためのネイティブパイプラインを実装する非常に便利なFace APIがあります。私はこのAPIを使用して、顔認識の重荷を処理しました。

特に、APIはカメラから検出された顔のおおよその距離を提供しました。顧客の顔が近距離にあると、顧客のスナップショットを撮り、Kairos APIで照合して顧客がデータベースに存在することを確認してから、顧客の店内ステータスでFirebaseデータベースを更新します。

また、顧客を認識したときにパーソナライズされたテキスト読み上げグリーティングを追加しました。それは本当にそれを使用したすべての人を驚かせた。

この実装の結果は次のとおりです。

顧客が出店した後、Androidアプリケーションの終了検出状態は、顧客がデータベースからピックアップしたアイテムを取得し、顧客が費やした合計金額を計算してから、プッシュ通知を顧客の個人用アプリに送信する役割を果たしました。 Firebase Cloudメッセージング。

36時間のうち、約6週間寝ました。トロントのダウンタウンの真ん中にある教室に限定して過ごしました。私たちが克服しなければならなかった無数のイライラするバグと実装の障害がありました。デモにいくつかのバグがあります。たとえば、カメラが同じショットの複数の人物を認識できないなどです。

また、顧客が商品をラックに戻すことを検出したり、より多くの種類の商品を追加したりするなどの追加機能を実装したいと思っていました。

私たちのプロジェクトはハッカソンで1位になりました。インタラクティブブース(タイトルの写真で見ることができるチポトレの箱の城)を1時間設置し、100人以上の人が店内を歩きました。人々は写真でサインアップし、ショッピングアプリにログインし、ストアに足を踏み入れ、アイテムを受け取り、外に出て、すぐに請求書の通知を受け取ります。キャッシャー、回線、領収書、および非常に楽しいユーザーエクスペリエンスはありません。

お客様を当店に案内する

私たちのチームが各個人の強みを活かしてプレイし、数時間で十分にまとめられたフルスタックIoTプロジェクトを作成したことを誇りに思いました。それは皆にとって信じられないほどやりがいのある気持ちであり、将来の私のキャリアでそれを再現したいと思っています。

これにより、EZShopなどの、大規模で、プロトタイプが作成された、ハッキーなハッカソンプロジェクトの舞台裏で何が行われているのかを理解できたと思います。

このような詳細で有益な記事に興味がある場合は、TwitterとMediumでフォローしてください!私は常に他のソフトウェア開発者とつながり、そこから学ぶことを歓迎しています。

このプロジェクトはオープンソースであり、Githubのこちらにあります。ハッカソンコードはきれいではありません。