メインコンテンツに移動
デベロッパーのためのクラウド活用方法

カメラ画像を Amazon Bedrock で解析 ! ~ SORACOM Flux における安全な AI 呼び出しと効果的なプロンプトの探求

2025-09-04 | Author : 株式会社ソラコム

はじめに

ソラコムが提供するサービスに SORACOM Flux があります。このサービスを活用すると IoT のカメラ画像をクラウドにアップロードするとともに、Amazon Bedrock を用いて画像分析できます。また、この機能の特徴として、画像分析のためのプロンプトをエンドユーザーが直接入力できるという特徴があります。

この記事では、以下を紹介します。

  1. SORACOM Flux で画像分析をさせるユースケースとして、店舗運営での商品の在庫切れを検出する「在庫監視システム」を題材に、Amazon Bedrock においてどのようなプロンプトが有効かを実験した過程
  2. エンドユーザーがプロンプトを入力するにあたって、システム (SORACOM Flux) で安全に Amazon Bedrock を呼び出すための工夫


X ポスト »
| Facebook シェア » | はてブ »

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。

今すぐ登録 »

システム構成の概要

以下は、本記事で紹介する在庫監視システムの全体構成図です。 カメラで撮影された在庫画像は SORACOM Harvest Files に保存され、SORACOM Flux により画像解析と通知処理が行われます。画像解析は Amazon Bedrock の Claude 3.7 Sonnet によって行われ、結果は Slack へ通知されます。

今回使用する機器・サービス

今回使用する機器、サービス

  • [ソラカメ対応製品] ATOM Cam 2
  • クラウド型カメラサービス「ソラカメ」 クラウド常時録画ライセンス
  • IoT オートメーションサービス「SORACOM Flux」
  • SORACOM Harvest Files   
        ◦ IoT デバイスからのファイルを収集・蓄積するファイルストレージサービスです。
  • Amazon Bedrock - Claude 3.7 Sonnet

Fluxアプリの構成

Fluxアプリはこのような構成となります。

定期的にソラカメ対応カメラから静止画を取得し、取得した静止画を Amazon Bedrock で解析し、在庫状況を自動判定しています。結果を Slack に通知します。

Missing alt text value

AI アクションの設定

前述のとおり、当システムでは取得した画像を AI (Amazon Bedrock - Anthropic Claude 3.7 Sonnet) に問い合わせ、在庫監視と欠品アラートを検知します。

AI の問い合わせにあたっては、ユーザーにこののような設定を提供しています。

「AI モデルの選択」でモデルを選択します。ここに「Amazon Bedrock - Anthropic Claude 3.7 Sonnet」が含まれます。「プロンプト」でユーザーはAIへのプロンプトを入力します。「プロンプト」以外にも「AIからの返答をJSON形式にする」というオプションがあります。これは、AIモデルからのレスポンスを次のアクション等で扱いやすくするための、AIからの返答をJSON形式に指定するものです。また、マルチモーダルに対応したAIモデル向けに画像のリンクを付与できます。

当 Flux アプリのポイントは Amazon Bedrock の AI モデルにわたすプロンプトです。これは場所や商品に応じて調整も必要となり、AI を利用したアプリケーションではプロンプトの調整はさけられないと思います。もちろん AI モデルもいくつか試したほうがよいでしょう。

Missing alt text value

在庫割合を算出するプロンプト

プロンプトの調整では、まずは次のように在庫の割合を算出しました。

画像は商品棚を棚の前方斜め上から撮影したものです。
商品棚は白く塗装されたスチール製です。
棚の各段には、いくつかの商品のパッケージが並べられています。
各段の商品が不足していないかどうかを知りたいです。
一番上の段から順番に、各段の商品の充足度合いを 0 から 10 の数値で教えてください。
商品が全く存在しない場合は 0、商品が全て揃っている場合は 10 としてください。
段ごとに充足度を数値で表してください。
段ごとの充足度を数値で表したら、一番上の段を段1、一番下の段を段5として、段ごとの充足度を以下のような JSON 形式で出力してください。

{
"段1": 7,
"段2": 3,
"段3": 10,
"段4": 2,
"段5": 0,
"段6": 0
}

 

 

 

最終的なプロンプト

通知先には自然言語でのコメントが欲しく、また Amazon Bedrock で十分な識別ができるため、在庫の割合に加えて、補充判断の理由や補足もコメントもしてもらうように改善しました。最終的なプロンプトは次のとおりとしました。

この画像は、店内の白い6段の商品棚を正面から撮影したものです。この棚の商品の陳列状況を分析し、補充の必要性を判断してください。

【前提ルール】
- 商品棚は6段ありますが、上から2段目、3段目、4段目を対象に評価してください。それぞれ上段、中段、下段としてください。
- 商品は原則、棚の「奥から手前」に向かって並べられています。
- 商品は棚の「横幅いっぱい」に等間隔で並べられるのが通常です。
- したがって、棚の「奥行き方向に商品が少ない」列は、奥の在庫が不足している可能性が高く「補充が必要」と判断できます。

