目次

AWS Panorama v2.0 完全ガイド(IoT / Edge)

初心者から実務者向けの包括的解説

AWS Panorama は、既存の IP カメラネットワークにエッジ処理機能を追加し、オンプレミス環境でコンピュータービジョン推論をリアルタイムに実行するサービスです。Panorama Appliance(専用ハードウェア)または認定デバイスを導入することで、映像全体をクラウドに送信することなく、エッジデバイス上で物体検出・人数カウント・品質検査を実現します。

⚠️ End of Support Notice: AWS Panorama は 2026年5月31日をもってサポート終了予定です。詳細参照。


目次

  1. 概要
  2. Panorama が解決する課題
  3. 主な特徴
  4. アーキテクチャ
  5. コアコンポーネント
  6. 対応デバイス
  7. アプリケーション開発
  8. 推論フロー
  9. エッジでのモデル最適化
  10. クラウド統合
  11. 主要ユースケース
  12. セキュリティ
  13. コスト構造
  14. Kinesis Video Streams との比較
  15. 他エッジ CV プラットフォーム比較
  16. マイグレーション戦略
  17. ベストプラクティス
  18. トラブルシューティング
  19. End of Support Notice
  20. まとめ

概要

AWS Panorama とは

AWS Panorama は 「既存 IP カメラを AI 対応にアップグレードするエッジコンピュータビジョンサービス」 です。

  • Panorama Appliance: NVIDIA GPU 搭載の専用ハードウェア
  • エッジ推論: ローカルネットワークで RTSP 映像を処理
  • クラウド統合: 結果のみをクラウドに送信(低帯域)
  • 複数カメラ対応: 単一アプライアンスで複数ストリーム処理
  • SageMaker 統合: クラウド学習モデルをエッジにデプロイ

Panorama を選ぶべき状況

以下のいずれかに該当すれば Panorama は最適です:

  • 既存の CCTV カメラ資産(投資)を有効活用したい
  • エッジで低レイテンシ推論が必要(数十 ms レベル)
  • 映像全体をクラウドに送信する帯域がない
  • プライバシー規制(映像ローカル保持)に対応する必要がある
  • 製造ラインの品質検査・工場安全管理を自動化したい

Panorama が解決する課題

課題 従来の方法 Panorama での解決
既存カメラの活用 スマートカメラへの総入れ替え(莫大投資) Appliance を追加するだけで既存 IP カメラが AI 対応に
レイテンシ クラウド処理で数百 ms 遅延 エッジ推論で 20-50 ms
帯域幅 映像全体をアップロード(GB/時間) 結果のみ送信(MB/時間)
モデル管理 エッジデバイスごとの手管理 SageMaker から OTA で自動配信
複数カメラ管理 カメラごとに デバイスが必要 単一 Appliance で複数ストリーム
オフライン対応 クラウド依存で断線時停止 エッジでローカル動作継続
セキュリティ 映像がクラウド経由 ローカル処理で映像非送信

主な特徴

✅ RTSP カメラとの直接互換性

  • IP カメラからの RTSP ストリームを直接取り込み
  • H.264 / H.265 対応
  • 複数ストリームの同時処理

✅ NVIDIA GPU による高速推論

  • Tegra Xavier / Orin などの SOM 搭載
  • 複数並列推論エンジン
  • FPS 対応(720p 30 FPS、4K 対応)

✅ SageMaker Neo 最適化

  • PyTorch / TensorFlow モデルのエッジ最適化
  • モデルサイズ削減・推論速度向上
  • 精度の低下を最小化

✅ クラウド無しで動作

  • インターネット断時も推論継続
  • OTA 更新は接続時に自動

✅ 複数カメラの一元管理

  • AWS Management Console でグローバル管理
  • DeviceFleet で複数拠点の Appliance 管理

アーキテクチャ

既存 IP カメラネットワーク(RTSP)
    ↓ ローカルネットワーク(低遅延)
Panorama Appliance(エッジ)
    ├── NVIDIA GPU / CPU
    ├── 複数カメラストリーム入力
    ├── ML 推論エンジン
    └── 結果出力(アラート / メタデータ)
    
クラウド(AWS)
    ← 推論結果(CSV / JSON)
    ← CloudWatch ログ・メトリクス
    ← S3 上異常画像保存
    → OTA モデル配信

データフロー例(製造ライン欠陥検査)

工場ラインカメラ(RTSP)
    → Appliance で実時間フレーム取得
    → 欠陥検出モデル推論(20ms/フレーム)
    → IsAnomalous = true → S3 に欠陥画像保存 + SNS アラート
    → IsAnomalous = false → ログのみ記録

