Takunojiのプログラミング・プレイグラウンド(遊び場)

Javaプログラミングを基本にして、ゲーム作成に必要なことの調査結果、やったら面白そうなことなどを記載します。プログラミングのススメ的なことも記載します。プログラミングで楽しく遊ぶために色々と記載して行きます。

TensorFlow AI〜人工知能ではなく、機械学習で出来る事〜

TensorFlowで何ができるのか?

上記の答えを出すために、TensorFlowのチュートリアルをやってみました。そのやった内容と感想、そしてこの結果どんなことができるのか?を考えてみたいと思います。

イントロダクション

今流行りの「人工知能」と呼ばれているアプリケーション、フレームワークTensorFlowについて自分が学習しました。

TensorFlowとは

他のサイトでたくさん書いてあるので細かいことは書きません。「流行っている」ので(笑)

今回の記載する内容は初めに記載したように「TensorFlow(人工知能と呼ばれるアプリケーション)」を使って何ができるのか?を調べてみました。つまりTensorFlowのチュートリアルをやってどんな処理をしているのか調べてみました。

TensorFlowのチュートリアルをやってみる

TensorFlowのインストールを行う

今までJavaで色々とやってきたのですが、Javaの特徴として「他の言語へのアクセスがしやすい」と言う部分があるので「Python」との連携を行う予定です。

<フロー図>

f:id:Takunoji:20190106215650p:plain

TensorFlowのインストール

Pythonでの実行が一番手軽であろうと思った(他のサイトを見るとPythonでやっているものが多かった)のでPyhtonでやることにしました。

インストール方法については下のリンクを参照してください。以下の内容を実行しています。

  1. Virtualenvをインストール
  2. Virtualenv上にTensorFlowをインストール
  3. TensorFlowのインストール確認

zenryokuservice.com

PythonはGoogleTrends(pytrends)を使用しています>

実は他にも、「Google Trend」などのAPIも使用したかったのでPythonを使用することにしました。Google TrendはAPIで世界で検索されているキーワードの検索実行数を取得できます。Pythonで実装しました。Gitからダウンロードできます

出力結果

$ python3 googleTrends.py 健康

データ型=<class 'dict'>

キーワード=健康

*** args 健康 ***

             query  value

0            健康 保険    100

1            健康 診断     53

2         国民 健康 保険     36

3         健康 保険 組合     18

***急上昇中のキーワード***

0                                    アイコス 健康  14750

1                 健康 で 文化 的 な 最低 限度 の 生活 ドラマ   8150

2                                    iqos 健康   5950

3                                健康 経営 優良 法人   5350

詳細に関してはリンクを参照ください。

 

結局のところ

TensorFlowでは、細かい計算をやってくれます。統計学的なアプローチで画像の判別を行ったり、文の内容から「ポジティブ」「ネガティブ」の判定を行ったりすることができます。根底にあるのは、「雨が降ったら傘屋が儲かる」ような話で「天候」と「飲み物の売り上げ」のように

「何かの条件」で「物事の結果(数値)」を出したいときに今までの「天気と売り上げのデータ」をTensorFlowの「レイヤー」と言う計算方法を組み合わせて作成する学習モデルに統計学的な予測を行わせることができる

と言うことがわかりました。

面白いところ

学習データセット(データの集まり)を作成するのは面白くはないが、学習モデルを作成する(データからどのような理論を持って、どんな答えを出させたいか?を考える)のは面白いと思います。これはプログラマでなくてもすぐにモデルの作成を行う(理論的に考える)ことができるのでとっつきやすいかと思います。※数式はとっつきづらいですが(笑)

関連ページ

  1. Python Tensorflow 〜初めての人工知能〜
  2. Tensorflow Keras〜初めのトレーニング_1〜
  3. Tensorflow Keras〜初めのトレーニング_2:前処理〜
  4. TensorFlow Keras〜テキストの分類〜
  5. TensorFlow Keras〜回帰、準備から予測まで〜

 

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
 

プログラムの習得手順

