RaspberryPi × Gravio でエッジコンピューティング入門
Raspberry Pi × Gravio
Raspberry Pi と Gravio を組み合わせてエッジコンピューティングへ入門してみます.後半ではデータの可視化を行います.
環境情報
- Raspberry Pi 4 Model B ( RAM 4GB )
- OS: Ubuntu Server ( 20.04.3 64-bit )
- Gravio 4.3 (Basic プラン)
環境構築
Raspberry Pi 自体のセットアップは終わっているものとして, Gravio の環境構築を行うところから行っていきます.また,Gravio は Raspberry Pi OS に対応していないので Ubuntu を載せた Raspberry Pi を利用します.
Gravio HubKit のインストール
公式ドキュメントの Raspberry Pi セットアップページを参考にしながら Raspberry Pi に Gravio HubKit をインストールします.
- apt を最新化する
sudo apt update
sudo apt upgrade
-
Gravio のソフトウェアダウンロードページに行き自分のPCに HubKit をダウンロード
-
scp
コマンドを使って自分の PC にダウンロードした HubKit のファイルをラズパイに転送する-
scp ./setup_-XXXX_XXX64.deb ubuntu@xxx.xxx.xx.xx:/home/ubuntu/
(ファイル名や IP アドレスは各自の環境に合わせてください)- 転送したファイルがラズパイ側にあるかを確認する
-
sudo apt install -y ./setup_-XXXX_XXX64.deb
を実行
-
-
Update Manager にログイン
- ブラウザを開いて
http://xxx.xxx.xx.xx:8080/
にアクセス (xx はそれぞれのラズパイの IP アドレス) - Gravio 起動画面が出てきたら OK
- 処理が終わりログイン画面が出たら完了
- ブラウザを開いて
Gravio Studio のインストール
ラズパイにインストールした HubKit は Gravio Studio から接続して設定などを行う.
Gravio Studio はそれぞれのローカルマシンへインストールするので,Gravio の製品ページから各環境に合った Gravio Studio をインストールする.
Gravio Studio と HubKit の接続
各自の PC から Gravio Studio を使って Gravio HubKit に接続する.Gravio Studio にログインしておきます.
- Gravio Studio の右上にある「+」マークから新規の Hub を追加する ( 以下の画像ではすでに設定済み )
- 新規 Hub の情報を入力する
- Hub名は任意のもの
- HubKit DNS名/IP はIPアドレスを入力
- Raspberry Pi のターミナルから
ip a
でIPアドレスを調べる - 無線LANなら
wlan0
のinet
のIPアドレス
- Raspberry Pi のターミナルから
- 設定した Hub を選択する ( 接続に成功すると以下の画像のような Actions の画面が開く )
エッジコンピューティング
ここからエッジコンピューティングの実験をしていきます.Raspberry Pi と ONVIF 規格に対応したネットワークカメラを接続し,取得したカメラ画像から空間の混雑度を推論します. ( 本当はUSBカメラでやりたかったのですが,Gravio4 ではまだUSBカメラに対応していないとのことです )
※ ネットワークカメラを Raspberry Pi と同じネットワークに参加させておいてください ( カメラによって設定は違うのでここでは割愛 )
Gravio Studio でデバイスの設定
今度は Gravio Studio からデバイスの設定を行う.Gravio Studio の Hub 設定画面からソフトウェアセンサの作成を行う.
- 先ほど作成した Hub をダブルクリックし,Hub の設定画面を開く.
-
設定
の画像推論モデル
からNumberOfPeopleTensorFlow
を選択する (Free プランではこれしか選べない)- 私は Gravio の Basic プランを使っているので
CongestionRecognition_48FeetTensorFlow
のモデルにしています
- 私は Gravio の Basic プランを使っているので
-
デバイス
のエリア
の「+」アイコンをクリックしエリアを追加する ( エリアというのはエッジコンピュータの設置場所を指す )
- レイヤーを追加する ( レイヤーはセンサの種類を指す )
- このとき,最初に
NumberOfPeopleTensorFlow
を追加していると一番下で選択できるようになっている
- このとき,最初に
- レイヤーを選択し論理デバイスの追加からネットワークカメラを追加する ( ネットワークカメラの設定がうまくいっていないと何も表示されない )
- センサーを「オン」にする
- Gravio Studio の
データ
タブで推論で取得したデータを確認する- センサを ON にしたあと更新や再起動すると取得したデータが画面に反映される
- 値のところに推論された人数のデータが表示されれば成功!
備考
データが取得されるタイミングは,カメラのプロパティのキャプチャ間隔で指定したタイミングとなるようです ( https://doc.gravio.com/manuals/gravio4/1/ja/topic/software-sensors ).また,NumberOfPeopleTensorFlow
の推論モデルでは人物の顔を正面から映したときに認識されるようで,有効範囲は数メートルとなるそうです.
Google のサービスを用いたデータ可視化
コチラの記事を参考に,Google のサービスを駆使してデータの可視化を行ってみます.基本は元記事がしっかりまとまっているのでここではサクッと概要だけメモします.
Google サービスの設定
Google のサービスを駆使するので連携させるための準備を行います.
- Google Drive などでGoogle フォームを作成する
- 「質問」の設定から「記述式」の質問を作成し,ほかはデフォルトのままにする
- 「送信」を押してリンクを取得しどこかにメモる
https://docs.google.com/forms/d/e/XXXXX/viewform?usp=sf_link
- リンクの末尾
viewform?usp=sf_link
をformResponse
に変更し以下のようにするhttps://docs.google.com/forms/d/e/XXXXX/formResponse
- 修正したリンクの URL にアクセスする
-
cmd + opt + i
で DevTool を開く - Elements で質問の解答欄の要素を探して質問IDである
name=entry.NNNNNN
を見つけてメモしておく - 見つからない場合は
entry.
などと入力して grep する
- HubKit に接続した Gravio Studio に入る
- 新規のアクションを作成する
- Step1 に
httpRequest
のアクションコンポーネントを追加しプロパティを設定する
メソッド: POST URL: https://docs.google.com/forms/d/e/XXXXX/formResponse Content-Type: application/x-www-form-urlencoded Body: "entry.NNNNNN="+av.Data
- Http Request についてはコチラ
- Http Request の body は
cv.Payload
で以下のようなフォーマットで指定するcv.Payload = {"entry.2027959015": tv.Data}
- Http Request の body は
- 実行をしてみてデータが Google フォームのスプレッドシート保存されていたらデータの送信には成功
- tv. の tv は trigger value の略で,トリガーから送信されるデータなのであとでトリガーを設定するまでは値は0となる
- 次にトリガーを設定し,定期的にデータが入っていることが確認できたらスプレッドシートを DB としてデータが蓄積されていく
- Google Data Portalなどで可視化すれば Google のサービスとの連携によるデータの可視化は完了
Summary
Raspberry Pi 4 と Gravio 4, Ubidots を用いてノーコードでエッジコンピューティングに入門しました.自作で People Count を行おうとすると Deep Learning 周りでなかなかハードルが高いですが,Gravio を導入することでそこの手間を省くことができます.
とはいえ,Gravio 自体の導入もなかなか難しいものがあります.ドキュメントを参考にしつつ進めましたが,最近 Gravio が3から4になったようで少し手間取りました.最終手段としてはフリープランでも参加できる Slack コミュニティがあるので,そこで質問を投げることで解決することができました.Reference にも上げていますがドキュメントや関連記事は豊富だと思うので参考になると思います.
また,Google Data Portal を使ってデータの可視化にも挑戦しました.複数のツールを組み合わせて簡単にエッジコンピューティングを行いましたが,それぞれのツールの使い方に慣れる必要もあり,思い通りのアプリケーションを作ろうと思うと超えるべきハードルがいくつかあります.
ただ Raspberry Pi と Gravio を使うことで,ノーコードで割と簡単にエッジコンピューティングに入門できることがわかりました.
Trouble Shooting
1度 Ubuntu ( RPI ) の電源を切ったあと再開するとデータが取得・送信できない
→ HubKit が停止しているのと,IPアドレスが変わっているため
- ネットワークの接続と HubKit の起動 (
sudo docker-compose up -d
) をし直す - Gravio Studio で HubKit に接続
- このときIPアドレスが変わっていたら新しいものに変更する
- Studio で HubKit に接続できたらネットワークカメラをバインドし直す ( IPアドレスが変わっていれば )
- トリガーで指定しているネットワークカメラのIPアドレスを新しいものに差し替える ( IPアドレスが変わっていれば )
HubKit を起動してしばらく経つと Raspi がフリーズして HubKit も停止する
→ 推論処理の負荷によるもの
- Raspberry Pi の RAM が 4GB で Ubuntu Desktop を使っていると推論の処理で落ちてしまうことがある
- Desktop なので Window System などでリソースを使っていることでうまくいかなくなることがあるようです
- Raspberry Pi の OS を Ubuntu Desktop ではなく Ubuntu Server にすることで RAM 4GB でもうまくいく
Acknowledgement
この記事を書くにあたって,質問に答えていただいた Gravio コミュニティの皆様に感謝申し上げます.
Discussion