【自作UAV】TensorKartのプログラム自体を少し勉強してみるかぁ~データ集める前に(笑)【VRCをシミュレータに】

VRC面白いので、操縦して遊んでしまいます(笑)

VRCなかなかよく出来てます(笑) ってそっちじゃない。。 こやつを動かすとラジコンしたくなるぅ~~ 僕のラジコン機材古いので、新しいの誰か安く譲って(笑)ってまたラジコンするのか?(笑)

【自作ラジコンUAV】USBアダプタ買ったのでVRCをインストールして動かしてみる。。【シミュレータ】

で・・前回は、NvidiaのDNNを読んでやってることを、あらかた理解したつもりになってます。でも、こういうのってすぐ忘れちゃうんだよなぁ~ だからブログに記憶させているんですが(笑)

【自作UAV】深層学習が何を学んでいるのかを知る NVIDIA BB8がルールをどう作ってるの?【PilotNet・TensorKart】

TensorKartのコードを読んでみる

全体をまずは、ざっくり・・Pythonで書かれています。

コード 中身
play.py マリオカートを動かす時に使うみたいですね。学習済みのニューラルネットワークで自動運転するというプログラムのようです。
record.py 学習データを作るために、マリオカートエミュレータの画面とジョイスティックの動きを記録するためのプログラムのようです。
train.py これが学習させるプログラムのようです。モデルは、TensorFlowで作られているって書いてあるけど、中身は、Kerasフレームワークですね。

ちゃんと中身見ないで、書いています。あとで間違いあれば、修正するかもです。

利用ライブラリ関係

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++】

 

 

 

投稿者 tom2rd

コメントを残していただけるとありがたいです

Loading Facebook Comments ...

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください