【Jetson Orin Nano レビュー(3)】ロボット開発シミュレータ「Isaac Sim」を「Jetson Orin Nano」で使ってみた!

全世界のNVIDIA Jetsonファンの皆様、お待たせしました!
「NVIDIA Jetson Orin Nano開発者キット」のレビュー第3弾は、「NVIDIA Jetson Orin Nano開発者キットで噂のロボットシミュレータ”NVIDIA Isaac Sim”を使ってみた!」編です。

「Isaac Sim」はNVIDIAが提供しているロボット開発シミュレータです。3DCGでの再現率が高く、工場や倉庫など複雑な環境の再現を行い、その中でロボット開発を行えるというものです。最近、注目されているデジタルツインにも通じる技術です。


詳しい情報はロボスタの別記事に書いてあるのでそちらもぜひ見てみてください。

ロボット開発シミュレータやデジタルツイン等に触る機会がないユーザには、なかなかイメージしにくいかもしれませんので、今回筆者が試した内容をステップ・バイ・ステップでレポートしていきます。


「Jetson Orin Nano」でIsaac Simを利用するまでの流れ

ロボット開発シミュレータの活用は比較的、中上級向けなので構成も複雑になっています。まずは読者に全体像をつかんで欲しいため、全体構成をまとめてみます。

ロボット開発シミュレータ活用の全体構成

メインの作業は真ん中の仮想デスクトップ上のubuntuで作業していくことになります。
手順が記載されているjupyterLabなどの細かい部分は割愛して、大きな流れで書いています。
使用するツールは、people segmentモデルが入ったdockerイメージ、デジタル環境構築済のIsaac Simのdockerイメージ、あとは転移学習ツールの NVIDIA TAOの3つを使っていることがわかります。

全体構成の中心部を拡大した図



VMware Horizon Clientのインストール

一番最初のステップとして「VMware Horizon Client」のダウンロードを行います。「VMware Horizon Client」はVMwareの仮想デスクトップに接続するためのクライアントアプリです。
OSはWindows、Mac OS、Linux x86 32-bit/64bitがあります。今回筆者はWindowsプラットフォーム版から接続しました。

「VMware Horizon Client」をインストールして仮想デスクトップサーバに接続するところ。今回サーバはNVIDIA社にレビュー用に用意してもらった。

仮想デスクトップに接続したところ。Ubuntu22.04LTSがインストールされていた。

あらかじめ準備された仮想デスクトップサーバにレビュー用のアカウントでログインするとUbuntuのデスクトップ画面が現れました。
VMware Horizon Clientの設定でローカルPCとの共有フォルダも設定可能で、最後に学習済モデルをダウンロードするために筆者はあらかじめ ”nvidiatemp” というフォルダ名で共有設定を行っています。
ここから先はJupyterLabのNotebookの指示に従って作業することになります。


condaとJupyter Labの準備

JupyterLabの準備は、NotebookのあるフォルダでTerminalを開き、condaとJupyter Labを実行するだけです。

デスクトップ上のフォルダ内にはjupyter Labのコンテンツが入っている。

フォルダ内右クリックからterminalを開く。

簡単に各コマンドを解説すると、condaとは、Anacondaというpythonや機械学習を行うパッケージになります。
jupyter Labはブラウザ上で動かせるプログラムの対話型実行環境です。Notebookと呼ばれるコンテンツ内で、文章解説、コマンド実行、プログラムのコード実行がまとめてできるので、プログラミング学習のテキストなどにも使われます。

condaとjupyter Labを実行すれば準備完了。

jupyter Labが開きコンテンツが自動的に読み込まれている。

condaを利用可能状態にして、Jupyter Labを実行するとコンテンツが自動的に読み込まれ表示しています。
これで準備はOKです!
お題をちょっと読んでいくと、

「合成データ使用して深層学習モデルを改善」
「このデモではモデルの作成からデプロイまでのワークフロー全体を体験できます。様々なカメラの高さ、群衆密度、視野(FOV)で構成されるデータセットでトレーニングされたNGCの事前トレーニング炭の人物セグメンテーションモデルから始めます。元のトレーニングデータセットにはこの視点からキャプチャされた画像がなかったため、このモデルを地面に近いロボットカメラで使用すると精度が低下することがわかりました。
新しいカメラアングルで新しい大規模なデータセットを収集し、各画像にタグ付けするには大変時間がかかります。代わりに、このデモではIsaac SimでReplicatorを使用し、データのバリエーションを増やす方法を示します。・・・・」

なるほど、要はIsaac Simで足りないアングルの人物イメージデータを撮りまくり、TAOで転移学習させて精度を上げちゃおう!ってことのようです。


Jupyter Labでの進め方

jupyter Labを開くと以下の目次があります。これに従って準備を進めていきます。

内容的には、

1.環境変数を設定
2.元のモデルのパフォーマンスを視覚化
 A.NGCからモデルをダウンロード
 B.結果の視覚化
3.Isaac Simで合成データを生成する
 A.アノテーション済セグメントマスクを使用して合成データを視覚化
4.TAOトレーニングの実施
5.両方のモデルを比較
6.推論の視覚化
7.モデルのエクスポート

という感じです。
結構項目ありますがひとつづつ見ていきましょう。


1.環境変数を設定

ここはそんなに難しくありません。これから動かす転移学習プログラムTAOの環境変数を設定していくだけなので、コード部分にカーソルを合わせ、メニューの再生ボタンのような右向き三角ボタンを押せば勝手に実行します。


最終的にtao_mounts.jsonが生成できれば完了です。



2.元のモデルのパフォーマンスを可視化

それでは早速変更前のPeople segmentのdockerファイルをダウンロードして、現状の認識具合を確認していきます。