コアコンポーネント

1. Panorama Appliance

仕様

  • NVIDIA Jetson Xavier NX / AGX Orin ベース
  • GPU メモリ: 8-32 GB
  • ストレージ: 256 GB NVMe SSD
  • ネットワーク: ギガビットイーサネット + WiFi オプション
  • 電源: AC 100-240V / DC PoE 対応
  • IP-62 防塵・防滴対応

価格

  • ハードウェア: 約 $4,000
  • サービス料: $600/年/デバイス

2. Panorama Camera Input

class CameraInput:
    """RTSP カメラからストリーム取得"""
    def __init__(self):
        self.camera_url = "rtsp://192.168.1.100/stream"  # IP カメラ
        self.credentials = {"username": "admin", "password": "***"}
    
    def connect(self):
        """RTSP ストリーム確立"""
        pass

3. Panorama Model

モデル対応フォーマット

  • PyTorch (.pth / .pt)
  • TensorFlow 2.x (.h5 / SavedModel)
  • ONNX (.onnx)

パッケージング例

panorama-cli model package \
    --model-dir ./models/defect_detection \
    --output-s3-location s3://my-bucket/models/

4. Panorama Application

Application は Python コードで構成:

import panoramasdk
import cv2
import numpy as np

class DefectDetectionApp(panoramasdk.node):
    def __init__(self):
        super().__init__()
        self.model = panoramasdk.model({
            'ModelPackageName': 'defect-detector',
            'BatchSize': 1
        })
    
    def process_streams(self):
        """各ストリームを処理"""
        streams = self.inputs.video_in.get()
        
        for stream in streams:
            frame = stream.image  # numpy (H, W, 3)
            
            # 前処理
            resized = cv2.resize(frame, (224, 224))
            normalized = resized.astype(np.float32) / 255.0
            
            # 推論
            output = self.model.predict(normalized)
            
            # ポスト処理
            if output[0] > 0.8:  # 欠陥スコア 80%
                stream.add_label(
                    text="DEFECT",
                    loc_x=0.1,
                    loc_y=0.1
                )
                # S3 に欠陥画像を保存
                self.outputs.defect_frames.put(stream)
            else:
                stream.add_label("OK", 0.1, 0.1)
        
        self.outputs.video_out.put(streams)

def main():
    app = DefectDetectionApp()
    while True:
        app.process_streams()

if __name__ == "__main__":
    main()

5. Panorama Node

Node は Application 内の処理ユニット:

class DataOutput(panoramasdk.node):
    """推論結果をクラウドに送信"""
    
    def process_streams(self):
        results = self.inputs.data_in.get()
        
        for result in results:
            # CloudWatch Metrics に記録
            self.metric({
                'Namespace': 'Panorama/Production',
                'MetricName': 'DefectCount',
                'Value': result['defect_count']
            })
            
            # S3 に JSON ログを保存
            self.s3({
                'Bucket': 'my-results',
                'Key': f"results/{result['timestamp']}.json",
                'Body': json.dumps(result)
            })

対応デバイス

公式 Panorama Appliance

  • AWS 製造の専用ハードウェア
  • NVIDIA GPU 統合
  • 複数ストリーム対応
  • IP-62 防塵・防滴

Panorama Enabled Device

認定パートナーデバイス:

  • Lenovo ThinkStation Appliance
  • その他産業用コンピュータ

Panorama SDK 統合可能デバイス

  • NVIDIA Jetson シリーズ(Nano, Xavier, AGX Orin)
  • x86 Linux マシン(Ubuntu 20.04+)
  • Raspberry Pi(制限あり)

アプリケーション開発

開発フロー

  1. ローカルマシンで開発・テスト

    python my_app.py --test-input /path/to/test.mp4
    
  2. SageMaker Neo でモデル最適化

    import sagemaker
    
    sess = sagemaker.Session()
    model_name = "defect-detector"
    
    # モデルを Neo にコンパイル
    compiled_model = sess.create_model_from_job(
        job_name="my-training-job"
    ).compile(
        target_instance_family="ml.eia2.medium",
        input_shape={'input': [1, 224, 224, 3]},
        framework='pytorch',
        framework_version='1.9'
    )
    
  3. Application をパッケージング

    panorama-cli application package \
        --app-dir ./my_app \
        --output-s3-location s3://my-bucket/apps/
    
  4. Appliance にデプロイ

    panorama-cli deployment deploy \
        --devices arn:aws:panorama:region:account:device/device-id \
        --application-s3-location s3://my-bucket/apps/my_app.tar.gz
    

