- DeepStreamとは何か
- DeepStreamでアプリケーションを構築する手段
DeepStreamとは
DeepStreamとは、
です。
DeepStreamでは動画ストリームをパイプライン処理することで高速化を実現しています。
出典:nvidia公式サイト
より具体的に説明すると、DeepStreamはモジュラープラグインを接続していき処理パイプラインを形成していきます。
モジュラープラグインは機能単位に分かれていて、
- ファイルからデータを読み込む「GstFileSrc」
- ディープラーニングの推論を行う「Gst-nvinfer-TensorRT」
など様々なプラグインが存在します。
プラグインの詳細はこちらのマニュアルに記載されています。
また、DeepStreamに関するドキュメントはこちらにまとまっています。
DeepStreamを構成する技術
DeepStreamは主に以下の2つの技術から構成されています。
GStreramer
GStreramerは、動画ストリームを処理パイプライン処理するためのフレームワークです。
動画や画像を高速に処理することができるので、エッジデバイスやリアルタイムで画像処理をする場合にはよく使われます。
GStreamerの詳細については公式ドキュメントを参照してください。
DeepStreamはGStreamerをベースに作られていて、DeepLearningの推論部分を新たに追加されています。
TensorRT
TensorRTは、ニューラルネットワークの推論を高速で実行するためのランタイムエンジンです。
事前に学習されたディープラーニングのモデルを効率的に実行することを重視して作られています。
DeepStreamでは、Gst-nvinferプラグインでTensorRTが実装されています。
DeepStreamを使ったアプリケーションの作成方法
DeepStreamでアプリを作成する方法には2種類あります。
それぞれの手法の概要はこちらの公式ドキュメントに記載されています。
deepstream-app
deepstream-appでは予め用意されたリファレンスアプリケーションを使って(変更して)、deepstreamのアプリケーションを作成する方法です。
そのため比較的簡単に実装することができます。
リファレンスアプリケーションでは、入力ソースを受け取り(GstFileSrc)、デコードして、DeepLearningの解析(Gst-nvinfer-TensorRT)し、検出物を追跡(Gst-nvtracker)し、描画(Gst-nvdsosd)して、画面に表示するというようにプラグインの順番が事前に決められています。
リファレンスアプリケーションの各プラグインのON/OFFや動作のカスタマイズを設定ファイルで行うことでアプリケーションの開発を行います。
そのため、プラグインにない独自の処理を追加することはできません。
(※ただし、プラグインのソースを書き換えることで独自の処理を無理やり実装することはできます。)
deestream-appのリファレンスアプリケーションのソースファイルとコンフィグファイルはそれぞれ以下のパスに格納されています。
ソースファイル | /opt/nvidia/deepstream/deepstream-5.1/sources/apps/sample_apps/deepstream-app |
コンフィグファイル | /opt/nvidia/deepstream/deepstream-5.1/samples / configs / deepstream-app |
リファレンスアプリケーションのコンフィグファイルの詳細については、こちらの公式サイトにまとめられています。
C / C ++およびPythonでのアプリケーション開発
Cやpythonをでアプリケーション開発することもできます。
こちらの方法では、用意されているプラグインとapiを組み合わせてアプリを作るので、プラグインを任意の順番にして独自のストリームを作成することができます。
また、処理の途中でコールバック関数を呼び出すこともできるので任意の処理もさせることも可能です。
apiリファレンスはこちらにあります。
DeepstreamのC / C ++のアプリケーションのサンプルは以下に格納されています。
/opt/nvidia/deepstream/deepstream-5.0/sources/apps
pythonでのアプリケーション開発には、deepstream_python_appsが必要になります。
出典:Nvidia公式サイト
python版のapiリファレンスはこちらになります。
DeepStreamのプラグイン
DeepStreamで提供されている代表的なプラグインを載せておきます。
プラグインのマニュアルはこちらあります。
プラグイン名 | 役割 |
GstFileSrc | ファイル(ビデオデータまたは画像)からデータを読み取ります。 |
GstH264Parse | 着信H264ストリームを解析します。H265コーデックの場合は、H265Parseを使用します。 |
GstRtpH264Pay | H264でエンコードされたペイロードをRTPパケットに変換します |
GstUDPSink | UDPパケットをネットワークに送信します。RTPローダー(GstRtpH264Pay)と組み合わせると、RTPストリーミングを実装できます。 |
GstCapsFilter | データを変更せずにデータ形式に制限を適用します。 |
GstV4l2Src | v4l2デバイスからビデオをキャプチャします。 |
GstQTMux | ストリーム(オーディオとビデオ)をQuickTime(.mov)ファイルにマージします。 |
GstFileSink | 受信データをローカルファイルシステム内のファイルに書き込みます。 |
GstURIDecodeBin | URIからrawメディアにデータをデコードします。指定された「uri」スキームを処理できるソース要素を選択し、それをデコードビンに接続します。 |
Gst-nvstreammux | AI推論のために送信する前にストリームをバッチ処理します。 |
Gst-nvinfer | TensorRTを使用して推論を実行します。 |
Gst-nvvideo4linux2 | ハードウェアアクセラレーションデコーダー(NVDEC)を使用してビデオストリームをデコードします。ハードウェアアクセラレーションエンコーダ(NVENC)を使用して、RAWデータをI420形式でH264またはH265出力ビデオストリームにエンコードします。 |
Gst-nvvideoconvert | ビデオカラーフォーマット変換を実行します。Gst-nvdsosdプラグインがストリームデータをI420からRGBAに変換する前の最初のGst-nvvideoconvertプラグインと、Gst-nvdsosdプラグインがデータをRGBAからI420に変換した後の2番目のGst-nvvideoconvertプラグイン。 |
Gst-nvdsosd | バウンディングボックス、テキスト、および関心領域(ROI)ポリゴンを描画します。 |
Gst-nvtracker | フレーム間でオブジェクトを追跡します。 |
Gst-nvmultistreamtiler | バッチバッファから2Dタイルを合成します。 |
Gst-nvv4l2decoder | ビデオストリームをデコードします。 |
Gst-Nvv4l2h264enc | ビデオストリームをエンコードします。 |
Gst-NvArgusCameraSrc | ArgusAPIを使用してISPプロパティを制御するオプションを提供します。 |
標準のプラグインにない機能は、C++を使って独自のプラグインを作ることでオリジナルの処理を作成することができます。
オリジナルプラグインのサンプル以下のパスに用意されています。
/opt/nvidia/deepstream/deepstream-5.0/sources/gst-plugins
まとめ
DeepStreamとは、ビデオなどのデータをDeepLearningで効率よく解析するためのソフトウェアです。
DeepStreamでは動画ストリームをパイプライン処理することで高速化を実現しています。
DeepStreamはTensorRTとGStreramerを元に構成されています。
コメント