sotaでWebsocketを使ってサーバーに画像を送信する

Sotaは画像をとってローカルストレージに保存することはできますがそれをアップロードする機能は標準では用意されていません。(多分。もしかしたらファイルアップロード機能あるかも) そこでWebSocketを使って画像を送信する方法を考えます。 サーバー側はpythonを考えています。 sotaがキャプチャした画像ファイル sotaは画像をキャプチャすると/var/sota/photoフォルダに指定の名前で保存されます。 気をつけなければ行けないのは「picture」という名前で指定してファイルを保存すると「picture.jpg」というファイルが保存されるので名前に注意です。 あとは普通にそのパスを参照すると画像ファイルを取得できます。 base64エンコード 画像ファイルをbyteデータとして送受信するのはめんどくさいので普通にテキストとして送りましょう。 画像などのバイナリデータはbase64エンコードをすることで文字列にできるのでそれを利用してwebsocketで普通のメッセージとして送信します。 sotaのvstone magicにこのようなプログラムを組み込んで画像をエンコードします。 あとはwebsocketとかでサーバーに送信してください File f=new File(path); int length=(int)f.length(); byte[] buf=new byte[length]; FileInputStream fs=new FileInputStream(path); fs.read(buf); fs.close(); String encoded = Base64.getEncoder().encodeToString(buf); base64デコード websocketのメッセージとしてきた画像文字列データはbase64でデコードすることで画像ファイルに戻すことができます。 pythonではbase64パッケージでデコードすることができます file = base64.b64decode(data) with open(‘file.png’,’wb’) as f: f.write(file)   Our supporting team is useable 247 at your serving and we aim at…

sotaでtyrusを使って継承を利用することなくWebsocketを使う

