MineRL導入テスト

 いろいろ試してみるのにMinecraftを題材にしてみたくなったのでMineRLを導入した。Dockerコンテナで適当にライブラリを入れていくだけで無事入った。

 ドキュメントにあまり明記されていない感じだったが、MineRLObtainDiamondShovel-v0 環境だと入出力は以下のような感じに推察された。

  • 入力
    • "pov" : 360 x 640の見えている画像
    • "inventory" : インベントリの情報
  • Action
    • 辞書形式
      • 各種ボタンを押すかどうか2値
        • ESC, attack, back, forward, left, right, jump, spring, sneak, use, hotbar8個
      • カメラの向きの変更角度量を指定
        • yaw角度, pitch角度の2つがある。単位がradかdegかはまだ未確認

 基本的に画像だけの観測を使い、行動はこのままで良さそう。

 これに対して強化学習的なことをしてみたい。状態としての画像と行動系列を得られることを確認した。

フレームID 状態 行動
0000 {"ESC": 0, "attack": 1, "back": 0, "camera": [-53.381187438964844, 5.193726539611816], "drop": 0, "forward": 0, "hotbar.1": 0, "hotbar.2": 0, "hotbar.3": 0, "hotbar.4": 1, "hotbar.5": 0, "hotbar.6": 1, "hotbar.7": 1, "hotbar.8": 0, "hotbar.9": 0, "inventory": 0, "jump": 1, "left": 0, "pickItem": 1, "right": 1, "sneak": 0, "sprint": 1, "swapHands": 1, "use": 1}
0001 {"ESC": 0, "attack": 1, "back": 0, "camera": [178.921142578125, -162.7048797607422], "drop": 0, "forward": 1, "hotbar.1": 1, "hotbar.2": 1, "hotbar.3": 0, "hotbar.4": 0, "hotbar.5": 0, "hotbar.6": 1, "hotbar.7": 0, "hotbar.8": 0, "hotbar.9": 1, "inventory": 0, "jump": 0, "left": 1, "pickItem": 1, "right": 1, "sneak": 1, "sprint": 0, "swapHands": 1, "use": 0}

 一回の試行で18000フレームが得られた。ランダム行動なのでまともな行動ができているわけではない。

 長かったのでちゃんと見ていたわけではないが、最後はライフが尽きて終わりになっていた気がすぐがフレーム数がキレイすぎることはちょっと気になる。なんらかの上限があるのかどうか。

 検索してみた感じだとなにかしらの上限はありそう。

VAE

 すべてをゼロから学習するのも難しいとは思われるので、まずは画像の特徴抽出として学習済みの適当なVariational AutoEncoderを使ってみることにした。

 得られた画像に対してVAEで適当にEncode, Decodeをする。

from diffusers.models import AutoencoderKL

device = "cuda" if torch.cuda.is_available() else "cpu"
vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-ema").to(device)
vae.eval()

obs = np.copy(obs["pov"])
x = torch.tensor(obs).permute(2, 0, 1).unsqueeze(0).float().div_(255).to(device)
z = vae.encode(x).latent_dist.sample().mul_(0.18215)
x_hat = vae.decode(z / 0.18215).sample
obs_hat = x_hat.squeeze().permute(1, 2, 0).mul_(255).byte().cpu().numpy()

 zを求めるときに謎の係数がかかっているのは DiT/train.py at ed81ce2229091fd4ecc9a223645f95cf379d582b · facebookresearch/DiT · GitHub をそのまま真似したため。

フレームID 状態 再構成
0001
0002
0003

 大まかにはかなり上手く再構成できているが、UIの細かいところなどは怪しくなっている。ゲームをプレイする上ではこれらの部分も重要になってくると思われるのでそこがどうか。

 とりあえず「現状態の表現 + 行動 -> 次状態の表現」を予測できればおおよその概観の遷移予測ができるかどうかは判別できそうであるため、それを目指してみることにしたい。そこの予測部分で場合によっては拡散モデルやその派生手法を使うことになるのではないか? などと思ったりはしている。

余談

 これに際して自分でもMinecraftのプレイを始めた。ダイアモンド取得くらいまではできるようになりたいが、一人称でキーボードWASD操作のゲームに全然慣れていないせいか、3D酔いがちょっと出る。一日30分くらいしかできないかも。