投稿日

クラウド型カメラ×生成AIの可能性がもっと広がる!ソラカメ&SORACOM Fluxの新たな活用方法のご紹介

こんにちは!クラウド型カメラサービス「ソラカメ」と、SORACOM Fluxの事業責任者を担当しております高見(ニックネーム:yuu)です。

これまでメッセージ収集アクション、ソラカメ画像アクションによる複数画像解析、バウンディングボックス機能、簡易物体検知によるフィルタなど、様々なSORACOM Fluxの機能アップデートについてご紹介させて頂きました。これらの機能群をフルに活用することでクラウド型カメラ×生成AI活用はもっと利用シーンを広げることができますし、実際に活用するお客様の事例も増えてきました。

そこでこのブログ記事では、新しいソラカメ×SORACOM Fluxの活用方法(Fluxアプリの作り方)を皆さんにご紹介したい思います!

「カメラ×AI活用」の課題

皆さんは「カメラ×AI活用」と聞くとどんなイメージをお持ちでしょうか?

「万引きを見つけたい」、「顧客がどのように売り場で商品を手に取ったか分析したい」、「物流拠点でカメラの前を通ったら箱の数をカウントしてほしい」などなど、動画をリアルタイムに分析するユースケースをイメージされる方が多いのではないでしょうか?

私も日々、カメラ×AIで新しいチャレンジをされたいというお客様とお話をする中でこういったニーズは非常に多く伺います。これらを実現するためには、エッジAIカメラと呼ばれる、カメラ本体またはローカル側に演算処理リソースを持たせて常時エッジ側で動画解析をすることが必要です。しかし、動画解析する演算リソースを現場におくと初期投資が高額になり、中々あちこちに設置して全社で本格展開しようとはならないケースがあるのも事実です。超大型の物流拠点等、費用対効果で回収できるケースは限られます。

一方で初期投資を抑えて多拠点展開に適しているのがクラウド型カメラ×AI活用になります。弊社でいえば、ソラカメとSORACOM Fluxになります。しかし、全てのユースケースに万能なソリューションはなく、逆にクラウド型の場合はデータをクラウドに上げるので、リアルタイム性をもって動画解析するのが中々難しく、静止画主体になるのが現実的です。一部、市場ではクラウドに動画を全量アップロードしてクラウド側で解析するケースもありますが、リアルタイム性を求めないユースケースに限定されている印象です。

つまり、どっちもどっちという状況なんです。ただ、クラウド型カメラのコスト感でもう少し解析できるユースケースが増えたらいいなーって思いませんか?

そこで新しい「クラウド型カメラ×AI活用」の方法のご提案

先ほどお伝えした通り、「クラウド型カメラ x AI活用」で課題になるのが、ある程度動いている物体(人や車等)を解析対象とする場合に「ドンピシャのタイミングで中々静止画を切り出せない」という問題なんです。動画でやれば、20FPSなどであれば1秒間に20フレームあるわけでドンピシャのタイミングがとれるので解決できるんですが、これが静止画ベースだと中々難しいです。ソラカメでもモーション検知機能がありますが、対象物が動いている場合一発でドンピシャで解析に適しが静止画を切り出すのが難しく「やっぱりエッジAIで動画で解析するしか無いか」となるケースはあります。

そこで新たにご提案したいのが、「イベントの前後数秒間隔で静止画切り出して、その複数画像を切り出して一番精度高い結果を採用しよう」という方法です。
1枚でドンピシャのタイミングを抜くのが難しくても、複数枚とればドンピシャのタイミングが引っかかるだろうという考え方で、これで「クラウド型×AI活用」の適用範囲を広げることができます。例えば、人の入退室だったり、車の入退場(低速または一時停止前提)であっても解析がうまくいくケースが実際に出てきています。

では、実際にどのようにSORACOM Fluxを使うのかやってみましょう。まず、はじめにご確認を。

