ぽきたに 〜ありきたりな非凡〜

現役F欄大学生が送るゴミ溜めと独り言

ARピタゴラスイッチのプログラム実装メモ(Arduino×Processing)

どうも、こんにちわ。たっきーです。

ちょっとけんきうの息抜きにARピタゴラスイッチを作ってみたのでメモ。

 

はじめに

1個下の学生さんが課題でARピタゴラスイッチなるものを作らなきゃいけないらしく面白そうやんけwって感じでプログラム周りを手伝ったのでそのメモ。

半日足らずで書いたので雑クオリティなの許してください。

 

ARピタゴラスイッチとは

こんなやつ。

www.youtube.com

拡張現実ピタゴラ装置って呼ばれたりもする(?)

動画見てめっちゃ面白そうやんけってなってモチベ爆上げ。

 

実行環境と使用機器

  • macOS Sierra 10.12.5
  • Arduino 1.8.3  
  • Arduino UNO
  • Processing 3.3.5
  • サーボモータ GWSサーボ MICRO/STD/F(フタバ)
  • タクトスイッチ
  • ミニブレッドボード
  • その他小物

 

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

 
Amazonベーシック USB2.0ケーブル 1.8m Aオス-Bオス 7HUA

Amazonベーシック USB2.0ケーブル 1.8m Aオス-Bオス 7HUA

 

Arduino - Software

Download \ Processing.org

 

 

参考にしたサイト・本

 

たのしくできるArduino電子制御

たのしくできるArduino電子制御

 

Processing.org

 

 

 ブレッドボード図

f:id:tacky0612:20170726173642p:plain

こういうの得意じゃないので間違ってるかも(?)

とりあえず、こんな感じ

f:id:tacky0612:20170726174342j:plain

スイッチ部分

f:id:tacky0612:20170726174431j:plain

全体像

f:id:tacky0612:20170726174558j:plain

 

Arduinoスケッチ

 

#include <Servo.h>
Servo myservo;

int pin7=7;

void setup()
{
Serial.begin(9600);
myservo.attach(9);
pinMode(pin7,INPUT);
}

void loop()
{
myservo.write(0);

if(digitalRead(7) == LOW)
{ Serial.write('a'); delay(2500); Serial.write('b'); myservo.write(180); delay(3000); } }

 こんな感じ。

スイッチが押されたらシリアルボードに'a'と書き込んで、指定時間遅らせてからサーボを回し、終わるタイミングで'b'を書き込むってだけのスケッチ。

 

Processingのプログラム

import processing.serial.*;
import cc.arduino.*;
import ddf.minim.*;
Serial port;

Arduino arduino;
Minim minim;

AudioSample oh;


float x,y;
float velx=10.0;
float vely=0.0;
float gravity=1;
float reaction=1;
float damp=0.9;
float height=758;
PFont myFont1;

void setup(){
  fullScreen();
  background(255,105,200);
  noStroke();
  fill(255,255,255,255); 
  x=y=0.0;
  myFont1=createFont("",100);
  port = new Serial(this, "COM3", 9600);
  port.clear();
  minim = new Minim(this);
  oh = minim.loadSample("oh.wav",2048);
}

int j = 0;
int i=0;
void draw(){
  j =  port.read();
  if (j == 'a') 
  {
    i = 1;
    oh.trigger();
  }
  if(j == 'b')
  {
    oh.trigger();
  }
  if(i == 1){

  fade(false);
  
  ellipse(x,y,100,100);
  
  vely+=gravity;
  
  x+=velx;
  y+=vely;

    if(x<0)velx=-velx;

  
  if(y>height){
    vely*=-reaction;
    velx*=damp;
    y=height;
  }  
  textFont(myFont1);
  fill(255,255,0);   
  textAlign(CENTER);   
  text("5000兆円欲しい!",663,378); 
}
  else
  {
    
  }
}

void fade(boolean _fadeFlag){
  if(_fadeFlag){
    fill(255,10);
    rect(0,0,1000,0);
    fill(0);
  }else{
    background(255,105,200);    
  }
}

こんな感じ。

↓を追加する必要あり。

Arduino Playground - Processing

Minim | Compartmental

