NVIDIA DeepStream SDKは、DeepLearningを用いた動画認識用のSDKで、物体認識や動画像処理などを高速に行うことができます。Jetson向けにも配布をしており、下記リンクからダウンロードすることができます。

ダウンロードしたファイルには、サンプルコードがいくつか入っていますが、自分でカスタマイズをする際に、概要を理解しておく必要があるかと思い、まとめてみました。

まずは、DeepStream SDKを扱うにあたり、欠かせないのがGStreamerです。DeepStream SDKはGStreamerにプラグインを提供しており、c言語で書かれたサンプルコードもGStreamerを前提に組まれているためです。

GStreamerとは?

GStreamerとは、オープンソースのマルチメディア処理ソフトウェアです。音声・動画などのマルチメディアを入力し、変換・切り抜きなどの処理をした後、ファイルやストリーミング等で出力することができます。

ffmpegとの違い

マルチメディア処理のソフトウェアというとffmpegをまず最初に思い浮かべる方も多いかと思います。

概ね「ffmpegに似たようなもの」という理解で良いとは思いますが、ffmpegと比べた時の利点としては、「GStreamerの方がプラグインが多く、カスタマイズ性が高い」という点かと思います。

ffmpegは単体でデコード/エンコード/フィルタリングなど、様々な機能を含んでいるのに対し、GStreamerが提供するのはフレームワークのみで、基本的にプラグインを入れないと何もできません。逆に、GStreamerの方がカスタマイズ性が高いとも言えそうです。

ffmpegはコマンドが簡易なので、パッと処理をしたい時には便利ですが、色々な機能を組み合わせて自前のマルチメディア処理ソフトウェアを構築する際はGStreamerの方が良いと考えられます。(現にDeepStream SDKもGStreamerにしかプラグイン提供していないので)

GStreamerの基本構造

GStreamerの基本構造は下記URLに記載されています。

oggプレイヤーの例

マルチメディアの処理はpipelineという一連の処理として表され、それぞれの要素をelementと呼んでいます。また、それぞれのelementの接続部分をpadと呼んでいて、src padから出力されたデータをsink padで受け取るようになっています。

上記のoggプレイヤーの例では、oggのファイルをsource elementが読み込み、ogg-demuxerが音声と動画に分解し、それぞれのdecoder elementがでコードを行い、スピーカーとディスプレイに出力されるというpipelineを示しています。

communication

また、src padとsink padでやりとりされているオブジェクトのことをbufferと呼んでいます。各elementからは処理の状態の情報などがアプリケーション側に送られますが、これをmessageと呼んでいます。

現在の再生時間やファイルの長さなどの情報を取得する際はqueryをアプリケーション側から投げると同期的にレスポンスが返却されます。

GstElementについて

GStreamerでは、各要素のことをGstElementと呼んでおり、pipeline、source、sinkなど全てGstElementによって表されます。

pipeline

全体の流れを作るGstElementです。このpipelineをまず作成した上で、各処理をこのpipelineに追加していき、pipelineを開始することでストリーム処理が開始されます。

source element

source element

マルチメディアのインプットになります。データの受け入れは行わず、生成のみを行います。例えば、Webカメラからのデータ読み込み・動画ファイルの読み込み等を行うことが可能です。

filter

filter

filterはその名の通り、入れたデータを変換した上で次に渡すGstElementになります。例えば、動画形式の変換・画角の変換・カラーコード変換等の処理を行うことが可能です。

demuxer

demuxer

demuxerは1つのインプットに複数のマルチメディア要素が含まれている場合に分けてくれるGstElementです。例えば、動画ファイルを読み込んだ際、音声データと動画データに分けることが可能です。

sink

sink

sinkは処理後のマルチメディアをどのようにアウトプットするかを定義するGstElementです。例えば、ファイル保存・ウィンドウで再生・RTSPによるストリーミング配信などのアウトプットをすることが可能です。

DeepstreamGstreamerJetson nano

Related Posts

ArduinoとCAN-BUSシールドでCAN通信
ArduinoとCAN-BUSシールドでCAN通信
概要 CAN(Controller Area Network) はドイツのBOSCH社が開発したシリアル通信プロトコルです。信頼性が高く、主に自動車の制御システムに用いられていましたが、最近はIoT、ロボット台車などでもCAN通信を使...
Read More
ROSパッケージ紹介 | depthimage_to_laserscanでデプスカメラ情報からscanトピックを発行
ROSパッケージ紹介 | depthimage_to_laserscanでデプスカメラ情報からscanトピックを発行
概要 gmappingなどの多くのマップ生成パッケージでは、sensor_msgs/LaserScanの型のトピックを受信することが多いと思います。そのような時に、scanを発行できるデバイスはLidarなどがありますが、Lidarを...
Read More
Arduinoでカラーセンサーを使って色を識別する
Arduinoでカラーセンサーを使って色を識別する
概要 物体の光の反射率を測定するフォトリフレクタは、発光素子と受光素子が配置されていて光を物体に反射させてその強度を測定することで、物体の存在確認や白黒パターンの検出などをすることができます。 光を検出できるセンサーは色々な種類があり...
Read More

サイトについて

RoboStationは誰でも手軽にロボットを製作できるようにすることを目的としたEC・ハウツーサイトです。