【評価観点】
1. 各段(上段・中段・下段)ごとに、全体としての**充足率**(どの程度商品で満たされているか)を 0〜100の整数(%)で評価してください。
2. 充足率が **40% 未満** の段は `"needs_restock": true` としてください。それ以上であれば false としてください。
3. 棚の奥行き方向に「商品が1列しかない」「奥が見えている」など、補充が必要なサインが見られる場合は、40%以上でも `"needs_restock": true` にしてかまいません(理由は `note` に記述してください)。
4. 商品が片側に偏っていたり、極端な空きスペースがある場合は`note` に記載してください。特に無ければ空文字でかまいません。

【出力形式】
以下の JSON 構造に厳密に従って出力してください。

```json
{
"shelf_analysis":{
"upper":{
"fill_ratio_percent":<整数(0〜100)>,
"needs_restock":<true|false>,
"note":"<補充判断の理由や補足(空文字でも可)>"
},
"middle":{
"fill_ratio_percent":<整数(0〜100)>,
"needs_restock":<true|false>,
"note":"<補充判断の理由や補足(空文字でも可)>"
},
"lower":{
"fill_ratio_percent":<整数(0〜100)>,
"needs_restock":<true|false>,
"note":"<補充判断の理由や補足(空文字でも可)>"
}
}
}
````

【重要な制約】

* 各キー(upper, middle,lower, fill\_ratio\_percent,needs\_restock, note)は**必ず含めてください**。
* `"note"`フィールドが空でも省略しないでください。
* 数値は必ず整数で、小数は使わないでください。
* JSONは機械処理に使われるため、**構造を崩さず出力**してください。

画像を確認し、上記のルールに従ってJSON出力してください。

 

 

 

実行結果

このように Slack で通知されました。

プロンプトにあるとおり、レスポンスでは、fill_ratio_percent (商品の充足率) や needs_restock (補充の要否判断) もありますので、これらの値に応じてアクションや通知先を変更できます。SORACOM Flux の Webhook アクションでは、AWS Signature Version 4 に対応しており、例えば Amazon Simple Queue Service (SQS) や Amazon Simple Notification Service (SNS) にも送信できますので、そこからサーバーレス IoT の仕組みに連携もできます。

Missing alt text value

Amazon Bedrockのサービスへの組み込み

これまで記載したとおり、SORACOM Flux は Amazon Bedrock をサービスに組み込んで使用しています。Amazon Bedrock は API が統一されている点が大きなメリットです。Claude 3.x 系はもちろん、Amazon Nova などのモデルを利用する際にも、インターフェースを変更せずに利用モデルだけを差し替えればよいという柔軟性があります。 実際に Claude 3.7 Sonnet がリリースされた際も、特別な対応なしに既存の構成にモデル名を追加するだけで対応できました。この拡張性の高さは、SORACOM Flux のようにさまざまな AI モデルを切り替えて利用する際に非常に大きな利点となります。

一方で課題となったのは、AI モデルの出力が常に安定した構造 (JSON) で返ってくるとは限らないという課題がありました。AI呼び出しの際に自然言語での回答を期待するケースがある一方で、AI からのレスポンスを処理したい場合には JSON 形式の方が扱いやすいケースがあります。当サービスでは、「AI からの返答を JSON 形式にする」というオプションを提供し、内部的には以下の処理を行っています。

1. システムプロンプトの指定

モデルに対して明示的に「この形式で返すように」という命令をシステムプロンプトで与えています。たとえば「引用符やその他の情報を含めずに JSON 構造に厳密に従って出力してください」という文言を含めることで、モデルの出力の安定性を向上させています。

2. 応答の検証とフォールバック処理

それでもまれに JSON 型ではない形式になるケース (ハルシネーションに似た現象) があるため、SORACOM Flux 側では応答文字列を一度 JSON としてパースを試み、失敗した場合にはエラー通知やログ出力を行う処理を入れています。

上記のシステム側の対応に加え、利用ユーザーには「JSON モードを有効化した場合は、サンプル JSON をプロンプトに含めたほうがよい」と案内しています。これらの工夫によって、レスポンスの整合性が一定程度保たれるようになりました。

今後の課題としては、不正応答防止の調整が挙げられます。現在、システムプロンプト内にルールを指定することで不正応答の防止 (不適切なコンテンツの抑制やプライバシーの考慮など) を図っていますが、ルール指定が逆に正当な利用でも過度にエラーとなる場合もあります。この点については、今後もモデルの進化にあわせたシステムプロンプトの継続的なチューニングが必要と考えています。

 

 

 

効果と他ユースケースへの応用

本記事では Amazon Bedrock を活用して、現場のカメラ画像から在庫状況を自動判定し、欠品アラートを出す仕組みをどのように構築したかを紹介しました。在庫状況をカメラとAIで監視することで、現場での業務効率の向上が見込まれます。これまでスーパーバイザーが各店舗を定期的に巡回し、目視で在庫状況を確認していた作業を SORACOM Flux と Amazon Bedrock によって自動化することで、業務負荷の軽減と人為的な見落としの防止が期待できます。
SORACOM Flux と Amazon Bedrockの組み合わせは、在庫管理に限らず、他の用途にも展開可能です。たとえば、 

  • 駅や商業施設での混雑度可視化(人数カウント)
  • 商品棚以外のエリアでの業務改善
  • 製造現場での工程中の異常検知
といった応用が考えられます。 
 
また、AI をサービスに組み込むにあたっての考慮点も記載しました。出力形式の明示的な制御、例外時のフォールバック処理、そしてプロンプトとシステムルールのバランスを取ることでシステムへの AI の組み込みを実用的に行うことが可能になります。