実現するために事前に準備する必要がある機材やライセンス等をご紹介致します。

  • ATOM Cam 2 または ATOM Cam Swing(AI解析の場合、画角が固定している方が扱いやすいのでATOM Cam 2をオススメします)
  • ソラカメ クラウド常時録画ライセンス(保存期間はいずれでも問題有りません)
  • SORACOM Flux Standard plan(Developerプランですとメッセージ集約アクションがご利用頂けません)
  • カメラを設置する場所にWi-Fi (2.4GHz帯)が利用できること(詳細なNW条件はこちら)※通信帯域は1台につき上り1.5Mbps必要

まずは完成形のイメージからご説明致します。

今回は、人の入退室を想定し、対象者の年代と性別を判定するFluxアプリケーションを作成します。

まず、作成するFluxアプリの完成形ですが、以下のとおりです。


それぞれのアクションが何をしているかは、①〜⑪のとおりとなります。

① インターバルタイマーで5分間隔でFluxアプリを起動する

② SORACOM APIアクションで過去5分間のモーション検知イベントを取得

③ Republishアクションで過去5分間に検知したイベント件数の分、for文(繰り返し処理)を回す。(5分間に3件イベントがあれば、3回処理を回すという意味)

④ イベントの前後を2秒間隔で全5枚の静止画を切り出す(4秒前、2秒前、イベント検知時、2秒後、4秒後の合計5枚)

⑥ 簡易物体検知アクションで人が写っているかを判定する(写っていない場合は処理しないことでAIアクションによるクレジット消費を削減する)

⑦ バウンディングボックスアクションで、画像の中のどこを解析するか四角い枠で指定し、AIに自然言語で指示しやすくする(今回不要だが、ナンバープレートだったり、入退場するドアがある場合等、エリア指定する場合に使う)

⑧ メッセージ収集アクションで、③で回した繰り返し処理を集約する。(1イベントにつき5枚の静止画処理するので、それを一旦集約してからAIに渡す。こうしないと、この中で一番解析精度の高い情報を出力するといった処理ができないため。)

⑨ AIアクションに5枚の静止画を一度に渡して解析させる

⑩ 再度AIアクションで最もAIが解析精度に自信があるデータを1つ選び、採用する

⑪ メールにて解析結果を通知する(ここは用途に応じて、Harvest Dataに保存したり、Webhookで自社システムに送付も可能)

では、それぞれのアクションの設定方法を順を追って解説させて頂きます。

①インターバルタイマーを設定する

まずSORACOM ユーザーコンソールのホーム画面左上の「メニュー」から「SORACOM Flux」>「Fluxアプリ」を押してください。

「新しいFluxアプリを作成する」を押して下さい。

「最初から作成」を押して下さい。

名前の入力欄に任意の名前をつけて下さい。なんでも構いません。概要は空欄で問題ありません。
入力したら、「作成」ボタンを押して下さい。

「チャネルを作成する」を押して下さい。

「インターバルタイマー」を押して下さい。

名前はデフォルトの「Timer Channel」のままで問題有りません。
スケジュール定義はどのくらいの頻度で設定して下さい。この例では5分に設定しています。設定したら、必ず「チャネルを作成」ボタンを押して下さい。

また、試す段階ではスケジュール定義上のボタンは「無効」にしておいてください。「有効」になっているとFluxアプリ作成中も作動してしまいます。
作成完了後に、「有効」に切り替えます。

② SORACOM APIアクションで過去5分間のモーション検知イベントを取得

次に2つ目のSORACOM APIアクションを設定します。チャネルの筒状のアイコンを選択して下さい。

アクションタブを押し、「アクションを追加」ボタンを押します。

以下画面にて、「SORACOM API」を選択して、OKボタンを押します。

以下のように設定して下さい。URLの部分の記載方法は下に出てきますので読み進めて下さい。

URLの部分は API検索ウィンドウに、「soracam event」と入れて検索し、「listSoraCamDeviceEventsForDevice」というAPIエンドポイントを選択して下さい。

URLは以下のように入力して下さい。{deviceid}の部分は、対象カメラのデバイスID(MACアドレス)をソラカメのデバイス管理画面またはソラカメViewerで調べて入力して下さい。過去5分間に発生したイベントを最大10件、昇順でJSON配列として出力するようにパラメータ設定しています。

/v1/sora_cam/devices/{device_id}/events?limit=10&from=${addMinutes(now(), -5)}&sort=asc

