モノクロタイム

I'm from the future!

NeoPixelとGemmaを使って卒業式用のイヤリングを作った(2017/03/03追記)

こんにちは,れいじです.

就職前に住む家を見つけるため,東京に滞在しています.

さて,以前スイッチサイエンスでこんなものを買っていました.(詳しくは前の記事をどうぞ)

GEMMA

GEMMA

  • スイッチサイエンス
Amazon

reiji1020.hatenablog.com

こちらを使って卒業式に付けるアクセサリーを作りたかったので,こちらの記事を参考にしながら,プログラムをGemmaに書き込むことにしました.

dotstud.io

ギャル電さん.超イケてますよね!

読み替え

私が購入したNeoPixelは16連ではなく12連なので,配線部分の読み替えが必要でした.

f:id:yomoyamareiji:20170222154709p:plain

(配線図作るのむずかしい・・・)

Gemma NeoPixel
D0 IN
GND GND
VOUT PWR

ArduinoIDEの導入やライブラリなどは上の記事の通りに進めるとよいです.あ,「Adafruit Neopixel by Adafruit」の部分は画像中では違う場所に赤枠がついているようなので注意.

動作確認

サンプルプログラムでは青と黄色にしか色が変わらなかったので,もうちょっとカラフルにしてみました.

f:id:yomoyamareiji:20170222153808j:plain

青・黄色・水色・緑・紫・赤・ピンク・黄緑に光ります.各色が順番に光ります.

コード

// Low power NeoPixel earrings example.  Makes a nice blinky display
// with just a few LEDs on at any time...uses MUCH less juice than
// rainbow display!
 
#include <Adafruit_NeoPixel.h>
 
#define PIN 0
 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(24, PIN);
 
uint8_t  mode   = 0, // Current animation effect
         offset = 0; // Position of spinny eyes
uint32_t color  = 0xffae00; // Start red
uint32_t prevTime;
uint32_t colors[] = {0xff0000,0xff8000,0xffff00,0x00ff00,0x00ffff,0x0000ff,0x7f00ff,0xff00ff};
uint8_t colorid = 0;
 
void setup() {
  pixels.begin();
  pixels.setBrightness(60); // 1/3 brightness
  prevTime = millis();
}
 
void loop() {
  uint8_t  i;
  uint32_t t;
 
  switch(mode) {
 
   case 0: // Random sparks - just one LED on at a time!
    i = random(24);
    pixels.setPixelColor(i, color);
    pixels.show();
    delay(10);
    pixels.setPixelColor(i, 0);
    break;
 
   case 1: // Spinny wheels (8 LEDs on at a time)
    for(i=0; i<12; i++) {
      uint32_t c = 0;
      if(((offset + i) & 5) < 2) c = color; // 4 pixels on...
      pixels.setPixelColor(   i, c); // First eye
      pixels.setPixelColor(23-i, c); // Second eye (flipped)
    }
    pixels.show();
    offset++;
    delay(50);
    break;
  }
 
  t = millis();
  if((t - prevTime) > 8000) {      
    mode++;                        
    if(mode > 1) {                 
      mode = 0;                    
      colorid = random(8);
      //if you want to loop through colors, uncomment line 58;
      colorid = offset % 8; 
      color = colors[colorid];
    }
    for(i=0; i<24; i++) pixels.setPixelColor(i, 0);
    prevTime = t;
  }
}

実はまだイヤリングの金具自体は付けられていないんですが・・・汗

あとは実家で金具を付けるだけです!完成が楽しみですね.

ではでは〜

【2017/03/03追記】

イヤリングの金具つけました!かわいい!

f:id:yomoyamareiji:20170303223027j:plain

[asin:B01MG5OWC7:detail]

【vvvv】vvvvでDeepLearning【DeepLearning】

こんにちは,れいじです.

最近はvvvvに傾倒しすぎてDeepLearning系の記事を書いてませんでした.久しぶりにDeepLearningの記事を書きますが,修士論文では常にDeepLearningをモグモグしていました.因みにCNNを使用して画素単位での輪郭線抽出とかやってました.

