Amazon Web Services ブログ

Amazon Kinesis Video Streams を用いた機械学習のためのパイプラインの構築

この記事は Building machine learning pipelines with Amazon Kinesis Video Streams を翻訳したものです。

はじめに

Amazon Kinesis Video Streams (KVS) は、コネクテッドデバイスから AWS にビデオを安全にストリーミングし、分析、機械学習 (ML) 、再生、その他の処理を簡単に行うことができるようにします。KVS は、数百万台のデバイスからストリーミングビデオデータを取り込むために必要なすべてのインフラを自動的に準備し、柔軟にスケールします。KVS は、ストリームのビデオデータを耐久性をもって保存、暗号化、インデックス化し、使いやすい API を通じてデータにアクセスできます。KVS は、ライブやオンデマンドでのビデオ再生、コンピュータビジョンやビデオ解析を活用したアプリケーションの迅速な構築を可能にします。2022年5月4日、KVS は、ビデオデータを分析し、顧客に実用的な洞察を提供するためのスケーラブルな機械学習パイプラインを容易に構築する新機能を発表しました。このブログ記事では、KVS に保存されているビデオデータを ML 処理に適した画像形式に変換するために必要なコンポーネントを設定する手順を説明します。

背景

今日、お客様は、ビジネス上の課題を解決するために、ビデオストリームに ML 機能を追加したいと考えています。これらの課題は、人やペットの検出から、製造における欠陥の特定などのドメイン固有の課題まで多岐にわたります。このプロセスにおける共通の要件は、動画を ML パイプラインに配信可能な画像形式に変換することです。画像生成機能の提供開始以前は、KVS に保存された動画を分析したいお客様は、動画を JPEG や PNG などの画像形式に変換するための計算リソースを構築、運用、拡張する必要がありました。AWS は、このソリューションをお客様が独自に構築できるように多くのサービスを提供していますが、ゼロから構築すると何週間もの労力が必要となり、結局は製品の差別化にはつながりません。

KVS は今回、3つの主要な機能を提供することでこの問題を解決します。

  1. マネージドな Amazon S3 への画像送信
  2. オンデマンド画像生成 API
  3. Amazon Simple Notification Service のキューへのストリームイベントの配信

このブログでは、マネージドな Amazon S3 への画像送信に焦点を当てます。その他の機能については、APIドキュメンテーションのページを参照してください。

ソリューションの概要

カメラデバイスからKVSサービスへのビデオの流れを示すハイレベルの図。KVS サービスは、ビデオを画像に変換して、 Amazon S3 に保存します。
注意:このソリューションを導入すると、AWSの請求に費用が発生します。価格の詳細については、価格ページを参照してください。

このソリューションの構築には、3つのコンポーネントが必要です。

Amazon S3 サービス

Amazon S3 サービスは、生成された画像を、タイムスタンプや関連する KVS フラグメント ID を含むメタデータとともに保存します。フラグメント ID は、画像生成に使用されたオリジナルのビデオデータを取得するために使用できます。

KVS C++ Producer SDK

KVS C++ Producer SDK は、GitHub で公開されているオープンソースの SDK です。この SDK の目的は、ビデオデータをフラグメントに分割し、そのフラグメントを KVS サービスに送信して、タイムインデックスを作成して保存することにあります。Producer SDK  は、フラグメントにタグを追加する putEventMetadata という名前のメソッドを提供します。このタグは、KVS サービスに画像を自動生成するよう通知するために使用されます。 SDK が提供するサンプルアプリケーションは、このメソッドを自動的に呼び出して、サービスの画像生成機能をテストします。注:KVS は Java および C 言語の Producer SDK を提供しており、これらの SDK でもこのタグ付けメソッドを提供しています。

KVS サービス

KVS サービスは、映像のタイムインデックスを作成し、顧客が設定した保存期間中、映像を保存します。KVS の各カメラは、一意の “ストリーム” として表現されます。KVS サービスの画像生成機能は、ストリーム単位で設定する必要があります。この設定には、画像出力形式(JPEG、PNG)、サンプリング間隔、画質、保存先 Amazon S3 バケットを含みます。

以下のステップでは、各コンポーネントの設定について説明します。さあ、はじめましょう!

ソリューションの構築

Amazon S3 バケットの作成

KVS の画像生成機能では、画像生成の設定の一部として、Amazon S3 バケットを指定する必要があります。Amazon S3 バケットは、KVS サービスを使用するのと同じ AWS リージョンに作成する必要があります。以下の例では、バケットを us-east-1 に指定しています。

aws s3 mb s3://sample-bucket-name --region us-east-1

KVS C++ Producer SDK のチェックアウトとコンパイル

注:このブログ記事では、Kinesis Video Streams C++ Producer SDK と Raspberry Pi を使用して、実機による画像生成のデモを行っています。KVS C++ Producer SDK に含まれるサンプルアプリケーションは、Mac、Windows、Linux でコンパイルすることが可能です。これらのプラットフォーム向けのビルド方法については、GitHub 上の readme の FAQ セクションを参照してください。

