Amazon Web Services ブログ

AWS Panorama によるエッジでのコンピュータビジョン

現在、AWS Panorama Appliance は一般にすべてのユーザーが使用できます。AWS Panorama Appliance は、オンプレミスのカメラから提供される画像を分析するために、ネットワークにデプロイされるように設計されたコンピュータビジョン (CV) アプライアンスです。

AWS Panorama Appliance

毎週、新しく革新的なコンピュータビジョンのユースケースに関する記事を読んでいます。お客様の中には、倉庫でのワーカーの安全を確保するためにパレットトラックが指定された場所に駐車されていることを確認するために CV を使用しています。また、少数ですが例を挙げると、小売店での顧客の歩行の流れを分析してスペースと製品の配置を最適化している人もいれば、猫やネズミを認識するためにそれを使用している人もいます

AWS のお客様は、クラウドはストレージとコンピューティングリソースに事実上無限にアクセスできるため、コンピュータビジョンモデルをトレーニングするのに最も便利な場所であるという事実に賛同を頂いています。クラウドでは、データサイエンティストは Amazon SageMaker などの強力なツールや、幅広いコンピューティングリソースフレームワークにアクセスできます。

しかし、1 つまたは複数のビデオフィードの画像を分析するときには、クラウドはそのようなワークロードを実行したい場所ではないと多くのご意見を頂いています。これには多くの理由があります。画像がキャプチャされる施設には、ビデオフィードをクラウドに送信するのに十分な帯域幅がない場合や、非常に低いレイテンシーが必要なユースケース、または画像をオンプレミスに保存し、分析のためにネットワーク外に送信しない場合があります。

re: Invent 2020 では、これらの要件に対応する AWS Panorama Appliance と SDK を発表しました

AWS Panorama は機械学習アプライアンスおよびソフトウェア開発キット (SDK) で、コンピュータビジョンをオンプレミスのカメラに取り込み、高精度かつ低レイテンシーでローカルで予測を行うことができます。AWS Panorama Appliance を使用すると、従来は人間による検査が必要だったタスクを自動化して、潜在的な問題の可視性を向上させることができます。例えば、AWS Panorama Appliance を使用して、製造品質を評価し、産業プロセスのボトルネックを特定し、インターネット接続が制限されているかまったくない環境でも職場のセキュリティをモニタリングできます。このソフトウェア開発キットにより、カメラメーカーは同等の機能を自社の IP カメラ内に直接取り込むことができます。

このブログではいつものように、AWS Panorama Appliance 用のコンピュータビジョンアプリケーションの開発とデプロイについて順を追って説明します。このブログのデモアプリケーションは、機械学習モデルを使用して、ネットワークカメラからのビデオのフレーム内のオブジェクトを認識します。アプリケーションは AWS Panorama Appliance にモデルを読み込み、カメラから画像を取得し、それらの画像をモデルを介して実行します。アプリケーションは、元の動画の上に結果をオーバーレイし、接続されたディスプレイに出力します。このアプリケーションは、AWS Panorama が提供するライブラリを使用して、入出力ビデオストリームとモデルを操作します。低レベルのプログラミングは必要ありません。

まず、いくつかの概念を定義しましょう。AWS Panorama ドキュメントのページから次の定義をお借りしました。

概念
AWS Panorama Appliance は、アプリケーションを実行するハードウェアです。AWS Panorama コンソールまたは AWS SDK を使用して、アプライアンスの登録、ソフトウェアの更新、アプリケーションのデプロイを行います。アプライアンス上で実行するソフトウェアは、カメラストリームを検出して接続し、ビデオフレームをアプリケーションに送信し、オプションで接続されたディスプレイにビデオ出力を表示します。

アプライアンスはエッジデバイスです。処理のために AWS クラウドにイメージを送信する代わりに、最適化されたハードウェア上でアプリケーションをローカルで実行します。これにより、動画をリアルタイムで分析し、制限された接続で結果を処理できます。アプライアンスのステータスの報告、ログのアップロード、およびソフトウェアの更新とデプロイの取得には、インターネット接続のみが必要です。