DeepLearningというワードでこの記事に行き着いた人もいるかと思うので,本記事で使用するvvvvというツールについて軽く説明をします.

vvvvとは

vvvv - a multipurpose toolkit | vvvv

vvvv(ブイブイブイブイ/ブイフォー)はビジュアルプログラミング言語の一種で,主にマルチメディア制作にスキルを全振りしている開発環境です.このブログにはvvvvので作成したCGやvvvvの各ノード(関数)について解説している記事がいくつかあるので,そちらも参考にしてみて下さい.

また,Youtubeにてvvvvの使い方を解説した動画があります.とてもわかりやすいのでこちらもぜひ.

vvvvのインストール方法については,Downloads | vvvvを参考にして下さい.

vvvvでDeepLearningを触ってみる

DeepLearningとは日本語で深層学習と訳され,現在話題沸騰中の機械学習モデルです.

最近の例でいくと,PaintsChainerFaceAppとかが主な活用事例になります.

2014年辺りからCaffeChainerなどのDeepLearningライブラリが提供され始め,今はDeepLearningやってみたいな〜と思ったらスッと始められる環境にあります.因みに修論ではCaffeを使ってあれこれしてました.

ライブラリの提供範囲はPythonC++辺りから徐々に広がり始め,vvvvでも有志によってDeepLearningを扱うためのアドオンパックが開発されました.

vvvv.org

C#機械学習ライブラリAccord.Net Frameworkを使用して開発されています.

導入方法としては,上記URLのDownloadからVVVV.Packs_.MachineLearning_x86_v0.1.2.zip を落としてきて解凍します.vvvv.exeと同一ディレクトリ内に「packs」という名前のディレクトリを作成し,その中に解凍した中身を入れてください.

f:id:yomoyamareiji:20170203172811j:plain

packsディレクトリの中身はこんな感じ.

f:id:yomoyamareiji:20170203172917j:plain

私は32bit版を落としてきていますが,これは私の導入しているvvvvが32bit版であるからです.64bit版のvvvvを導入している場合は,x64の方を導入して下さい(vvvv本体とアドオンパックのbitバージョンが揃ってないと動きません!)

見てて楽しいサンプルパッチ

VVVV.Packs.MachineLearningにはgirlpower(=サンプルパッチ群)が入っており,サンプルパッチを参考にしながらプログラムを作ることができます.

パッと見で面白いのは「face_recognition.v4p」です.名前のとおり,USBカメラで撮影した画像の中から顔を検出するパッチです.

SVM_Classification-YinYan.v4p」はSVMを使用したクラス分類を行うサンプルパッチです.YinYanとはタイチーマークの事です.

f:id:yomoyamareiji:20170203174758j:plain

DeepBeliefNetworkのサンプルパッチについて

上のサンプルパッチと同じ場所に,「DeepBeliefNetworks.v4p」というサンプルパッチがあります.Deep Belief Network(DBN)はRistricted Boltzmann Machine(RBN)を多層化したモデルで,2006年にG.Hinton氏によって考案されました.少し古い記事ではありますが,まとまっていて読みやすいです.ぜひ.

qiita.com

サンプルパッチがちょっとわかりにくいので少し解説してみようと思います.このパッチは教師あり学習を行うDBNのサンプルです.

上でも記述したとおり,このライブラリの大元はAccord .Net Frameworkなので,Accord .Net Frameworkの作法を覚えておく必要があります.この辺については以下の記事が参考になります.

qiita.com

学習データと教師データ

まずはサンプルパッチの上部を見ていきましょう.

f:id:yomoyamareiji:20170204222103j:plain

Trainingパッチに繋がる部分には,学習用データと教師データを接続します.青枠部分で囲っているのが学習用データで,ピンク枠で囲っているのが教師用データになります.学習用データは11個存在し,それぞれ違う値を取っています.例えば一番左の学習用データを配列風に書くと{1,0,0,1}といったような感じになります.