つまり、5分間に10件以上のイベント(人が通過するなど)の場合は、解析漏れが出ますので用途に応じて適宜修正して下さい。(今回利用しているAPIエンドポイントの仕様はこちら

なお、ソラカメの画像取得は1分間に100回までがレートリミットです。今回は1イベントに付き5枚の静止画を切り出すので理論上は1分間に最大20イベントまでは対応できるということになります。ただし、静止画取得エラーが出る場合などを考慮して1分間に10イベント x 5枚/イベント = 50回/分ぐらいにキャパシティ設計されることを推奨致します。

アクションのアウトプットを別のチャネルに送信するの部分は、有効にして、「新しいチャネルを作成する」を選択し、チャネル名は任意で構いませんが、「event output」などと名前をつけて、「作成する」ボタンを押して下さい。

③ Republishアクションで過去5分間に検知したイベント件数の分、for文(繰り返し処理)を回す。

次に今作成した「event output」の筒状のアイコンをクリックして下さい。

アクションタブから、「アクションを追加」を選択して、以下画面で「Republish」を選択してOKを押して下さい。

設定画面で以下の内容に設定して下さい。

OUTPUT設定は、高度な設定のプルダウン押して開いて、必ず「配列データを分割して、新規イベントとして送信する」にチェックつけて下さい。
これで、前工程で過去5分間に2件イベントがあった場合は、2回繰り返し処理がされJSON配列の中身のイベント発生時刻が1つずつ後ろのchannelに流れることになります。つまり、JSON配列の中身をイベント発生時刻順に順次処理するということです。

間隔は5秒に設定します。終わったら、「作成する」ボタンを押して下さい。

④ イベントの前後を2秒間隔で全5枚の静止画を切り出す

次に今作成した「Output channel」の筒状のアイコンをクリックして下さい。

アクションタブから、「アクションを追加」を選択して、以下画面で「ソラカメ画像取得」を選択してOKを押して下さい。

以下の様に設定して下さい。終わったら、右下に出る「作成する」ボタンを押して下さい。

デバイスIDの部分は、必ず解析対象のカメラのデバイスIDを忘れずに入力してください。

このソラカメ画像取得アクションは全部で5個、設定します。

最初は、指定時刻の設定は、それぞれ以下の通り指定します。

1個目(イベントの4秒前):${addSeconds(payload.time, -4)}

2個目(イベントの2秒前):${addSeconds(payload.time, -2)}

3個目(イベント時点):${payload.time}

4個目(イベントの2秒後):${addSeconds(payload.time, 2)}

5個目(イベントの4秒後):${addSeconds(payload.time, 4)}

この設定を「指定時刻」の設定だけ上述の通り変更して、5回繰り返して5つの画像取得アクションを作成してください。

注意して頂きたいのは2つ目以降の設定は、OUTPUTの送信先チャネルが「既存のチャネルを選択する」にして、必ず同じImage Outputに結果が出力されるようにして下さい。

以下のようなワークフローが出来上がっていれば、ここまでは成功です。

⑥ 簡易物体検知アクションで人が写っているかを判定する

では、Image Outputの筒状アイコンをクリックして下さい。

アクションタブから、「アクションを追加」を選択して、以下画面で「簡易物体検知」を選択してOKを押して下さい。

以下のように設定して下さい。終わったら、右下の「作成する」ボタンを押して下さい。

画像URLは、${payload.imageUrl}です。検出対象物体クラスはプルダウンからたくさん人、車、トラック等、様々なものが選択できます。

今回は入退場する人の解析につかうため、人を選択します。

「データを変換する」チェックボックスをつけます。以下のように設定します。

Content Type: application/json

Content

{
"result":${result},
"imageUrl":"${payload.imageUrl}"
}

【補足】上記記述は、通常の簡易物体検知の出力だけだと、後ろのチャネルに画像URL(${payload.imageUrl})が渡されないので、通常の簡易物体検知の出力${result}に加えて、${payload.imageUrl}の付け足す内容にデータを変換しています。
payloadやresultの意味については、ユーザーガイドをご確認下さい。

⑦ バウンディングボックスアクションで、画像の中のどこを解析するか四角い枠で指定し、AIに自然言語で指示しやすくする

簡易物体検知の後ろの筒状のアイコンをクリックします。

アクションタブから、「アクションを追加」を選択して、以下画面で「バウンディングボックス」を選択してOKを押して下さい。

設定画面は以下のとおりに設定して下さい。完了したら、右下の「作成する」ボタンを押して下さい。

アクション実行条件には以下のとおりに記載します。前の簡易物体検知で人が1名以上検知されていたら実行するという意味になります。
これを入れることで、もし人が写っていない場合はこの画像についてはAI解析まで進まないので無駄なクレジット消費を抑えることができます。

payload.result.person >= 1

画像URLは、${payload.imageUrl}です。

チャネル名は任意で構いませんが、「bounding box output」としています。

バウンディングボックスの設定は「編集する」ボタンを押すと別ウィンドウが開きます。「ソラカメの画像を選択」ボタンをおして、解析対象のカメラを選択すると、現在の画像が画面に表示され、そこに四角形や多角形で解析したい場所を指定することができます。簡単なので詳細は割愛します。(詳細はこちら

ナンバープレート解析であれば、車が止まった場合にナンバープレートが映り込むあたりを指定したり、ドアがあるのであれば、人が通るドアのエリアを指定することで、AI解析を自然言語で指示する際に、AI指示するプロンプトが作成しやすくなります。

⑧ メッセージ収集アクションで、③で回した繰り返し処理を集約する。

バウンディングボックスの後ろの筒状のアイコンをクリックします。

アクションタブから、「アクションを追加」を選択して、以下画面で「メッセージ収集」を選択してOKを押して下さい。

自動的に以下内容になっていると思いますので、「作成する」ボタンを押して下さい。

⑨ AIアクションに5枚の静止画を一度に渡して解析させる

メッセージ収集アクションの後ろの筒状のアイコンをクリックします。

アクションタブから、「アクションを追加」を選択して、以下画面で「AI」を選択してOKを押して下さい。

以下の様に設定して下さい。(ちょっと下に画像貼付されています。)完了したら、「作成する」ボタンを押します。

AIモデルはお好きなものを選択して下さい。今回は、例としてOpenAI(GPT4.1)を選択していますが特に大きな理由はありません。
実際に試してみて、解析精度とクレジット消費量のバランスでご選択下さい。

プロンプトは以下のとおりです。(解析内容に応じて修正して下さい)

1枚目から5枚目まで同じ画角かつタイミングを2秒毎ずらした画像が入力されています。それぞれの画像に対して、枠内の人の年齢(10代、20代、30代、40代、50代、60代、70代以上)と性別を判別してください。
また、あなたなりの解析精度について0~1の間のfloat値でconfidenceも出力して下さい。

以下のJSONフォーマットで出力お願いします。
{
"age":"10代", 
"gender":"male",
"confidence":0.5
}

また、画像URLの指定は以下のとおりです。
こちらは5枚とった静止画のURLが格納されたmessages配列(メッセージ収集アクションの出力メッセージに含まれる)から画像URLを指定しています。メッセージ集約アクションの出力形式(messages配列に格納される)については、こちらのユーザーガイドをご参照下さい。

1枚目:${payload.messages[0].imageUrl}

2枚目:${payload.messages[1].imageUrl}

3枚目:${payload.messages[2].imageUrl}

4枚目:${payload.messages[3].imageUrl}

5枚目:${payload.messages[4].imageUrl}

出力先チャネル名は、任意で構いませんが「AI output」としています。

⑩ 再度AIアクションで最もAIが解析精度に自信があるデータを1つ選び、採用する

AIアクション後ろの筒状のアイコンをクリックします。

アクションタブから、「アクションを追加」を選択して、以下画面で「AI」を選択してOKを押して下さい。

以下のように設定して下さい。完了したら「作成する」ボタンを押します。

AIモデルは任意で構いません。ただ、今回は最も精度が高いものを選定するだけなので、安価なモデルで構わないと思います。
ここでは、「Google Gemini 2.5 Flash-Lite」を選択しています。

プロンプトは以下のとおりです。(適宜修正してご活用下さい。)

payload.output.resultsの中に5枚の画像に対するJSONデータがあるはずです。
その各データを確認し、最もConfidenceの値が高いデータを以下JSONフォーマットで出力して下さい。
同じconfidenceのデータが複数ある場合はそのうちいずれか1つを出力して下さい。

JSONフォーマットは以下の定義で出力お願いします。定義されていないデータは不要です。
{
"age":"20代",
"gender":"male",
"confidence": 0.5
}

出力先のチャネル名も任意で構いませんが、「AI filter output」としています。

⑪ メールにて解析結果を通知する

AIアクション後ろの筒状のアイコンをクリックします。

アクションタブから、「アクションを追加」を選択して、以下画面で「Email通知」を選択してOKを押して下さい。※今回はEmail通知をしていますが、SORACOM APIアクションを利用してHarvest Dataに保存したり、Webhookアクションを利用して外部システムに送信したりすることもできます。

以下のとおりに設定し終わったら、「作成する」ボタンを押して下さい。

メールの宛先はお好きなものを選択できますが、検証メールを送り、当該メールアドレスで受信して本文記載のURLをクリックして本人認証をする必要があります。詳細はこちらをご確認下さい。

メールの件名は、「解析結果通知」としていますが、お好きなものを入力して下さい。

本文は以下の通り指定しています。
SORACOM Fluxで扱う変数、関数等の記載方法については、こちらを参照下さい。

通行した人の属性情報は以下のとおりです。

性別:${payload.output.gender}
年代:${payload.output.age}

以上で、Fluxアプリの作成は完了です。お疲れ様でした。完成すると、以下のような冒頭のワークフローが完成しているはずです。

最後にテスト実行で正常に動作するか確認しましょう。

左端(先頭)のイベントタイマーの緑色のアイコンを押して下さい。

テスト実行タブをクリックし、左下の「実行」ボタンをそのまま押して下さい。

すると、以下の様なメールが1イベントにつき1通届きます。

例えば、5分間に3件イベントがあった場合は、5枚の画像/イベント x 3 イベント = 15枚 画像が生成AIで解析され、1イベントにつき1通の最も確かな(confidenceの値が高い)データがメール通知として届きます。

今回のハンズオンではEmail通知アクションとしましたが、データを貯めて解析されたい場合は、最後のアクションをSORACOM APIアクションにしてこちらのAPIを利用してHarvest Dataに保存することも可能ですし、Standard plan以上であればEmail通知アクション(高機能版)にしてメールに画像添付することもできます。

ニーズに合わせてぜひご利用下さい。

最後に、実際にこのFluxアプリを利用開始する場合は、イベントソースタブをクリックして、「有効」に変更して必ず「変更を保存」ボタンを押して下さい。

これで設定した内容通りにアプリが動作し始めます。(今回だと5分間隔でアプリが起動しつづけます。)
SORACOM Fluxの料金体系や生成AIモデルごとのクレジット消費量はこちらを参照下さい。

まとめ

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

これまでアップデートされてきたSORACOM Fluxの各機能をフル活用いただくと、「クラウド型カメラx生成AI」という構成であっても、より幅広いユースケースに対応できるなと思って頂けたら大変うれしいです。

また、今回ブログでSORACOM Fluxアプリの設定手順をご紹介させて頂きましたが、一人でやってみたけど途中で詰まってしまった、わからないといった方はぜひ「SORACOMはじめてサポート」の活用をご検討下さい。月額11,000円(税込)で月2回 x 1時間のオンラインミーティングにてソラコムのテクニカルアドバイザーが個別にご相談を伺い、問題解決をご支援致します。

さらに、自分で手元で試すのはブログ記事でうまくできたけど、実際に現場で使うにあたってはプロにお願いしたいという場合は、弊社のパートナー企業による導入支援サービスをご紹介することも可能です。ご希望の場合は、お気軽にソラコムまでお問い合わせ下さい。

「カメラ×AI活用」にチャレンジしてみたい方、最初の一歩としてはソラカメとSORACOM Fluxの活用が手軽に始められておすすめです。ぜひ、ご活用下さい。

― ソラコム高見 (yuu)