今とある用事でsotaの開発を行っていますがsotaを開発するためのVstone MagicというIDEにいろいろハマったのでメモ Vstone Magic Vstone Magicとはブロックを配置するだけでjavaプログラムを自動生成し、コンパイル、sotaにプログラムを転送できるIDEです。 細かいことをしようと思うと内部にjavaプログラムを埋め込むことができます。 ただ、javaのクラスに影響を与えるような自由記述は許されておらず、例えばクラスのattributeを指定したりスーパークラスを指定すると、プログラムは転送できるのですがvstone magicでブロックを移動させた瞬間に継承の記述が消えます。 Tyrus tyrusとはjava用のWebsocketのライブラリですがGetting Startedを見ると利用するにはクラスにattributeを記述するか、Endpointクラスを継承しないと利用できなさそう しかしvstone magicはattributeや継承の記述を消去してしまいます 無名内部クラス そこでjavaの無名内部クラスというものを利用することによって、継承もattributeも利用することなく、tyrusを利用できます。 結局はonConnectServerメソッドの第一引数にEndpointを継承したクラスオブジェクトをいれる必要があるだけなので、無名内部クラスを使うことで解決しました WebSocketContainer container = ContainerProvider.getWebSocketContainer(); ClientEndpointConfig config = ClientEndpointConfig.Builder.create().build(); try { this.session = container.connectToServer(new Endpoint() { @Override public void onOpen(Session session, EndpointConfig endpointConfig) { try { onOpenSocket(session, endpointConfig); } catch (Exception e) { e.printStackTrace(); } } }, config, URI.create(URL));…

Re:ゼロから学ぶ強化学習 – QLearningによる合理的判断の獲得 –

機械学習やAIなどで代表されるニューラルネットワークなどの教師あり学習は、人間が判断した正解データを与えることによって、人間と同じ能力をコンピュータに実現させようというものです。 一方、機械学習の中には教師ありではなく、「半教師あり学習」という機械学習も存在します。 一般的にそれは、「強化学習」と呼ばれ、「報酬」という教師データを人間が与えることで機械が試行錯誤の中、得られる報酬を最大化するというような学習方法になります。 ではこのような機械学習の手法で一体なにができるのか、今日はそんなことを解説していきたいと思っています。 私の自論では、強化学習の面白いところは、「人間を超えた合理的判断を学習することができる」というところにあると思っています。 考える問題 強化学習はソフトウエア工学の領域よりはむしろ、ロボティクスの分野で発展してきました。 例えばロボットは今自分が置かれている環境を探索しながら、得られる報酬(例えばゴールにたどり着くなど)を最大化することによっていち早くゴールにたどり着くルートを探索するなどです。 今回はそれと同じように、スタートからゴールまでを行く合理的なルートを学習させたいと思います。 今回考える迷路はこのようなものとします。 黒色が動ける道、灰色のスペースには行くことができません。 白色の場所は特殊な場所で、今回は「危険地帯」としましょう そして、赤色の場所がスタート地点、黄色がゴール地点です。 ここであと2つ成約を設けます。 「黄色のゴールにたどり着くと+20の報酬を得ることができる」 「白色の危険地帯を通るには-25の報酬を払わなければならない」 さて、皆さんはこのような成約が設けられた迷路で、下方向と危険地帯を通る右方向、どちらを通ってゴールまでたどり着きますか? おそらく大半の方が、危険地帯を通らずに、遠回りをしてゴールまで行くルートを選択するでしょう。 なぜなら、報酬を最大化するという目的において、遠回りすることは危険地帯を通るよりも得られる報酬が高くなるルートだからです。 人間はそれを瞬時に判断できますが、はたして機械はどうでしょうか。 Q-learnig この問題を解決するために強化学習の解法の一つとして、Q-learningというものがあります。 Q-learningはその環境(今回は迷路の現在位置)である行動(今回は4方向どこに行くか)の価値(Q値)を定義します。 その環境(今回は迷路の現在位置)である行動(今回は4方向どこに行くか)の価値(Q値)がわかるのであれば、迷路内において、現在地からどこに行けばいいかが瞬時にわかります。 しかしその価値はまだわからないので、次に示す方法を使ってその価値を計算します。 その方法が「死に戻り」です。 …Re:ゼロわからない人すみません 要するにQ-learningではとりあえずいろんな行動をしてみて、うまく行けばそれを覚えておいて、うまく行かなければ死んでもう一度やりなおすという恐ろしい方法です。 しかし無作為な行動ばかりをしていてもダメなのでQ-Learningでは、うまくいった前の行動や状態にうまく行ったときの報酬より少ない報酬を設定させます。 するとうまく行った(+20)、その前の状態と行動(+15)、その前の前の状態と行動(+5)のように、徐々にその行動の価値が伝搬していきます。 学習が終わったら、あとはその状態において一番価値が高い行動をすれば、最大報酬を得られる方策となります。 実際に動きを見てみる 今回はMDPというモデルで考えます。 下図のgifを見てください。 一番左は最初に示した環境の状態です。 真ん中は「その状態(位置)における最大価値を持つ行動の価値」です。 一番右は「学習結果である0,0から3,6の座標に移動するベストなルートです」 真ん中の図ではゴール位置から0,0に向かって徐々に白色になっていっていることがわかります(白色になるほど価値の値が高いです) (ただし、真ん中の図は必ずしも白色ほど最適なルートではありません。最適ルートは右図です) ゴールから上向きに向かって白色が伝搬しにくいのは、危険地帯(報酬-25)があるため、そこ周辺の行動や状態は伝搬された価値が低くなるからです。 結果、右図を見ると、我々が想定していたことと同じ遠回りのルートを学習することができました。 合理的判断をしてみる 最初に述べたように、私が考える強化学習のすばらしいところは、「合理的な判断をさせることができる」ところにあるとおもっています。 例えば同じ下図の環境で、「1つの行動をするたびに-2の報酬を払わなければいけない」というルールならばどうでしょうか。 1つの行動をするたびに-2の報酬を払わなければならないならば、「危険地帯を通って(-25)でも近道を行きたいところです」 つまりこの環境では遠回り自体にリスクを伴うんですね。   ではQ-learningはこれと同じ合理的判断をすることができるのでしょうか 結果は下図の通りです 機械学習でコンピュータが「多少危険地帯を通ってでも近道のほうが合理的だから近道を選ぶ」という考えを獲得させることができました。 人間を超えた合理的判断をさせる さて、強化学習のさらにおもしろいところは、人間を超えることができるというところです。 下図の環境を考えてみてください。 白色が-25の報酬を払う危険地帯、黒色が道、灰色は道ではありません あと、1回の行動に-2の報酬を払わなければならない場合、(0,0)から(3,6)の座標(報酬+30)へのルートはどれが一番合理的でしょうか?…