AI

日本システム開発株式会社からAIに関するコラムをお届けします。

推論システム開発に2017年から携わっている実績に基づき、様々な情報を発信しています。

日本システム開発の技術、
覗いてみませんか。

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}
  1. トレーニング済みのモデルとコンフィグファイルをダウンロードします。
$ ./prebuild.sh
  1. フレームワークで対応されていない独自のビルドします。

$ cd nvdsinfer_custom_impl_Yolo

$ export CUDA_VER=10.0

$ make –j4

※Deepstream SDKでは、フレームワークで対応していない独自の処理を記載し、shared object形式で動的リンクすることが出来ます。

 Yolo V3は、この対応が必要なため、サンプルコードに含まれています。

  1. 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

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

$ cd <path>/<to>/yoloface/model-weights

$ bash get_model.sh

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

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

$ cp <path>/<to>/yoloface/cfg/yolov3-face.cfg

${WORK_DIR

  1. 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;

※ クラス数の変更に伴い、独自機能の実装の中にもクラス数に依存する処理があるので修正を行います。
  1. カスタマイズしたアプリケーションを実行します。

$ cd ${WORK_DIR}

$ deepstream-app -c deepstream_app_config_yoloV3.txt

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

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

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

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

■関連サービス

AIソリューション

オープンソースを活用したAIのシステム構築・開発を支援!

車両ナンバープレート検知全国版

車両のナンバープレートをAIが検知・処理!全国のナンバープレートに対応!

人数カウントBODY_ロゴ

カメラ撮影した映像から指定領域内の滞在人数をAIが認識!

人数カウントHEAD_ロゴ

密集した空間から指定領域内の滞在人数をAIが認識!

ラインクロスカウント

来店人数のカウントや通行量調査などを自動化!

pagetop