アプリケーションは、カメラ、モデル、コード、またはグローバル変数を表すノードと呼ばれる複数のコンポーネントで構成されます。ノードは、構成のみ (入力と出力) またはアーティファクト (モデルとコード) を含めることができます。アプリケーションノードは、AWS Panorama Appliance がアクセスできる S3 アクセスポイントにアップロードするノードパッケージにバンドルされています。アプリケーションマニフェストは、ノード間の接続を定義する設定ファイルです。

コンピュータビジョンモデルは、画像を処理するようにトレーニングされた機械学習ネットワークです。コンピュータビジョンモデルは、分類、検出、セグメンテーション、追跡などのさまざまなタスクを実行できます。コンピュータビジョンモデルは、画像を入力として受け取り、画像内のイメージまたはオブジェクトに関する情報を出力します。

AWS Panorama は、Apache MXNetDarkNetGluonCVKerasONNXPyTorchTensorFlow、および TensorFlow Lite で構築されたモデルをサポートしていますAmazon SageMaker でモデルを構築し、Amazon Simple Storage Service (Amazon S3) バケットからインポートすることができます。

AWS Panorama コンテキスト

これで概念はつかめましたので、実際に使ってみましょう。

AWS Panorama Appliance の開封
サービスチームが送ってくれた箱にはアプライアンス自体が入っていました (当然ですね)。電源コードと 2 本のイーサネットケーブルです。この箱には、アプライアンスを初期設定するための USB キーも入っています。このデバイスは、産業環境で動作するように設計されています。背面の電源コネクタの横に 2 つのイーサネットポートがあります。スライドドアの後ろで保護された前面には、SD カードリーダー、HDMI コネクタが 1 つ、USB ポートが 2 つありました。また、デバイスを工場出荷時の状態に戻すための電源ボタンとリセットボタンもあります。

AWS Panorama Appliance の前面 AWS Panorama Appliance の裏面 AWS Panorama USB キー

アプライアンスの設定
最初に自分のネットワーク (ケーブル + DHCP ですが、静的 IP 設定もサポートしています) に合わせて設定し、AWS アカウントに安全に接続できるように登録しました。そのために、AWS マネジメントコンソールに移動し、ネットワーク設定の詳細を入力しました。設定ファイルと証明書のセットが生成されました。提供された USB キーを使用してこれらをアプライアンスにコピーしました。同僚の Martin Beeby がこのプロセスのスクリーンショットを共有してくれました。 AWS チームはプレビュー中に受け取ったフィードバックに基づいて画面を少し修正しましたが、ステップバイステップのプロセスをもう一度行う価値はないと思います。フィールドからのヒント: 箱に入っている USB キーを必ず使用してください。正しくフォーマットされ、アプライアンスによって自動的に認識されます (私の USB キーは正しく認識されませんでした)。

次に、Panorama GitHub リポジトリからサンプルアプリケーションをダウンロードし、この GitHub でも利用できる Test Utility for Panorama で試しました (テストユーティリティはシミュレータとして動作するよう設定された EC2 インスタンスです)。PTest Utility for Panorama は、アプライアンスにデプロイする前に、Jupyter ノートブックを使用して、サンプルアプリケーションやコードをすばやく試すことができます。また、アプリケーションをプログラムでアプライアンスにデプロイできるコマンドも一覧表示されます。

Panorama コマンドライン
Panorama コマンドラインを使用すると、プロジェクトの作成、アセットのインポート、パッケージ化、および AWS Panorama Appliance へのデプロイの操作が簡素化されます。これらの手順に従って、Panorama コマンドラインをダウンロードしてインストールできます

サンプルアプリケーションなど、他の人が開発したアプリケーションを受け取った場合、すべてのアプリケーションファイルとディレクトリ名の AWS アカウント ID を置き換える必要があります。これを 1 つのコマンドで行います。

