2017年10月1日日曜日

Unity入門:スクリプトの作成

Unity入門:スクリプト作成


前回はプロジェクト作成をやって
Unityでゲームを作る場合は3D空間に3Dモデルを並べるんだろうなって所まで書きました。

今回はそれらの3Dモデルに動きを付けるためのスクリプトの作成について書こうと思います。

ここからプログラムのコーディングが始まります。
デバッグはコンソール画面に出力させて、、など色んなプログラムで行ってきてるやり方と同じですね。
1つ違うとすればUnityというエンジンを使って動かしている点でしょうか。

あまりエンジン使ってるって意識せず気楽に考えた方がスクリプトの書き方に自由度が広がって分かりやすいかもしれません。

超絶まとめ
・コンソール画面を用意しておく
・3Dオブジェクトを設置
・スクリプトを新規作成する
・スクリプトを3DオブジェクトにD&Dする
・スクリプトをダブルクリックしてVisualStudioが開く
 そこに思う存分のコードを記述。


スクリプトの新規作成

コンソール画面の表示と3Dモデルにスクリプト挿入

コンソールに文字を出力する時は

 Debug.Log("~~");

になります。

次回は3Dオブジェクトを動かすコードを記述してみたいと思います。

Unity入門:プロジェクトの作成

Unity入門~プロジェクトの作成~

 SteamやってるとUnityで作ったゲームが増えてきて、ミニゲーム作るのにはいいのでは?!って思いこれから初めてみようと思いました。

今日が1日目なので、初歩の初歩!
あ、でもダウンロードからインストールまでは済んでいる事が前提ですね。
インストールだけは前に済ませておいたので、、

気を取り直して
今回はインストール後の使い方について書いていきます。

最初に結論から書きますと、

Unityはアニメ・3Dモデル・スクリプト、シーン作成、、色々と分担して作業が出来るような仕組みになっています。
プログラムを書くといってもスクリプトを書くというイメージですかね。

Unity環境でやる事は、
3D空間に3Dモデルを置いて、スクリプトを組み込んでいきます。

そういう操作は作法なものなので、覚えるしかないです。

例えば、3D空間について。

3D空間上にあるオブジェクトは全部Hierarchyにツリー上になって表示されます。
それぞれは原点を持っていて、ツリーの中に入っているオブジェクトをそのツリーの1つ上のオブジェクトの位置を原点になります。
初期位置の原点座標は(0,0,0)になります。

3Dモデルを設置する方法について。
次に3Dモデルを置く方法はAssetと呼ばれる所にあるPrefabを置いていきます。
テクスチャとか張っていく場合はInspectorウィンドウの中のComponentになります。

などなど、、
話が長々となってしまいました。

今日の本題に戻って、
さっそくプロジェクト作成から始めたいと思います。

①プロジェクト作成
最初の画面

New Projectを選ぶとこんな画面が出てきます。
何も設定せずにCreate押しちゃっても構いません。


②新しいオブジェクトを置いてみる

オブジェクトを設置する時の様子

出来上がったモデルをインポートして設置していくのが本来のパターンになりますが、
ここでは自前で基本オブジェクトを置いてみます。
Hierarchyウィンドウのツリーの所で右クリック押して好きなオブジェクトを置きます。

設置した時の様子

カメラツリーの中にCubeを作ってしまいました。

この時の原点はどこかというと、カメラ座標を原点にしているので重なっていますね。

Hierarchy内でオブジェクトをD&Dして移動した時の様子

分けて設置したいときはCubeをD&DしてUntitledの所で離します。

これで分離できました。

HierarchyとInspectorと3D空間の操作を馴れるがUnityを早く覚えるコツです。

今日はここまで。


次へ http://ivis-mynikki.blogspot.jp/2017/10/unity_1.html

2017年9月27日水曜日

OpencvSharpでパノラマ画像を作成する

OpenCVでC++の場合のサンプルコードは沢山見かけるのですが、
C#版が無かったので投稿します。

Surfとかはライセンスの関係の問題でOpenCVに付属していないようです。
なので代わりにAKAZEを利用しています。

