投稿日

簡単に構築、カメラ+SORACOM Flux+生成AIによる映像監視システムの解説

こんにちは、ソリューションアーキテクトの守谷(ニックネーム: moris)と申します。

簡単に設置でき、映像がクラウドに常時録画されるソラカメと、AIによる分析を簡単に行えるSORACOM Flux(以下、Flux) を使って映像による監視システムを構築する方法を解説します。

これまでは Fluxから 時系列データを格納するのにやや複雑な手順を経る必要がありましたが、新しい API が公開されてより簡単になりました。

監視システムの全体像

今回はFluxを使って、簡易的な監視システムを作ってみます。

監視システムの全体像は以下のようになります。

  • ソラカメ(ATOM Cam 2) でCO2濃度・温度・湿度センサーの表示を撮影、クラウドに常時録画
  • Fluxで録画から静止画を切り出し、SORACOM Harvest Files(以下、Harvest Files) に保存
  • Fluxで静止画をAIに読み込ませ、表示されている数値を読み取り
  • 読み取ったデータをSORACOM Harvest Data(以下、Harvest Data) に保存
  • SORACOM Lagoonで 可視化

最終的に以下のようなダッシュボードが得られます。

構築手順

それでは構築していきましょう。

ソラカメの設置

まずはカメラとセンサーを用意しましょう。

ソラカメは ATOM Cam 2 + クラウド常時録画ライセンス (7日間) を使用します。

センサーは今回 SwitchBot CO2センサー を利用します。

ATOM Cam 2のセットアップは以下のドキュメントをご覧ください。

クラウド録画の確認

ATOM Cam 2 のセットアップが終わったら、クラウド録画が成功されているかSORACOM ユーザーコンソールにて確認しましょう。

ソラコムクラウドカメラサービス/デバイス管理 にアクセスし、デバイス一覧からセットアップ済みのATOM Cam 2 の名前をクリックして録画映像を確認しましょう。

この時、カメラのデバイスIDをメモしておきましょう。

きちんとカメラ画像が録画されていることが確認できました。
ちなみに気が付いたのは、湿度がかなり低いので加湿器を買った方がよさそうな環境であることもわかりました。

Fluxアプリの作成

Fluxのアプリを作成していきます。 Fluxのアプリ一覧画面から「新しいアプリを追加する」ボタンを押下し、アプリ名を入力して「作成」ボタンを押下します。

Fluxによる静止画切り出し処理

Fluxでは3つの要素を組み合わせてアプリを作っていきます。

  • イベントソース: どのような契機でアクションが実行されるか
  • アクション: イベントソースから渡されたデータに対してどのような処理を行うか
  • チャネル: イベントソースとアクション、またはアクションとアクションをまとめたもの。一つのFluxアプリごとにチャネル数の制限がある

最初に作る静止画切り出し処理は、クラウド録画に保存された映像から最新の時間のキャプチャを定期的に取得し、Harvest Filesに画像ファイルとして保存します。これをFluxの要素に当てはめると以下のようになります。

  • イベントソース: タイマーイベントソース
  • アクション: ソラカメの静止画エクスポートAPIを呼び出し

実際に設定していきましょう。

「チャネルを作成する」をクリックし、

イベントソースに「タイマー」を選択、「次へ」をクリックします。

「新しいチャネルを作成」ダイアログで、イベントソース設定を編集していきます。

イベントソースが「有効」となっていることを確認し、スケジュールを定義します。今回は「5分ごとに実行」とします。

編集が終わったら「チャネルを作成する」をクリックします。

チャネルが作成されました。次にアクションを設定します。「アクション」タブを選択します。

「アクションを追加」をクリックします。

Harvest Filesに画像を保存するため、「SORACOM API」を選択し「OK」をクリックします。

「新しいアクションを作成」ダイアログが表示されるので、わかりやすい名前をつけます。

今回は5分ごとに静止画の保存が必ず実行されるため、「アクションの実行条件」は空にしておきます。

ダイアログをスクロールすると、使用するAPIの選択欄が出てきます。

ここでソラカメの静止画エクスポートAPIを呼び出すよう設定します。

検索欄に「exportSoraCamDeviceRecordedImage」と入力すると、同名のAPIがサジェストされます。APIをクリックして選択します。

さらにスクロールするとURLの入力欄が現れます。このURLのプレースホルダ({device_id}の部分)を、先ほどメモしておいたカメラのデバイスIDに置き換えます。

