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

スポンサーリンク
広告

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

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

【自作ラジコンUAV】USBアダプタ買ったのでVRCをインストールして動かしてみる。。【シミュレータ】
全然進まないラジコンUAV開発 いろいろと、調べるだけは調べているんですが・・ 【UAV自作のために】Autoware ROSベース ち...

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

【自作UAV】深層学習が何を学んでいるのかを知る NVIDIA BB8がルールをどう作ってるの?【PilotNet・TensorKart】
TensorKartのプログラムはNvidiaを参照している こないだから、VRCを自動学習で走らせられないか?夜中にコツコツ遊んでいます...

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モデルのチュートリアル

Sequentialモデルのガイド - Keras Documentation

を見ながら、ちょっと勉強しないと、このコード分からないですね(笑)

Play.py

これもKerasが分からないと、なんともなんですが・・・

モデルを読み込み、重みを読み込み、画像を読み込んで、リサイズして、DNNに喰わせて、ジョイスティックの動きを、予測して、マリオカート64エミュレータに入れるってことをやっていますね。

さて・・

KerasでMINSTの画像認識を動かすか?こやつをVMで動かすか? どっちにせよ動かさないとだめですね。

なんなくだけど、ジョイスティックの動きを、Square Meanで誤差にして返しているけど、これ、ステアリングとスロットルを、ひとつにしているんですよね。それでも学習できているのでいいのかもしれないけど、もともとのモデルが、ステアリングだけなので、ステアリングとスロットル別々にOutputするようなモデルにした方が良さそうに思うけど。。どうなんだろう?? 連動する方がいいのかな?

モデルを変えないとしても・・Train.pyだけが使えそうで、あとは、作らないといけなさそうですね。そりゃそうだけど(笑)

Record.pyのようなやつをやっぱり先に作るか・・

でも、Pythonだったら、Windows10のJoystickも簡単に読めそうだけど、どうなんだろ?

pygame.joystick — pygame v2.4.0 documentation

とか

inputs
Cross-platform Python support for keyboards, mice and gamepads.

を見てると・・ こないだやったこれは。。なんだったんだろう?って(笑)

【Windows】USB取り込みのためのVisual Studio。。 DirectX SDKのインストールが止まるのよねぇ~からのUSB取り込み成功【Visual C++】
USB取り込まなきゃなんだけどSDKが入らない問題 で、ちょいと不明のままだったんですが・・ Zilinx のFPGAのボードを眺め...

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

Loading Facebook Comments ...
%d人のブロガーが「いいね」をつけました。