処理速度や特徴点抽出には申し分ないと思うのでコピペ利用でOKだと思います。



void hoge()
{
    var src = new Mat[2];
    var dst = new Mat[2];
    Mat outImg = new Mat();
    KeyPoint[] keypoints1;
    KeyPoint[] keypoints2;
    var descripter1 = new MatOfFloat();
    var descripter2 = new MatOfFloat();
    var result = new Mat();

    src[0] = Cv2.ImRead("2.JPG");
    src[1] = Cv2.ImRead("1.JPG");
    dst[0] = new Mat();
    dst[1] = new Mat();
    Cv2.CvtColor(src[0], dst[0], ColorConversionCodes.BGR2GRAY);
    Cv2.CvtColor(src[1], dst[1], ColorConversionCodes.BGR2GRAY);

    var akaze = AKAZE.Create();
    akaze.DetectAndCompute(dst[0], null, out keypoints1, descripter1);
    akaze.DetectAndCompute(dst[1], null, out keypoints2, descripter2);

    var matcher = new BFMatcher();
    var matches = matcher.Match(descripter1, descripter2);

    Cv2.DrawMatches(src[0], keypoints1, src[1], keypoints2, matches, outImg);

    using (new Window("OutImg", outImg))
    {
        Cv2.WaitKey();
    }

    //画像合体
    var size = matches.Length;
    var getPoints1 = new Vec2f[size];
    var getPoints2 = new Vec2f[size];

    for (var a = 0; a < size; a++)
    {
        var pt1 = keypoints1[matches[a].QueryIdx].Pt;
        var pt2 = keypoints2[matches[a].TrainIdx].Pt;
        getPoints1[a][0] = pt1.X;
        getPoints1[a][1] = pt1.Y;
        getPoints2[a][0] = pt2.X;
        getPoints2[a][1] = pt2.Y;
        Debug.WriteLine($"{pt2.X - pt1.X}, {pt2.Y - pt1.Y}");
    }

    var hom = Cv2.FindHomography(InputArray.Create(getPoints1), InputArray.Create(getPoints2), HomographyMethods.Ransac);

    Cv2.WarpPerspective(src[0], result, hom, new Size(src[0].Cols * 2.0, src[0].Rows * 2.0));
    for (int y = 0; y < src[0].Rows; y++)
    {
        for (int x = 0; x < src[0].Cols; x++)
        {
            result.Set(y, x, src[1].At<Vec3b>(y, x));
        }
    }

    using (new Window("result", result))
    {
        Cv2.WaitKey();
    }
}

2017年9月25日月曜日

TinkerBoardでリモートデスクトップxrdpを使う

RaspberryPi感覚でインストールして使ってみると
ログイン画面は出てくるけどその後は真っ青で何も進まない経験をしたのではないでしょうか。

それは必要なパッケージが入ってないだけで、解決する方法があります。

以下のコマンドを入力してくださいw

$ sudo apt-get install xorgxrdp xrdp -y

はい、これでおk

Tinkerboardでorable jdk8をインストールする。

openjdkがとても遅いのでOracleのJDKをインストールしました。

やっぱ本家は早いね!
JAVA使いならぜひインストールした方がいいと思います。

