Role A: AI推論&エッジ連携モジュール

実装詳細とアーキテクチャ要件

トップページへ戻る

Role Aが担当する「AI推論&エッジ連携モジュール」は、システムの「目と脳」を担う最も負荷の高いコンポーネントです。単にライブラリを繋ぎ合わせるだけでは、「VPNのネットワーク瞬断によるプロセス停止」や「AI推論・API通信のI/O待ちによるカメラ映像の遅延(バッファ詰まり)」といった致命的な障害が必ず発生します。
これらを回避し、24時間安定稼働する堅牢なシステムを構築するために、Role Aが「何をするために」「何が必要で」「どのような手順で実装すべきか」を詳細に定義します。

1. 開発に必要な環境・情報(準備物)

  • インフラ: AWS EC2インスタンス、Tailscale(EC2およびローカルPC)
  • ハードウェア: RTSP配信が可能なローカルカメラ(またはスマホのWebカメラ化アプリ)、Cisco Meraki実機
  • 認証情報 (Role Bから受領): AWS IoT CoreのエンドポイントURL、デバイス証明書、プライベートキー、Root CA
  • API情報: Webex Botのアクセストークン、通知先Room ID

2. 実装手順と技術的課題の根本解決アプローチ

Step 1: VPN開通と「遅延ゼロ」のカメラ取得

目的: EC2からローカルネットワーク内のカメラ映像をリアルタイムに取得する。

  1. ローカルPCにTailscaleをインストールし「サブネットルーター」として設定。EC2からカメラのローカルIPへ疎通させる。
  2. PythonのOpenCV (cv2.VideoCapture) を用いてRTSPストリームを取得する。

【重要】技術的課題と根本解決:
VPN経由ではパケット遅延が発生しやすく、標準の読み込みでは古いフレームがバッファに溜まり、推論が数秒〜数十秒遅延します。これを防ぐため、「カメラ読み込み専用のバックグラウンドスレッド」を作成し、常に最新の1フレームのみを保持し、古いフレームは即座に破棄(ドロップ)する設計を必ず実装してください。

Step 2: AI推論ロジックの構築

目的: 映像から子供の危険状態を判定する。

  1. 誤飲防止・侵入検知: YOLOv8を用いて、特定エリアへの人の侵入や、小さな物体の検出を行う。
  2. 転倒・うつ伏せ検知: MediaPipe Poseを用いて骨格を抽出し、「頭部と足首のY座標の逆転(転倒)」や「顔のキーポイント消失(うつ伏せ)」を数学的に判定する。

【重要】技術的課題と根本解決:
EC2(CPU環境)では推論に時間がかかる場合があります。毎フレーム推論すると処理が追いつかないため、「Nフレームに1回だけ推論を実行する(フレームスキップ)」ロジックを組み込み、FPSの低下を防いでください。

Step 3: AWS IoT CoreへのMQTT送信

目的: 危険を検知した際、フロントエンド(Role C)へ1秒以内にアラートを届ける。

  1. AWS IoT Device SDK v2 を使用し、証明書を用いたmTLS接続を実装する。
  2. 危険検知時に、JSON形式のペイロードを特定のトピックへPublishする。
  3. (並行タスク)MT10/MT20のダミーJSONデータを定期的にPublishする別スクリプト(シミュレータ)も作成する。

【重要】技術的課題と根本解決:
VPNの鍵更新などでネットワークが瞬断すると、MQTTクライアントがクラッシュします。必ずSDKの「非同期イベントループ」と「自動再接続機能」を利用し、オフライン時はメッセージをキューイング(QoS 1)する堅牢な接続クラスを設計してください。

Step 4: Webex APIへの証拠画像送信

目的: 危険検知時の状況を、画像付きで保護者のWebexに通知する。

  1. 検知時のフレーム画像に、YOLOのバウンディングボックスや警告テキストを描画する。
  2. requests ライブラリを用いて、Webex Messaging APIへマルチパートデータとしてPOST送信する。

【重要】技術的課題と根本解決:
画像をディスクに保存してから送信すると、I/O待ちでシステム全体が数秒間フリーズします。必ず「メモリ上で直接JPEGエンコード(cv2.imencode)」し、さらに送信処理自体を「別スレッド(ThreadPoolExecutor等)」に逃がして、メインの推論ループを絶対にブロックしない非同期送信を実装してください。

Step 5: 全体統合とエラーリカバリ

目的: 上記の全モジュールを統合し、24時間稼働するデーモンプロセスにする。

カメラ取得、AI推論、MQTT送信、Webex送信を1つのメインコントローラークラスに統合します。カメラの接続が切れた場合の「自動再接続ループ」や、APIのタイムアウト例外をキャッチして握り潰さずにリトライ・スキップするエラーハンドリングを網羅してください。

3. 他ロールとの連携ポイント(アウトプット)

Role Aの実装が完了したら、以下の情報を他ロールへ共有します。

  • Role Bへ: MQTTで送信するJSONデータのフォーマット(スキーマ)。これによりRole BはDynamoDBへの保存ルールを構築できます。
  • Role Cへ: 送信するMQTTの「トピック名」。これによりRole CはReact側でどのトピックをSubscribeすればよいかが確定します。