イントロダクション

プログラムの話をする人は結構いるけど、実際コードの話をする人ってあまりいないなぁと思いました。

「理論は後からついてくる」パターンの学習手順だと思ってます。

実績のある理論には、机上の理論では勝てません。という事を実感できると思います。

プログラミングのススメ

Javaの場合ですがプログラムってどんなもの?ってのがわかると思います。

知識技術なので、理解すればすぐに使えます。理解するまでが大変ですが…

プログラム 習得 順序 手を動かして理解 – PGボックスzenryokuservice.com

オススメ

簡単なゲームを作る。

プログラムで絵を描く。

人の作った(著作権フリーの)3dモデルを動かす。

 

マイクロビット シリアル通信をやる

イントロダクション

ここの数日、マイクロビット→PC→ウェブサーバとデータ送信を行いたいと思い色々と調べたり、試したりしています。

今回はひとつクリアしました。

まずマイクロビットをいじったことがないので、とりあえずいじってみます。

PGボックス〜ゲームとプロジェクトとプログラミング基礎〜

とてもシンプルにできて、すぐ動かせるとかが魅力的です。

シリアル通信を行う

マイクロビットでシリアルブロックをつかいシリアル送信を行うプログラムを作りました。

実際は、ちょっとのブロックを組むだけなので、大した事ありません。

ボタンを押したらシリアル送信を行う

というものです。

そして、送信したものを受け取ります。マイクロビットはUSBでPCに接続している想定です。つまりUSBシリアル通信でマイクロビット→PCとデータを送る訳です。PC側の受信確認は「screen コマンド」で行いました。

Microbit Python 〜シリアル通信データを受け取る〜 – PGボックスzenryokuservice.com

 

www.youtube.com

結局のところ?

マイクロビット〜データ送信を行いウェブサーバと連携してみるのも面白そうだと思っています。

この実績を使って、マイクロビット同士やラズパイ 、PCとの連携アプリを作る事が可能です。あとはデータを受けた後の処理をどーするか?にかかってきます。何か良いアイデアはないものか?

 

マイクロビットで遊ぶ

イントロダクション

マイクロビットで遊んでみようと思いました。

<プラン>

  1. マイクロビットブラウザ連携
  2. マイクロビット→ブラウザに表示

 

こんな感じのフローでブラウザに何を表示するかは後で考えます。

 

<マイクロビットの準備>

zenryokuservice.com

 <マイクロビットでシリアル通信>

zenryokuservice.com

課題について

とりあえずは、セットアップをして開発に取り掛かりたいのですが、下のように処理をするにはどうしたらいいか?

これが現状の課題になります。

 

ちょいと試す

世の中にはWeb Bluetooth API - Web APIs | MDN言うのがありブラウザとマイクロビットの様なデバイスと接続可能なようです。

が、セキュリティが厳しく使うのにセットアップが必要で「誰でも出来る」と言うわけには行かなそうです。

そこで、考えました!マイクロビットにプログラムを埋め込んでしまうのはどうだろうか?

そんなわけで、下のサイトで組み込み系のプログラムに挑戦します(笑)

https://www.i-programmer.info/programming/hardware/9651-getting-started-with-cc-on-the-microbit.html

 

結果

やれそうだけれど、プログラム初心者にはやはり…「よくわからないがこーすれば、こーなる」位にしかならなそうだ…

昔の人は、とりあえず作ってそこから理解していった、という話をよく聞くのですが…それもまたひとつかな?

 

関連ページ一覧

