masato-ka's diary

日々思ったこととか、やったことの備忘録。

Variational Auto Encoderを利用したAI RC Carの教師なし学習の検討

この記事について

この記事はAI RC Car アドベントカレンダー22日目の記事です。今回はAI RC Carの教師なし学習について考察します。

AI RC CarのDLモデル学習とそれぞれの課題

AI RC Carが走行に利用する学習モデルは基本的に教師あり学習で行われます。AI RC Carから撮影したコースの画像と、それぞれの画像に紐づけられた教師ラベルです。この教師ラベルの良し悪しによってAI RC Carの走行特性が大きく変わります。例えばDonkeyCarのような模倣学習を行なった場合、ドライバーがコース上を綺麗に走行することで、推論走行時にコースを綺麗に走行できます。また、JetRacerのようにマニュアルでアノテーションを付ける場合はアノテーションの付け方によって走行時の特性が決定します。

 これらの教師あり学習に共通して言えることは、教師ラベルの付け方が最終的な走行性能に影響を当たるという点です。これはAI RC Carを扱う人がラベルの付け方を訓練してコツをつかむ必要があることを意味します。

 しかし、画像のみからコースを走行するために必要な情報を学習できれば、人によるラベル付けに影響を受けません。そこで、今回はラベルを必要としない教師なし学習でAI RC Carの走行用モデルを学習させる方法を検討します。

VAEによる教師なし学習

DLの教師なし学習のモデルとして、Auto Encoderと呼ばれるモデルがあります。今回はAuto Encoderの発展系のモデルであるVariational Auto Encoder(VAE)を利用します。Variational Auto Encoderそのものについての詳細は他の詳しいサイトを参照ください。

qiita.com

簡単にいうとAutoEncoderは与えられた画像と同じ画像を出力するように学習させたCNNです。ネットワークの構造は大きく3つに別れています。まずはじめにEncoder層です。この層は一般的なCNNと同様に、画像を畳み込みフィルタで圧縮します。次に、中間層と呼ばれる層ではEncoderで画像から圧縮された 特徴を保持します。最後の層はDecoder層ですこの層はEncoderと逆向きのネットワーク構造を持っています。中間層から受け取った特徴から元の画像を再構成します。学習はEncoderに入力した画像を同じ画像がDecoderから出力されるように学習を行います。このように学習すると、中間層の特徴変数(潜在変数)は元の画像の情報を十分に表現した特徴を抽出していると言えます。このAEを拡張したVAEでは中間層の潜在変数が正規分布に従うように正則化して学習を行います。実はこうすることで、潜在変数の個々の変数に意味を持たせることができるようです。

VAEによるAI RC Carのステアリング制御

VAEでAI RC Carのステアリングを制御する方法については以下の論文を参考にしました。この論文では実車の車載カメラから撮影した画像をVAEで学習を行い自動運転をするというものです。VAEの潜在変数のうち、道路の曲率を説明する変数を使いステアリングの制御に活用することを提案しています。実はこの論文の中ではステアリングの制御については詳細は説明されていません。ですので、ここから先はどのように実現するか検討する必要があります。

http://people.csail.mit.edu/rosman/papers/iros-2018-variational.pdf

本記事のゴールは、AI RC CarでもVAEを使いコース上のカーブの曲率を説明する特徴を抽出できることを検証し、それ以降は今後考えていきます。

VAEの実装と実験

VAEの実装はこちらのPytorchの実装を参考にしました。

github.com

ただし、このままの実装だとLoss関数が思わしくなかったため、Loss関数部分をこちらの実装に置き換えています。

www.sambaiz.net

ハイパーパラメータとして、バッチサイズは32、エポック数は300を与えています。画像サイズは64x64です。また、VAEでは潜在変数の数を決定します。潜在変数が少なければ表現力が失われ、変数が多くなれば変数を扱うときに不便です。今回は変数 5, 10,25で100エポックづつ学習させて再構成された画像を比較してみたところ、10程度で十分と考えました。かなり小さい画像ですが左が入力画像、右が再構成された(最終的に出力された)画像になります。

f:id:masato-ka:20191217000304p:plain
5変数
f:id:masato-ka:20191217000347p:plain
10変数
f:id:masato-ka:20191217000411p:plain
25変数

変数5では背景が多少ぼやけています。10, 25ではそんなに変化がないように見受けられます。

結果と考察

実際に1300毎程度の画像を300エポック学習させました。どのくらいが適正な画像枚数なのかわかりませんが、1300枚は学習データとしては少ない枚数だと思います。まずは学習後、実際に再構成された画像は以下です。これは学習ずみのVAEにコース画像を入力し、デコーダから出力された画像を並べたものです。かなりぼやけてはいますが、人目に見て、コースだということがわかるくらいには表現されています。まず学習としては成功と言えると考えられます。

f:id:masato-ka:20191217001223p:plain
再構成画像

続いて、各変数の値の意味を確認していきます。実は各変数がデコーダの出力を通ってどのように画像に影響を与えるかを解析的に求める方法はありません。(もし手法があるなら教えて欲しい)上記の参考文献でも各変数のうち1つのパラメータを変動させてデコーダ出力を観察すると記載されています。 そこで、上記再構成画像の1枚めの画像の潜在変数をサンプリングし、10個の潜在変数をそれぞれ独立に-20か20の間で1づつ変化させた画像を作成しました。つまり画像の生成を行なっています。

f:id:masato-ka:20191217001741p:plain

小さい画像で見にくいですが、パラメータを変えることで、画像が変化していっていることがわかります。このうち、上から7列めの画像では右から左にかけて白線の傾きが変わっているように見えます。拡大して、GIF画像にしたのが以下のものです。

f:id:masato-ka:20191217232040g:plain

このように、白線の傾きを1つの潜在変数で再現することが可能となりました。同様に、白線が傾いて見えるカーブの画像を入れると、この変数の値は白線の傾き具合、つまりカーブの曲率を出力されると考えられます。これで画像のみからコースに関する知識を抽出することが可能となりました。

課題

今回はVAEを使い、コース画像のみから、教師データなどの事前知識なしに、どういった画像がカーブなのかというコースに関する知識を抽出することができました。しかし、これで実際にAI RC Carを走らせるには課題があります。

  1. 潜在変数の取り扱い

VAEでは学習を行うたびに潜在変数が表す値が変わってきます。これを固定する方法は現在のところありません。また、今回はたまたま曲率を表すパラメータを抽出できましたが、必ずカーブの曲率を学習するという保証もないと思っています。潜在変数の評価方法と、最適な潜在変数のパラメータ数を追求する必要がありそうです。

  1. 実機での制御

カーブの曲率を表す潜在変数を見つけたとしてここから制御値にどのように落とし込むかはまだ課題です。値の変化がカーブの曲率に対して比例していれば、PID制御など単純な制御でうまくいきそうな気もします。ただし、必ずしも潜在変数がカーブの曲率を表現する保証がありません。先行事例では潜在変数を使った強化学習により、制御を獲得する方法もあります。

https://towardsdatascience.com/learning-to-drive-smoothly-in-minutes-450a7cdb35f4

まとめ

今回はVAEによる教師なし学習でコースに関する知識を学習させることができました。今後は潜在変数による制御方法の獲得を目指したいと思います。