Jetson nanoで、オリジナルの学習モデルを使った物体検出[5/5]  〜Jetson nanoを使った物体検出〜

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

はじめに

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

これを実現する方法を5回に分けて記事を記載してきましたが、今回はいよいよ最終回です!!

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

第5回:学習モデルの変換と物体検出

前回はDeep Stream SDKに添付されている学習済モデルを使って物体検出をやってみました。しかし、Deep Stream SDKに添付されている学習モデルは4種類の物体しか検知できません。今回は、90種類の物体を検出可能な、COCOデータセットを使った学習済モデルであるSSD Mobilenet v2 cocoによる物体検出の方法と、第2回でGoogle Colabで作成したオリジナルの学習モデルを使った物体検出の方法をご紹介します。

SSD_mobilenet_v2を使った物体検出

まずは、SSD Mobilenet v2 cocoを使って物体を検知してみたいと思います。

①SSD Mobilenet v2 cocoのダウンロード

まずは、SSD Mobilenet v2 cocoのモデルをダウンロードします。ちなみに学習済のモデルは「Model Zoo」と呼ばれていて「TensorFlow 1 Detection Model Zoo」のサイトから、ダウンロード可能です。

②アーカイブの解凍

ダウンロードが完了したら、tar.gzアーカイブを解凍します。frozen_inference_graph.pbなど、オリジナルの学習モデルを作成した時と同じようなファイルがありますね。解凍したらディレクトリを移動します。

③uff変換用configファイルの作成

Tensorflowのpbファイルは、そのままではJetson nanoのTensorRTでは利用できません。このため、pbファイルをTensorRT用のuffファイルに変換する必要があります。この変換に必要な設定ファイル「config.py」を以下のように作成します。この内容はNVIDIA Developper Forumのココで紹介されているものです。

④uffファイルへの変換

config.pyが作成できたら、NVIDIA版Tensorflowに含まれる「convert_to_uff.py」を使って以下のように、pbファイルをuffファイルに変換します。私はここでつまずいて2週間ぐらい悩みました💦

⑤nvinfer_custom_implのコピー

次にSSDモデル用のnvinferカスタムプラグインを作成します。カスタムプラグインといっても、NVIDIAのサンプルをそのまま使います。まずは、NVIDIAのソースをコピーします。コピーしたソース内の「objectDetector_SSD」ディレクトリにnvinfer_custom_implが入っています。

⑥nvinfer_custom_implのビルド

次にnvinfer_custom_implをビルドします。なお、ビルドには「CUDA_VER」環境変数が必要なので、設定してからビルドします。うまくビルドできると「libnvdsinfer_custom_impl_ssd.so」が作成されます。

作成された「libnvdsinfer_custom_impl_ssd.so」を、uffファイルと同じディレクトリにコピーします。

⑦ラベルファイルの作成

次に、検出物体の名前が記載されたラベルファイルを作成します。COCOモデルのラベル一覧は、ここからダウンロードできます。ただし1行目は「Undefined」にしないとダメらしいので、1行目に「Undefined」を追加します。

⑧nvinfer設定ファイルの作成

nvinferの設定ファイル「config_infer.txt」を以下のように作成します。このファイルの中に、ここまでで用意した3つのファイル(uff、so、ラベル)のパス記載します。ちなみに、model-engine-fileは自動生成されるので、この時点でファイルはなくてOKです。

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

最後にDeep Streamアプリ用の設定ファイル「app_config.txt」を作成します。config-fileの部分がポイントですね。[source0]や[sink0]は前回の記事を参考に、カスタマイズして下さい。

⑩必要ファイルの確認

ここまでの手順を完了すると、以下の5個ファイルがあると思いますので、確認しましょう!!

11.DeepStreamアプリの実行

それでは、DeepStreamアプリを実行して物体検出できるかテストしてみましょう‼️

以下が物体検出結果の動画です。車も人もバスも検出できています‼️

以上でSSD Mobilenet v2 cocoを使った物体検出は完了です。

オリジナルモデルを使った物体検出

ここからは、IBM Cloud Annotationsを使ってアノテーションし、Google Colabを使って学習したオリジナルモデルを使った物体検出をやっていきます。手順はSSD Mobilenet v2の場合と同じですが、オリジナルモデルは検出できる物体の数が違うので、この部分を変更する必要があります。

①モデルファイルのアップロード

まずは、作業ディレクトリ「myModel」を作成して、Google Colabで作成したモデルをアップロードして解凍しましょう。またテスト用の動画ファイル「input.mp4」もアップロードしましょう。

②必要ファイルのコピー

SSD Mobilenet v2 cocoの時に作成した「config.py」「app_config.txt」「config_infer.txt」ファイルと「sources」ディレクトリをコピーします。

③uff変換用configファイルの編集

まずは「config.py」の23行目に記載の「numClasses=91」の記述を「numClasses=3」に変更します。この「3」という数字はラベルの数+1の値です。オリジナルモデルでは「Untitled Label」と「flower」の2つのラベルを定義しているので「3」となります。

また、オリジナルのモデルには「Cost」オペレーションが入ってしまいエラーとなるので、「config.py」の最終行に「Cast」オペレーションを削除するための2行を追加します。

④uffファイルへの変換

「config.py」の編集ができたら、pbファイルをuffファイルに変換します。

⑤nvinfer_custom_implの編集

次にnvinfer_custom_implを編集します。「sources/objectDetector_SSD/nvdsinfer_custom_impl_ssd/nvdsparsebbox_ssd.cpp」の52行目にある「NUM_CLASSES_SSD = 91;」を「NUM_CLASSES_SSD = 3;」に書き換えます。

⑥nvinfer_custom_implのビルド

書き換えたらビルドして「libnvdsinfer_custom_impl_ssd.so」を再作成し、これをuffファイルと同じディレクトリにコピーします。

⑦ラベルファイルの作成

次に、ラベルファイル「mylabels.txt」をuffファイルと同じディレクトリに作成します。以下のような感じですね。

⑧nvinfer設定ファイルの編集

ラベルファイルの名称を変更したので「config_infer.txt」のラベルファイル名を変更します。また、インプット動画のファイル名も変更しましょう。

⑨アプリの設定ファイルの編集

アプリ設定ファイル「app_config.txt」への変更は、入力する動画のファイル名の変更のみで大丈夫です。

⑩必要ファイルの確認

以上の作業により、以下の6つのファイルが揃っていることを確認します。

11.DeepStreamアプリの実行

それでは、この連載の最終目的であるオリジナルモデルを使った物体検出の実行です!以下のようにして、DeepStreamアプリを起動しましょう‼️‼️

以下が物体検出を行なった動画です。ちゃんと「ひまわり」が検出されています!!感動ですね😭

ちなみに、物体がうまく検出できない場合は、信頼度の値「app_config.txt」の「threshold」の値を下げてみると、信頼度の低い物体も四角の枠がつくので、調整してみてください。

おわりに

今回は、SSD Mobilenet v2 cocoとオリジナルのモデルを使って、Jetson nanoで物体検出ができるようにしてみました。TensorflowのモデルをTensorRTのモデルに変換するところで、何度もくじけそうになりましたが、ようやくできるようになったので、ここにまとめました。Tensorflowは、開発が盛んでバージョンアップの度に色々変わるので、Tensorflowのバージョンをしっかり合わせるのがポイントかと思います。

関連記事

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

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

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

コメント

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