Micro:bitで遊ぶ

  1. Micro:bit(Chibi:bit) での開発環境セットアップ
  2. Micro:bit スマホでプログラミング〜ブラウザにアクセス〜
  3. Micro:bit スマホでプログラミング〜Bluetoothの設定〜
  4. PHP JS 〜WebSocketもどきの作成〜
  5. PHP ServerSocket 〜レンタルサーバーでSocket受信〜
  6. Python websocket client〜WebSocket送信処理を作る〜
  7. Micro:bit Python 〜マイクロビット→PCへシリアル通信〜
  8. ターミナル(コマンド)を使う 〜FTPSを使ってファイルアップロード〜
  9. Microbit リファレンス 〜サイトを眺めてみる〜
  10. Microbitで遊んでみる
  11. Microbitで遊ぶ〜ボタンを押す〜
  12. Microbitで遊ぶ〜シリアル通信をする〜
  13. Java Microbit Serial data connect 〜シリアル通信〜※中途半端です
  14. Microbit Python 〜シリアル通信データを受け取る〜
  15. Microbit Python HTTP リクエストを飛ばす
  16. Microbit花火〜MicrobitからWebServerまでの旅〜

 

 

Java OpenCV Lv2: JavaFX + ビデオキャプチャを動かす

イントロダクション

前回は、OpenCVを起動するための準備をやりました。

今回は、JavaFX上でOpenCVを起動します。

 

実装

zenryokuservice.com

 

作業はこんな感じでした。

EclipseOpenCV用のプロジェクトを作る

www.youtube.com

 

画面(GUI)で画面を作成するツールのインストール

www.youtube.com

 

3. 作成した画面をプログラムと連結する

www.youtube.com

 

4.JavaFXよりOpenCVビデオキャプチャを起動する

www.youtube.com

 

Java OpenCV Lv1: JavaFXで画像を表示する

イントロダクション

OpenCVPythonではなくJavaで動かそうと色々と調べて。。。

結局は下のサイトを参考にしてやるのが一番ということになりました。

Welcome to OpenCV Java Tutorials documentation! — OpenCV Java Tutorials 1.0 documentation

 

そこには、OpenCVでHigh GUIを使用して画像の表示などを行なっていたのですが、今回使用するOpenCV3.Xでは、それを使用しない方向に変わったということで。。。

 

JavaFXを使用して画像を確認する方向でやっていくことにするようです。(チュートリアルサイトに記載あり)

そんなわけで、以下のものを設定します。

  1. Eclipseのセットアップ
  2. Eclipse SceneBuilderを追加する
  3. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  4. Java OpenCv Lv1 〜入門: 写真の表示〜

<作業の動画>参考にどうぞ

1. JavaFXプラグインEclipseに追加する

www.youtube.com

 

2.OpenCVをセットアップする(Eclipse)

www.youtube.com

 

 

Java OpenCV セットアップ

イントロダクション

今まで、3Dグラフを作成していましたが今度は、画像から文字を取得する機能を作ります。レシートの写真から買い物の詳細を取得するためです。

そんなわけでOpenCV

OpenCVをいじってみる

www.youtube.com

環境セットアップ

zenryokuservice.com

 
画面作成ツール

Eclipse SceneBuilderを追加する – PGボックス

www.youtube.com

 

JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~ – PGボックス

www.youtube.com

 

 

3Dグラフを作る

イントロダクション

家計簿アプリの作成で3Dグラフを作りました。現状はグラフっぽくないのですが…

それでも微調整を残しひと段落です。

http://zenryokuservice.com/wp/2018/11/10/eclipse-アプリ作成-lv7〜cubeを日付順に並べる〜/

残タスク

・グラフの日付が分からなくなる

→月〜日まで、日〜土までを切り替えて表示する機能は使ったのですがどこが1日なのか、現状では分からなくなります

f:id:Takunoji:20181111223746p:image

・支出などの金額がわからない

→Cubeの高さにより金額を表す予定ですが、メモリなどが無いとぱっと見ではどの位の出費かわからない。

今後の予定

残りの画面実装は、アイデアを出すまで保留、次はレシートとの読み込み処理実装します。

使用する技術

機械学習Open CVで基礎を学ぶ

PGボックス〜ゲームとプロジェクトとプログラミング基礎〜

 

自分もディープラーニングできるかな?

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
 

3Dグラフを作る〜アプリ設計〜

イントロダクション

家計簿アプリで月の支出を一覧出来る3Dグラフを作りたいと思っています。

