はじめに
2020 年は新型コロナウィルスの影響で生活が一変しました。特にリスクが高まることが判明している、密閉空間/密集場所/密接場面の「3 密」を避けることの重要性が定着し、3 密は 2020 年の流行語大賞にもなりました。
今回シスコメンバー有志で、レストランやカフェなど、物理的に人が集まって食事をする場所を要する商業施設やイベント会場に向けて、「Meraki スマートカメラで 3 密を避けるソリューション」を考案しましたので、その方法を説明します。
今回やりたいこと & デモ動画
今回は、人の流れをコントロールして、人の少ない飲食店に来場者を誘導することで、お店が密になるのを避ける仕組みを考えました。
施設案内の Web サイトを来場者が見たときに、飲食店が混んでいるかどうかひと目で確認できるようにします。また、空いている飲食店にだけ割引クーポンを提示します。割引クーポンに引き寄せられて、来場者は人の少ない飲食店に誘導される、ことを期待しています
イベント会場を例にしたデモ動画(30秒/無音)
来場したお客様が会場のフリー Wi-Fi に接続すると、施設案内マップが表示されます。混んでいるレストランはオレンジのアイコン、空いているレストランは緑のアイコンが表示されています。
アイコンをクリックすると、Meraki スマートカメラから、レストランの今の様子が見え、また人数もわかります。
そして緑の、空いているレストランにだけ、10% オフクーポンが動的に表示されます。これにより、今空いているレストランにだけ人を呼び込むことができます。
仕組み
Meraki スマートカメラでは、カメラに映っている人の人数を検知し、Meraki のクラウド上の管理コントローラ(=Meraki ダッシュボード、 Meraki スマートカメラはコントローラで集中管理されます)から API 経由で情報を取得することができます。今回は、カメラに写っている人数をカウントする API(MV Sense API) と、カメラ画像のスナップショットを撮る API(Snapshot API) を活用します。
- Cisco Meraki スマートカメラで、施設内のレストランやカフェなど飲食店の状況を監視し、MV Sense API で定期的に人数をカウントする
- 施設案内の Web サイトで混雑状況を Google Map に色分け表示し、各店の現在の様子を Snapshot API で表示する
- 飲食店内の人数が増え定員オーバーを検知したら、人が少ない飲食店にだけ、施設案内の Web サイトで「割引クーポン」を表示する
- 施設へ来場したゲストはクーポンにつられて人の少ない飲食店に誘導されることで、施設全体の密を回避する。
このソリューションでは、Google Maps API、Meraki MV Sense API、Snapshot APIの3つのAPIを使用しています。イベントWebサーバーはPython とFlaskのWebフレームワークで構築しています。
Web サーバーは Google Maps API でサイトマップを取得し、マップ上にレストランのアイコンを配置します。
サーバーは、カメラで検知した人数を Meraki MV Sense API で取得し、レストランの混雑度に基づいて価格やクーポンを判定しページ上に表示します。
また、Meraki Snapshot API でリアルタイムの店内画像を取得し、ページ上に表示します。
Meraki API 解説 ~Meraki Snapshot API~
今回は、Google Map にリアルタイムの店内画像を表示するのに利用している、Meraki Snapshot API について詳しく解説します。
Meraki Snapshot API は、リクエストを送ると、Meraki スマートカメラの画像(スナップショット)を生成しその画像の URL を返します。リクエストは日時を指定することもできますし、指定しない場合は現在の画像を返します。また第二世代以降の Meraki スマートカメラでは、返す画像の解像度を調整することも出来ます。
STEP1: Meraki API 有効化と API key 取得
お手持ちのMeraki スマートカメラで API を利用するための準備として、まずは Meraki ダッシュボードでのAPIの有効化と、API Keyの取得が必要です。
まず API を有効化するには、Meraki ダッシュボード [Organization(オーガナイゼーション) > Settings(設定) > Dashboard API access(ダッシュボードAPIアクセス)]でチェックボックスをオンにします。
API Key はダッシュボードの管理者ごとに生成・失効・再生成されます。Meraki ダッシュボード右上のアカウントをプルダウンして [Profile(プロファイル)]をクリックします。
自分のプロファイルに関連付けた API Key を生成します。
STEP2: Meraki スマートカメラの MV Sense API 有効化
今回のプログラムでは、STEP3 で解説する Meraki Snapshot API だけでなく、カメラに写った人数をカウントするために Meraki MV Sense API も利用しています。そのため、対象の Meraki スマートカメラで MV Sense API を有効化します。
Meraki ダッシュボード [Camera(カメラ) > (API を有効化したいカメラを選択) > Settings(設定) > Sense(センス)]から、MV Sense API を有効化します。
STEP3:Meraki スマートカメラの画像を返す Snapshot API の動作確認
DevNetのAPI 解説ページでは、簡単に動作確認やサンプルコードの取得が可能です。
今回利用する Meraki Snapshot API については、こちらを試してみます。
https://developer.cisco.com/meraki/api-v1/#!generate-device-camera-snapshot
まずは、先程の下準備 STEP1 で取得した API Key と、Meraki スマートカメラのシリアル番号を手元に準備しましょう。
Meraki スマートカメラのシリアル番号は、カメラ本体が手元になくても Meraki ダッシュボード [Camera(カメラ) > Monitor(監視) > Camera(カメラ)]から確認できます。
もしデフォルトで表示されていない場合は、表の右端にある青い Tool アイコンをクリックし、表示する項目から「シリアル番号」を選択してください。
準備ができたら、DevNet サイトで Snapshot API の動作を確認しましょう。
Generate Device Camera Snapshot にアクセスします。
サイト上部にMerakiスマートカメラのシリアル番号を入力し、
Headers情報にAPI Keyを入力し、 [Run]ボタンを押します。
すると、URLが返されます(下図左)。返ってきたURLを開いてみると、指定した日時にMerakiスマートカメラに写っていたスナップショットが確認できました(下図右)。
Google Map での混雑状況表示と動的なクーポン提示
今回は、地図上で施設の混雑状況を表示するために、Google Map 上に施設のアイコン設置し、
そのアイコンの色を Meraki スマートカメラ の MV Sense API で検知した人数に応じて変化させています。
Web ページ上への Google Map の表示は flask_googlemaps モジュールを利用します。
取得した地図上に緯度経度を指定して飲食店のアイコンを設置しています。
(参考URL)
https://pypi.org/project/flask-googlemaps/
また飲食店のアイコンをクリックしたら、Meraki スマートカメラのスナップショット画像を表示しています。
実行コード
Snapshot を取得する Python スクリプト
import requests import json import time from config import settings def snapshot(): camlist = settings.camlist snap_url=[] for sn in camlist: meraki_snapshot_url='https://api.meraki.com/api/v0/networks/' + settings.network_id + '/cameras/' + sn + '/snapshot' meraki_headers = {'X-Cisco-Meraki-API-Key': settings.apikey} meraki_snapshot_response = requests.post(meraki_snapshot_url, headers=meraki_headers) meraki_snapshot_response_json=json.loads(meraki_snapshot_response.text) snapshot_url=meraki_snapshot_response_json['url'] snap_url.append(snapshot_url) return snap_url if __name__ == "__main__": snap = snapshot() print(snap)
Meraki スマートカメラで検知された人数を取得する Python スクリプト
import requests import json def personcount(): camlist = ['<camera serial number>'] num_of_person=[] apikey = '<meraki api key>' for sn in camlist: headers = {'X-Cisco-Meraki-API-Key': apikey} mv_live_url = 'https://api.meraki.com/api/v1/devices/'+sn+'/camera/analytics/live' mv_live_response = requests.get(mv_live_url, headers=headers) mv_live_response_json=json.loads(mv_live_response.text) num_of_person_detected=mv_live_response_json['zones']['0']['person'] num_of_person.append(num_of_person_detected) return num_of_person
上記スクリプトとあわせて、
Google Map に混雑状況のアイコンと、人数やスナップショット画像を表示する Python スクリプト[app.py]や、施設案内(Google Map)を表示する Web サイトの HTML スクリプト[map.html]を GitHub に掲載しています。
ぜひご活用ください。
https://github.com/ayamazak/Avoid-the-3Cs_via_Meraki-Camera
おすすめ:DevNet Code Exchange
最後に、シスコ製品のAPIを試してみたい方に参考になる、「Cisco DevNet Code Exchange」を紹介します。
https://developer.cisco.com/codeexchange/
Cisco DevNet Code Exchangeとは、様々なシスコソリューションの API を使ったコードが公開されているコミュニティです。
シスコ機器の API をなにか試してみたいな〜というときに、製品名などで検索もでき、様々なコードを参考にすることができます。
今回の「Meraki スマートカメラで3密を避けるシリーズ」の解説もこちらに掲載しています。解説ページ右上からは GitHub に飛ぶことができますので、参考にしていただければ幸いです。
Avoid-the-3Cs_via_Meraki-Camera
終わりに
以上により、Meraki スマートカメラを使って飲食店で密を避け、人が少ないレストランにだけ新たに人を呼び込むことができました
他にも、同じくMeraki スマートカメラを使って 3 密を避け、今度は人が多くなった飲食店から人を追い出すソリューションなどを考案しています。今後の記事化にご期待ください。