この手順は、Raspberry Pi 3 Model B Plus Rev 1.3 で、Raspberry Pi Camera V2.1 を使ってテストしました。Raspberry Pi には、イメージ 2022-01-28-raspios-bullseye-arhmf-lite.img を使用した Raspberry Pi OS “bullseye” を書き込みました。執筆時点(2022年5月20日)では、サンプルアプリケーションからカメラモジュールにアクセスするためには、raspi-config で Legacy Camera サポートを有効にする必要があります。

  1. 必要な依存関係のインストール
    sudo apt-get install pkg-config cmake m4 git
    sudo apt-get install libssl-dev libcurl4-openssl-dev liblog4cplus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools
  2. KVS C++ Producer SDK バージョン 3.3.0 のクローン
    git clone —branch v3.3.0 https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
  3. build ディレクトリの作成
    mkdir -p amazon-kinesis-video-streams-producer-sdk-cpp/build
    cd amazon-kinesis-video-streams-producer-sdk-cpp/build
  4. SDK とサンプルアプリケーションのビルド
    cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=OFF
    make

サンプルアプリケーションの IAM 認証情報の取得

SDK のビルド後、build ディレクトリに kvs_gstreamer_sample というバイナリがあるはずです。 このアプリケーションは、KVS の API にアクセスするために IAM 認証情報を必要とします。認証情報の権限は、以下のアクションを許可する必要があります。

“kinesisvideo:PutMedia”

“kinesisvideo:UpdateStream”

“kinesisvideo:GetDataEndpoint”

“kinesisvideo:UpdateDataRetention”

“kinesisvideo:DescribeStream”

“kinesisvideo:CreateStream”

“s3:PutObject”

権限情報を取得した後、kvs_gstreamer_sample を実行する前に、権限情報をエクスポートする必要があります。 次のセクションに例が示されています。

export AWS_ACCESS_KEY_ID=<your access key id>
export AWS_SECRET_ACCESS_KEY=<your secret access key>
export AWS_DEFAULT_REGION=<your region>

KVS サービスの設定

画像生成機能を有効にするための KVS サービスの設定は、3 つのステップで行います。

  1. 目的の AWS リージョンに KVS ストリームを作成します。
    aws kinesisvideo create-stream --stream-name <stream name> \
     --data-retention-in-hours 12 --region us-east-1

    このコマンドの例では、データ保持時間が12時間のストリームを作成します。 データは12時間後に自動的に削除されます。画像生成機能では、データの保持期間が0より大きいことが必要です。現在、設定可能な最小の保持期間は1時間です。

  2. 以下の JSON の <stream name>, <region name>, Amazon S3 <bucket name> を編集します。その他の設定項目については、KVS のドキュメントページを参照してください。この設定をファイル名 update-image-generation-input.json で保存します。
    {
        "StreamName": "<stream name>",
        "ImageGenerationConfiguration": {
            "Status": "ENABLED",
            "DestinationConfig": {
                "DestinationRegion": "<region name>",
                "Uri": "s3://<bucket name>"
            },
            "SamplingInterval": 3000,
            "ImageSelectorType": "PRODUCER_TIMESTAMP",
            "Format": "JPEG",
            "FormatConfig": {
                 "JPEGQuality": "80"
            },
            "WidthPixels": 320,
            "HeightPixels": 240
        }
    }
  3. AWS CLI を使用して、KVS サービスの画像生成機能を設定します。先の json ファイルを変更した場合は、この AWS CLI コマンドを再度呼び出してください。
    aws kinesisvideo update-image-generation-configuration \
    --cli-input-json file://update-image-generation-input.json

画像の生成

この時点で、Amazon S3 バケットを作成し、KVS C++ Producer SDK サンプルアプリケーションをコンパイルし、適切な認証情報を取得してお使いの環境にエクスポートし、KVS サービスを設定して画像を生成できるようになりました。

サンプルを実行し、第一引数に前項で作成したストリーム名を渡します。

./kvs_gstreamer_sample <stream name>

Amazon S3 のコンソールを開くと、目的の S3 バケットに画像が生成されているのが確認できるはずです。

S3 バケットに保存されているイメージのリストを表示する AWS S3 コンソールのスクリーンショット

まとめ

このブログ記事では、Kinesis Video Streams の画像生成機能を使用して、機械学習に使用できるパイプラインを構築する方法を紹介しました。Amazon S3 が画像を保存しているので、Amazon S3 イベント通知を使用して、独自の ML パイプラインを起動したり、Amazon Rekognition による分析を起動したりすることができます。この新機能をぜひ試してみてください。終了したらリソースを削除することを忘れないでください。Happy building!

この記事はソリューションアーキテクトの三平が翻訳しました。