目次
VRC面白いので、操縦して遊んでしまいます(笑)
VRCなかなかよく出来てます(笑) ってそっちじゃない。。 こやつを動かすとラジコンしたくなるぅ~~ 僕のラジコン機材古いので、新しいの誰か安く譲って(笑)ってまたラジコンするのか?(笑)
で・・前回は、NvidiaのDNNを読んでやってることを、あらかた理解したつもりになってます。でも、こういうのってすぐ忘れちゃうんだよなぁ~ だからブログに記憶させているんですが(笑)
【自作UAV】深層学習が何を学んでいるのかを知る NVIDIA BB8がルールをどう作ってるの?【PilotNet・TensorKart】
TensorKartのコードを読んでみる
全体をまずは、ざっくり・・Pythonで書かれています。
コード | |
play.py | |
record.py | |
train.py | |
utils.py | 640×480のゲーム画面を200×66に変換するのと、教師信号を見たり、画像を見たりするユーティリティプログラムですね |
ちゃんと中身見ないで、書いています。あとで間違いあれば、修正するかもです。
利用ライブラリ関係
Pythonライブラリの依存関係は、requirement.textに書かれています。Pythonも実はあんまり知らないので、こやつらも注釈入れておこう。
inputs==0.1 | KeybordやJoystickの入力ライブラリのようです。 | |
wxPython==4.0.0a1 | PythonのGUIライブラリらしい。 | |
matplotlib==1.5.2 | グラフ書いたりするライブラリ | |
numpy==1.10.1 | 行列計算のライブラリ | |
scikit-image==0.12.3 | 画像処理のライブラリ 二値化とかフィルタとか | |
termcolor==1.1.0 | ANSIテキストのカラーフォーマッター | |
keras==2.0.3 | ディープラーニングのライブラリ | |
h5py==2.7.0 | バイナリーデータを扱うライブラリ | |
tensorflow-gpu==1.0.1 | GPUでTensorflowを使うライブラリ | |
Pillow==4.1.0 | これも画像処理のライブラリですね。 |
う・・・これ全部勉強してたら・・・おじさんは、もう人生終わってしまいます(笑) だから、このリンクを作っておいています。。
コード
さて・・どれから読むか?(笑)
こういう時は、使う順番から読んでいくことに限りますね。。
使う順番は、record.py, utils.py, train.py, play.py おっぱい。。 の順番です<おぃ
record.py
220行のコードだから、一行一行注釈入れておこうかと思ったけど、めんどくさくなった(笑)
画像を映しながら・・ジョイスティックの動作をグラフ化して動いているのを見せるのと、マリオカートの動画をスナップショットして、同期させてバイナリーで保存しているだけのようですね。
ここは、作らないといけないですね(^^;
作るのに必要そうなところだけ抜粋しておこうっと
def take_screenshot(self): screen = wx.ScreenDC() bmp = wx.Bitmap(Screenshot.IMG_W, Screenshot.IMG_H) mem = wx.MemoryDC(bmp) mem.Blit(0, 0, Screenshot.IMG_W, Screenshot.IMG_H, screen, Screenshot.OFFSET_X, Screenshot.OFFSET_Y) return bmp
def save_data(self): image_file = self.outputDir+'/'+'img_'+str(self.t)+'.png' self.bmp.SaveFile(image_file, wx.BITMAP_TYPE_PNG) # make / open outfile outfile = open(self.outputDir+'/'+'data.csv', 'a') # write line outfile.write( image_file + ',' + ','.join(map(str, self.controller_data)) + '\n' ) outfile.close() self.t += 1
PNGで保存しているんですね。ジョイスティックは、data.csvで入れてる。
Utils.py
load_sample(sample) という関数で、record.pyで作ったデータを読み込んで、
xには画像を、リサイズして入れ、yにはジョイスティックのデータを入れて一つのファイルにしている模様。。
やっぱり、これ、データ自体を作った方が早そうかな?
record.pyとutils.pyを見ると、ジョイスティックのデータ構造が割と複雑(^^;
あとで、もう一度考えよう。。
train.py
NvidiaのモデルをKerasで表現すると、こうなるってのが書いてありますね。
def create_model(keep_prob = 0.8): model = Sequential() # NVIDIA's model model.add(Conv2D(24, kernel_size=(5, 5), strides=(2, 2), activation='relu', input_shape= INPUT_SHAPE)) model.add(Conv2D(36, kernel_size=(5, 5), strides=(2, 2), activation='relu')) model.add(Conv2D(48, kernel_size=(5, 5), strides=(2, 2), activation='relu')) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) model.add(Flatten()) model.add(Dense(1164, activation='relu')) drop_out = 1 - keep_prob model.add(Dropout(drop_out)) model.add(Dense(100, activation='relu')) model.add(Dropout(drop_out)) model.add(Dense(50, activation='relu')) model.add(Dropout(drop_out)) model.add(Dense(10, activation='relu')) model.add(Dropout(drop_out)) model.add(Dense(OUT_SHAPE, activation='softsign')) return model
でも・・・こりゃ。。Kerasを読まなきゃ無理だわ(笑)
学習させているところは、これだけ・・
# Training loop variables epochs = 100 batch_size = 50 model = create_model() model.compile(loss=customized_loss, optimizer=optimizers.adam()) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, shuffle=True, validation_split=0.1) model.save_weights('model_weights.h5')
KerasのSequencialモデルのチュートリアル
https://keras.io/ja/getting-started/sequential-model-guide/
を見ながら、ちょっと勉強しないと、このコード分からないですね(笑)
Play.py
これもKerasが分からないと、なんともなんですが・・・
モデルを読み込み、重みを読み込み、画像を読み込んで、リサイズして、DNNに喰わせて、ジョイスティックの動きを、予測して、マリオカート64エミュレータに入れるってことをやっていますね。
さて・・
KerasでMINSTの画像認識を動かすか?こやつをVMで動かすか? どっちにせよ動かさないとだめですね。
なんなくだけど、ジョイスティックの動きを、Square Meanで誤差にして返しているけど、これ、ステアリングとスロットルを、ひとつにしているんですよね。それでも学習できているのでいいのかもしれないけど、もともとのモデルが、ステアリングだけなので、ステアリングとスロットル別々にOutputするようなモデルにした方が良さそうに思うけど。。どうなんだろう?? 連動する方がいいのかな?
モデルを変えないとしても・・Train.pyだけが使えそうで、あとは、作らないといけなさそうですね。そりゃそうだけど(笑)
Record.pyのようなやつをやっぱり先に作るか・・
でも、Pythonだったら、Windows10のJoystickも簡単に読めそうだけど、どうなんだろ?
https://www.pygame.org/docs/ref/joystick.html
とか
https://pypi.python.org/pypi/inputs
を見てると・・ こないだやったこれは。。なんだったんだろう?って(笑)
【Windows】USB取り込みのためのVisual Studio。。 DirectX SDKのインストールが止まるのよねぇ~からのUSB取り込み成功【Visual C++】
コメントを残していただけるとありがたいです