AI素人エンジニアが一週間で自動運転ラジコンカーを作ってみた
アーカイブ動画
AI自動運転ラジコンカー「Bonsai Car」開発プロジェクト立ち上げの舞台裏
AI自動運転ラジコンカー「Bonsai Car」は、アバナードで年1回開催されている社内メイカソン「!nnovate (イノベート)」で作成されたもの。Bonsai Carという名称の由来は、マイクロソフトのAI「Project Bonsai」からきている。Bonsai Carチームは7人のメンバーで構成されており、今回登壇したのはチームリードの小林直樹氏、AI部分の開発を担当した寺岡優氏、IoTエッジ側、Raspberry Piの搭載側を担当した大北真之氏の3人。寺岡氏はサーバサイドがメイン担当のため、AIに触れたことはなかった。大北氏はCMSの案件に従事しており、Raspberry Piを案件で使うことはもちろんないため、二人とも今回初めてRaspberry Piに触れたのである。
まずは小林氏がBonsai Carの概要について説明を行った。
Bonsai Carを作るきっかけは、社内で年1回開かれているメイカソン「!nnovate(イノベート)」に参加したこと。!nnovateでは、あらかじめ定められたテーマに沿ってチームでユニークなアイデアを出し、最小限の機能を実際に作って競い合うイベントである。
今回のテーマは「身近な課題から、世界の課題へ」。テーマからすると自分自身や身近な困りごとを解決できる仕組みやサービスを作ることがイメージされるが、小林氏は「課題は後付けにして、マイクロソフトのAI「Project Bonsai」を活用し、Bonsai Carの作成にチャレンジした」と笑う。
結果としては、社内投票でも2位という好成績を残すことができた。今回のイベント運営責任者であるアバナード関西シニアディレクターの杉本礼彦氏には、「テーマだけで採点すると0点だが、やっていることはめちゃくちゃ面白い」という評価をもらったという。杉本氏自身、TECHBEER(テックビール)やAI判定ビリビリクイズマシーンなどユニークなモノづくりにチャレンジしており、「Avanade tech talk」でもその取り組みを発表している。
小林氏はBonsai Carの取り組みを説明する前に、まずはAI全般に共通する課題を挙げた。第一の課題はAIが判断した基準、根拠がわかりにくいこと。AIはブラックボックスと言われるように、内部の構造が複雑なため、どういうロジックで結果が導き出されたのかわかりにくいのだ。
第二に大量の学習データが必要になること。例えば画像判断をさせる際には、サンプルとなる画像が大量に必要となる。最近は『Azure Custom Vision』など、比較的少ない枚数でも精度を出してくれるサービスも登場している。それでも最低50枚程度は画像がないと正確な判断は難しい。第三の課題は、データサイエンティストやデータエンジニアへの依存度が高いことだ。
「設計から製造、運用のほか、大量のデータへのラベリング作業も必要となります。ただでさえ少ないデータサイエンティストやエンジニアへの依存度が、どうしても高くなってしまいます」(小林氏)
マイクロソフトが提供するAIサービス「Project Bonsai」とは
次に小林氏は、Bonsai Carに適用したマイクロソフトのAIサービス「Microsoft Project Bonsai」について紹介した。Project Bonsaiとは現在は限定プレビュー版の公開となるが、機械教示と強化学習を使ったインテリジェントなシステムに活用できるAIサービスである。
最大の特徴はAI自身が教科学習と機械学習により、自律的にAIトレーニングを行う点だ。しかも、人間が持っている知恵や経験を活かし、UI上から比較的簡単な操作でAIを作成することができる。
「BonsaiはAIがどのような意思決定したのかを可視化できます。また、ニューラルネットワークの設計も必要ありません」(小林氏)
Bonsaiは「Integrate」「Train」「Export」の3つのエリアで構成されている。Integrateでは、AIトレーニングに必要なフィードバックをする現実世界のトレーニングシミュレーターを用意。真ん中のTrainではAIに学習をさせ、Exportで学習済みのAIをデプロイしていく。このトレーニングしたAIをBrainと呼ぶ。
小林氏はBonsaiの重要なポイントについて、さらに次のように説明した。
「学習に必要なシミュレーターは、自前で作成する必要があります。しかしBonsaiはTraining simulatorからAPIを通じて学習させることで、大量のデータを用意する作業の代替をします」(小林氏)
データに対するラベリングなども必要ない。しかも、好きな開発言語で作成できる。データサイエンティストの手を煩わせることなく、開発者でも作成できることも大きなメリットだ。さらにデジタルツインを活用することによって、精度の高いシミュレーターを容易に作成することができる。
Trainエリアではまず、ポイントとなるのがトレーニングエンジンだ。同エンジンは次の4つのコンポーネントで構成されている。
- アーキテクト:トレーニングカリキュラムに沿って学習モデルを生成する
- インストラクタ:シミュレーターに提供された学習内容をコーディネートする
- ラーナー:インストラクタの指示に基づき、学習する役目を担う
- プロジェクタ:ラーナーがどんな動作をしたのか報告する役割を担う
Brain部分は、Linuxコンテナとしてエクスポートできる。オンプレミスやクラウドはもちろん、今回使用したRaspberry Piでもエクスポートすることで使用が可能となる。
Project Bonsaiを活用するメリットは、次の3点にまとめられる。第一に根拠となる目標、目的の設定が自分で行えるため、ブラックボックス部分を減らすことができる。第二に自律的にAIの学習を行ってくれるため、学習データを事前に用意する必要がないこと。
第三にシミュレーター部分は開発者が作成し、ローコードでAI作成ができるため、データサイエンティストの関与を最低限にすることができる。つまり、データサイエンティストの負荷を軽減することができるのだ。
AI自動運転ラジコンカー「Bonsai Car」とは?
Bonsai Carは、Bonsaiが自律的にラジコンを走らせ、壁などの障害物を自動的に避け、特定の画像に反応してアクションを起こす、自律走行ラジコンカーだ。前方についた赤外線センサーで対象物との距離を測定。台座の部分に付いたカメラで、画像を判断している。
Bonsai Carのシステム構成は以下の図のように、点線より上側がProject Bonsai、下がエッジ側、いわゆるRaspberry Piのシステムである。
DockerにCustom VisioとProject Bonsaiを乗せ、赤外センサーで検知した距離やカメラで取得した画像をPython経由でCustom VisionやProject Bonsaiに投げ、動作させるのだ。
そのシステム動作を具体的に示すと下記の図となる。最初にBonsai Carのカメラで画像を取得し、その画像をCustom Visionに投げ、追跡対象物を発見したらその位置情報を返す。
それを受けとったPython側は、Bonsai Carから取得した距離の情報と追跡対象の情報をProject Bonsaiに投げる。Project Bonsaiはその対象物の方に進むのか、はたまた対象物がなければどう進むのか自分で考え、アクセルの強さとハンドルの向きを解析。その値をPython側に返す。その値で、Bonsai Carを操作する仕組みとなっている。
Bonsai Carを開発するまでの学習アーキテクチャを解説
続いて、寺岡氏が登場。「素人でもProject Bonsaiを使えば、学習モデルを作れることを紹介したい」と前置きし、Bonsai Carを開発する学習アーキテクチャに関する説明を行った。
まず、Project Bonsaiの学習フローのイメージを図で表すと次のようになる。合計3ステップで学習が進行し、より高い評価が得られる行動を学習する。
第1ステップは、評価が高い行動の実行。Bonsai Carで言えば、壁が目前に迫ってくると避けることが評価の高い行動となる。評価の高い行動をシミュレーターに送信すると、シミュレーターはその環境情報を更新する。第2ステップとしては、シミュレーターは実シミュレーターや車の位シミュレーター画像の情報などを内部に持っているので、そこに対して車のリアクションを受け取り、行動実行後の環境情報を目標(Inkling)に通知する。
Inklingで目標の設定を記載する際は、目標にどれだけ近づいたのかを評価し、その結果をBrainに投げ返して、先ほどの行動が良かったかどうかを判断。さらによりよい評価が得られる行動を学習させていくのである。
実装については、まず普通のシステム開発の要件定義のように前提条件から進めていった。前提条件としては真ん中に車があり、周りには壁が配置されており、社長と大阪所長の画像が部屋の中にある。
実現したい目標は次の4点。「壁にぶつからずに走り続ける」「社長のアイコンがカメラに映ったら近づく」「大阪所長のアイコンがカメラに映ったら離れる」「できる限りスピードを出す」。
第3ステップは、これらの目標を達成するために車にどういう動きをさせるのか、その整理を行った。車は前方向に指定の速度で移動する「前進」、後ろ方向に指定の速度で移動する「後退」の2種。そして前進・後退させるために、左方向または右方向に移動先を補正するハンドル操作を行う。
最後に行うのは、取得できる情報についての整理。1つ目は赤外センサーの検知距離。車体の前方に設置した赤外センサーで、障害物までの距離を検知する。
2つ目は車体とアイコン間の距離。カメラに映った映像から、画像のサイズ=距離を判断する。3つ目は車体とアイコン間の角度。カメラに映った映像から、画像と車体の前方から角度を算出することで得られる。
この要件をProject Bonsaiの学習アーキテクチャに照らし合わせると、次のような図になる。
Project Bonsaiの学習キーワードは「アクション」「ステート」「評価」の3つ。Bonsai Carは前進または後退、またその速度、壁との距離、および画像との位置関係の情報、壁にぶつからずにできる限り早い速度か、また画像に対して指定のアクションを行えているか、と3つのキーワードに当てはめることができる。
この関係図を描ける題材であれば、Project Bonsaiの適用が可能となる。
続いて寺岡氏はシミュレーターの開発へと話題を移した。シミュレーターからアクションを送信し、シミュレーターでステートを返信するというシンプルさ。だが、決して簡単ではなく、「ゲームプログラミングに近い実装が必要だった」と明かす。
シミュレーターとはプログラム上ですべての環境情報を実現するものである。現実の状態をシミュレーターで表現しなければならない。
コネクタというBonsai workspaceに接続するためのライブラリが必要になるが、好きな言語で実装できる。Bonsai CarではC#で実装したが、PythonやNode.js、Javaなどの言語も利用可能だ。
シミュレーターはBonsai workspaceを利用して開発する。Bonsai workspaceはBonsaiのBrainとInklingを提供するクラウドサービスである。Bonsai WorkspaceにはWorkspace IDとAccess keyを使ってアクセスする。
学習の概要フローは、まずシミュレーターを初期化して、Workspaceよりアクションを送信、シミュレーターのステートを更新。Inklingで設定した目標を評価し、失敗条件に該当した場合はその学習はストップする。失敗条件に該当しない場合でも指定のステップ回数を超過した場合は、その学習をストップさせる。
「このエピソードを複数回繰り返すことで学習させる。何度も繰り返して得られる評価が収束するところまでを学習としました」(寺岡氏)
Inklingは、シミュレーターから送信されたステートを評価するBonsai独自のプログラム言語である。InklingはWebブラウザ上で実装。またシミュレーターに送信するアクション定義もInklingで実装する。
実際のInklingの設定、およびシミュレーターの作成の方法はデモで紹介された。またBonsai Carがちゃんと目標通りに動くかどうか、シミュレーター画面でその学習成果も確認できた。詳しい設定の方法などについては、こちらを参考にしてほしい。
※デモで紹介されたシミュレーション画面
Bonsai Carを実際に動かすためのハードウェアの仕組みを紹介
最後に登場した大北氏は、Bonsai Carを実際に動かす仕組みを紹介した。Bonsai Carに搭載されているハードはRaspberry Pi。Raspberry Piの特徴は、85mm×56mmという小さな基板にも関わらず、コンピュータとして使用するにあたって最低限必要な機能が揃っていることである。
大北氏一番の推しポイントは、GPIOピンという端子が用意されており、簡単に電子工作ができることだ。Raspberry Piを搭載するラジコンは、距離情報を取得する赤外線センサーと、進行方向の判断をするためのカメラが搭載されている。
Project Bonsaiの実行方式はAzure IoT Centralを使用し、トレーニング済みBrainをクラウドサービスモジュールとして公開する方法とRaspberry Pi上のDockerにBrainを構築し、ローカル環境で実行する方法がある。
「コストがかからないこと、WANを経由しないので通信遅延が発生しないこと。この2つの理由によりローカル実行案を採用しました」(大北氏)
Pythonで書いている処理は次の図の通り。
Project Bonsaiを呼び出すプログラムについても紹介された。
まずはPostする際のURLを設定するのだが、「v1/predictionは固定。ここは要注意ポイント」と、大北氏は指摘する。
次に、学習したBrainをRaspberry Pi上で動くようにセットアップしていく。だが、それには次のような前提条件がある。
- Azure CLIがインストールされていること
- 使うローカルコンピュータ上にDockerがインストールされていること
- Bonsai側でトレーニングが終わっていること
Bonsaiの絵が出てきたら、セットアップは完了である。
最後に大北氏は、Bonsai Carを動かしたシーンを動画で流しながら注意点を語った。
「ハードエンジニアにとっては当たり前のポイントですが、ソフトエンジニアにとって見逃しがちなポイントは、ハードを交換したらシミュレーターのチューニングが必要になることです。何気なく部品や電池を交換すると、シミュレーターで設定している速度などの値が実機と異なってくる可能性があるため、注意が必要です」(大北氏)
実際、今回のラジコンでも電池を高出力なモノに替えたことで、シミュレーターで設定している速度と実際の速度に差が生じたため、設定値を見直したという。
また苦労したポイントとしては、Brainの呼び出し時のパスを挙げる。
「BrainをVer.13でエクスポートしたのですが、実行する際のパスはV1とする必要があり、気づくまでに結構な時間がかかってしまいました。皆さんはまらないようにしてくださいね」(大北氏)
【Q&A】盛り上がった質疑応答タイム
3人の発表が終わり、Q&Aタイムに入った。多くの質問が寄せられ、大いに盛り上がった。その一部を紹介する。
Q.Project Bonsaiを使った他のプロジェクトはあるか
寺岡:現在パブリックプレビューということもあり、本運用のサービスでは引き合いがないのですが、研究開発案件での引き合いが来たことがあります。
小林:補足ですが、マイクロソフトでは風力発電の羽根の方角や位置などを風向きで調整したり、飛行機のメーカーがフライトシミュレーションを使って自動で空を飛ばせるようにする事例があります。
Q.カメラやラズパイに合う形のラジコンのボディ(白色)やタイヤはどうやって用意、作成したのか
大北:市販のラジコンカーセットを購入しました。カメラの性能が良いモノ、スピードを出しやすいモノなどいろいろな種類があり、選定には悩みました。
Q.50cmごとに画像取得を判定するとのことだが、車体のスピードと判定周期はどのように調整したのか
寺岡:あらかじめBonsaiのコンテナを使って、1秒ごとにアクセルの強さなどのシミュレーターを作って、調整しています。
Q.Project Bonsaiの仕組みの説明はMicrosoftから利用ガイドなどが出ているのか
小林:こちらに公式のリファレンスが公開されているので、ご参照ください。
Q.Bonsaiを使うメリットは、tensorflowなどをpythonでプログラムを書かずに、学習部分を簡単につくれることか
寺岡:簡単にでき、AIエンジニアの負荷を減らせる点がメリットです。Bonsaiの目標設定部分はAIエンジニアの知見が必要ですが、開発者でもある程度はAIの開発ができるようになります。
Q.各フェーズで一番つまずいたポイントは?
小林:Bonsai Carに至るまでが大変でした。生み出しのところが一番つまずきました。
大北:Dockerのビルドが通らなくて、新しいバージョンにアップデートしたり、OS1つでビルドが通る通らないが影響するのかといったところが一番、つまずいたポイントです。
寺岡:一番大変だったのは、シミュレーター上の動きとラジコンの動きを同期させること。妥協した部分もあります。それを調整するのが大変でした。
※注* Project Bonsai、Bonsai Microsoft Projectは、米国 Microsoft Corporation の米国及びその他の国における登録商標または商標です。
※注*記載されている会社名および製品名は、各社の商標または登録商標です。