ソラコムのソリューションアーキテクトの今井です。ニックネームはfactoryと申します。SORACOM Flux(以下、Flux)はもうお試しになりましたか?さまざまなIoTのデータをAIと接続し、プロンプトでアプリケーションを構築できてしまうというのは本当にワクワクしますよね。
今日はFluxでソラカメの画像を簡単に扱えるようにするための方法論をご案内します。ソラカメはソラコムが提供するクラウドカメラサービスで、アプリやクラウドから簡単に対応カメラとその画像や映像を管理することができるサービスです。例えば株式会社ベイシア様ではソラカメを店舗に設置して商品の売れ行きや在庫補充のタイミングを図るのにご利用頂いています。
画像 x 生成AIでなにができる?
画像データを活用するには適切な画角の画像、もしくは画角や明るさなどに対してファインチューニングされた専用のAIモデルの準備(つまり、トレーニング)が必要でした。こういったプロセスには専門的な知識や経験が必要となります。
生成AIを利用すると「対象が写っている画像であれば、ファインチューニングをせずともそれなりに判定できる」というメリットを得ることができます。つまり、カメラの設置位置の厳しい調整や専用AIモデルのトレーニングを経ることなく、クイックにカメラ画像を解析し、ビジネスへの活用をしていくことが可能になります。
(もちろん、カメラの設置位置が良い方がより良い精度が得られますし、専用のモデルを作ったほうがコンピューティングコストや精度の面で有利になることがあります)
このポストでは、使い始めやすいカメラサービスであるソラカメと、そして使い始めやすいAIである生成AIを、SORACOM Fluxで組み合わせて体験してもらうことをゴールとしていきたいと思います。
Fluxでソラカメ画像を扱うには?
2024/07現在、Fluxは以下のようなイベントソースを取り扱うことができます。
ソラカメの画像を扱うのであればSORACOM Harvest Files(以下、Harvest Files)に画像をアップロードして連携するのがよいでしょう。例えば以下のような設定にすると /flux/soracam/factory/ 配下にファイルをアップロードするたびにイベントを発火することができます。
今回はソラカメのAPIを利用して、クラウドに保存された画像を取り出してHarvest Filesに保存したいと思います。手順としては以下のようになります。
- 必要なタイミングでソラカメのAPIを呼び出し、画像をエクスポートする。
- エクスポートされた画像をダウンロードする
- 画像を Harvest Filesの /flux/soracam/factory/ にアップロードする
こういった処理を実行してくれるAWS Lambdaを実装し、Webhookで呼び出せるようにしてあげると以下のような構成のFluxアプリを作ることができるようになります。
Fluxアプリ全体の流れは画像の中に解説を入れていますのでぜひご覧頂ければと思いますが、まとめると1のタイマーで起動されたWebhookで定期的にソラカメ画像がHarvest Filesにアップロードされ、それを監視している3のHarvest Filesノードが発火(動作)し、その後のフローが流れていくイメージです。
実装してみる
上記のアーキテクチャの2の、Webhookによる呼び出しを受けるLambdaを実装してみると、以下のような仕組みを作ることになります。やりたいこと、つまりビジネスロジックとしては④⑤⑥あたりになるのですが、セキュアに実装しようと思うとAWS Lambda呼び出しのためのAPIキーの設定や、SORACOMの各種APIを呼び出すためのクレデンシャルを安全に保存しておくためにAWS Secrets Managerの設定が必要になり、②③も実装が必要になります。
すぐに試せるテンプレートをAWS CDKで用意しました!
上記を実装できる方はぜひ!と思います。「自分でちょっと試すだけならまずは認証周りの実装を省略して・・・」みたいなお試しから始めることもありでしょう。
しかし、せっかくならみなさまにはベストプラクティスに則った状態でSORACOMの各種サービスを利用頂きたいなと思うのと、なにより早くFluxの魅力を体験していただきたい、という思いがあるのでAWS CDKで上記のスタックを実装したものを公開することにしました。
AWS CDK(Cloud Development Kit)とは、AWSのクラウドインフラストラクチャをプログラムコードで定義し、共有、デプロイをするための仕組みで、実装されたインフラ一式のことを「スタック」と呼びます。今回ご用意したスタックを使うと、上記の構成をみなさまご自身のAWS環境にデプロイすることができます。
なお、このCDKスタックが提供するインフラには、他にも「Twilio APIを使って電話をかける」とか「Google Spreadsheetにデータを出力する」のようなデータの外部連携や「SORACOM Air SIMのメタデータを書き換える」、「SORACOM AirのSMS APIを使ってデバイスにメッセージを送る」のようなデバイスの挙動を制御するような仕組み、他にも「SORACOM Harvest Dataからデータを取ってきてAIの判定の参考材料として利用する」といったことを実現するWeb APIが含まれています。FluxのよいところのひとつとしてWebhookを使って外部リソースとの連携ができることがあげられます。このスタックの他の機能についてはまた追って別のブログポストを書こうと思っています。
使ってみよう
手順と前提は以下のとおりです。
前提
- SORACOMオペレーター(アカウント)をお持ちで、必要に応じてSAMユーザーの払い出しができること。
- AWSアカウントをお持ちであること。必要に応じてIAMユーザーやIAMロールの払い出しができること。
- クラウド常時録画ライセンスが割り当てられたソラカメを持っていること。
- 作業環境にnode.jsがインストールされていること。
手順1. SORACOMのSAMユーザーを用意する
このプログラムは「ソラカメから画像をダウンロードしてSORACOM Harvest Filesにアップロードする」という作業を行いますので、適切な権限を持ったSAMユーザーが必要です。
まず、下記に沿ってSAMユーザーを作成してください。「認証キーを作成する」まで完了すればOKです。
次に、作成したユーザーに以下のようなパーミッションを「直接指定」で付与してください。
{
"statements": [
{
"effect": "allow",
"api": [
"OAuth2:authorize",
"SoraCam:getSoraCamDeviceExportedImage",
"SoraCam:exportSoraCamDeviceRecordedImage",
"FileEntry:putFile"
]
}
]
}
手順2. AWS CDK CLIをインストールする
下記を参考にAWS CDK CLIをインストールしてください。特にステップ5とステップ7が完了できていれば大丈夫です。
手順3. CDKスタックをダウンロードする
gitコマンドであれば以下のようにダウンロード可能です。
git clone https://github.com/soracom-labs/flux-toys
zip形式でダウンロードすることも可能です。
手順4. CDKスタックをデプロイする
以下の手順でCDKスタックをビルドしてデプロイします。${SORACOM_AUTH_KEY_ID}と${SORACOM_AUTH_KEY}は手順1で作成したSAMユーザーの認証キーの、それぞれauthKeyIdとauthKeySecretを当てはめてください。${HARVEST_FILES_DIR_PATH}にはSORACOM Harvest Files内で、画像ファイルを格納するディレクトリを指定します。ここでは例えば flux/soracam
としておきましょう。
cd flux-toys
npm run installAll
npm run build
npx cdk deploy \
--context stackName="${YOUR_STACKNAME_PREFIX}" \
--context deploySoracamImageSource=1 \
--context soracomAuthKeyId="${SORACOM_AUTH_KEY_ID}" \
--context soracomAuthKey="${SORACOM_AUTH_KEY}" \
--context harvestFilesPath="${HARVEST_FILES_DIR_PATH}"
なお、このデプロイを実行するには以下のようなIAMパーミッションが必要です。
デプロイがうまくいくと以下のような出力が得られます。ご自身の出力のhttps://~/v1/
のところをメモしておいてください。
手順5. 動作確認する
デプロイがうまくいったらまずは単体で動かしてみましょう。Webhookなので、curlコマンドでテストできます。まず、APIを呼び出すためのAPIキーを取得します。AWSのコンソールにログインして、作業中のリージョンのAPI Gatewayの画面から「API keys」のメニューを開きます。リストのなかに「FluxToysCollectionApiKey」という名前のAPIキーが出来上がっていると思いますので、そのAPIキーの実体をコピーしてどこかにメモしてください。
いよいよ動作確認です。以下のようなcurlコマンドを実行してみましょう。
curl \
-XGET \
-H "x-api-key:${先ほどメモしたAPIキー}" \
"https://${先ほどメモしたAPIのURL}source/soracam_image?device_id=${あなたのソラカメのID}&upload_directory=factory"
実際の実行イメージです。以下のように {“message”:”Image uploaded.”} というメッセージが返ってきたら成功です。
SORACOM Harvest Filesの画面から /flux/soracam/factory ディレクトリを覗きに行くと以下のように画像ファイルがアップロードされているはずです!
手順6. Fluxアプリからの呼び出し設定をする
ここまでいいかんじですね。では最後にFluxアプリからこのWebhookを呼び出す設定をしていきましょう。
WebhookノードのINPUTに以下のように先程のURLとAPIキーを設定してあげればOKです。
実際に動作を試すのであれば以下のようにタイマーチャネルのノードとつなげてあげるとよいでしょう。
タイマー側のノードには「テスト実行」というタブがありますので、ここから以下のように実行して動作確認をすることができます。なお、現在のFluxのUIの制約上、かならず{}というBODYを手で指定して頂く必要があります(とくにWebhookの動作には関係ありません)。
Webhookを呼び出してそれが成功していることがご確認いただけます。なお、Flux側の制約でWebhookが10秒以内に終了する必要があるのですが、今回実装したソラカメ画像のアップロードWebhookが10秒以上時間がかかってしまい、Webhookが失敗と判断されることがあります。実際にはソラカメ画像のアップロードのWebhookは最後まで動作してSORACOM Harvest Filesへのファイルアップロードは完了しますのでご安心ください。SORACOM Fluxの制約等については順次改善が検討されています。
今後の話
SORACOM Fluxはまだ生まれたばかりでこれからどんどん進化をしていきます。今回ご紹介しているような機能がSORACOM Flux自体に実装されるかもしれませんが、まずはこのスタック等を利用してぜひソラカメ画像を利用したFluxアプリを体験頂ければと思います!
ぜひソラコムのSalesやSAにお声がけください!
このブログポストは多くの人にFluxの魅力を体験してほしいと思いしたためたものです。お試しいただける方はこれを参考にFluxの世界の扉を開けていただけたら嬉しいです。
もちろん、AWSの環境をお持ちでなかったりそれに慣れていなかったりソラカメをお持ちでない方もいらっしゃると思います。このブログを読んで「試してみたい!」と思った方はぜひソラコムのメンバーにお声がけいただければと思います。お問い合わせは下記からお願いいたします!
—ソラコム今井