Arduinoから受け取った信号に対応してアニメーション開始したり音出したりする。

 

commons.nicovideo.jp

↑からダウンロードして、oh.wavって名前で保存して、.pdeファイルと同じディレクトリ内に入れる。

 

実行動画

 声がウザいのは気にしない。

 

上手いこと行ってよかった()

 

最後に

ARピタゴラスイッチめちゃ面白い(語彙)

Arduinoの制御、Processingの使い方の初歩的な部分を学ぶことができるのでオヌヌメです。

もっと他のセンサーとか使ってギミックを追加してみたさ深い。

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

 
Arduinoをはじめようキット

Arduinoをはじめようキット

 

 

らぼの日常

 

 

 

 

 

初心者による初心者の為のTensorFlowを使用したMNIST for ML Beginnersを解説。

どうも、たっきーです。
機械学習Hello worldと呼ばれるているMNISTってやつを試してみたので覚書き。
 

はじめに

今回は本当に触ってみただけなので、中のロジックとか数式の意味とか割りと理解してないし、ブラックボックス的にTensorflowを使いました。
どのようなロジックで手書き文字の学習がされているのか正直わからん。(ザコ)
TensorFlow公式ドキュメントを参照。
 

MNISTとは

f:id:tacky0612:20170618225924p:plain

「Mixed National Institute of Standards and Technology database」の略で、機械学習Hello worldと呼ばれるているヤツ。
アメリカ国立標準技術研究所(National Institute of Standards and Technology, NIST)が提供するデータ。
28×28の784個のピクセルの0〜9の手書き数字のデータセットのこと。55000個の学習データ (mnist.train)と10000個のテストデータ (mnist.test)と5000個の検証用データ (mnist.validation) が画像データとメタデータとしてどの数字を表すのかをラベルデータが与えられている。
今回、手書き文字の推定をするプログラムを作りたい。
 
環境の整え方などは前の記事を参照。
 

 

TensorFlowの処理の流れ

  1. TensorFlow読み込み
  2. 式を立てる(モデル)
  3. セッションを開始
  4. 式を実行(run)

 

機械学習の3ステップ

  1. 現象をモデル化する
  2. モデルを最適化するパラメータを求める
  3. 学習したモデルを使用して推定・分類

 

このチュートリアルで何をするか

MNISTデータとソフトマックス回帰について学ぶ。
イメージ内のすべてのピクセルを調べることに基づいて、数字を認識するためのモデルを作成する。
TensorFlowを使用して、学習データを見て数字を認識させるようにモデルを訓練します。
テストデータでモデルの精度をチェックする。
 
 

実装

早速チュートリアルのコードを実装してみる。
from tensorflow.examples.tutorials.mnist import input_data
 
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
MNIST_data/ がダウンロード先。
まずはこのコマンドで必要なものをダウンロード。
 
import tensorflow as tf
TensorFlowをtfとしてインポート
x = tf.placeholder(tf.float32, [None, 784])
placeholderという入れ物を用意する。イメージ的にC言語で言う int i; みたいなもんかな?(違う?)
 
一応よく使うヤツなので使い方↓
placeholder(
    dtype,                       #https://www.tensorflow.org/api_docs/python/tf/DType
    shape=None,            #与えられる行列の形状(オプション)。形状が指定されていない場合は、任意の形状のテンソルを供給することができます。
    name=None              #操作の名前(オプション)。
)

次に、変数を定義。

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
Variableは変数のこと。zerosで0で埋めてあげる。
Wは重み、bはバイアス。
10は0〜9の数字があるので。
y = tf.nn.softmax(tf.matmul(x, W) + b)
確率を格納する為の変数をyとする。matmul は行列の掛け算。
y_ = tf.placeholder(tf.float32, [None, 10])
ここ(y_)に正解データ(ラベルデータっていうのかな?)を格納する。
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
cross_entoropyに推定値とラベルデータの差分
ぶっちゃけこの計算のロジックはわからん。教えてくれ。 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
train_stepが学習ステップ。重みを最適化して更新する。
GradientDescentOptimizerは勾配降下法のことっぽい。()の中は学習率。
参考までに、TensorFlowのOptimizer一覧(

https://www.tensorflow.org/api_guides/python/train#optimizers

 )
