AIコラムー第3回 DeepStreamSDKのサンプルアプリケーションのカスタマイズ(3/3)

今回は DeepStream SDK に付属されているYoloV3のサンプルアプリケーションをカスタマイズして、オープンソースのモデル(顔の物体検出)を適用したアプリケーションを作成したいと思います。

まずは、作業ディレクトリとして変数に以下のディレクトリを登録しておきます。

実環境にインストールした場合は以下を実施します。

$ export WORK_DIR=/opt/nvidia/deepstream/deepstream-4.0/sources/objectDetector_Yolo

dockerコンテナの場合は以下を実施します。

$ export WORK_DIR=~/deepstream_sdk_v4.0.2_jetson/sources/objectDetector_Yolo

Yolo V3のサンプルアプリケーションの実行

まずはカスタマイズのベースとなるYolo V3のサンプルアプリケーションを動かしてみましょう。

手順.1 作業ディレクトリに移動します。

$ cd ${WORK_DIR}

手順.2 トレーニング済みのモデルとコンフィグファイルをダウンロードします。

$ ./prebuild.sh

手順.3 フレームワークで対応されていない独自のビルドします。

$ cd nvdsinfer_custom_impl_Yolo
$ export CUDA_VER=10.0
$ make –j4

※Deepstream SDKでは、フレームワークで対応していない独自の処理を記載し、shared object形式で動的リンクすることが出来ます。Yolo V3は、この対応が必要なため、サンプルコードに含まれています。

手順4. Yolo V3のサンプルアプリケーションを実行します。

$ cd ${WORK_DIR}
$ deepstream-app -c deepstream_app_config_yoloV3.txt

サンプルアプリケーションは80クラスのオブジェクトを検出することができます。

どのような物体を検知するかは「labels.txt」ファイルの中に記載されています。

カスタマイズ

次にここまでに実行したYolo V3のサンプルアプリケーションをカスタマイズしていきます。

今回は以下でMITラインセンスのもと公開されているモデルを使用させて頂き、人間の顔を検出するようにアプリケーションをカスタマイズしようと思います。

https://github.com/sthanhng/yoloface

手順1. Yolofaceのチェックアウトをします。(チェックアウトするディレクトリはお任せします)

$ cd <path>/<to>
$ git clone https://github.com/sthanhng/yoloface.git

手順2. Yolofaceのモデルをダウンロードします。

$ cd <path>/<to>/yoloface/model-weights
$ bash get_model.sh

手順3. ダウンロードしたモデルとコンフィグファイルを作業ディレクトリにコピーします。

$ cp <path>/<to>/yoloface/model-weights/yolov3-wider_16000.weights ${WORK_DIR}
$ cp <path>/<to>/yoloface/cfg/yolov3-face.cfg ${WORK_DIR}

手順4. Deepstream SDKの設定ファイルを修正します。

以下4つのファイルの修正が必要になります。

ファイル名説明
deepstream_app_config_yoloV3.txtアプリケーションのパイプラインを定義する設定ファイルです。
config_infer_primary_yoloV3.txtPrimary Detector のプラグインの設定ファイルです。
labels.txtオブジェクト検出で検出されるラベル名を記述します。
nvdsinfer_custom_impl_Yolo/nvdsparsebbox_Yolo.cpp独自定義の処理を記載した実装です。
Deepstream SDKが対応していない機能などを自分で実装し、機能を追加することができます。

 それでは順番に修正をおこなって行きましょう。

 修正前の行をコメントアウト(# or //)の形にしておりますので、コメント前の行と一致する箇所を修正して下さい。

 - deepstream_app_config_yoloV3.txt の修正箇所

   ・変更点①

# model-engine-file=model_b1_int8.engine
model-engine-file=model_b1_fp16.engine

    ※ 詳細は後述の config_infer_primary_yoloV3.txt の修正で説明いたします。

   ・変更点②

# uri=file://../../samples/streams/sample_1080p_h264.mp4
uri=file: <顔が写っている動画ファイルのパス>

    ※ ここで指定した動画ファイルがアプリケーションの入力となります。

    カスタマイズの効果を確かめるために顔が映った動画をご用意下さい。

 - config_infer_primary_yoloV3.txt

    ・変更点①

# custom-network-config=yolov3.cfg
custom-network-config=yolov3-face.cfg

    ※ 顔の検出を行うモデルの設定ファイルの指定です。

     モデルを変更したため、顔の検出用のモデルの設定ファイルを指定しています。

    ・変更点②

# network-mode=1
network-mode=2

    ※モデルの最適化の設定値になります。

     0〜2 のモードが用意されており、0: FP32, 1: INT8, 2: FP16 モードの推論に対応いたします。

     デフォルトの INT8 のモードは一部の GPU でのみサポートされています。

     Jetson Nano は INT8 モードでの推論をサポートしていないため FP16 の指定に変更しています。

    ・変更点③

#num-detected-classes=80
num-detected-classes=1

    ※ 今回は顔の検出のみ行うモデルのため、クラス数は1となります。

   - labels.txt

   ・変更点①

face

     labels.txt のすべての行を削除した後、「face」の1行を追加して下さい。

      → 「顔」の1クラスだけを検出するモデルなので、「face」と1行だけ定義しています。

   - nvdsinfer_custom_impl_Yolo/nvdsparsebbox_Yolo.cpp

    ・変更点①

// static const int NUM_CLASSES_YOLO = 80;
static const int NUM_CLASSES_YOLO = 1;

   ※ クラス数の変更に伴い、独自機能の実装の中にもクラス数に依存する処理があるので修正を行います。

手順.5 カスタマイズしたアプリケーションを実行します。

$ cd ${WORK_DIR}
$ deepstream-app -c deepstream_app_config_yoloV3.txt

如何でしょうか?Deepsteram SDKで独自のモデルの適用が体験出来たかと思います。

NSKでは、こういったアプリケーションの開発、独自プラグインの実装などを行っております。

興味がある方は、お問い合わせフォームより、ご連絡頂ければと思います。

最後までお読み頂きありがとうございました。

カテゴリ一覧

お問い合わせ

名古屋本社

東京本社

【受付時間】9:00~18:00

pagetop

お客様のお悩み承ります。