panorama-cli import-application

アプリケーションの構造
Panorama アプリケーションの構造は次のようになります。

├── assets
├── graphs
│   └── example_project
│       └── graph.json
└── packages
    ├── accountXYZ-model-1.0
    │   ├── descriptor.json
    │   └── package.json
    └── accountXYZ-sample-app-1.0
        ├── Dockerfile
        ├── descriptor.json
        ├── package.json
        └── src
            └── app.py

  • graph.json は、このアプリケーションのすべてのパッケージとノードを一覧表示します。ノードは、Panorama でアプリケーションを定義する方法です。
  • 各パッケージの package.json には、パッケージとそのパッケージが使用するアセットに関する詳細が記載されています。
  • モデルパッケージの model には、モデルのコンパイルに必要なメタデータを含む descriptor.json があります。
  • コンテナパッケージの sample-app パッケージには、src ディレクトリ内のアプリケーションコードと、コンテナを構築するための Dockerfile が含まれています。descriptor.json には、コンテナの起動時に使用するコマンドとファイルの詳細が記載されています。
  • assets ディレクトリは、パッケージ化されたコードやコンパイルされたモデルなど、すべてのアセットが存在する場所です。このディレクトリでは何も変更しないでください。

パッケージ名にはアカウント番号のプレフィックスが付くことに注意してください。

アプリケーションの準備ができたら、コンテナを構築します (Docker EngineDocker CLI を備えたLinuxマシンを使用し、macOS または Windows 用の Docker デスクトップの使用は避けています)。

$ panorama-cli build-container                               \
               --container-asset-name {container_asset_name} \ 
               --package-path packages/{account_id}-{package_name}-1.0 

カメラに関する注意事項
AWS Panorama Appliance には「抽象カメラ」の概念があります。抽象カメラソースは、アプリケーションのデプロイ中に実際のカメラデバイスにマッピングできるプレースホルダです。Test Utility for Panorama を使用すると、抽象カメラをビデオファイルにマッピングして、簡単かつ反復可能なテストを行うことができます。

機械学習モデルの追加
AWS Panorama Appliance は複数の機械学習モデルフレームワークをサポートしています。モデルは、Amazon SageMaker または任意の他のソリューションでトレーニングできます。S3 から機械学習モデルをダウンロードし、プロジェクトにインポートしました。

panorama-cli add-raw-model                                                 \
    --model-asset-name {asset_name}                                        \
    --model-s3-uri s3://{S3_BUCKET}/{project_name}/{ML_MODEL_FNAME}.tar.gz \
    --descriptor-path {descriptor_path}                                    \
    --packages-path {package_path}

陰では、機械学習モデルは AWS Panorama Appliance の Nvidia Accelerated Linux Arm64 アーキテクチャに最適化するためにコンパイルされています。

アプリケーションのパッケージ化
機械学習モデルとアプリケーションコードがコンテナにパッケージ化されたので、AWS Panorama Appliance のアプリケーションアセットをパッケージ化する準備ができました。

panorama-cli package-application

このコマンドは、すべてのマニフェストとともに、すべてのアプリケーションアセットを AWS クラウドアカウントにアップロードします。

アプリケーションのデプロイ
最後に、 AWS Panorama Appliance にアプリケーションをデプロイします。デプロイでは、アプリケーションとその設定 (カメラストリームの選択など) が AWS クラウドからオンプレミスの AWS Panorama Appliance にコピーされます。Python コード (および既に知っているかもしれない Boto3 SDK) を使用して、アプリケーションをプログラムでデプロイすることができます。


client = boto3.client('panorama')
client.create_application_instance(
    Name="AWS News Blog Sample Application",
    Description="An object detection app",
    ManifestPayload={
       'PayloadData': manifest         # <== this is the graph.json file content 
    },
    RuntimeRoleArn=role,               # <== これは、Cloudwatch などの AWS のサービスを使用するためのアクセス許可をアプリケーションに付与するロールです。
    DefaultRuntimeContextDevice=device # <== これは私のデバイス名です。 
)