cross_entropyをminimizeで小さくなるように学習する。 
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
これはオマジナイ。心を無にするのだ。
for _ in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
for文で1000回、バッチ(100個のランダムで選択したデータを入れたもの)でtrainする。feed_dictでxにbatch_xs, yにbatch_ysを指定する。placeholderには、feed_dictを通じて値を外挿できる。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
結果の評価をする。推測とラベルデータの差を評価。argmax()で行列の中で最も大きな値(確率が一番大きいやつ)を持っているところを一つ取ってくるヤツ。
equal(a,b)でa=bならTrue,  a≠bならFalseを吐く。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
reduce_meanで精度の平均値を出す。
True,Falseでは計算出来ないのでcastで数値(割合)に変換。
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
print文で計算結果を出力する。
 

f:id:tacky0612:20170618231225p:plain

 
ちなみに僕は91.87%の精度でした。
 
 

だがしかしこれはまだ深層学習ではない

だがしかしこれはまだ深層学習(Deep Leaning)ではない。(大事なことなので(ry)
 
 

 

TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~

TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~

 

 

 

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

 

 

 
 

最後に 

なんとなく考えとか整理するのに書き始めたけど、アレ(遅い)。
こうやってブログに起こすのめんどくさいだけで、実はTensorFlowのチュートリアルは一通りやった。
ただこうやって書いてて実は理解してなかったところとかを発見出来たりするのでよい。
ちょっと長いコード書くとなるとPythonインタラクティブシェル使うのダルいのでJupiterNorebook使うとよい。(よい。)
Pythonはコードが読みやすいのでよい。おっPython
 
公式ドキュメントの最後らへんに

Is that good? Well, not really. In fact, it's pretty bad. This is because we're using a very simple model. With some small changes, we can get to 97%. The best models can get to over 99.7% accuracy!

 

ってあるけどかっこよすぎん?(?) まだ力を秘めているボス的な感覚。
TensorFlow「まだ本気じゃねえんだぜ…!」って。
 
 

そういや今年の6月は雨が少ないですね。

 

初心者による初心者の為のTensorFlowを使用したHello,Worldまでを解説してみるって話。

f:id:tacky0612:20170531012239p:plain

どうもこんにちは、たっきーです。
今回はTensorflowの”Hello, world”をAnacondaを使用して試してみました。あとちょっとした四則演算。
人間がTensorflow試してみたよ〜〜って色々書いてるけど、僕みたいなクソザコに頭が追いつくようなものは中々なかったので僕が書く。
けんきう室にGPU搭載のハイスペックPCがあるけど、今回は動作確認という事で手持ちのMacBook Pro(Late2016)でササッと動かしてみた。
 

環境

参考程度にMacBook Proのスペックです。

f:id:tacky0612:20170531012806p:plain

macOS Sierra(10.12.4)です。
 
事前知識としてPythonについて知っているとスムーズに進むかなぁと。
おっPython
 
 

TensorFlowとは

Googleが公開したオープンソースディープラーニングライブラリのこと。
 
公式はこちら↓
 
英弱なのでチュートリアル読むので一苦労。
Let's study English!!
 
使っていることを明記すれば商用利用もできるらしい。
いろんな大きな会社も利用しているみたい。今やビッグデータ時代なので機械学習が注目されてますね。
これはTensorFlowを利用している企業さん。見たことのあるロゴばかりですね。

f:id:tacky0612:20170531013005p:plain

 

 

Anacondaとは

f:id:tacky0612:20170531013251p:plain

インストールがめんどいライブラリが最初から入っているとてもリッチなPythonのパッケージ。
ちょっといらないものも入りすぎてるおデブちゃんなんだけど、いらないものを削ったMinicondaというのもあるみたい。詳細は知らん。
公式ドキュメントには
The Anaconda installation is community supported, not officially supported.
って書かれてるけど気にしない。
ダウンロードページがカッコイイ。
こういうおしゃんなダウンロードページだとこれから学習するモチベすごい上がりますよね(伝われ…!)
 

f:id:tacky0612:20170531013554p:plain

自分のOSに合ったモノをインストール。Python3.5の方を選ぶ。
基本的に次へ次へ次へ完了でおk。
 
 

Tensorflowの導入

とうとう導入です。
 
こちらがAnacondaを使用したTensorflowのインストール方法。
ターミナルを立ち上げ、一応自分のPythonのバージョン確認しとく
$ python —version

f:id:tacky0612:20170531013941p:plain

Python 3.5.2 :: Anaconda 4.2.0 (x86_64)って表示され現在のVersionを確認できる。
ターミナルの立ち上げ方はggrks
 
次に、Tensorflowをインストールする。以下コマンド。tensorflowって名前で環境を作ってくださいねってコマンド。一応Pythonのバージョンを指定しておく。
$ conda create -n tensorflow python=3.5

f:id:tacky0612:20170531014015p:plain

するとこんなツールをインストールしますか?って聞いてくるので y を押して Enter を押す♂。
 
次にTensorflowの実行環境に入るために以下コマンド。
$ source activate tensorflow

f:id:tacky0612:20170531014721p:plain

このように、先頭に(tensorflow)と表示されるとTensorflowの実行環境に移れたってこと。おk。
 

必要なライブラリのインストー

次に、以下コマンドを使うと必要なパッケージを勝手に選んで入れてくれる。Anaconda良い。
$ conda install -c conda-forge tensorflow

f:id:tacky0612:20170531015406p:plain

さっきと同じでyを押してインストール。

 

これで上手く行かない場合は、公式ドキュメントにあるようにpipを使ってインストールしていこう。

condaコマンドを使う方が簡単。
 

いよいよTensorflowで”Hello, world!”

Run a short TensorFlow programというのが公式ドキュメントにある。これはいわゆる”Hello, world!”的な奴。TensorFlowが正常に動いているか確認するためのサンプルコード。
 
以下コマンドをターミナルで叩くとPythonの対話的実行環境に入れる。インタラクティブシェルって言うみたい。カッコイイ。
なんかごちゃごちゃ出てきて最終的に「>>>」って表示されるとインタラクティブシェルに入れてる。
 
まずはTensorFlowをtfと言う名前としてimportする。
>>> import tensorflow as tf
これでEnterを押して次の「>>>」が表示されるとTensorFlowのインストールが上手くいってるってこと。
 
以下コマンドで”Hello, world”。('Hello, TensorFlow!'じゃねーか!ってツッコミは無しで
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))