置き換え後は以下のようになります。コピー&ペースト時に空白など余分な文字が入らないようお気をつけください。

※7CDD… の部分を実際にお使いのデバイスIDにしてください。

静止画エクスポートAPIの呼び出し内容(HTTPリクエストボディ)を設定します。

今回は以下のように設定します。

{
  "harvestFiles": { 
    "pathPrefix": "/moris/sora_cam/{device_id}"
  },
  "time": ${now()}
}

“harvestFiles”: { “pathPrefix” } の部分は、Harvest Filesのどのパスにファイルを保存するか、という設定です。{device_id} という部分は先述のURLに設定したdevice_idに置き換えられます。この pathPrefixは後で使用するので、メモしておいてください。

“time” はいつの時点の録画から静止画を切り出すか、を指定します。ここではFlux内で利用可能な now()関数で値をセットしています。

これにより、このタイマーイベントが呼び出されたタイミングで最新時刻の映像が切り出されることになります。

本APIの詳しい情報は APIリファレンス をご確認ください。

これでこのチャネルに対する設定は完了です。しばらく待っていれば、5分ごとに静止画がHarvest Filesに保存されていくはずです。

しかし、開発中に5分待つのは苦労します。そこで、Fluxのテスト機能を使ってもっと素早く動作確認が行えます。

チャネルの詳細画面から「テスト実行」タブを開きます。

Bodyにはアクションに与えるJSONを記述します。

今回はアクションに与える情報は不要なので、空のJSON({}) を与えます。

「実行」をクリックするとチャネルが作動し、静止画切り出しアクションが実行され、その結果が下に表示されます。

Harvest Filesを確認し、現時点の静止画が切り出されているか確認しましょう。

作成日時がテスト実行時点の行が新たに作成されていることを確認してください。また、↓ ボタンから画像をダウンロードし、確かに最新の映像が保存されていることを確かめましょう。

うまく撮れていますね。この静止画を次のステップでAIに読み取らせていきます。

この時点で、以下のようなチャネルがFluxのアプリ詳細画面に追加されています。

SORACOM Harvest FilesからAI分析

クラウド録画から切り出した静止画をAIに読み取らせる処理を作成していきましょう。

先ほど作成したチャネルにアクションを追加することもできますが、今回は「Harvest Filesに静止画が保存されたらAIに読み取らせる」という処理を行うチャネルを新たに作成します。

「+チャネルを追加する」ボタンを押下し、新たなチャネルを追加します。今回はイベントソースに「Harvest Files」を選択します。

イベントソース設定で、ファイルパスに先ほどの静止画エクスポートAPIで設定したpathPrefixの値を入力します。ここではプレースホルダは使用せず、具体的なデバイスIDを入力するようにしましょう。

※7CDD… の部分を実際のデバイスIDに置き換えてください。

また、今回は新しく静止画が保存された時にのみAI処理を実行したいので、イベントタイプは「ファイル作成」にチェックをつけておきましょう。

アクションの追加では、「AI」を選択します。

今回は以下のようにアクションを設定します。

  1. AIモデルは Amazon Bedrock – Anthropic Claude 3 Haiku
  2. プロンプトは画像の通り。簡単な指示と、出力すべきJSON形式を与えています。
  3. 「AIからの返答をJSON形式にする」にチェックを入れます
  4. 「AIに画像を読み込ませる」にチェックを入れます。
  5. ${event.payload.presignedUrls.get}」と指定することで、イベントソースから渡されるHarvest Filesの画像がAIに読み込まれます。

これらの設定により、AIがCO2センサーの表示を読み取り、JSONにして返してくれるようになります。

SORACOM Harvest Dataに保存

Fluxの出力データをHarvest Dataへ保存するには、最近公開されたAPIを用いることで実現できます。

AI処理のアクションに続くチャネルを作成します。アクション設定の一番下までスクロールし、「Output」を以下のように設定します。

  1. 「アクションのアウトプットを別のチャネルに送信する」を有効にします。
  2. 「送信先チャネル」の設定で、「新しくチャネルを作成する」を選択し、チャネル名を設定します。

「更新」を押下すると、新たにチャネルが追加されます。全体像としては以下のようになっています。

赤枠が新しく追加されたチャネルです。これを押下し、「アクション」タブから「アクションを追加」->「SORACOM API」を選択します。

APIの検索欄で「createSoraCamDeviceDataEntry」と入力し、サジェストされた同APIを選択します。

確認中

この方法はカメラを共有している場合は利用できません。