学習用データに付随する教師データが11個存在し,学習用データの中で一番左側に存在するデータに対しては{1,0}のラベルが付けられています.残りの11個に対しては{0,1}のラベルが付けられています.つまり,学習データは{1,0}か{0,1}のどちらかのクラスに属していることになります.

DBNは学習用データとラベルデータとの関係を学習して,入力された未知のデータに対し,データがどちらのクラスに近いかを判定します.

Trainingノード

次にTrainingノードを見ていきましょう.

f:id:yomoyamareiji:20170204223100j:plain

元々ノードにキャプションが振られているのでわかりやすいです.機械学習畑の方ではない人の為に,用語の説明を簡単にしておきます.

  • Hidden Neurons : 隠れ層と出力層の数.分類するクラス数が2なので,出力層は2

  • Epochs : 学習回数

  • Batch Size : ネットワーク内のパラメータを更新するときに使用するデータの数.学習するデータの数が膨大になってくると,この辺の調整が必要になってくる

  • Learning Rate : 学習率.0.01辺りがよく使われる.けどこのパッチでは0.1を使っている

  • Weight decay : 重み減衰.学習が進むにつれて,パラメータ内の不要or過剰な重みを取り除く役割を担う.ネットワークをもっと多層化する場合はこの変の調整も視野に入れる

  • Train Layer : 指定した学習データと教師データで学習を行うときはここを右クリック

このサンプルパッチではバッチサイズ~重み減衰辺りはあまり深く考えなくてもいい気がします.

Classifyノード

学習したDBNを使用して,実際にデータを入力してクラス判定を行うことが可能です.Classifyのボタンを右クリックすると,入力データに対するクラス分類を行います.

f:id:yomoyamareiji:20170204225604j:plain

GetSliceの値は学習データとリンクしています.今0番目を指定しているので,学習データの一番左のデータを指し示しています.

下のClassとキャプションが振られている部分がクラス分類結果になります.結果は確率値で表されます.

学習データの0番目({1,0,0,1})はラベルが{1,0}であったので,分類結果は(ギリギリ)正解です.

f:id:yomoyamareiji:20170204230016j:plain

5番目の学習データを指定してみました.5番目の学習データはラベルが{0,1}であったので,分類結果は成功です.

GetSliceのエッジとChangeのエッジを切ると,未知の学習データに対する判定を行うことが出来ます.

f:id:yomoyamareiji:20170204234043j:plain

こんな感じ.

右下のこれですが…

f:id:yomoyamareiji:20170204234117j:plain

あまり明確に役割が分からないです.隠れ層の可視化?わからないなぁ.何か知っている方はコメント欄で教えていただけると助かります.

DLライブラリの活用について

DBNのサンプルパッチでは数値データを使用した学習及びクラス分類を行っているのですが,ImagePackと合わせるとvvvvを使用したDeepLearningでの画像認識も可能になるのかな?とか考えております.(FaceTrackingもUSBカメラの画像を持ってきて顔認識してるので…)

もう少しサンプルパッチを使用して勉強してみたいと思っています.

ではでは~

[asin:B01B768QJW:detail]

【vvvv】Astronomyライブラリの諸々を解説してみる

こんにちは,れいじです.

vvvvにはAstronomyと名前が付いたライブラリが存在します.

f:id:yomoyamareiji:20170118230207j:plain

中身を見ると,月や太陽などの天文学に関連したノードのようです.

なんとなく動きが分かっているものだけ紹介してみたいと思います.

Date

f:id:yomoyamareiji:20170118230529j:plain

現在の日時を取得します.Locationを「jp-JP」に変更することで日本の時刻を取得することが可能です.

Current Time

f:id:yomoyamareiji:20170118230923j:plain

現在時刻を取得します.

greenwich mean timeグリニッジ標準時のことです.標準時刻とタイムゾーンを指定した地域の時刻を得ることが出来ます.

日本のタイムゾーンGMT+9hなので,9を指定すると日本の時刻を取得できます.

