Googleが開発したオープンソースの機械学習用ソフトウェアライブラリ「TensorFlow」を活用し、マリオカートで自動運転を再現した様子をデベロッパーのケビン・ヒューズさんが公開しています。

TensorKart: self-driving MarioKart with TensorFlow

http://kevinhughes.ca/blog/tensor-kart

デベロッパーのヒューズさんは年末年始の空き時間に、「人工ニューラルネットワークを用いてマリオカート64をプレイする」というプロジェクトに取りかかったそうです。ヒューズさんは過去数年の間、「機械学習を用いて何かしたい」と考えていたそうで、特に最近話題のTensorFlowを使ってみよう、ということで今回のプロジェクトを思いついた模様。このプロジェクトの内容は、「TensorFlowを用いて人工知能がマリオカート64をプレイできるように学習させる」というものです。

その成果は以下のムービーで確認できます。人工知能が走るコースはマリオカート64の中でも初心者向けの「ルイージサーキット」で、使用するドライバーは「マリオ」、ゲームモードは「タイムアタック」です。

TensorKart - Luigi Raceway - YouTube

さっそくタイムアタックスタート。



スタート前のカウントダウン中にアクセルを押すことで可能な「ロケットスタート」はせずにスタート。



コースの最初にある大きなカーブは難なくクリア。なぜか3つあるレーンの真ん中を維持するように走ります。



カーブ後のトンネルに突入。



途中まできれいにコースを走っていたのですが……



カーブの途中で曲がりきれずに壁に激突。



さらに、トンネルを抜けた後に1度コースアウトしてしまいました。



しかし、トンネル後の大きなカーブは無事クリアして……



2周目に突入。



若干ふらついたりもするものの、大きめのカーブでコースアウトすることはありません。





しかし、2周目でもトンネル内で壁にちょっとだけぶつかります。



さらにふらついてインコースギリギリでトンネルを抜けるのですが……



1周目でちょっとだけコースアウトした場所ではしっかりレーンの中を走ることに成功。



その後、3周目でも大きなカーブは問題なくクリアするのですが……



トンネル内のカーブではどうしても壁にぶつかってしまう模様。



そしてそのままクリア。タイムは1周目が45秒32、2周目が43秒37、3周目が41秒97と、ラップを重ねるごとにタイムが縮まっているのが分かります。なお、タイムアタックで3回だけ使えるダッシュキノコは未使用で、カーブの際のドリフトやジャンプなどのテクニックも一切使用していませんでした。



さらに、ピーチサーキットを走る様子がGIF画像で公開されており、ルイージサーキットを走る際よりもカーブでインコースを走っているように見えます。なお、これらを実現するのは「決して簡単なことではなかった」とヒューズさんはブログに記しています。



ヒューズさんはトレーニング用のデータセットを作るため、PC画面のスクリーンショットを撮影して自身のコンピューターに画像を同期するためのプログラムを自作。そして、まずはPC上のマリオカート64のエミュレーターで自分がゲームをプレイし、PC画面のどの位置のスクリーンショットを撮影するのかを決めたそうです。このプログラムを使用することで、ヒューズさんが開発したマリオカート64専用の自動運転人工知能である「TensorKart」が行うアクションを記録していったそうです。



ヒューズさんは、TensorFlowの文字認識チュートリアルのMNISTというデータセットを修正したり、NVIDIAが自動運転カーのために開発しているソフトウェアを活用したりすることで、自身で用意しなければいけないコードを単純化したとのこと。そして人工知能を機械学習させるわけですが、ヒューズさんは「TensorFlowによる訓練はプロジェクトの中で最も簡単なパートだった」と語っています。なぜTensorFlowでは訓練がとても楽なのかというと、素晴らしい資料と多くのチュートリアルやソースコードが存在するからだそうです。

ヒューズさんはC言語でのプログラミン経験がなかったそうで、プログラミングの際にはオリジナルの入力ドライバのソースコードをコピペすることから始めたそうです。ヒューズさんの目標は人工知能からの出力をPC上にあるマリオカート64のエミュレーターに反映させ、適切にカートを走らせることで、以下のように実際にカートをグルグル走らせることに成功。



さまざまな準備の末にTensorKartがマリオカート64をプレイする環境が整ったわけですが、最初のレースではカートが真っ直ぐ壁に突っ込み、曲がろうとしないという散々な結果に終わったそうです。これを修正するため、ヒューズさんはTensorKartにマニュアルでの走行機能を追加。必要な際に人工知能にヒューズさんによる運転を見せることで、より良い走行技術をTensorKartが学べるようにした、としています。

TensorFlowを用いてさまざまなチャレンジを行ったヒューズさんですが、「もしも私が別のディープラーニングプロジェクトを行うなら、恐らくTensorFlowを直接使用することはないだろう。その場合、私は恐らくKeras(Pythonで書かれた、TensorFlow上で実行可能な高水準のニューラルネットワークライブラリ)を用いるでしょう」と記述しています。

また、Googleの自動運転カーで使用されている技術と同じものを活用し、約20分のトレーニングデータで人工知能が大多数の簡単なコース(ルイージサーキットなど)を走行できるようになり、訓練していないコースでも走れるようになったとのこと。加えて、「より多くのデータがあれば、マリオカート64用の完全な人工知能を作り出すこともできると断言できる」とコメントしています。

なお、TensorKartのソースコードはGitHub上に公開されています。

GitHub - kevinhughes27/TensorKart: self-driving MarioKart with TensorFlow