URLの入力欄に、AIが生成したデータを保存するURLを設定します。ここではソラカメのデバイスIDをURLに設定します。下記の赤枠のプレースホルダを実際のデバイスIDに置き換えます。

HTTPボディは以下のように設定します。

前段のAI処理から出力されたJSONは、「payload.output」に格納されています。「temperature(温度)」、「humidity(湿度)」、「co2(CO2濃度)」をそれぞれHarvest Dataに保存します。

また、ちゃんとセンサーの表示を読み取れているか、画像を表示して確認できるようにしたいため、Harvest Filesに保存された画像のパスも「image_path」に格納します。

「新しくSAM Userを作成する」を選択し、「作成する」を押下してアクションを作成しましょう。

なお、「既存のSAM Userから選択する」を選んだ場合は、選んだSAM Userの権限を自分で適切に設定する必要があります。

これでFluxの設定は完了です。

SORACOM Harvest Dataにデータが格納されるか確認

Fluxアプリが正常に作動し、データがHarvest Dataまで格納されるかを確認しましょう。

最初に作成したTimer Channelで、テストとして空のJSON( {} ) を与えて何度か実行してみましょう。

Harvest Dataを開き、以下の手順で目当ての時系列データを参照します。

  1. 右上の「リソース」を押下し、検索ダイアログを表示
  2. デバイスの種類で「ソラカメ」を選択
  3. 検索欄に ATOM Camの初期設定で入力したデバイスの名前を入力し、絞り込み
  4. サジェストされたデバイスを押下し、選択

すると以下のようにデータが一覧で表示されます。

一覧で表示されない場合は、赤枠のアイコンを押下して表示モードを切り替えましょう。

右端の「グラフ用データ」が想定通り整形されていることを確認します。

きちんとデータが格納されていない場合、以下のような可能性が考えられます。一つずつ確認し、バグを修正しましょう。

  • ソラカメの録画に失敗している
  • Fluxのタイマーイベントが無効になっている、実行間隔が長くまだ実行されていない
  • Fluxの静止画エクスポート処理が失敗している
  • FluxのAIアクションによる情報抽出が失敗している
  • FluxのSORACOM API呼び出しが失敗している

SORACOM Lagoonでデータを可視化

正しくデータがHarvest Dataに格納されていることが確認できましたら、今度はSORACOM Lagoonでそのデータを可視化しましょう。

Lagoonの使用開始、ユーザー作成、ダッシュボード追加までの手順は 公式ドキュメント をご確認ください。

ダッシュボードまで作成できましたら、パネルを追加していきます。

「Add a new panel」を押下します。

Data source にHarvest, デバイス種別としてSoraCamを選択します。

デバイス選択欄から対象のソラカメのデバイスIDを選択し、グラフ表示に用いるデータ項目を選びます。ここではco2(CO2濃度)を選択しています。

Harvest Dataにデータが入っていればグラフが表示されます。もし表示されない場合は対象期間が正しいかを確認してください。パネル上部の 「Last 6 hours」などと表示されているボタンから対象期間を変更することができます。

想定通りのパネルが作成できたら、右上の「Apply」ボタンを押下してダッシュボードに反映します。

温度や湿度に関しても同様にパネルを作成しましょう。

エクスポートされた静止画のうち、最新のものをこのダッシュボードで確認したい、と思うかもしれません。

その場合は以下の手順で画像を表示するパネルを作成します。

新しいパネルを作成し、編集画面に移動します。右上のパネルの種類(デフォルトでは「Time Series」となっています)を選択し、検索欄に「Soracom Dynamic Image Panel」と入力して出てきたパネル種別を押下します。

「Mode」を「Harvest Files」、Name を「A-image_path 」とします。ここにはHarvest Dataに送られたJSONデータのキーが表示されます。すると、「Current Value」に最新のエクスポート画像のURLが入ります。

最終的に以下のようなダッシュボードが完成しました。

まとめ

いかがでしたでしょうか。

今回新しく公開されたAPIも使用し、カメラの設置からダッシュボードの作成までより簡単に構築できるようになりました。

もし異なる監視対象、例えば工場の機器の運転ランプのようなものが要件に出てきたとしても、AIに与える指示(プロンプト)を書き換えるだけで対応できる可能性があります。

ソラカメは1台から購入でき、またFluxも月額基本料無料で使い始めることが可能です(SORACOM Flux の料金プラン)。まずは使っていただけますと幸いです。

参考リンク:

― ソラコム守谷 (moris)