リアルタイム・ストリーム分析のデモ

概要

このデモでは、OpenVINO モデルサーバーを使用して AI 分析を実行するアプリケーションを作成する方法を示します。ビデオ分析では、さまざまな形式のソースコンテンツを処理できます。ここでは、ローカル USB カメラ、保存されたエンコード済みのビデオファイル、およびエンコード済みのビデオストリームからビデオのソースを取得する方法を説明します。

クライアント・アプリケーションはビデオソースを読み取り、分析のため gRPC 接続を介してすべてのフレームを OpenVINO モデルサーバーに送信することが期待されます。MediaPipe グラフまたは DAG を介して配置された完全な処理パイプラインを使用して、分析をモデルサーバーのエンドポイントに完全に委任できます。リモート分析を推論の実行のみにすることもできますが、その場合、ビデオフレームの前処理と結果の後処理をクライアント側で実装する必要があります。

このデモでは、OpenCV ライブラリーを使用して、ローカル USB カメラとエンコードされたビデオファイルからビデオコンテンツを簡単に読み取ることができます。エンコードされたネットワーク・ストリームでは、さらに説明が必要な場合があります。サーバー・コンポーネントによって転送され、FFMPEG ユーティリティーを使用してエンコードされた RTSP ストリームを使用します。

以下に構成を示します

rtsp

以下で説明するすべてのクライアント・シナリオでは、前述の 3 つのソースから入力コンテンツを読み取り、結果を 3 つのデスティネーションに送信できます: ローカル画面、エンコードされたビデオファイル、または RTSP 出力ストリーム。

デモでは、シナリオに応じて 2 つの gRPC 通信パターンが使用されます。

  • gRPC ストリーミング - MediaPipe グラフ、特にステートフル分析に推奨

  • gRPC 単項呼び出し - DAG グラフでの推論のみに推奨

要件

  • クライアント側は、Windows*、macOS*、Linux* のいずれかになります。RTSP クライアントのシナリオでは、FFMPEG をインストールする必要があります。Python3.7 以降が必要です。

  • サーバーは、Linux*、MacOS* (x86_64 アーキテクチャー CPU のみ)、または Windows* の WSL 内にデプロイできます。

  • gRPC 経由で送信される画像はエンコードされないため、クライアントとサーバー間のネットワーク接続が良好であることが求められます。高速でのリアルタイム・ビデオ分析には少なくとも 100Mb/秒が必要です。

MediaPipe グラフを使用した gRPC ストリーミング

gRPC ストリーム接続は、提供される MediaPipe グラフに対して許可されます。これにより、単一のセッション・コンテキストでリンクされたエンドポイントに非同期呼び出しを送信できるようになります。応答はストリーム経由で返信され、コールバック関数で処理されます。ヘルパークラス StreamClient は、フロー制御と、要求と応答のシーケンス追跡メカニズムを提供します。StreamClient の初期化では、ストリーミング・モードは streaming_api=True パラメーターによって設定されます。

ストリーミング API を使用すると、次の利点があります。

  • 非同期呼び出しと複数の呼び出しのグラフ実行の共有による優れたパフォーマンス

  • 応答が要求シーケンスに依存する場合のオブジェクト追跡などのステートフル・パイプラインのサポート

総合的なグラフを使用した gRPC ストリーミング用のモデルサーバーの準備

総合グラフは入力に IMAGE オブジェクトを期待し、出力で IMAGE を返します。そのため、前処理や後処理は必要ありません。このデモでは、返されたストリームは視覚化されるか、ターゲットシンクに送信されるだけです。

総合的なユースケースを備えたモデルサーバーは、次の手順でデプロイできます。

git clone https://github.com/openvinotoolkit/model_server.git
cd model_server/demos/mediapipe/holistic_tracking
./prepare_server.sh
docker run -d -v $PWD/mediapipe:/mediapipe -v $PWD/ovms:/models -p 9000:9000 openvino/model_server:latest --config_path /models/config_holistic.json --port 9000

このユースケースの詳細を確認してください。

注: 入力および出力に画像を含むすべてのグラフは、クライアント・アプリケーションに変更を加えることなく適用できます。

