NVIDIA Isaac Sim を用いて学習データをシミュレーションで作成し TAO Toolkit (Transfer Learning Toolkit) で学習
*2021年9月1日更新 : Transfer Learning Toolkit が TAO Toolkit とリネームされた際にコマンドも変更されたため関連する部分を更新
*2021年10月7日更新 : 別の USD で学習データを作成する方法を追記
背景
Deep Learning モデル作成の課題
Deep Learning のモデルを使用するには下記に上げられる課題があります。
- Deep Learning のモデルを十分な精度で学習するには大量のデータが必要
- モデルの推論速度を最適化しないと、速度が求められるケースで十分なパフォーマンスを発揮できない
- Deep Learning モデル作成には PyTorch や TensorFlow といった知識がないと作成できない
TAO Toolkit (以下: TAO) は上記の問題を解決することができます。詳細は後述します。 (Transfer Learning Toolkitからリネームされて TAO Toolkitになっています。)
学習データについて
学習用データ量の 1000 万対数スケールに比例して精度 (mean AP) が向上することが述べられています。
- 学習用データとして Google が保有する3億枚のラベル付き画像 (ラベルはノイズあり。約 20 % のエラーを含む) を活用し、学習に用いるデータ数を変えて学習 (モデルを作成)
- 学習後のモデルでオブジェクト検出 (object detection) を行った結果を比較 (本番用データには 2 種類のデータセット (COCO, PASCAL) を活用)
1000 万対数スケールでデータを準備することは現実的ではありません。対策として転移学習がありますが、転移学習ではドメインが違う場合 (例: 動物のデータで学習したモデルを産業用に使用するなど) は効果的に動作しません。
ドメインに適する事前学習済みモデルがなく、大量の教師データを準備できない場合はシミュレーションでデータを作成する方法があります。
シミュレーションで学習データを作成
シミュレーションでデータを作成するメリットは下記です。
- 無制限にラベル付きデータを作成
- コーナー/危険なケースのシナリオのデータ作成が可能
- 様々な設定でデータ作成が可能
しかしシミュレーションで作成したデータは現実データとの差異があります。
シミュレーションデータと現実データのギャップを埋める
3 つのアプローチがあります。
- ドメイン適応: 現実のデータを用意して、シミュレーションで学習したモデルを現実のデータで適応させる
- システム同定: シミュレーションをできるだけ現実に近づける
- ドメインランダマイゼーション: 多様なランダム化されたシミュレーションバリエーションを作成し、現実が Deep Learning にとって単なる異なるバリエーションと見なされるようにする
NVIDIA Isaac Sim とは
ロボットのシミュレーションを GPU を用いて容易にするソフトウェアです。NVIDIA Isaac Sim は NVIDIIA の Omniverse プラットフォーム上で動作します。
Omniverse に関しては下記の動画をご覧ください。
Omniverse で学習データを作成する際に重要な要素は RT コアによる反射光の再現です。ほとんどの CNN はテクスチャを認識するのですが、反射光が忠実に再現されるとテクスチャの表現が現実世界により近づくので、シミュレーションと現実世界のギャップが小さくなります。
NVIDIA Isaac Sim では現実世界のデータとシミュレーションの差分を埋めるために、ドメインランダマイゼーションを使用しています。
NVIDIA Isaac Sim に関する他の情報は下記をご覧ください。
- Omniverse を基盤とする NVIDIA Isaac Sim のオープン ベータ版をリリース | by 栃谷 宗央 (Muneo Tochiya) | NVIDIA Japan | Jul, 2021 | Medium https://medium.com/nvidiajapan/nvidia-isaac-sim-on-omniverse-now-available-in-open-beta-e62ee8bfec2f
NVIDIA では Meta Sim と呼ばれるドメインにあったシミュレーションを自動作成する手法やシミュレーションを現実のシーンに近づける研究をしています。これらの手法も将来的に NVIDIA Isaac Sim に導入されることが期待されます。
- Meta Sim: NVIDIA Research at ICCV: Meta-Sim: Learning to Generate Synthetic Datasets | NVIDIA Developer Blog https://developer.nvidia.com/blog/nvidia-at-iccv-meta-sim-learning-to-generate-synthetic-datasets/
- シミュレーションを現実のシーンに近づける研究: NVlabs/MUNIT: Multimodal Unsupervised Image-to-Image Translation https://github.com/NVlabs/MUNIT
TAO Toolkit (Transfer Learning Toolkit) とは
- 多数の転移学習済みモデルがあるため、少量のデータで学習可能
- 枝刈り、量子化によって高い推論速度を実現
- 量子化を考慮した学習によって量子化した差異の精度低下を抑える
- コマンドだけで動作可能
TAO Toolkit (Transfer Learning Toolkit)に関する詳細は下記の動画をご覧ください。
NVIDIA Isaac Sim のインストール
NVIDIA Isac Sim のハードウェア、 OS の必要条件は下記リンクになります。
NVIDIA Isaac Sim のインストール方法は下記ドキュメントを参考にしてください。
シミュレーションに使用する Asset の追加も必要です。下記ドキュメントを参照してください。
環境構築
Anaconda で環境構築をします。環境構築は公式ドキュメントを参照ください。
下記のディレクトリに移動します。インストール先フォルダー ($HOME//.local/share/ov/pkg) はユーザーによって変更可能なので、変更している方は異なるケースがあります。
cd $HOME//.local/share/ov/pkg/isaac_sim-2021.1.0/python_samples
必要なライブラリをインストールして環境構築をします。
conda env create -f environment.ymlconda activate isaac-sim
`setenv`スクリプトを用いて、omniverse kit python環境をPYTHONPATHに追加します。
source setenv.sh
NVIDIA Isaac Sim で学習データを作成
今回、検出したい対象はダンボール箱と移動カートです。
下記コマンドでシミュレーションで物体検出用の学習データを作成します。
python syntheticdata/offline_generation/generator.py --writer_mode kitti --classes cardbox pushcart --num_frames 1000 --train_size 800 --data_dir output
各オプションの詳細は以下になります。
- — writer_mode kitti: TAO は KITTI のフォーマットである必要があるので、KITTI を指定します。KITTI のフォーマットに関してはこちらのリンクをご覧ください。
- — classes cardbox pushcart: 検出対象のクラスを指定しています。今回は cardbox (ダンボール箱) と pushcart (移動用カート) にしています。シミュレーションによっては検出可能なクラスが異なるので、ドキュメントに記述のコード部分を確認して、自分たちの用途にあったクラスに調整してください。
- — num_frames 1000: 合計フレーム数を指定しています。学習、評価データの総数になります。
- — train_size 800: num_frames のうち、どの程度、学習データに使用するかを指定します。
作成されたデータはデフォルトでは “output” ディレクトリに出力されます。
下記のような構成になります。
- output
- training
- image_2
- label_2
- testing
- image_2
デフォルトでは学習データの作成の様子が確認できないので、コードの “ headless ” を False に変更することでデータ作成の様子を確認できます。
シミュレーションで使用するデータは USD というフォーマットで保存されているデータを使用します。パスの設定はホストのパスではなく NVIDIA Isaac Sim 上のパスになります。
NVIDIA Isaac Sim 上のパスですが NVIDIA Isaac Sim を動作すると確認できます。
著者の環境では “omniverse//IP Address:3009/” 以下のパスを指定しています。ユーザーによっては IP Adress の部分が localhost になります。
USD 以外のファイルフォーマットについて
NVIDIA Isaac Sim には URDF Importer が用意されており URDF フォーマットのデータを読み込むことができます。URDF フォーマットのデータを読み込んでから USD に変換することが可能です。
ドメインランダマイゼーションについて
“ syntheticdata/offline_generation/generator.py ” の下記部分で呼ばれ、実行されています。
オブジェクトの移動やテクスチャのドメインランダマイゼーションをかけたい場合はコード “ syntheticdata/advanced/domain_randomization.py “ を参考にして適用してください。
TAO の設定
TAO のインストール方法は下記に記述してあります。
- TAO Toolkit Quick Start Guide — TAO Toolkit 3.0 Pre-Requisites https://docs.nvidia.com/tao/tao-toolkit/text/tao_toolkit_quick_start_guide.html#installing-the-pre-requisites
- TAO Toolkit Quick Start Guide — TAO Toolkit 3.0 Installation https://docs.nvidia.com/tao/tao-toolkit/text/tao_toolkit_quick_start_guide.html#installing-tao-toolkit
TAO は TAO Toolkit Launcher という仕組みを利用しています。この仕組みは裏側で用途にあった Docker コンテナを呼んで Docker コンテナ内でコマンドが動作します。
この仕組みが導入されている理由として自然言語処理用の TAO (PyTorch ベース) と画像処理用の TAO (TensorFlow ベース) がベースとなる Deep Learning フレームワークが異なるため導入されています。
この TAO Toolkit Launcher の仕組みのため tao-mount.json を編集しておかないとコマンドを実行することができません。
デフォルトでは “ ~/.tao_mounts.json “ のパスにあります。
下記のように編集します。
- Source: ホスト側のパスになります。“/home/mogushi” の部分は構築環境によってパスが変わるので環境に合わせて修正してください。
- destination: Docker 側のパスになります。
著者の場合は下記のようになります。
TAO でデータの変換
TAO の画像処理は内部で TensorFlow が動作するため、データを tfrecord 形式に変換します。
下記コマンドでデータを tf_record 形式に変換できます。
ここで指定している各パスは Docker 内のパスなので注意してください。
tao detectnet_v2 dataset_convert -d tlt-experiments/isaac_sim_kitti.txt -o tlt-experiments/output_tlt/isaac-sim_cardbox_pushcart
- -d: Spec file と呼ばれる各種設定を記述したテキストファイルを指定します。
- -o: tfrecord を出力するパスです。
前処理のスペックファイルは下記のようになります。
各種パラメータの詳細については下記をご覧ください。
実行すると下記のようなログが確認できます。
内部で学習データと検証データに分けて、それぞれに partition を割り当てています。
Shard は並列数でデフォルトで 10 が設定されています。
2021–06–22 02:06:06,462 — iva.detectnet_v2.dataio.dataset_converter_lib — INFO — Writing partition 0, shard 1/usr/local/lib/python3.6/dist-packages/iva/detectnet_v2/dataio/kitti_converter_lib.py:273: UserWarning: genfromtxt: Empty input file:::b’pushcart’: 79b’cardbox’: 612021–06–22 02:06:06,520 — iva.detectnet_v2.dataio.dataset_converter_lib — INFO — Writing partition 1, shard 0/usr/local/lib/python3.6/dist-packages/iva/detectnet_v2/dataio/kitti_converter_lib.py:273: UserWarning: genfromtxt: Empty input file: “/workspace/tlt-experiments/output/training/label_2/765.txt”
TAO で学習
学習済みモデル
ngc コマンドがモデルのダウンロードに必要なので下記コマンドを実行します。
export CLI=ngccli_reg_linux.zipmkdir -p ngccliwget “https://ngc.nvidia.com/downloads/$CLI" -P ./ngccliunzip -u “./ngccli/$CLI” -d ./ngccli/rm ./ngccli/*.zip
今回使用するモデルの一覧を下記のコマンドで確認します。
./ngccli/ngc registry model list nvidia/tlt_pretrained_detectnet_v2:*
下記のように精度、Epoch 数、バッチサイズ、使用した GPU、メモリーフットプリント、ファイルサイズ、状態、作成日付が確認できます。
+ — — — — — — — — — — — -+ — — — — — + — — — — + — — — — — — + — — — — — -+ — — — — — — — — — + — — — — — -+ — — — — — — — — -+ — — — — — — — +| Version | Accuracy | Epochs | Batch Size | GPU Model | Memory Footprint | File Size | Status | Created Date |+ — — — — — — — — — — — -+ — — — — — + — — — — + — — — — — — + — — — — — -+ — — — — — — — — — + — — — — — -+ — — — — — — — — -+ — — — — — — — +| vgg19 | 82.6 | 80 | 1 | V100 | 153.8 | 153.77 MB | UPLOAD_COMPLETE | Apr 29, 2020 || vgg16 | 82.2 | 80 | 1 | V100 | 113.2 | 113.2 MB | UPLOAD_COMPLETE | Apr 29, 2020 || squeezenet | 65.67 | 80 | 1 | V100 | 6.5 | 6.46 MB | UPLOAD_COMPLETE | Apr 29, 2020 || resnet50 | 82.7 | 80 | 1 | V100 | 294.5 | 294.53 MB | UPLOAD_COMPLETE | Apr 29, 2020 || resnet34 | 79.5 | 80 | 1 | V100 | 163.6 | 163.55 MB | UPLOAD_COMPLETE | Aug 03, 2020 || resnet18 | 79.0 | 80 | 1 | V100 | 89.0 | 89.02 MB | UPLOAD_COMPLETE | Apr 29, 2020 || resnet10 | 79.2 | 80 | 1 | V100 | 38.3 | 38.34 MB | UPLOAD_COMPLETE | Apr 29, 2020 || mobilenet_v2 | 77.5 | 80 | 1 | V100 | 5.1 | 5.1 MB | UPLOAD_COMPLETE | Apr 29, 2020 || mobilenet_v1 | 79.5 | 80 | 1 | V100 | 13.4 | 13.37 MB | UPLOAD_COMPLETE | Apr 29, 2020 || googlenet | 82.2 | 80 | 1 | V100 | 47.7 | 47.74 MB | UPLOAD_COMPLETE | Apr 29, 2020 || efficientnet_b0_swish | 77.11 | 80 | 1 | V100 | 16.9 | 16.9 MB | UPLOAD_COMPLETE | Jun 09, 2021 || efficientnet_b0_relu | 77.11 | 80 | 1 | V100 | 16.9 | 16.9 MB | UPLOAD_COMPLETE | Jun 09, 2021 || darknet53 | 76.44 | 80 | 1 | V100 | 467.3 | 467.32 MB | UPLOAD_COMPLETE | Apr 29, 2020 || darknet19 | 77.52 | 80 | 1 | V100 | 229.1 | 229.15 MB | UPLOAD_COMPLETE | Apr 29, 2020 |+ — — — — — — — — — — — -+ — — — — — + — — — — + — — — — — — + — — — — — -+ — — — — — — — — — + — — — — — -+ — — — — — — — — -+ — — — — — — — +
学習済みモデルのダウンロードを行います。detectnet_v2 をダウンロードします。
mkdir -p pretrain_model./ngccli/ngc registry model download-version nvidia/tlt_pretrained_detectnet_v2:resnet18 --dest pretrain_model/
他にも使用できる学習済みモデルが存在します。気になる方は下記リンクをご参照ください。
- Transfer Learning Toolkit for Video Streaming Analytics | NVIDIA NGC https://ngc.nvidia.com/catalog/containers/nvidia:tlt-streamanalytics
モデルの学習
環境変数を設定します。
export KEY=tlt_encode
下記コマンドでモデルの学習を行います。
使用している各引数の説明は下記にあります。
tao detectnet_v2 train -e tlt-experiments/isaac_sim_kitti_train_cardbox_pushcart.txt -r tlt-experiments/pretrain_model/tlt_pretrained_detectnet_v2_vresnet18 -k $KEY -n resnet18_detector --gpus 1
学習用のスペックファイル
学習用のスペックファイル ”isaac_sim_kitti_train_cardbox_pushcart.txt” は下記をベースにしました。
変更した部分は下記になります。
まず学習に使用するデータのパスを変更します。画像データのフォーマットが png なので変更します。
今回対象となるクラスに修正します。
前処理は今回、作成した画像のサイズに合わせるように修正します。
後処理も同様に今回の対象クラス ”cardbox” と ”pushcart” に対応できるように修正します。
先程ダウンロードした学習済みモデルのパスに変更します。
評価用の設定も変更します。今回の対象クラス ”cardbox” と ”pushcart” に対応できるように設定します。
cost_function の設定も今回の対象クラス ”cardbox” と ”pushcart” に対応できるように変更します。
Bounding Box の設定も今回の対象クラス ”cardbox” と ”pushcart” に対応できるように変更します。
学習時のログ
ログを確認してみると内部で TensorFlow が動作しているため、下記のようなログが確認できます。
2021–06–18 17:06:40,194 [INFO] root: Registry: [‘nvcr.io’]2021–06–18 17:06:40,324 [WARNING] tlt.components.docker_handler.docker_handler:Docker will run the commands as root. If you would like to retain yourlocal host permissions, please add the “user”:”UID:GID” in theDockerOptions portion of the ~/.tlt_mounts.json file. You can obtain yourusers UID and GID by using the “id -u” and “id -g” commands on theterminal.Using TensorFlow backend.WARNING:tensorflow:Deprecation warnings have been disabled. Set TF_ENABLE_DEPRECATION_WARNINGS=1 to re-enable them.Using TensorFlow backend.
各 epoch ごとのロスの遷移と 30 epoch ごとの MAP の精度が確認できます。
INFO:tensorflow:global_step/sec: 6.515082021–06–18 08:21:00,273 [INFO] tensorflow: global_step/sec: 6.515082021–06–18 08:21:01,347 [INFO] modulus.hooks.sample_counter_hook: Train Samples / sec: 26.057INFO:tensorflow:epoch = 29.825581395348838, learning_rate = 0.00049999997, loss = 2.015719e-05, step = 5130 (5.226 sec)2021–06–18 08:21:02,274 [INFO] tensorflow: epoch = 29.825581395348838, learning_rate = 0.00049999997, loss = 2.015719e-05, step = 5130 (5.226 sec)INFO:tensorflow:global_step/sec: 6.489882021–06–18 08:21:02,893 [INFO] tensorflow: global_step/sec: 6.489882021–06–18 08:21:05,227 [INFO] modulus.hooks.sample_counter_hook: Train Samples / sec: 25.773INFO:tensorflow:global_step/sec: 6.438242021–06–18 08:21:05,533 [INFO] tensorflow: global_step/sec: 6.43824INFO:tensorflow:Saving checkpoints for step-5160.2021–06–18 08:21:06,770 [INFO] tensorflow: Saving checkpoints for step-5160.2021–06–18 08:21:09,635 [INFO] iva.detectnet_v2.evaluation.evaluation: step 0 / 28, 0.00s/step2021–06–18 08:21:11,498 [INFO] iva.detectnet_v2.evaluation.evaluation: step 10 / 28, 0.19s/step2021–06–18 08:21:12,641 [INFO] iva.detectnet_v2.evaluation.evaluation: step 20 / 28, 0.11s/stepMatching predictions to ground truth, class 1/2.: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2564/2564 [00:00<00:00, 27995.07it/s]Matching predictions to ground truth, class 2/2.: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 705/705 [00:00<00:00, 23850.49it/s]Epoch 30/120=========================Validation cost: 0.000007Mean average_precision (in %): 97.9688class name average precision (in %)— — — — — — — — — — — — — — — — — — —cardbox 98.3051pushcart 97.6325
モデルの枝刈り
TAO の特徴である枝刈りを行います。
枝刈りの内部処理に関して興味がある方は下記記事をご覧ください。
- Pruning Models with NVIDIA Transfer Learning Toolkit | NVIDIA Developer Blog https://developer.nvidia.com/blog/transfer-learning-toolkit-pruning-intelligent-video-analytics/
使用しているコマンドの各引数に関するドキュメントは下記リンクになります。
下記コマンドで枝刈りをします。
モデルのサイズを小さくしたい場合は “ -pth “ の引数の値を上げるとより小さいサイズのモデルにできます。
tao detectnet_v2 prune -m tlt-experiments/model_cardbox_pushcart/model.step-20640.tlt -o tlt-experiments/model_cardbox_pushcart/model.step-20640_prune.tlt -eq union -pth 0.000052 -k $KEY
下記のようなログが確認できます。”Pruning ratio (pruned model / original model): 0.21987475869290346“ から元のモデルのサイズの 21% までモデルを圧縮できていることが分かります。
:2021–06–23 02:27:03,674 [INFO] modulus.pruning.pruning: Exploring graph for retainable indices2021–06–23 02:27:04,054 [INFO] modulus.pruning.pruning: Pruning model and appending pruned nodes to new graph2021–06–23 02:27:13,890 [INFO] iva.common.magnet_prune: Pruning ratio (pruned model / original model): 0.219874758692903462021–06–23 11:27:14,872 [INFO] tlt.components.docker_handler.docker_handler: Stopping container.
枝刈りの前後でモデルのサイズが 43MB から 9.6MB まで削減できました。
TAO で量子化を考慮した学習
量子化を考慮した学習については下記資料をご覧ください。
- GTC 2020: Toward INT8 Inference: Deploying Quantization-Aware Trained Networks using TensorRT | NVIDIA Developer https://developer.nvidia.com/gtc/2020/video/s21664
- 量子化を考慮した学習と NVIDIA Transfer Learning Toolkit を使用した INT8 精度の向上 | by Chris To | NVIDIA Japan | Medium https://medium.com/nvidiajapan/improving-int8-accuracy-using-quantization-aware-training-and-the-transfer-learning-toolkit-c589aa9cc6b1
枝刈りしたモデルを用いて量子化を考慮した学習を行うため、先程の学習用のスペックファイルを修正します。
cp isaac_sim_kitti_train_cardbox_pushcart.txt isaac_sim_kitti_train_cardbox_pushcart_qat.txt
“ pretrained_model_file “ に枝刈りしたモデルを設定します。
量子化を考慮した学習できるように設定します。”training_config “ に “ enable_qat: true“ を追加します。
下記コマンドで量子化を考慮した学習を行います。
tao detectnet_v2 train -e tlt-experiments/isaac_sim_kitti_train_cardbox_pushcart_qat.txt -r tlt-experiments/model_cardbox_pushcart_qat -k $KEY -n resnet18_detector_pruned_qat --gpus 1
量子化を考慮した学習は量子化を考慮したいレイヤーを Quantize レイヤーと DeQuantize レイヤーで挟みます。Quantize レイヤーは量子化を行い、DeQuantize レイヤーは元の数値精度に戻す処理をしています。これを略して QDQ と呼びます。
図で表すと下記のようなイメージになります。
学習ログを見るとモデルのレイヤーが Quantize 化されていることが分かります。これは量子化を考慮した学習には必要な処理なのですが、これが適用されていることが分かります。
__________________________________________________________________________________________________Layer (type) Output Shape Param # Connected to==================================================================================================input_1 (InputLayer) (None, 3, 800, 1024) 0__________________________________________________________________________________________________input_1_qdq (QDQ) (None, 3, 800, 1024) 1 input_1[0][0]__________________________________________________________________________________________________conv1 (QuantizedConv2D) (None, 64, 400, 512) 9472 input_1_qdq[0][0]__________________________________________________________________________________________________bn_conv1 (BatchNormalization) (None, 64, 400, 512) 256 conv1[0][0]__________________________________________________________________________________________________activation_1 (ReLU) (None, 64, 400, 512) 0 bn_conv1[0][0]__________________________________________________________________________________________________activation_1_qdq (QDQ) (None, 64, 400, 512) 1 activation_1[0][0]__________________________________________________________________________________________________
TAO の INT8 量子化
量子化前の精度を下記コマンドで評価します。
各引数の説明は下記リンクにあります。
- DetectNet_v2 — TAO Toolkit 3.0 documentation https://docs.nvidia.com/tao/tao-toolkit/text/object_detection/detectnet_v2.html#evaluating-the-model
tao detectnet_v2 evaluate -e tlt-experiments/isaac_sim_kitti_train_cardbox_pushcart_qat.txt -m tlt-experiments/model_cardbox_pushcart_qat/model.step-20640.tlt -k $KEY -f tlt
量子化前の精度は下記になります。
Validation cost: 0.000101Mean average_precision (in %): 96.1599class name average precision (in %)— — — — — — — — — — — — — — — — — — —cardbox 94.8515pushcart 97.4684Median Inference Time: 0.020021
下記コマンドで INT8 量子化を行います。量子化の際に TensorRT のフォーマットに変更します。
変換後のモデルのフォーマットは “trt.int8“ に変更しています。
各引数の説明は下記リンクにあります。
- DetectNet_v2 — TAO Toolkit 3.0 documentation https://docs.nvidia.com/tao/tao-toolkit/text/object_detection/detectnet_v2.html#exporting-the-model
mkdir model_cardbox_pushcart_qat_int8tao detectnet_v2 export -m tlt-experiments/model_cardbox_pushcart_qat/model.step-20640.tlt -o tlt-experiments/model_cardbox_pushcart_qat_final/model.step-20640.etlt -k $KEY --data_type int8 --batch_size 32 --max_batch_size 32 --engine_file tlt-experiments/model_cardbox_pushcart_qat_int8/model.step-20640.trt.int8 --cal_cache_file tlt-experiments/model_cardbox_pushcart_qat_final/calibration_qat.bin --verbose
量子化後の精度を評価します。
先程の評価用コマンドとの違いですが、量子化後のモデルを指定して、ファイルフォーマットを tensorrt にして実行します。
tao detectnet_v2 evaluate -e tlt-experiments/isaac_sim_kitti_train_cardbox_pushcart_qat.txt -m tlt-experiments/model_cardbox_pushcart_qat_int8/model.step-20640.trt.int8 -k $KEY -f tensorrt
精度は下記になります。INT8 量子化したにもかかわらず、このケースでは精度低下を 0.8 % から 0.3 % に抑えられています。
推論時間は 0.020021 から 0.000605 になっており、推論時間は量子化前の 3 % までに抑えられています。
Validation cost: 0.002975Mean average_precision (in %): 96.3992class name average precision (in %)— — — — — — — — — — — — — — — — — — —cardbox 94.0643pushcart 98.7342Median Inference Time: 0.000605
TAO の推論の様子
量子化したモデルで推論をします。
下記のスペックファイルを参考に修正します。
”cardbox” と ”pushcart” の target_classesを 追加します。
画像のサイズを 1024, 800 に変更します。
“ tensorrt_config “ に量子化したモデルファイルを設定しています。
各クラスの Bounding Box を設定します。
下記コマンドで推論処理を行います。
tao detectnet_v2 inference -e tlt-experiments/isaac_sim_kitti_inference_cardbox_pushcart_int8.txt -o tlt-experiments/output_inference_cardbox_push_cart_int8 -i tlt-experiments/output/testing/image_2/ -k $KEY
下記のように ”cardbox” と ”pushcart” を認識できていることが確認できます。
NVIDIA Isaac Sim を用いて学習データを作成し、TAO で高速かつ高精度なモデルを作成することで、画像認識モデルをより早くマーケットに導入できる手助けになれば幸いです。
別の USD で学習データを作成する場合
今回、使用した USD は予めラベルデータを作成するための設定がされていた USD でした。別の USD に適用するためには下記の設定が必要です。
- ドメインランダイマーゼーション
- Semantic Schema Editor の設定
まず適用したい USD を /Isaac/Samples/Synthetic_Data/Stage
に追加します。コードからアクセスしやすいため、こちらのパスに追加しています。
ドメインランダイマーゼーション
Synthetic Data->Domain Randomization->Components から必要なドメインランダマイゼーションを設定できます。
もしドメインランダマイゼーションの設定ができない場合はプラグインが設定できていない可能性があるので、下記リンクを参考に設定してください。
今回は一例として Movement のドメインランダマイゼーションを適用してみます。
上記の方法で Movement を選択すると Stage に movement_component_0
が追加されます。
この Movement を適用したいターゲットを primPaths
に追加します。
movement_component_0
をクリックすると movement_component_0
の Property が確認できます。
この Property 上で primPaths
の設定ができます。今回は RandomCamera (便宜上 Camera センサーの名前を変更しています。) を設定します。 Add Target(s) をクリックします。
Camera センサーの追加方法は下記をご覧ください
下記のような画面が出るので RandomCamera を選択します。
下記のように primPaths
に追加されていることが確認できます。
xRange
, yRange
, zRange
のパラメータを調整して移動幅を変更可能です。設定の範囲が大きすぎると、ターゲットのオブジェクトが映らなくなるので、小さくしてカメラに映る範囲に修正した方が良いです。
動作確認方法ですが Isaac Sim 上にカメラアイコンがあるので、そこをクリックします。Camera から今回、設定した RandomCamera を選択します。
▷の再生ボタンを押します。
設定した移動幅に基づいて、カメラが移動して下記のようなシーンが確認できます。
Semantic Schema Editor の設定
バウンディングボックスなどのラベル情報を追加する必要があります。
下記を参考に記述しています。
まずラベル情報を取得したいターゲットを選択します。今回は予め追加した Cylinder を選択します。
もし同様の手順で確認したい場合は Cylinder を Create -> Mesh -> Cylinderで追加できます。
Synthetic Data->Semantic Schema Editor を選択します。
下記のように Semantic Schema Editor を選ぶ画面が Content の横に表示されます。
Apply semantic data on selected objectのTypeに class
, Dataに cylinder
を設定し、Apply changes をクリックします。TAO Toolkitの設定の関係上、すべて小文字で Data を設定する必要があります。
動作しているか確認するため、Viewportウィンドウの上にある
上図のアイコンをクリックします。
動作を確認したい要素である RGB, BBox 2D Tight, BBox 2D Loose をチェックします。
Visualize をクリックします。
下記のように表示されます。BBoxを確認することができます。
これで USD を変えてもドメインランダマイゼーションをかけた画像とラベル情報を取得できるようになります。
Cylinder の Property の Raw USD Properties のsemantic:Semantics:params:semanticData に cylinder
, semantic:Semantics:params:semanticType に class
が追加されています。
間違って設定した場合はこれらを削除するとラベル情報が出力されなくなります。
Ctrl + S で USD を保存します。
コードでの動作確認
syntheticdata/offline_generation/generator.py の USD ファイルを取得している部分を変更します。
先程設定したクラスが cylinder
なので cylinder
を設定して実行します。
python syntheticdata/offline_generation/generator.py --writer_mode kitti --classes cylinder --num_frames 1000 --train_size 800 --data_dir output
output ディレクトリにシミュレーション画像とラベルデータが作成されます。