AWS DeepRacerのハンズオンをやってみた

# はじめに
面白そうだからAWS DeepRacerやってみようという話になったのでとりあえずハンズオンやってみました!
# AWS DeepRacerとは
AWS DeepRacer(以下DeepRacer)とは、楽しく体系的に強化学習を学べるサービス

評価関数やハイパーパラメーターを設定してモデルを作成することでシミュレータ、もしくは実機でレースをすることができます。
# DeepRacerを始める
早速DeepRacerを始めてみましょう！

マネジメントコンソールからDeepRacerにアクセスします。
ここからの流れは基本的に[AWS DeepRacer Workshop](https://catalog.us-east-1.prod.workshops.aws/workshops/03f7e662-e3b1-4c5b-8fbe-b6af0c00c7b2/ja-JP) のハンズオンに沿って行っていきます。

ハンズオンの内容だけであれば無料枠内で完結するはずです。

# 車両のカスタマイズ
まず、左メニューのYour garageから自分専用の車両を作成します。

~~ハンズオンにはステアリングなどを設定する項目があったのですが見当たらないので見た目とカメラだけ設定して進めます。~~ 
チュートリアルが作られた時と設定の順番が前後していました。モデルを作成する際にステアリングなどは設定します。

![Vehicle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/d608aa69-3710-9b72-3b41-b51d7cbe8a70.png)
色は自由に選んで、カメラはとりあえず一人で走るだけなのでCameraを選択します。

各カメラの用途は以下のようになっています。
| カメラの名前 | 用途 |
|:-:|:-:|
|Camera|スタンダードなタイムアタック用|
|Stereo camera|立体視カメラ　障害物レース,直接対決レース用|
|LIDARセンサー|後方の死角用センサー　直接対決レース用|

これで車両の設定はOKです！

# モデルの作成
まず、左メニューからYour modelsを選択

Create Modelを選択
Modelの名前を決める
コースを選択 ハンズオンに則ってここではThe 2019 DeepRacer Championship Cupを選択(けっこう後ろの方にある)![model_cource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/bb89b1cd-d02f-db5d-2c20-8e4e72cbfec6.png)

レースタイプはtime trialを選択、ハイパーパラメータはとりあえずノータッチでOK

ここでステアリングの設定があるのでDiscrete action spaceを選択
ステアリング角度 MAX:30° 粒度:5
スピード MAX:1m/s 粒度:3
に設定
![actionspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/ffc95b32-6e86-1efa-9952-65fedc75cfcd.png)
次にさっき設定した自分の車両を選択

ここで報酬関数を設定します
ハンズオンの資料に乗っている報酬関数の中でも一番スタンダードな関数を設定します。
```py
def reward_function(params):
    '''
    エージェントにセンターラインに従うように報酬を与える例
    '''
    
    # 中心線からだんだん離れていく3つのマークを計算する
    marker_1 = 0.1 * params['track_width']
    marker_2 = 0.25 * params['track_width']
    marker_3 = 0.5 * params['track_width']
    
    # 車が中心線に近いほど報酬を与える
    if params['distance_from_center'] <= marker_1:
        reward = 1.0
    elif params['distance_from_center'] <= marker_2:
        reward = 0.5
    elif params['distance_from_center'] <= marker_3:
        reward = 0.1
    else:
        reward = 1e-3  # クラッシュした可能性が高い / トラックから外れた状態に近い
    
    return float(reward)
```

Stop conditionsはモデルをトレーニングする最大時間で
ハンズオンの設定であれば少なくとも120分で設定しておきましょう

Automatically submit to the DeepRacer Leagueの設定はどっちでもOKです。

# トレーニング
見てるだけ(二時間)
よちよち歩く赤ちゃんを見守ってる気分ｗ
<iframe width="1206" height="721" src="https://www.youtube.com/embed/_rJwx8_szB8" title="DeepRacer(Qiita用)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



トレーニングが終了したらログがダウンロードできたり,報酬のグラフが見れたりします
# モデルのパフォーマンス評価
トレーニングの下にあるEvaluationからStart evaluationを選択します。
コース選択はre:Invent 2018を選択,レースタイプはTime trialを選択しStart evaluation！ 
![cource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/277b7b2e-3efc-f227-647b-ac4ddcdbd833.png)

評価が始まるとコースを走る様子がリアルタイムで表示されます。(撮り忘れた・・・)


評価が終了するとラップタイムと完走率が表示されます。
![evolve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/1e920640-8e05-db77-f6e2-6d9bdf0ae6ab.png)

これでモデル完成です！　これでレースに出場したりモデルをさらに改善することもできます！

# さいごに

今回はハンズオンにそってDeepRacerを触ってみました。
ハンズオンではサンプルの報酬関数を使いましたが、もっとこだわって作りだしたらなかなか沼なサービスなんじゃないかなと思います・・・

なかなか楽しいし、勉強にもなるのでぜひ皆さんも触れてみてはいかがでしょうか。