リアルタイム・ストリーム分析を使用してクライアントを開始

依存関係をインストールして、Python 環境を準備します。

cd ../../real_time_stream_analysis/python/
pip install -r ../../common/stream_client/requirements.txt

RTSP クライアントを使用する場合、ホストに FFMPEG コンポーネントもインストールします。

あるいは、次のコマンドを使用してクライアントで Docker イメージをビルドします。

docker build ../../common/stream_client/ -t rtsp_client

クライアント・パラメーター:

python3 client.py --help
usage: client.py [-h] [--grpc_address GRPC_ADDRESS]
                      [--input_stream INPUT_STREAM]
                      [--output_stream OUTPUT_STREAM]
                      [--model_name MODEL_NAME] [--input_name INPUT_NAME]
                      [--verbose] [--benchmark]
                      [--limit_stream_duration LIMIT_STREAM_DURATION]
                      [--limit_frames LIMIT_FRAMES]

options:
  -h, --help            show this help message and exit
  --grpc_address GRPC_ADDRESS
                        Specify url to grpc service
  --input_stream INPUT_STREAM
                        Url of input rtsp stream
  --output_stream OUTPUT_STREAM
                        Url of output rtsp stream
  --model_name MODEL_NAME
                        Name of the model
  --input_name INPUT_NAME
                        Name of the model's input
  --verbose             Should client dump debug information
  --benchmark           Should client collect processing times
  --limit_stream_duration LIMIT_STREAM_DURATION
                        Limit how long client should run
  --limit_frames LIMIT_FRAMES
                        Limit how many frames should be processed

ローカルカメラからの読み取りと画面上の視覚化

python3 client.py --grpc_address localhost:9000 --input_stream 0 --output_stream screen

--input_stream 0 パラメーター は、カメラ ID 0 を示します。

エンコードされたビデオファイルから読み取りと結果をファイルに保存

wget -O video.mp4 "https://www.pexels.com/download/video/3044127/?fps=24.0&h=1080&w=1920"
python3 client.py --grpc_address localhost:9000 --input_stream 'video.mp4' --output_stream 'output.mp4'

RTSP ストリームを使用した推論

rtsp クライアント・アプリは、読み書きするために RTSP ストリームにアクセスできる必要があります。以下は、video.mp4 とコンテンツソースを使用してそのようなストリームをシミュレートする手順です。

rtsp サーバー mediamtx の例:

docker run --rm -d -p 8080:8554 -e RTSP_PROTOCOLS=tcp bluenviron/mediamtx:latest

次に、ffmpeg を使用してサーバーに書き込みます (例: ビデオまたはカメラを使用)。

ffmpeg -stream_loop -1 -i ./video.mp4 -f rtsp -rtsp_transport tcp rtsp://localhost:8080/channel1
ffmpeg -f dshow -i video="HP HD Camera" -f rtsp -rtsp_transport tcp rtsp://localhost:8080/channel1

RTSP ストリームがアクティブである間、クライアントを実行してストリームを読み取り、出力ストリームを送信します。

python3 client.py --grpc_address localhost:9000 --input_stream 'rtsp://localhost:8080/channel1' --output_stream 'rtsp://localhost:8080/channel2'

結果は、変更されたコンテンツを読み取って表示する ffplay ユーティリティーで確認できます。

ffplay -pixel_format yuv420p -video_size 704x704 -rtsp_transport tcp rtsp://localhost:8080/channel2

gRPC 単項呼び出しの使用

ヘルパークラス StreamClient は、単項 gRPC 呼び出しをサポートします。その場合、streaming_api=False パラメーターで初期化する必要があります。フレームはモデルサーバーに非同期で送信されますが、それぞれのフレームはステートレスであり、各要求は独立して処理できます。このモードの主な利点は、各要求をモデルサーバーの異なるインスタンスまたは異なる計算ノードにルーティングできるため、負荷分散とスケーラビリティーが容易になることです。

このドキュメントに基づいて、水平テキスト分析を使用した単項呼び出しを追跡できます。

注: 出力形式によっては、カスタムの後処理関数が必要になる場合があります。