目次
AWS Panorama v2.0 完全ガイド(IoT / Edge)
初心者から実務者向けの包括的解説
AWS Panorama は、既存の IP カメラネットワークにエッジ処理機能を追加し、オンプレミス環境でコンピュータービジョン推論をリアルタイムに実行するサービスです。Panorama Appliance(専用ハードウェア)または認定デバイスを導入することで、映像全体をクラウドに送信することなく、エッジデバイス上で物体検出・人数カウント・品質検査を実現します。
⚠️ End of Support Notice: AWS Panorama は 2026年5月31日をもってサポート終了予定です。詳細参照。
目次
- 概要
- Panorama が解決する課題
- 主な特徴
- アーキテクチャ
- コアコンポーネント
- 対応デバイス
- アプリケーション開発
- 推論フロー
- エッジでのモデル最適化
- クラウド統合
- 主要ユースケース
- セキュリティ
- コスト構造
- Kinesis Video Streams との比較
- 他エッジ CV プラットフォーム比較
- マイグレーション戦略
- ベストプラクティス
- トラブルシューティング
- End of Support Notice
- まとめ
概要
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(制限あり)
アプリケーション開発
開発フロー
-
ローカルマシンで開発・テスト
python my_app.py --test-input /path/to/test.mp4 -
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' ) -
Application をパッケージング
panorama-cli application package \ --app-dir ./my_app \ --output-s3-location s3://my-bucket/apps/ -
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. 交通・道路監視
入力: 信号機カメラ / 駐車場カメラ
処理:
- 車両検出・分類
- 違法駐車検出
- 交通流量監視
出力:
- 交通量レポート
- 駐車区画最適化
- 違法駐車アラート
セキュリティ
デバイスセキュリティ
-
トラスト・アンカー
- Appliance 内部に秘密鍵保存
- AWS IoT 認証書による識別
-
暗号化
- TLS 1.2 による通信暗号化
- S3 への送信データ暗号化
-
アクセス制御
- 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 → クラウド推論
移行ステップ
-
モデルエクスポート
# ONNX / SavedModel フォーマットで出力 python export_model.py --format onnx -
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 ) -
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 が起動しない
-
電源確認
# SSH で接続テスト ssh ubuntu@<appliance-ip> -
ネットワーク確認
# Appliance から AWS に到達可能か確認 curl https://panorama.region.amazonaws.com -
デバイス登録確認
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年以降の長期運用を計画している
公式ドキュメント
- AWS Panorama Developer Guide
- AWS Panorama Application SDK
- AWS Panorama Pricing
- AWS Panorama End of Support
最終更新: 2025年4月27日 バージョン: v2.0