Animal AI Olympicsの環境を触ってみる

# 基本情報

http://animalaiolympics.com/

トップページ動画があるが、このタスクを解くわけでは無い。
タスクは、以下に説明がある。10個。

https://www.mdcrosby.com/blog/animalaieval.html

1. Food
2. Preferences
3. Obstacles
4. Avoidance
5. Spatial Reasoning
6. Generalization
7. Internal Models
8. Object Permanence
9. Advanced Preferences
10. Causal Reasoning


ルールはこちら
http://animalaiolympics.com/rules.html

順位は、EvalAIというプラットフォームでつけている。

https://evalai.cloudcv.org/web/challenges/challenge-page/396/leaderboard/1107

EvalAIは、CLIがあり `pip install evalai` で簡単インストール

https://evalai-cli.cloudcv.org

EvalAIにアカウント作成後、トークンが得られるので、CLIは、それを使ってログインする。

# 評価申請の方法

評価はスクリプトをPushするかDockerイメージをPushすると自動で実行される。
Animal AI Olympicsでは、Dockerイメージを使う。学習済みモデルはDockerイメージに含めておく。（余談だが、AWSを使っているらしい。DockerイメージはECRにPushされる）

評価申請の方法は以下に書かれている。
https://github.com/beyretb/AnimalAI-Olympics/blob/master/documentation/submission.md

以下に評価申請用のサンプルがあり、これを修正する。
https://github.com/beyretb/AnimalAI-Olympics/tree/master/examples/submission

[Dockerfile](https://github.com/beyretb/AnimalAI-Olympics/blob/master/examples/submission/Dockerfile)には、必要なライブラリのインストールなどを書く。
学習済みモデルは[data以下](https://github.com/beyretb/AnimalAI-Olympics/tree/master/examples/submission/data)に置く。[agent.py](https://github.com/beyretb/AnimalAI-Olympics/blob/master/examples/submission/agent.py)を修正し、step毎にActionを推論するようにする。
このdata以下とagent.pyは、Dockerイメージ無いにコピーされる。

# 実行の仕方

```
$ git clone https://github.com/beyretb/AnimalAI-Olympics.git
$ pip install animalai
```

https://github.com/beyretb/AnimalAI-Olympics/tree/master/#requirements

にある"Environment link"からダウンロード。自分の環境のものをダウンロード。

[![Image from Gyazo](https://i.gyazo.com/96834e03a04328b35809789f5ce9da25.png)](https://gyazo.com/96834e03a04328b35809789f5ce9da25)

cloneしたディレクトリの中の'env/'にダウンロードした実行ファイルを配置

<img width="60%" alt="finder" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/1aad16c6-a218-93ec-0420-6392f05b90e4.png">

visualizeArena.pyを実行。

```
$ cd AnimalAI-Olympics/examples
$ python visualizeArena.py
```


<img width="70%" alt="game screen" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/ecdead5b-61d9-4990-03cc-fcc3d32eb235.png">

`c`を押すと一人称視点へ

<img width="70%" alt="game screen" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/f72f242a-6b4a-bfd7-0bcb-b0807bed31b5.png">

`w`, `a`, `s`, `d`で移動できる。

configsの中にタスク1〜7のサンプルがある。これは、審査のサンプル。8〜10は秘密らしい。

```
$ python visualizeArena.py configs/6-Generalization.yaml
```

<img width="70%" alt="game screen" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38555/4097d285-4969-d133-f552-d7744435b3b5.png">

# 環境についてメモ

https://github.com/beyretb/AnimalAI-Olympics/blob/master/documentation/training.md

に、ObservationとActionについて記述がある
Action spaceは、[3, 3]で、それぞれ (0: nothing, 1: forward, 2: backward) と (0: nothing, 1: right, 2: left)の意味になる。つまり、2次元のAction。

ただ、Open AI Gymでは、1次元にしないといけないので、[AnimalAIEnv](https://github.com/beyretb/AnimalAI-Olympics/blob/master/animalai/animalai/envs/gym/environment.py)というラッパーがある。これで、[3, 3]のAction spaceをflattenしており、action spaceは9になる。つまり

* 0: [0, 0] nothing, nothing
* 1: [0, 1] nothing, right
* 2: [0, 2] nothing, left
* 3: [1, 0] forward, nothing
* 4: [1, 1] forward, right
* 5: [1, 2] forward, left
* 6: [2, 0] backward, nothing
* 7: [2, 1] backward, right
* 8: [2, 2] backward, left