または、AWS マネジメントコンソールを使用することもできます。

[Deployed applications] で、[Deploy application] を選択します。

AWS Panorama - デプロイを開始する

graphs/<project name>/graph.json の内容をコピーしてコンソールに貼り付け、[次へ] を選択します。

AWS Panorama - グラフ JSON のコピー

アプリケーションに名前とオプションの説明を付けます。[Proceed to deploy] を選択します。

AWS Panoram Deploy - アプリケーション名

次の手順は、

  • IAM ロールを宣言して、AWS のサービスを使用するためのアクセス許可をアプリケーションに付与します。最小限のアクセス権限セットでは、CloudWatchPumetricData API を呼び出すことができます。
  • デプロイする AWS Panorama Appliance を選択して
  • アプリケーション descriptors.json で定義された抽象カメラを、AWS Panorama Appliance によって認識される物理カメラにマッピングします。
  • 許容可能なしきい値、ログレベルなど、アプリケーション固有の入力を入力します。

IAM ポリシーの例を次に示します。

AWSTemplateFormatVersion: '2010-09-09'
説明: AWS Panorama application のリソース。
Resources:
  runtimeRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - panorama.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: cloudwatch-putmetrics
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action: 'cloudwatch:PutMetricData'
                Resource: '*'
      Path: /service-role/

次の 6 つのスクリーンショットは、このプロセスをキャプチャします。

AWS Panorama - デプロイ 2 AWS Panorama デプロイ 1 AWS Panorama - デプロイ 3
AWS Panorama - デプロイ 4 AWS Panorama - デプロイ 5 AWS Panorama - デプロイ 5

デプロイには、コードのサイズと機械学習モデル、およびアプライアンスの使用可能な帯域幅に応じて、15~30 分かかります。最終的に、ステータスは緑色の「実行中」に変わります。

AWS Panorama - デプロイの完了

アプリケーションが AWS Panorama Appliance にデプロイされると、実行が開始され、継続的に動画を分析し、ミリ秒以内にローカルで高精度の予測を生成します。HDMI ケーブルを AWS Panorama Appliance に接続して出力をモニタリングすると、次のことがわかります。

AWS Panorama HDMI 出力

デプロイ中またはアプリケーションの使用中に何か問題が発生した場合、Amazon CloudWatch のログにアクセスできます。2 つのログストリームが作成されます。1 つは AWS Panorama Appliance 自体用で、もう 1 つはアプリケーション用です。

AWS Panorama Appliance ログ AWS Panorama アプリケーションログ

料金と可用性
AWS Panorama Appliance は、AWS コンソールの AWS Elemental 注文ページで購入できます。米国、カナダ、英国、および欧州連合から注文することができます。アプライアンス自体に 4,000 USD の 1 回限りの料金がかかります。

8.33 USD/月/カメラフィードの利用料金がかかります。

AWS Panorama は、AWS Panorama Appliance (機械学習モデルとビジネスロジックを含む) にデプロイされたすべてのアセットのバージョン管理されたコピーをクラウドに保存します。このストレージには、0.10 USD/GB/月が課金されます。

AWS Panorama Appliance にデプロイされたビジネスロジックが他の AWS のサービスを使用している場合は、追加料金が発生する場合があります。例えば、ビジネスロジックが機械学習予測をオフライン分析のために S3 にアップロードする場合、発生したストレージ料金については S3 によって別途請求されます。

AWS Panorama Appliance はどこでもインストールできます。アプライアンスは、米国東部 (バージニア北部)米国西部 (オレゴン)カナダ (中部) または、欧州 (アイルランド)、AWS リージョンの AWS クラウドの AWS Panorama サービスに接続します。

今すぐ最初のコンピュータビジョンモデルを構築しましょう

— seb

原文はこちらです。