開発ツール

# Panorama CLI インストール
pip install panorama-cli

# プロジェクト初期化
panorama-cli create --template-dir my_project

# ローカルテスト実行
panorama-cli test \
    --container-image-name my-app:latest \
    --input-video /path/to/sample.mp4

# Device Fleet デプロイ
panorama-cli deployment create \
    --name my-deployment \
    --devices device-1 device-2 device-3

推論フロー

リアルタイム推論パイプライン

入力: RTSP ストリーム(30 FPS)
    ↓
フレームキャプチャ(毎フレーム)
    ↓
前処理(リサイズ・正規化・カラー変換)
    ↓
バッチ作成(複数フレーム)
    ↓
GPU 推論(並列処理)
    ↓
ポスト処理(NMS・ラベリング・スコアリング)
    ↓
出力: メタデータ / 画像アノテーション

計算効率

バッチサイズ: 1 フレーム
入力解像度: 1920x1080 (Full HD)
モデル: ResNet-50 (SageMaker Neo 最適化)
推論時間: 20-50 ms(フレーム)
スループット: 20-50 FPS

エッジでのモデル最適化

SageMaker Neo の活用

SageMaker Neo はモデルを Panorama Appliance のハードウェアに最適化:

# TensorFlow モデルの最適化
optimized_model = sagemaker.model.neo.compile(
    model_name="defect-detector",
    input_shape={
        'input_1': [1, 224, 224, 3]
    },
    framework='tensorflow',
    framework_version='2.8',
    target_device='panorama',
    role=role,
    s3_location='s3://bucket/model.tar.gz'
)

最適化のメリット

  • モデルサイズ削減: 90% 圧縮
  • 推論速度向上: 5-10倍高速化
  • 精度維持: 量子化で 1-2% 低下抑制
  • メモリ使用量削減: GPU メモリ節約

クラウド統合

1. AWS IoT Core への接続

import json
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

class IoTPublisher(panoramasdk.node):
    def __init__(self):
        self.client = AWSIoTMQTTClient("panorama-device")
        self.client.configureEndpoint(
            "a1234567-ats.iot.region.amazonaws.com",
            8883
        )
        self.client.configureCredentials(
            caPath="/etc/panorama/ca-cert.pem",
            keyPath="/etc/panorama/private.key",
            certPath="/etc/panorama/cert.pem"
        )
        self.client.connect()
    
    def publish_results(self, results):
        payload = {
            'timestamp': int(time.time()),
            'device_id': 'arn:aws:panorama:...',
            'defect_count': results['defect_count'],
            'confidence': results['confidence']
        }
        self.client.publish(
            topic="panorama/detections",
            QoS=1,
            payload=json.dumps(payload)
        )

2. AWS Lambda トリガー

# Panorama → S3 → Lambda 自動トリガー

# S3 イベント通知
{
    "Records": [
        {
            "s3": {
                "bucket": {"name": "defects-bucket"},
                "object": {"key": "2025-04-27/001.jpg"}
            }
        }
    ]
}

# Lambda ハンドラー
def lambda_handler(event, context):
    """S3 に保存された欠陥画像を処理"""
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        
        # 欠陥画像を分析
        response = rekognition.detect_text(
            Image={'S3Object': {'Bucket': bucket, 'Name': key}}
        )
        
        # 結果を SNS で通知
        sns.publish(
            TopicArn='arn:aws:sns:region:account:defect-alerts',
            Subject='Manufacturing Defect Detected',
            Message=json.dumps(response)
        )

3. CloudWatch Metrics への送信

class MetricsPublisher(panoramasdk.node):
    def __init__(self):
        self.cloudwatch = boto3.client('cloudwatch')
    
    def publish_metrics(self, results):
        self.cloudwatch.put_metric_data(
            Namespace='Panorama/Production',
            MetricData=[
                {
                    'MetricName': 'DefectRate',
                    'Value': results['defect_rate'],
                    'Unit': 'Percent',
                    'Timestamp': datetime.utcnow()
                },
                {
                    'MetricName': 'ProcessingLatency',
                    'Value': results['latency_ms'],
                    'Unit': 'Milliseconds'
                }
            ]
        )

主要ユースケース

1. 製造ライン品質検査

シナリオ: プリント基板(PCB)の製造ラインで、ハンダ付け・部品実装の不良を検査

入力: PCB ラインカメラ(全数検査)
処理:
    - 基板を 224x224 リサイズ
    - 欠陥検出モデル推論(20ms)
    - IsAnomalous = true → 不良品排出機構に信号
