Omniverse Replicator を用いたシミュレーション上での Deep Learning の学習データ生成
Introduction
NVIDIA 大串です。Deep Learning においてデータ量は精度に影響してきます。精度とデータ量に関してはこちらの記事の背景のパートをご覧下さい。ただしアノテーションされたデータセットを用意するにはコストがかかります。そこでシミュレーションでアノテーションされたデータを作成することが出来ればそのコストを大幅に減らすことが出来るだけでなく、現実では再現が難しいケースにも対応可能です。
Isaac Sim に Omniverse Replicator という機能があります。これによってシミュレーションでアノテーションされたデータを生成が可能です。
Isaac Sim に関してはこちらの記事をご覧下さい。Omniverse Replicator の事例についてはこちらの記事をご覧ください。
Omniverse Replicator
まず Isaac Sim に必要な環境と Isaac Sim の起動が必要になるので、下記の記事を参考に環境を用意して Isaac Sim を起動してください。著者は 2022 年 2 月に Isaac Sim 2021.2.1 で動作確認をしました。
- 1. Isaac Sim Requirements — Omniverse Robotics documentation https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/requirements.html
- 2. Basic Isaac Sim Installation — Omniverse Robotics documentation https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/install_basic.html
Omniverse Replicator は GUI から生成する方法とコード上から生成する方法があります。今回は GUI から操作する方法を紹介します。
GUI 上でのデータ生成
まず予め用意したシミュレーション環境を設定します。今回は一例として ’simple_room’ を使用します。
Create->Isaac->Environments->Simple Room で設定可能です。
下記のような環境が確認できます。
Asset を追加します。
Create->Shapes->Cube で追加できます。
Asset を一つづつ追加するのは大変なので、Script Editor を使用することで Python コードでデータを追加できます。これによって大量の同様のデータの追加が簡単になります。先ほど追加した Cube は右クリックし、Delete で削除できます。そして Script Editor で Cube を追加します。
Window->Script Editor で Script Editor を追加します。
Script Editor の Python と記述されている部分の下に Python コードを記述することができます。
下記のコードを Script Editor に入力して Run を実行すると下記のように 3 つの Cube が追加されます。
現状のアノテーションされたデータの様子を確認します。
緑で囲んだ部分をクリックするとチェックボックスが現れます。
RGB、2D Tight Bounding Box、2D Loose Bounding Box、Instance Segmentation、Semantic Segmentation のチェックボックスをチェックします。
下記のようにセンサー情報を確認できます。
現状、先程追加した Cube にアノテーションしていない状態なのでアノテーションされていません。Instance Segmentation は個々のオブジェクトごとに分けてセグメンテーションされるため、デフォルトで設定されたアノテーション情報が確認できます。
Semantics Schema Editor を使用してアノテーションをします。Synthetic Data-> Semantics Schema Editor を選択します。
Semantics Schema Editor は下記のようになります。今回追加した cube にアノテーションをつけてみます。
Prim Types to label と Class List を変更します。
Class List は USD ステージアウトライナー上でこの Class List 内のいずれかが含まれていることをチェックします。
例えば Class List に cube があるので、例えば cube0、cub1、cube2 が対象になります。
Prim Types to label はアノテーションをする Prim type を指定します。Prim Type は同様に USD ステージアウトライナー上で確認できます。
Prim Types to label を Cube だけに編集、Class List は cube だけに編集します。Generate Labels を押します。 編集する前に Generate Labels をクリックすると最初に設定した Prim Types to label と Class List が適用されます。
もし編集前に Generate Labels をクリックしてしまうとデフォルト設定が反映されます。修正したい場合は設定されたオブジェクトの semantic:Semantics:params:semanticData と semantic:Semantics:params:semanticType に入力された値を削除してから再度設定してください。
下記のように追加されたデータを確認できます。
アノテーションされた cube の Property を確認すると semantic:Semantics:params:semanticData に cube がアサインされ semantic:Semantics:params:semanticType に class がアサインされていることが確認できます。この項目を削除するとアノテーションが解除されます。
Synthetic Data Recorder を使用して、アノテーションされたデータを保存してみます。Synthetic Data-> Semantic Data Recorder を選択します。
下記の用に設定する画面がでます。Status で保存したいアノテーションを選択します。
RGB 以外には Colorize と Save array という項目があります。
Colorize をチェックすると png 形式のアノテーションされた画像を保存できます。
Save array をチェックするとアノテーションされた情報が npy 形式で保存されます。
Synthetic Data Recorder ではアノテーションされたファイルの出力先 Output Directory で設定できます。
その他のパラメータはこちらをご参照ください。
再生ボタンを押して、Start Recording を押すことでデータが生成されていきます。
下記のように output ディレクトリ直下に Viweport というディレクトリが作成され、その直下に今回作成したアノテーションファイルが各アノテーションごとに保存されます。
例えば Instance Segmentation だと下記のようになります。
Semantic Segmentation だと下記のようになります。
このシミュレーションのデータを単純に使用できません。こちらの記事の背景のパートで説明したシミュレーションと現実のデータの差分が生じるためです。
この問題の解決方法の一つとしてドメイン ランダマイゼーションがあります。ドメイン ランダマイゼーションの設定は下記をご覧ください。
- Domain Randomization — Omniverse Robotics documentation https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/ext_omni_isaac_dr.html#domain-randomization
- NVIDIA Isaac Sim を用いて学習データをシミュレーションで作成し TAO Toolkit (Transfer Learning Toolkit) で学習 | by Masaya Ogushi | NVIDIA Japan | Medium ( こちらの記事のドメイン ランダマイゼーションのパートを参照ください。) https://medium.com/nvidiajapan/isaac-sim-synthesis-data-transfer-learning-toolkit-e7ca9bb776d0
まとめ
Isaac Sim の Omniverse Replicator を GUI から使用する方法について紹介しました。3D の Asset が用意できれば Deep Learning の画像処理用のアノテーションされた学習データを容易に作成できるので、ぜひ試してみてください。