Jetson nanoで、オリジナルの学習モデルを使った物体検出[4/5]  〜DeepStreamアプリを使いこなす〜

スマートホーム
スポンサーリンク
このエントリーをはてなブックマークに追加

はじめに

オリジナルモデルを使った物体検出をJetson nanoで行うべく、以下を実現しようとしています。

これを実現するために、5回に分けて記事を記載予定で、今回は4つ目の記事です。

 第1回:IBM Cloud Annotationsを用いたアノテーション
 第2回:Google Colabを用いたモデルの学習
 第3回:Jetson nanoの環境構築
 第4回:DeepStreamアプリを使いこなす ←この記事
 第5回:学習モデルの変換と物体検出

第4回:DeepStreamアプリを使いこなす

前回は、Jetson nanoにJetPackを使ってOSをインストールし、DeepStreamを動作させる環境を準備しました。今回は、DeepStreamのアプリケーションであるdeepstream-appを使えるようにします。さらに、出力形式を動画ファイルやネットワーク経由で送る方法や、入力をカメラにする方法などdeepstream-appの様々な使い方をご紹介します。

カメラの設定

まずは、DeepStreamアプリを使う前に、Jetson nanoにカメラを接続して、カメラの動作確認をします。

①カメラの接続

まずは、Jetson nanoにカメラを接続します。今回はUSB接続のカメラでしたので、Jetson nanoのUSB3.0ポートに挿すだけです😊

②dmesgの確認

カメラを接続したら「dmesg」コマンドを使って、認識されているか確認します。ちゃんと「HD USB CAMERA」として認識されていますね。

③lsusbで確認

次にlsusbで確認します。メーカ名の部分が空白ですが「32e4:0317」というのがカメラっぽいです(笑)

④v4l2で確認

次に、v4l2ドライバーからカメラが認識できているか「v4l2-ctl –list-devices」コマンドで確認します。以下のように「/dev/video0」で認識されていることが確認できます。

⑤利用可能なフォーマットと解像度の確認

次に、「v4l2-ctl –list-formats-ext」コマンドを使って、カメラで利用可能なフォーマットと解像度を確認します。私が使ったカメラはMJPGとYUYVフォーマットに対応しており、複数の解像度に対応していることが確認できます。この情報は後で使うので、テキストエディタなどにメモしておきましょう。

⑥カメラ画像の確認

それでは、接続したカメラの画像を確認してみましょう!もっと簡単に確認する事もできますが、今回はGstreamerの動作確認も兼ねてGstreamerを使って画面に表示してみます。

うまく行くと以下のように、画面にカメラの映像が表示されます。

以上で、カメラの設定は完了です。

DeepStreamアプリによる物体検出

ここからは、DeepStreamのアプリを使って物体検出を行なっていきます。DeepStreamのアプリは以下のような構成になっており、Gstreamerのパイプラインを組み合せて作られています。

この図は、後の設定ファイルの内容を理解するのに、非常に重要ですので、頭の片隅に入れておきましょう。そして、この図の中の「PRIMARY DETECTOR」が物体検出を行う処理であり「Gst-nvinfer」プラグインによって実装されています。

出典 https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_ref_app_deepstream.html

①作業用ディレクトリの作成

まずは、今回の作業用ディレクトリを作成しましょう。今回は「deepstream」という名前のディレクトリを作成します。

②サンプルモデルのコピー

次に、DeepStream SDKに付属している学習済モデル「Primary_Detector_Nano」を作業ディレクトリにコピーします。ちにみに、DeepSteamの各種ファイルは「/opt/nvidia/deepstream/deepstream-5.0/」に格納されています。

③Gst-nvinfer設定ファイルのコピー

次に、Gst-nvinferプラグイン用の設定ファイル「config_infer_primary_nano.txt」をサンプルディレクトリからコピーします。

④Gst-nvinfer設定ファイルの編集

次に、作業ディレクトリに戻り「config_infer_primary_nano.txt」の63〜66行目の「Primary_Detector_Nano」のファイルパスを今回のディレクトリ構成に合わせて書き換えます。

「config_infer_primary_nano.txt」の63〜66行目の書き換え後は、以下のようになります。

⑤アプリの設定ファイルの作成

次に、DeepStreamアプリ用の設定ファイル「test_disp.txt」を作成します。

