2019年7月20日、柏の葉にあるKOILにて開催された第2回 AI RCカー勉強会@柏の葉「JetBotハンズオン」に小5の息子と一緒に参加してきました。

第2回 AI RCカー勉強会@柏の葉「JetBotハンズオン」 – connpass
今年4月にJetson nanoが発売された際、JetBotについてもやりたいと思っておりましたが自分には部材の調達も組み立てもプログラミングもハードルが高く諦めていました。
しかし、今回講師をしていただいた株式会社GClueの佐々木陽さんが、JetBotのキットを用意され、JetBotの組み立て、設定、学習から自動運転走行までがこのハンズオンで学べるとあって、とても楽しみにしておりました。
今回は、そのハンズオンでどんなことをやったのかをご紹介します。
JetBotとは?
まずは知らない人のためにJetBotの説明です。
JetBotとはNVIDIAが出している小型GPUを積んだ開発ボード「Jetson Nano」を使ったAIロボットです。
実際は車輪がついているので小型AIカーといったほうがいいかもしれません。

NVIDIAがこのJetBotを動かす為のツールが組み込まれたOSイメージを公開しており、誰でも公開されているJetBot部品リスト(BOM)を参考に必要な機器をそろえ、組み立て、そのOSイメージを使うことで、自動運転についての実験や学習をすることができます。
* JetBot OSイメージ
NVIDIA-AI-IOT/jetbot: An educational AI robot based on NVIDIA Jetson Nano.
近い将来、車は自動運転が当たり前になるといったことも言われていますが、その新しい技術を、一般の人でも購入可能な予算内で手軽に楽しむことができるのが、このJetBotの大きな特徴です。
とはいっても、それなりにハードルは高いですけどね。
「AI/IoTの街」柏の葉のKOILが会場

今回ハンズオンの主催「Jetson Japan User Group」のドローンワークス株式会社今村博宣さんの尽力で、「AI/IoTの街」柏の葉にある「31VENTURES KOIL(柏の葉オープンイノベーションラボ)」を利用させていただくことができました。

前半はJetBotの組み立て

今回のハンズオンでは、JetBotフルセット購入枠とJetson nanoをすでに持っている人用にJetBotベアボーン枠が用意され、私はベアボーン枠で申し込み。

こちらが佐々木さんが用意してくださっとJetBotの部品達。

こんな感じでセットになり購入者に配布されました。

佐々木さんが用意してくださったFaBo JetBot Docsを見ながら組み立てます。

まずは部品の確認

ひとつひとつ組み立てます。

モーターをドライバーで取り付け

難しいところは父の出番


AM10時からスタートしてお昼ぐらいになんとか完成!
Jupyter Notebookを使って初期設定
JetBotを組み立てたらJupyter Notebookを使って初期設定や学習を行います。

今回は、JetBotを会場のWiFiに接続し、自分のPCからブラウザ経由でJetBotにアクセスします。( JetBotのIPアドレス+ポート番号8888)
まずは、”basic_motion.ipynb”を実行していきます。
問題がなければ、コマンドを実行するたびにJetBotが動きます。

このように、Jupyter Notebook上に操作ボタンを表示させれば、自由にJetBotを動かすことができます。
collision_avoidance 画像による境界線認識

JetBotのBasic_motionが成功したら、いよいよ自動運転のための学習を行います。
今回のハンズオンでは、collision_avoidanceという画像による境界線認識と呼ばれるモデルでalexnetの転移学習を行いました。

Jupyter Notebookでコマンドを実行していくと、上の図のような画面が出て、カメラの映像が「進んでいいとき」と「進んじゃだめなとき」を撮影していきます。

実際にはこんな感じで、JetBotを会場のコースに置き、JetBotのカメラの映像をJupyterNotebookで見ながら、目の前に障害物がなく進んでもいいときには、先程の「add free」ボタンを押し、境界線があるときや前方に障害物がある時は「add blocked」のボタンを押します。

JetBotを操作するボタンで位置を動かしながら、進んでいいとき、進んじゃだめなときをそれぞれ50枚撮影し、これで学習用のデータセットが準備完了です。
JetBotでの学習
JetBotの大きな特長は、クラウドなどを使わなくても学習用データセットからJetBot自身が学習ができることがあります。
これは、JetBotがJetson nanoというGPUモジュールを自分自身に搭載しているからこそできるので、AI carを取り組むハードルを大きくさげることができました。

実際、学習についてもJupyter Notebook上でtrain_model.ipybを実行すれば先程のデータ・セットを利用して実行できます。

学習データセットを元にDeep Learningを行い、繰り返すことで徐々に正確性をあげていきます。
もちろん、この学習にはそれなりの時間がかかりますが、最終的に「best_model.pth」という学習済みモデルファイルが生成されます。
あと一息!
JetBotでの実行

Jupyter Notebookにて「live_demo.ipyb」を開いていよいよ自動走行を行います。

このように、JetBotのカメラの映像がJupyter Notebookに表示され、進むべきか(free)か進まざるべきか(blocked)が推論され、それによってJetBotが進んだり回転したりします。
言葉よりも動画でみてみてください
ここまでブログで書いてきましたが、JetBotで実行する自動運転の様子は動画をつくりましたので、ぜひ、こちらをご覧ください。
後半に今回講師をしていただいたGClue佐々木さんと参加者のインタビューがあります。
まとめ
このJetBotハンズオンにて、学習データを作成し自動運転までできたのですが、もっとまっすぐ言ってほしいのに曲がってしまったり、もっと早めに曲がって障害物を避けてほしいのに、曲がってくれなかったりと、自分が運転するんだったらもっと違うのにという動きをJetBotがしてしまいやきもきしました。
これは、50枚づつ撮影した、こういう時は進んでよい、こういう時は前に進んではいけないという学習データ・セットによるものだと理解し、これをもっと改良するためには、この学習データセットを改善する必要があるものだとわかりました。
「近い将来、車は自動運転になる」。そんなことをニュースできいたりしますが、そのためには、安全、安心、そして効率的に自動運転できるための、人間側の知見の蓄積が必要で、サイズは小さいけれど、より多くの人達がJetBotのようなものを使って、楽しみながら取り組むことが、そんな未来につながるのでしょう。
ということで、Jetson Japan User Groupでは今後もGClue佐々木さんのお力を借りながら、JetBotのハンズオンを開催したり、自分のJetBotを持ち寄り、AI-RCカー走行会を開催したりする予定です。
ご興味ありましたら、connpassにあるJetson Japan User Groupへご参加ください。