dockerイメージダウンロード中。少し時間がかかる。左側の[*]になってるときは処理中なので先に進まないよう注意が必要だ。

ダウンロードしたオリジナルのモデルを試しにTAOで推論させてみる。

オリジナルのPeople segementのdockerで足元だけを認識させようとした様子。全身が入っていないのでほとんど認識できていない。

上側のテスト画像が足元だけなので通常は人の輪郭が塗りつぶされているように出るはずが、ほとんど認識していないのがわかります。

もうちょっとやってみても同じような結果に。

「結果についてどう思いますか?」
このモデルは、シーンでロボットの観点から人々をうまくセグメント化できてないようです。
このモデルのパフォーマンスを改修するにはどうすればよいでしょうか?
「代わりに合成データを使用できますか?」

と、続きます。なるほど、ルンバみたいなお掃除ロボットにカメラがついていたら人間の見える部分は足元だけ。これは追加の学習データを集めないといけないですけど。
その辺で足元の写真をローアングルで撮りまくっていたらかなり怪しい人だし、下手したら捕まります。そこで「Isaac Sim」の登場というわけです。


3.Isaac Simで合成データを生成する

Jupyter Labの別タブで開いたTerminalから、Issac Simのdockerを起動させます。
さらにdocker内で合成データ用のスクリプトを実行します。
前述したようにIsaac Sim内ではデジタルツインで作成された環境が構築可能です。ロボットと同じカメラアングルで様々なアングル、光量、アスペクト比などを変えながらもりもりと合成データとアノテーション用のマスクデータを作ってくれます。

ところが、実行中に謎のCUDAエラーが表示されてしまいました。アウトプット完了後なのでこのまま進めますが心臓に悪いです。

スクリプトが終了したら合成データの生成作業は終了です。
今回は「Isaac Sim」の環境データが事前に準備されていたのでスクリプトを起動するだけで済みましたが、実際に自分で作る場合は環境構築からはじめる必要があるかもしれませんので、機会があれば今後この辺もレポートしたいところです。


 A.アノテーション済セグメントマスクを使用して合成データを視覚化

Isaac Simで生成した合成データを見てみましょう。
”output_headless_people”フォルダに出力結果があるので、コードを実行して生成したデータを可視化していきます。



Isaac Sim上だと人物の3Dモデルを認識しているので、マスキングだけでなく背景とのセグメンテーションも綺麗に設定されている。

2段になっている画像の上段がIssac Simで生成された合成データですが実写と言われてもわからないほど精細な合成データです。


4.TAOトレーニングの実施

Isaac Simのおかげで、足元の写真を大量に用意することなく、追加トレーニング用合成データが作成できました。
ここからはTAOを使っての転移学習をしていきます。オリジナルの‘People Segmentのモデルに今作成した合成データを使って転移学習をします。


ここは特に画像での結果は出ませんが、コマンド実行後「Execution status PASS」と出ていればOKです。


5.両方のモデルを比較

それではオリジナルのPeople Segmentモデルと合成データで再トレーニングしたものを比較してみましょう。


両方の比較の指標ですがTAOでは下の4項目で評価しているようです。
今回は機械学習の授業ではないので項目ごとの詳細は割愛しますが、今回はsegmentationなのでF1 score, Mean IoUが結構重要な評価項目だと思います。

Recall: どれくらい取りこぼしなく検知できたかの再現性。
Presision: 検知したものの中でどれだけ正解したか。(適合率)
F1 score: 対象がきちんと認識しているかどうか。
Mean IOU: 輪郭に欠けやはみだしがないか。

そういう視点で見ていくとF1 score:0.74->0.95, Mean IOU:0.64->0.92とかなり向上している様子です。


6.推論の視覚化

それでは実際に2つのモデルの評価画像を見てみましょう!



2段で画像が表示されていますが、それぞれ上段がオリジナル、下段が合成データで転移学習したものです。認識率がかなり向上してますね。
Isaac Simの合成データがきちんと機能していることが実感できました。


7.モデルのエクスポート

ここまでできれば合成データで再トレーニングさせた学習モデルを出力してJetson上で動かすだけです。
モデルのエクスポートはTAOで出力させた後にVMware Horizon Clientでそれぞれ共有したローカルフォルダにコピーして後USBメモリでもオンラインでもデータをJetsonに送るだけです。



合成データで再トレーニングさせたエンジン。これを共有フォルダ経由でローカルPCにコピーしてJetsonで動かせばよい。




まとめ

いかがでしたでしょうか?なかなか実際の利用イメージがつかなかったIsaac Simを使って学習モデルの再トレーニングができました。
個人的には足元だけのカメラアングルのシミュレーションは驚きましたが、ロボット目線になってみると納得という「目からうろこ」の体験でした。
クラウドでIsaac Simは敷居が高いと思った方も多いと思いますが、NVIDIA GeForce RTX 3080以上のGPUが利用可能であればOmnivers上でIsaac Simが実行できるとのことなので、一度利用してみたいと思いました。

さて今回で「NVIDIA Jetson Orin Nano開発者キット」のレビュー記事は最終回です。
筆者は早速これにNVMe SSDを増設して今年度の研究開発用として使っていこうと思います!

自腹で買ったNVMe SSD。レビュー記事が終わったらじっくり触っていく。

皆さまもぜひ「NVIDIA Jetson Orin Nano開発者キット」を手に取って仕事やAI学習に生かしてみてください!

ABOUT THE AUTHOR / 

高橋一行

Forex Robotics株式会社 代表取締役。NVIDIA認定 Jetson AI Specialist。AI、機械学習、ロボット、IoTなどのシステム開発を行いながら、コミュニティ活動やLTにも精力的に活動。 最近、那須塩原にサテライトオフィスを設立しました!

PR

連載・コラム