インストールの方法ですが、自前で設定する感じです。(めんどくさいですが、、

Step1ダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html

上記サイトからArm-32bit版のSDKをダウンロードしてください。


Step2.解凍する
$ tar zxvf  dk-8u144-linux-arm32-vfp-hflt.tar.gz


Step3.フォルダ移動
$ sudo mv ./jdk1.8.0_144 /usr/lib/jvm/jdk1.8.0


Step4.設定する
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0/bin/javac" 1
$ sudo update-alternatives --config java

自分で打ちこんだ項目が一番下にあるので番号で指定する。


Step5.確認
$ java --version

これで1.8.0ってバージョンが表示されていればおk。

お疲れ様です。

2017年9月24日日曜日

TinkerBoardを買ってみた

総論からすると、
LXDEデスクトップの仕上がりが
RaspberryPiみたいなPIXEL風に見た目良くなるのを待ってもいいのかなー。

ラズパイのデスクトップを見てしまうと、あれ以上のクウォリディーが欲しくなってしまいますw

インストールの仕方ですが
準備編
・電源は最低5V3A必須。
・初期設定はHDMIディスプレイ上で行う。
・SSH、Vimは最初からインストール済みなので安心してOK

設定編
https://tinkerboarding.co.uk/forum/thread-69.html

①上記サイトからOSイメージをダウンロードしてSDカードにイメージ展開する。
②Wifiとかネットワークの設定を済ませたら
 $ sudo Passwd linaro でパスワード設定。

③別PCからSSHログイン。
 ユーザ名はlinaro

これでいけました。(V2.0.1時点)

今後のアップデートでRpi用タッチスクリーンやカメラに対応するそうです。

試しに繋げてみたけど動かなかっただけで、壊れはしませんでしたw

2017年9月22日金曜日

[Rpi]PlantUMLServerをインストールする。

PlantUML公式ページにWEBで出力してくれるけど、やっぱ自前サーバーでやりたいって人向けの情報です。
設定は簡単だけど、どこにも載ってないので備忘録を残しておきます。

$ sudo apt-get install -y graphviz maven
$ git clone https://github.com/plantuml/plantuml-server
$ vim ~/.bashrc
---
$GRAPHVIZ_DOT="/usr/bin/dot"
---
最後の行に挿入

$ source ~/.bashrc
$ mvn jetty:run -Djetty.port=1001

http://address:1001/

最初エラー画面が出るけど、下のURLをクリックすると表示する。

2017年9月11日月曜日

[UWP]2017年版UWPアプリを作る時に覚えておくこと

.Net Core 2.0や .Net standard 2.0が登場して間もない時期ですが、
ようやく下位互換になった!
というか
ようやく置いてけぼり感を食らっていたユーザーに光が差し込まれました。

UWPアプリで書くTaskや新しいインターフェイスを書かずとも

今まで通りの感覚でプログラムが書けます!

( ˘ω˘ )

2017年秋から本格的にUWPアプリを書き始めてみようかなと思いました。

まず今までと違うところが1つあって、
無い!って思ったライブラリ関係は
全部Nugetで追加していかないといけません。

その代名詞になるのが、シリアルポートでしょうか。

それにUWPのUIって全部XAMLで書かないといけないのかって
悩ましい問題も実はテンプレート関係が揃ってるライブラリもNugetにあります。

今までモノシックに出来上がったライブラリが
分割できる特殊パーツはNugetにしようって流れですね。

Nugetに何があるか分からないけど 視点を変えて、

無いものはまずWEBでNugetライブラリ検索しよう

という新しいスタイルをもって開発した方がよさそうです。

まずは簡単に必要最小限に必要な知識としては、
プログラムを全部ライブラリ化して、
UI部分をXamarinやWinform、UWPなどいろんなプラットフォームに合わせて作成する感じですね。

ということで、

ライブラリは.Net Standard 2.0で作る
 これ重要。



ついでにプライベートレポジトリを作っておくと便利なので、

Nugetパッケージを作る
・コマンドラインを開き、.slnファイルのある場所でdotnet pack



ハード制御したいよっという場合は、

シリアルポートを使う
・nugetで Ststem.IO.Portsをインストール



UWPアプリってXAMLタグ打つの大変、、ハンバーガーメニューを一発で使いたい場合は

UWPの画面回りテンプレートを使う
・nuggetで Microsoft.Toolkit.Uwpをインストール  
 サンプルがWEBストアにあって、
 UWP Community Toolkit Sample Appをインストール。
 Microsoft.Toolkit、Microsoft.Toolkit.Servicesこの辺りも使えそう。


ひとまずはこれを知っておけとなんとかなりそうです。

2017年8月8日火曜日

Windows版Tensorflowを使う

以前、RaspberryPi3でTensorflow、Kerasをインストールして機械学習を楽しんでいました。
が、学習には相当量なCPUパワーが必要で、Rpi3で開発は現実的ではない事が判明しました。最初から分かっていた事なのですが、Rpi3より圧倒的に高性能なWindowsPCで行う事にしました。

〇Bash on Windowsにインストール始める前にパスワードを忘れてしまったら、、、
> lxrun.exe /setdefaultuser root
> bash
$ passwd ユーザー名
パスワードを入力してから
$ exit
> lxrun.exe /setdefaultuser ユーザー名
> bash
でOKです。

ここからスタート
$ git clone https://github.com/yyuu/pyenv ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ exit
> bash

一回入りなおしてから、

$ pyenv install --list
anaconda3の最新バージョンを探してインストール
$ pyenv install anaconda3-4.4.0
$ pyenv global anaconda3-4.4.0
$ pyenv refresh
ここからは思いのままに欲しいパッケージを入れる。
$ conda install -c conda-forge tensorflow
$ conda install -c conda-forge keras
$ conda install -c conda-forge jupyter
$ conda install -c conda-forge scikit-learn
$ conda install -c conda-forge pandas
$ conda install -c conda-forge numpy
$ conda install -c conda-forge scipy
$ conda install -c conda-forge ipython


〇Windowsのローカルにインストール
https://repo.continuum.io/archive/.winzip/Anaconda2-4.4.0-Windows-x86_64.zip
をダウンロードしてインストール。
スタートメニューからAnaconda Promptを起動する。
$ pip install tensorflow
$ pip install keras

雑記:
 pipやconda、pyenvと統一感があまりないですが、目的は達成しているのでよしとします。

参考URL:
http://qiita.com/toyolab/items/bccd03d4cb7795112ab6
http://qiita.com/samacoba/items/207f2650ee60fe1de25a
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

2017年8月6日日曜日

Kerasサンプルを実行して動きを眺めてみる。


1.とりあえずサンプルをダウンロードする。

$ wget https://github.com/fchollet/keras/archive/master.zip
$ mv master.zip keras.zip
$ unzip keras.zip
$ cd keras/example

2.サンプルの内容を確認する。

Google翻訳をそのままコピペ。

数えてみると31個もサンプルがあるので、意味はわからないけどまずは機械学習を触ってみてサンプルをいじって遊ぶ程度なら沢山あればなんでもOKですね。
中身なんも分かってないですけど片っ端から動かしてみます。



 Implementation of sequence to sequence learning for performing addition of two numbers (as strings).
 2つの数値の加算を行うためのシーケンス学習へのシーケンスの実装(文字列として)。
 →実行すると、Q,T,赤い□の右隣に数字が出てくる。
  Qが足し算、Tが計算結果、赤い□はなんだろうか。
  正解率は52%あたりで中止した。

 Demonstrates how to write custom layers for Keras.
 Kerasのカスタムレイヤーを作成する方法を示します。
 →6万サンプル、1万テスト、エポック40、正解率は96%
  カスタムレイヤーの作成例らしいのであとで中身を見ようと思います。  

 Trains a memory network on the bAbI dataset for reading comprehension.
 読解のために、bAbIデータセット上のメモリネットワークを訓練する。
 →サンプルデータをダウンロードしてきて何やら解析を始める。
  エポック120あるけどかなり高速で1万サンプルをやっつけていく。
  ラズパイ3だとエポック1つ処理するのに30秒、つまり1時間かかるので中止。

 Trains a two-branch recurrent network on the bAbI dataset for reading comprehension.
 読解のために、bAbIデータセット上の2つの分岐の反復的なネットワークを育成する。
 →サンプルデータをダウンロードしてきて解析を始める。
  エピック40あってラズパイ3ではつらいので中止。
  認識率は20%くらいと低いようだ。

 Trains a simple deep CNN on the CIFAR10 small images dataset.
 CIFAR10の小さな画像データセットでシンプルな深いCNNを学習します。
 →サンプルデータをダウンロードして解析を始める。
  Using real-time argumantation.というのが表示される。
  中止もすんなり受け付けてくらないので他と何か違うらしい。

 Visualization of the filters of VGG16, via gradient ascent in input space.
 VGG16のフィルタのビジュアライゼーション。
 →レイヤーの数がかなりある。進行状況の表示も他のと異なっていてCurrent Loss valueが逐一表示されて、Processingを200回繰り返しやるみたいです。1つくらい最後までやってみようと

 Demonstrates the use of a convolutional LSTM network.
 畳み込みLSTMネットワークの使用を示します。

 Deep Dreams in Keras.
 ケラスの深い夢。

 Trains a convolutional stack followed by a recurrent stack and a CTC logloss function to perform optical character recognition (OCR).
 畳み込みスタックとそれに続く反復スタックとCTCログ損失機能をトレーニングし、光学式文字認識(OCR)を実行します。

 Trains a Bidirectional LSTM on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクで双方向LSTMを訓練する。

 Demonstrates the use of Convolution1D for text classification.
 テキスト分類のためのConvolution1Dの使用を示す。

 Trains a convolutional stack followed by a recurrent stack network on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクで反復スタックネットワークが後に続く畳み込みスタックを訓練する。

 Trains a FastText model on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクでFastTextモデルをトレーニングします。

 Trains a LSTM on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクでLSTMを訓練する。

 Compares different LSTM implementations on the IMDB sentiment classification task.
 異なるLSTM実装をIMDBセンチメント分類タスクで比較します。

 Generates text from Nietzsche's writings.
 ニーチェの著作からテキストを生成する。

 Implementation of AC-GAN ( Auxiliary Classifier GAN ) on the MNIST dataset
 MNISTデータセットにおけるAC-GAN(Auxiliary Classifier GAN)の実装

 Trains a simple convnet on the MNIST dataset.
 MNISTデータセットで単純なconvnetを学習します。

 Trains a Hierarchical RNN (HRNN) to classify MNIST digits.
 階層型RNN(HRNN)をトレーニングして、MNISTディジットを分類します。

 Reproduction of the IRNN experiment with pixel-by-pixel sequential MNIST in "A Simple Way to Initialize Recurrent Networks of Rectified Linear Units" by Le et al.
 Leらによる "整流された線形単位の再帰的ネットワークを初期化する簡単な方法"における画素単位の連続的なMNISTによるIRNN実験の再現

 Trains a simple deep multi-layer perceptron on the MNIST dataset.
 MNISTデータセットで単純な深層マルチレイヤパーセプトロンを学習します。

 Reproduction of the Net2Net experiment with MNIST in "Net2Net: Accelerating Learning via Knowledge Transfer".
「Net2Net:知識移転による加速学習」におけるMNISTによるNet2Net実験の再現

 Trains a Siamese multi-layer perceptron on pairs of digits from the MNIST dataset.
 MNISTデータセットの数字の対にシャーマンの多層パーセプトロンを訓練する。

 Demonstrates how to use the sklearn wrapper.
 sklearnラッパーの使用方法を示します。

 Trains a Stacked What-Where AutoEncoder built on residual blocks on the MNIST dataset.
 スタックされたWhat-WhereをトレインするAutoEncoderは、MNISTデータセットの残りのブロックに基づいて構築されました。

 Transfer learning toy example.
 転送学習のおもちゃの例。

 Neural doodle.
 神経の落書き。

 Neural style transfer.
 ニューラルスタイルの転送。

 Loads pre-trained word embeddings (GloVe embeddings) into a frozen Keras Embedding layer, and uses it to train a text classification model on the 20 Newsgroup dataset.
 訓練された単語埋め込み(GloVe埋め込み)をフリーズしたKeras埋め込みレイヤーに読み込み、これを使用して20 Newsgroupデータセットのテキスト分類モデルをトレーニングします。

 Trains and evaluate a simple MLP on the Reuters newswire topic classification task.
 ロイターのニュースワイヤトピック分類タスクで簡単なMLPをトレーニングし、評価します。

 Demonstrates how to use stateful RNNs to model long sequences efficiently.
 ステートフルなRNNを使用して長いシーケンスを効率的にモデル化する方法を示します。

 Demonstrates how to build a variational autoencoder.
 バリアントオートエンコーダの構築方法を示します。

 Demonstrates how to build a variational autoencoder with Keras using deconvolution layers.

 デコンボリューションレイヤを使用してKerasを使用してバリアントオートエンコーダを構築する方法を示します。


総論:
 全部のサンプルを動かして率直な印象。
 大量のデータセットがあって、
 学習用途に合わせたレイヤー構成があって、
 学習させるのに大量の処理時間が必要で、
 正解率は学習毎に変わって正解率100%はありえない。

という結論です。
あとディープラーニング自体は画像解析に特化している


詳しく理解してないですが、何を解析するかでどういう解析手法にするか選択するようです。
上記サンプルからわかることは、

 LSTM、GRU :自然言語解析
 CNN    :画像解析
 RNN    :自然言語、画像解析でも利用。亜種が色々。

のようです。

何が効果的か本来は試行錯誤しながら見つけなければいけないと思うのですが、インターネット上で研究成果も色々乗っているわけで、利用者側からすれば詳しいモデル構造を知らなくてもモデルのテンプレを集めておけば、データセット収集で目的の半分は達成できそうな気もする。


参考URL
https://keras.io/ja/



2017年8月5日土曜日

特化型人工知能について

AIには汎用型と特化型で2種類あるうち特化型についてまとめてみた。

特化型最高峰は最近の流行りである深層学習であるディープラーニングである。

ディープラーニングをざっくり説明すると、データから自ら特徴を見つけ出し、カテゴリ分けを行い、それに人間がラベリングを行い、実社会と人工知能の結果を結びつけるというものである。
今までと違うのが自ら特徴を見つけ出すという部分で、人が分かってない特徴も見つけ出す事も可能ということです。

学習手順を大まかに書くと、

 大量のデータセット→AIエンジニアが作った機械学習プログラム→結果

1.あるデータセット(動画・音声・テキスト・センサ情報など)を入力する。
2.AIが学習を行う。
  AIエンジニアがデータに最適な手法を組み合わせたり、評価関数を作り、求めるパラメータを明確化する。
3.それなりに結果得られるようになったら完成。


人工知能と人と同じく最初は判別しやすいデータを与えて勉強させることが必要です。
ベースを作ってから徐々に判定が難しいデータを与えて調節していく感じがいいように思えます。


AIエンジニアのお仕事
 ディープラーニングが登場してから毎週のように進化していっているので、対象のデータをどういったアルゴリズムを使えば最善であるか設計する作業があります。それと人工知能が出した結果が評価する評価関数の導出も必要だったりするので人工知能だからって手放しで全自動というわけではないのが現状である。


人工知能のやるにあたっていきなりディープラーニングをやるよりも、用語や機械学習の扱い方を覚えるためにまずSVMやニューラルネットワークから導入したほうがいいかも。


以下、完全にまとめきれてないのですが、用語集。


特化型AIの種類
ファジィ集合
・SVM(サポートベクトルマシン)
(NN)ニューラルネットワーク
NNを更に特化したものたち
 CNN、ResNet
 RNN
 LSTM

オートエンコーダ
・VAE(Variational Autoencoder)

アプリ
・OpenPose 動画で人の関節の動きを可視化する
・Merlin 深層学習ベースの音声合成ツールキットMerlin
・Eliza チャットボット


ライブラリ
・Tensorflow
・Chainer



・その他参考用語集
generative model...生成モデル
maximum likelihood learning...最尤学習
weights...重み
bias...バイアス(偏差)
meta-parameter...超パラメータ
stochastic...確率的
Robust...頑健
binary...2値
deterministic...決定論的
training data...訓練データ
validation data...検証データ
test data...テストデータ
GD(Gradient Descent)...勾配法
SGD(Stochastic Gradient Descent)...確率的勾配法
overfitting...過学習
approximate...近似
standard deviation...標準偏差
momentum...はずみ、運動量、今回の場合はGD中に振動の抑制項として使われる
ravine...峡谷、谷
brute-force...力ずく
weight decay...荷重減衰
mixing rate...混合率(理想分布への収束スピード)
coefficient...係数
partition function...分配関数
sparsity target...スパース化目標
sparsity cost...スパース化コスト
stability...安定性
discriminative...識別の
order of magnitude...10の累乗
eigenvalue...固有値
eigenvector...固有ベクトル
natural image...自然イメージ、多様性のあるイメージ
rectified...修正された
exponential family...指数型分布族
integrate out...積分消去


参考URL
http://machinelearningmastery.com/get-help-with-keras/
http://www.iryounomirai.com/news/study/1078/


2017年8月1日火曜日

[RaspberryPi]Tensorflowをインストールする

WindowsでTensorflowの環境構築がうまくいかなかったので、持て余しているラズパイにディープラーニング用フレームワークTensorflowをインストールすることにした。

ビルド済みのをインストールする方法もあるのですが、バージョンが古いのでソースからビルドします。

ちなみに2017年8月時点でJessie版RasbianのG++-4.9でビルドはできません。
参考URLにのっているのですが、threadpool.ccをビルドする時にエラーになります。

捕捉:試しにStretch版へアップグレードしてGCC-6、G++-6でビルドしてみたらこっちはOKでした。(スワップメモリを大きめに取っておく必要はありますが。)


以下を打ちこめばOK。
---
$ git clone https://github.com/tensorflow/tensorflow
$ sudo apt-get install -y autoconf automake libtool gcc-4.8 g++-4.8 libjpeg-dev
$ tensorflow/contrib/makefile/download_dependencies.sh
$ cd tensorflow/contrib/makefile/downloads/protobuf/
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig  # refresh shared library cache
$ cd ../../../../..

raspberry pi zero or 1ならこっち
$ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI OPTFLAGS="-Os" CXX=g++-4.8

raspberry pi 2 or 3ならこっち(neon有効化?)
$ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI \
OPTFLAGS="-Os -mfpu=neon-vfpv4 -funsafe-math-optimizations -ftree-vectorize" CXX=g++-4.8
---

追記:Bazelを使う場合、
ビルドにbazelを使用すると「configure」が使えるので、調整が色々できるようになります。
Bazelはv0.4.5を使います。

$ wget https://github.com/bazelbuild/bazel/releases/download/0.4.5/bazel-0.4.5-dist.zip
$ unzip -d bazel bazel-0.4.5-dist.zip
$ cd bazel

ソースコードで編集2か所あります。

nano scripts/bootstrap/compile.sh
117行目 末尾に「-J-Xmx500M」を追加。


nano tools/cpp/cc_configure.bzl
133行目 関数の頭にreturn "arm" を追加。

$ sudo ./compile.sh
$ sudo cp output/bazel /usr/local/bin/bazel

これでBazelインストール完了。
次にTensorflowのビルド
$ cd ~/tensorflow
$ ./configure
$ bazel build -c opt --copt="-mfpu=neon-vfpv4" --copt="-funsafe-math-optimizations" --copt="-ftree-vectorize" --copt="-fomit-frame-pointer" --local_resources 1024,1.0,1.0 --verbose_failures tensorflow/tools/pip_package:build_pip_package

これでOK。

★ビルドエラーが出て先に進めない、手っ取り早くインストールしたい場合
ビルド済みのwhlがあるので活用する方法があります。

$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/blob/master/archive/tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl

これでOK。

-----------
〇動作チェック

動作確認で画像認識をやってみる場合、
---
curl https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015_stripped.zip \
-o /tmp/inception_dec_2015_stripped.zip
unzip /tmp/inception_dec_2015_stripped.zip \
-d tensorflow/contrib/pi_examples/label_image/data/
make -f tensorflow/contrib/pi_examples/label_image/Makefile
tensorflow/contrib/pi_examples/label_image/gen/bin/label_image
---

動作確認でカメラを使った動画認識をやってみる場合、
---
make -f tensorflow/contrib/pi_examples/camera/Makefile
tensorflow/contrib/pi_examples/camera/gen/bin/camera
---

ビルド時間がとても長いので気長にまちましょう。

Androider