出力: 不良率 KPI / 欠陥パターン分析

2. 小売店舗の来客分析

入力: 店舗入口カメラ
処理:
    - 人物検出・カウント
    - 客動線追跡
    - 滞留時間集計
出力:
    - リアルタイム来客数
    - 店舗レイアウト最適化
    - 実績連動ディスプレイ

3. 工場安全管理

入力: 工場フロアカメラ
処理:
    - 安全ベスト・ヘルメット検出
    - 危険エリア侵入検知
    - 正しい動作確認
出力:
    - ヒヤリハット検出
    - KPI ダッシュボード
    - アラート通知

4. 交通・道路監視

入力: 信号機カメラ / 駐車場カメラ
処理:
    - 車両検出・分類
    - 違法駐車検出
    - 交通流量監視
出力:
    - 交通量レポート
    - 駐車区画最適化
    - 違法駐車アラート

セキュリティ

デバイスセキュリティ

  1. トラスト・アンカー

    • Appliance 内部に秘密鍵保存
    • AWS IoT 認証書による識別
  2. 暗号化

    • TLS 1.2 による通信暗号化
    • S3 への送信データ暗号化
  3. アクセス制御

    • IAM ロールで権限管理
    • デバイス別の S3 バケット制限

アプリケーション署名

# Application に署名(デプロイ前)
panorama-cli application sign \
    --app-dir ./my_app \
    --certificate /path/to/cert.pem \
    --private-key /path/to/key.pem

ネットワーク分離

  • Appliance ←(プライベート VLAN)→ IP カメラ
  • ↓(インターネット)
  • AWS(結果通信のみ)

コスト構造

ハードウェアコスト

項目 価格
Panorama Appliance(本体) $3,500-4,500
オプション(ネットワークカード等) $200-500
初期投資計 $3,700-5,000

サービスコスト

項目 単価
サービス料(/年/デバイス) $600
デプロイメント(初回) 無料
データ送信(S3 へ) 標準 S3 料金
CloudWatch ログ 標準 CloudWatch 料金

年間総コスト例

単一拠点: Appliance x1 + サービス
年間: $600 + 電力($50/年) = $650

5拠点展開: Appliance x5
年間: $600 x 5 + 電力 $250 = $3,250

ROI シミュレーション

従来: 検査員 2 名 × $40,000/年 = $80,000/年
Panorama: $3,250/年 + メンテナンス $500 = $3,750/年
年間削減: $76,250(初年度 Net ROI)

Kinesis Video Streams との比較

観点 AWS Panorama Kinesis Video Streams
処理場所 エッジ(Appliance) クラウド
レイテンシ 20-50 ms 5-10 秒
帯域幅要件 低(結果のみ) 高(全映像)
推論タイプ リアルタイム推論 ストレージ+分析
カメラ互換性 IP/RTSP カメラ 専用カメラ / SDK 統合
複数カメラ 単一 Appliance で対応 別途 Worker インスタンス
初期投資 $4,000/Appliance 低コスト(サーバーレス)
採用理由 リアルタイム品質検査 映像分析・アーカイブ

他エッジ CV プラットフォーム比較

特徴 Panorama NVIDIA Metropolis Intel OpenVINO Edge Impulse
推奨用途 AWS 統合・既存カメラ 高性能・カスタム 汎用 x86 IoT・エッジ ML
対応デバイス Appliance(専用) DGX / Jetson CPU/GPU / Movidius マイコン / ARM
セットアップ難度 低(SaaS) 中-高 低(Web IDE)
クラウド統合 AWS に統合 限定的 限定的 独立可能
コスト ハードウェア必須($4K) 高い 低い 低い

マイグレーション戦略

SageMaker / Bedrock への移行

現在(Panorama):
    既存 IP カメラ → Panorama Appliance → エッジ推論

将来(推奨):
    既存 IP カメラ → AWS IoT Greengrass → SageMaker Edge Manager
        または
    既存 IP カメラ → Bedrock Vision API → クラウド推論

移行ステップ

  1. モデルエクスポート

    # ONNX / SavedModel フォーマットで出力
    python export_model.py --format onnx
    
  2. SageMaker へのインポート

    import sagemaker
    model = sagemaker.model.Model(
        image_uri='382416733822.dkr.ecr.region.amazonaws.com/onnx-inference',
        model_data='s3://bucket/model.onnx',
        role=role
    )
    
  3. Greengrass デプロイ

    aws greengrass create-component-version \
        --inline-recipe "{...}"
    

ベストプラクティス

1. ネットワーク設計