Gregolian(Join)/Gregolian(Split)

f:id:yomoyamareiji:20170118232804j:plain

f:id:yomoyamareiji:20170118232347j:plain

グリニッジ標準時を求めてくれます.Joinは日時を1つずつ指定することで特定の日時のグリニッジ標準時を求める事ができます.

SplitはCurrent Timeか何かで導き出した時間をミリ秒~年まで分割して求めてくれます.

Moon

f:id:yomoyamareiji:20170118234139j:plain

指定した時間と緯度・経度から見られる月の角度や方位角を求めてくれます.

Latitudeが緯度,Longitudeが経度です.経度ですが,一般的に東経はプラス,西経はマイナスを付けて表します.

Moon Phaseなんですけど…これは多分月の満ち欠け具合を示しているのではないかと思います.月齢を調べてみると,本日(2017年1月18日)は下弦の月が見られる2日前で,半月より少しふっくらしているそうです.

Azimuthは方位角です.基準角が明記されていないので詳しくはわからないのですが,左手系北基準を採用しているのだとすると,今は南東の方角に月がいることになります.

方位角 - Wikipedia

Elevationは月の上る高さです.水平線を0として月が見える場合はプラスの数値が,月が見えない場合はマイナスの数値を出力します.90度に達すると天頂に位置することになります.ここではマイナスの数値が出ていますので,本日は月が見えないということになります.

今日のほしぞら - 国立天文台暦計算室

Sun

f:id:yomoyamareiji:20170119001352j:plain

Moonと同じく,指定した時間と緯度・経度から見られる太陽の角度や方位角を求めてくれます.

基本的なパラメータについてはMoonとほぼ同じです.が,経度だけ注意が必要です.

Moonと違い,東経はマイナス,西経はプラスを付けて表します.どういうことだってばよ…

さらに時刻ですが,Current Timeを指定すると上手く動いてくれません.GMTを指定する必要があります.

Azimuthを確認すると太陽は南東の方角にいることがわかります(左手系北基準).

Elevationがマイナスなので,今は太陽が出ていない=深夜だということがわかります.

パラメータの指定の仕方をMoonに揃えてくれないかな…

Astronomyライブラリに含まれるノードは以上です.

活用の幅を考えたくてこういうのを作ってもみましたが,なかなか難しい…

癖はありますが,データビジュアライズ系のCGを作るときなんかに使えそうな気がします.

ではでは~

【Raspberry Pi】ラズパイにGitbook+Re:Viewを導入する

こんにちは,れいじです.

みなさん,ラズパイ使ってますか?

私はSubsonicを導入してミュージックサーバーとして使用しています.

Subsonic

もうちょっと有効活用したいなーとのことで,GitbookとRe:Viewを導入して,本を書く環境を整えてみたいと思います.

文章を書くのは好きなので,将来的に初心者向けのvvvvの薄い本やレジンクラフトの薄い本などを書きたいな~とか思ってたり.

気持ちが萎えないうちに,環境だけでも整えておこうと考えた次第です.

あ,何でラズパイかというと,手元にすぐ使えるLinuxPCがないからです…笑

インストール手順はここを参考にしました.

https://masarakki.gitbooks.io/how-to-build-techbook/content/setup.html

ラズパイはnpmやrakeなどのパッケージが初期状態では入っていないので,上記サイトを参考にする前に以下のコマンドを実行して,2つのパッケージを入れておく必要があります.

 $ sudo apt-get install npm
 $ sudo apt-get install rake

TeX関連のパッケージの導入に時間がかかるので,気長に待つとよいです.

環境の構築は終了です.gitbook化に関しても問題なし.

流石にラズパイ上でMarkDownを書くのは厳しいので,ファイルはgitで管理するようにします.

githubと紐づけて,WindowsまたはMacで中身を編集できるようにしました.

pdfの生成部分に関してはラズパイに任せるとします!

ではでは~

[asin:B01D3CXJNG:detail]