「test_disp.txt」の記述内容は、以下をコピペして下さい。

このファイルは非常に重要なので、ポイントを解説しておきます。まず5〜12行目の設定が、画面に何個の映像の表示を行うかの設定です。今回は1つあれば十分なので、rowsもcolumnsも1を設定します。また、画面の解像度も設定します。

14〜20行目が入力の設定です。まずはDeepStreamSDKに付属のサンプルmp4ファイルを指定しています。また、22〜30行目は、出力の設定です。まずは、画面に表示してみます。

そして、57〜70行目が本題の物体検出を行うGst-nvinferの設定です。ここのポイントは、上で編集した「config_infer_primary_nano.txt」を指定していることです。また、60行目のmodel-engine-fileの設定については、ファイルは存在しなくてOKです。存在しない場合はDeepStreamアプリが実行時に自動的に作成してくれます。

⑥アプリの実行

上の手順通りに行うと、作業フォルダ内は以下のようになっていると思います。

それでは、DeepStreamアプリを実行してみましょう❗️実行方法は、以下の通りです。上で作成した設定ファイルを「-c」オプションで指定して実行します。

アプリが動き出すと「Trying to create engine from model files」と表示され、学習済モデルからmodel-engine-fileの作成が開始されます。model-engine-fileの作成が完了すると、以下のように画面に動画が表示され、物体が検出できている様子が確認できます‼️

うまくいきましたか⁉️これの画面が出ると少し感動しますね‼️

DeepStreamアプリで色々試す

ここからは、DeepStreamアプリの設定ファイルを変更して、色々試してみたいと思います。

①ファイルに出力

1つ目は、出力結果を動画ファイルに出力する方法です。アプリの設定ファイルの[sink0]の部分を以下のように書き換えます。ポイントはtypeに「3」を設定して、container、codec、output-fileを指定する事です。

アプリを実行すると、out.mp4が作成されます。

out.mp4を再生してみると、以下のように物体検出の様子が記録されています。

②ネットワーク経由で送信

2つ目は、出力結果をネットワーク経由で送信する方法です。アプリの設定ファイルの[sink0]の部分を以下のように書き換えます。ポイントは、typeに「4」を設定して、rtsp-portとudp-portを指定する事です。また、一番下の[tests]の部分でfile-loop=1にしておくと、入力ファイルをループ再生してくれるので便利です。

アプリを実行すると、「rtsp://localhost:8554/ds-test」というURLが表示されます。

次にPCでVLC media playerを起動し、「ファイル」→「ネットワークを開く」を選択します。

URLの入力欄で「rtsp://<Jetson nanoのIPアドレス>:8554/ds-test」と入力して「開く」ボタンをクリックします。

すると、以下のように物体検出結果の動画がネットワーク経由で確認できます。Jetson nanoをヘッドレスで利用している場合には便利ですね。

③カメラを入力にする

3つ目は、Jetson nanoに接続したカメラを入力にしてみます。アプリの設定ファイルの[source0]の部分を以下のように書き換えます。ポイントは、typeに「1」を設定して、camera-v4l2-dev-node、camera-width、camera-height、camera-fps-nを指定する事です。ちなみに、DeepStreamアプリではMJPG形式での読み込みはサポートしていないようなので、上で調べたYUYV形式で対応している解像度とFPSを設定する必要があります。

実行すると以下のように、カメラを入力に物体検出を試すことができます。ちゃんと、車のおもちゃもCarとして認識されていますね!!

以上でDeepStreamアプリで色々試すは完了です。

おわりに

今回はJetson nanoに接続したカメラの動作確認を行なった後に、DeepStream SDKに付属のモデルを使って物体検出をやってみました。また、DeepStreamアプリの設定ファイルを色々変更して、出力形式や入力形式を変更することをやりました。次回は、いよいよ最終回。オリジナルのモデルを使った物体検出を行なってみたいと思います。

 第1回:IBM Cloud Annotationsを用いたアノテーション
 第2回:Google Colabを用いたモデルの学習
 第3回:Jetson nanoの環境構築
 第4回:DeepStreamアプリを使いこなす
 第5回:学習モデルの変換と物体検出  ←次回

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。
スポンサーリンク
naka-kazz

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム 開発者向け
naka-kazzをフォローする
育児×家事×IoT

コメント

タイトルとURLをコピーしました