でも、見栄えとか…「一目瞭然出来るか?」がこのアプリの要になります。

3Dグラフの特徴(自分の考え)

  1. 少ない領域で情報が沢山表示出来る
  2. 沢山の情報があるので分かりづらくなる

まとめると、通常の棒グラフと同じ情報量にすれば分かりやすいが、3Dにする意味がない

やたらに情報を詰めると意味がわからない。

考える事

情報量が多いと意味がわからないのは「グラフの示すものが、分からなくなるから」とした時にどんな対処法があるか?

グラフ内の示すものに名前をつけて表示するのはどうだろうか?

結論

作ってから考えよう(笑)

注意点

プログラムを組むとき全体に言える事だけど、追加・修正しやすいように作る

→作成するメソッドや処理の依存度を下げるかなくす様に作る

<悪い例>

// あなたの年齢を表示するメソッド

public void yourAge() {

int age = 12;

System.out.println(“あなたの年齢は” + age + “ 才です”);

}

 

<良い例>

public void yourAge(String name, int age) {

System.out.println(name + “の年齢は” + age + “ 才です”);

}

悪い例は「あなたの年齢は12才です」しか表示出来ませんが

良い例は誰の年齢でも表示出来ます。

 

このように、汎用的な処理を用意してメインのルートになる部分と道具として使う部分(プログラム)に分けて

不要な処理は作らない

様に作ると後でメンテナンスする時や人に説明する時など便利です。

そして、一切の無駄がなく見やすいコードは「美しいコード」と誰もが言うでしょう。自分もそこを目指しています。

ソースの改修サンプル

家計簿アプリの作成(Open GLの理解を含む)でコードを改修しながらやってます。良かったらどうぞ。

<Cube(立方体)の表示>

http://zenryokuservice.com/wp/2018/11/03/eclipse-アプリ作成-lv2〜家計簿を作る土台作り〜/

<Cubeを並べる>

http://zenryokuservice.com/wp/2018/11/04/eclipse-アプリ作成-lv3〜3dグラフ用cube作り〜/

<Cubeを並べて7x5のマスを作る>

http://zenryokuservice.com/wp/2018/11/04/eclipse-アプリ作成-lv4〜3dグラフ用cubeに高さを与える〜/

 

でわでわ。。。

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseにCDTをインストール〜
  3. Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
 

Java OpenGL 〜家計簿アプリを作る〜

イントロダクション

今まで、Git BookのLWJGLを学習して来ました。(ここ2週間ほど。。。)

結局、レンダリング(描画)が理解出来ずやり直す事にしました。

ただ、やり直すだけでは勿体ないので家計簿アプリを作りながら理解します。

<写経して動いたもの>

https://mobile.twitter.com/java_takunoji/status/1057586067182804994

 

家計簿アプリ開発

描画処理で、大まかな流れは理解出来たが、具体的な処理をどうするか?がわからなかったので、描画(rendering)に戻ってやり直します。

アプリの仕様について

<L v1:データの表示>

3Dグラフを使って1ヶ月の支出や収入を一覧する機能を作ります。

見慣れた2Dグラフだと、表示出来る情報が少ないので3Dグラフを使う事にしました。

 

<Lv2:カテゴリ切り替えと登録>

初期表示では、単純に支出額のグラフを表示しますが、「必要な支出」と「不要な支出」のカテゴリ分けをしたい場合があると思います。そのための「カテゴリ」を編集する機能を作ります

 

<Lv3:レシートや領収書の入力>

はっきり言って、この機能が面倒なので家計簿を付けないという人が多いと思います。だからレシートや領収書を読み込む自動入力にしようと思います。

最近流行りの機械学習を使います。

 

環境構築〜画面表示

http://zenryokuservice.com/wp/2018/11/01/eclipse-アプリ作成-lv1〜家計簿を作る準備〜/

描画の時に指定する頂点の動かし方

http://zenryokuservice.com/wp/2018/11/03/eclipse-アプリ作成-lv2〜家計簿を作る土台作り〜/