f:id:tacky0612:20170531021213p:plain

W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.

W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.

W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.

W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.

W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.

なんかしらんがsess = tf.Session()の次にすごい警告が出てきた。よく分からんが、エラーでは無いので無視しておく。トラブルシューティング力のNASA
まぁ、無事にHello, TensorFlow!と表示されてるのでセーフ。(適THE当)
 

折角なので、簡単な四則演算も実行してみる

簡単な四則演算もTensorFlow環境下で実行してみよう。
以下コマンドで文字式の四則演算を実行してみる。
ちなみにconstantは一度値を格納したら変更できないヤァツ。

>>> a = tf.constant(10)

>>> b = tf.constant(32)

>>> print(sess.run(a + b))

>>> print(sess.run(a * b))

>>> print(sess.run(a - b))

>>> print(sess.run(a / b))

f:id:tacky0612:20170531023229p:plain

はい、想定通りですね。

 

終了方法

最後に後片付けしましょう。
Pythonインタラクティブシェルを抜けるには以下コマンド。

>>> exit()

 

 
あとはTensorFlowの実行環境の抜け方は以下コマンド。
$ source deactivate tensorflow
 
これにて終了〜〜。
 

最後に

思ってたよりも長々と書いてしまった。気がつけば4000文字程度書いてるやん。つらい(つらい)#つらい
僕は深層学習始めたばかりの全く初心者なので何か気になった点などあれば教えてください。
TensorFlowには幾つかチュートリアルが用意されてるのでクリアしていこうかな。
次はTensorflowを用いたMNIST(手書き文字認識)のこととか書いていこうと思う。(多分)
間違いなどあれば教えてください。随時、修正していきます。

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

 

 

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

 

 

 

呟き。

 

スポンサードリンク