推奨:
    カメラ(ローカル VLAN) → Appliance(有線 ギガビット)
    Appliance → クラウド(VPN または専用線)

非推奨:
    WiFi カメラ(遅延) → Appliance(WiFi)
    インターネット経由の低遅延信号送信

2. モデル選択

推奨:
    - 事前学習済み:YOLO v8, ResNet, MobileNet
    - Lightweight:MobileNet v2, SqueezeNet
    - 量子化対応

非推奨:
    - 大規模モデル:ResNet-152, Vision Transformer
    - 量子化非対応モデル

3. リソース管理

# メモリ効率的な推論
class OptimizedApp(panoramasdk.node):
    def __init__(self):
        # バッチサイズ 1(メモリ削減)
        self.model = panoramasdk.model({
            'ModelPackageName': 'detector',
            'BatchSize': 1
        })
        # フレームキャッシュ最小化
        self.frame_cache = []
    
    def process_streams(self):
        streams = self.inputs.video_in.get()
        # スキップフレーム処理(毎フレーム推論しない)
        for i, stream in enumerate(streams):
            if i % 3 == 0:  # 3 フレームごと
                output = self.model.predict(stream.image)

4. エラーハンドリング

class RobustApp(panoramasdk.node):
    def process_streams(self):
        try:
            streams = self.inputs.video_in.get()
            for stream in streams:
                try:
                    result = self.model.predict(stream.image)
                except Exception as e:
                    # スキップ(キープアライブ)
                    self.logger.error(f"Inference failed: {e}")
                    stream.add_label("ERROR", 0.1, 0.1)
                    continue
        except Exception as e:
            self.logger.critical(f"Stream error: {e}")
            # Fallback: 最後の成功フレーム再利用
            pass

トラブルシューティング

Appliance が起動しない

  1. 電源確認

    # SSH で接続テスト
    ssh ubuntu@<appliance-ip>
    
  2. ネットワーク確認

    # Appliance から AWS に到達可能か確認
    curl https://panorama.region.amazonaws.com
    
  3. デバイス登録確認

    aws panorama describe-device --device-id <device-arn>
    

推論精度が低い

① モデルがハードウェアに最適化されているか確認
   → SageMaker Neo で再コンパイル

② 入力前処理が正しいか確認
   → テスト画像で前処理結果を検証

③ 推論ノードのスコア閾値調整
   → 応報スコア = 0.8 から 0.7 に下げる

デプロイが失敗する

エラー: "DeviceAlreadyHasApplication"
→ 既存アプリを削除: aws panorama delete-application

エラー: "ModelNotFound"
→ S3 パスを確認: s3://bucket/path/to/model.tar.gz

エラー: "InsufficientDeviceMemory"
→ バッチサイズを 1 に設定
→ モデルを軽量化(量子化)

End of Support Notice

重要なお知らせ

AWS Panorama は 2026年5月31日をもってサポート終了予定です。

  • 新規利用: 代替手段(SageMaker / Bedrock)の使用を検討してください
  • 既存利用者: サポート期間内に代替ソリューションへの移行を計画してください

推奨される移行経路

オプション 1: AWS IoT Greengrass + SageMaker

  • Panorama Appliance
  • → AWS IoT Greengrass エッジ処理
    • SageMaker Edge Manager でモデル管理

メリット

  • より柔軟なエッジ処理
  • SageMaker との深い統合
  • 複数 AWS サービスの連携

オプション 2: Bedrock Vision API

IP カメラ → クラウド(Bedrock) → 推論結果

# コード例
import boto3
bedrock = boto3.client('bedrock-runtime')
response = bedrock.invoke_model(
    modelId='anthropic.claude-3-5-vision-20241022-v2:0',
    body=image_data,
    contentType='image/jpeg'
)

メリット

  • セットアップが簡単
  • モデル管理不要
  • スケーラビリティ

まとめ

AWS Panorama は 「既存 IP カメラをエッジ AI 推論で最強にアップグレードするサービス」 です。

強み

  • 既存カメラ資産を活用(初期投資最小化)
  • 低レイテンシ・低帯域の運用(製造ライン向け)
  • SageMaker との統合(モデル管理の一元化)

制約

  • ハードウェア購入必須($4K)
  • 2026年5月31日でサポート終了
  • 複雑なカスタマイズには限界

選択基準

  • ✅ 既存 RTSP カメラを活用したい
  • ✅ エッジでの低レイテンシ推論が必須
  • ✅ SageMaker モデルを使いたい
  • ❌ 2026年以降の長期運用を計画している

公式ドキュメント


最終更新: 2025年4月27日 バージョン: v2.0