FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Raspberry-Pi3でTensorFlowをコンパイルして動作させるまで

以下を参考にする。

qiita.com

Raspibianのインストー

以下から、NOOBSのフルインストーラ版をダウンロードした。

https://www.raspberrypi.org/downloads/noobs/

f:id:msyksphinz:20170604111504p:plain

以下のような画面が現れて、Raspberry-Pi3用のLinuxであるRaspbianのインストールが始まる。

f:id:msyksphinz:20170604111828p:plain

f:id:msyksphinz:20170604111757p:plain

しばらくしてインストールが完了し、デスクトップが現れた。

ちょっとしたモッサリ感があるが、立派なLinuxデスクトップだ。

f:id:msyksphinz:20170604111922p:plain

パッケージのアップデート

次に、パッケージのアップデートを行っておく。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install jfbterm
sudo apt-get install ibus-anthy

最初にデスクトップを日本語に設定してしまったせいか、いろいろと文字化けしてしまっている。

f:id:msyksphinz:20170604113611p:plain

sshサービスの立ち上げ

最後に、ifconfigIPアドレスを調べ、sshのポートを開放しておく。これで、わざわざデスクトップを触らなくても、ssh経由で作業マシンからログインできるようになる。

/etc/init.d/ssh start

sshでのログイン時は、

  • ユーザ名: pi
  • パスワード: raspberry

となっている。

パッケージのアップデートとTensorFlowをインストールする。

ここから先は、上記Qittaの記事の写経なのだが、まずはRaspbianのパッケージアップデートを行う。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install jfbterm
sudo apt-get install ibus-anthy

TensorFlowのインストールは、まずはリポジトリをクローンしてきた。

git clone https://github.com/tensorflow/tensorflow.git

static libraryの生成を行う。これも、上記Qittaの記事の通りに実行できる。最後のターゲットビルドには、かなり時間がかかった。数時間レベルかな?

tensorflow/contrib/makefile/download_dependencies.sh
sudo apt-get install -y autoconf automake libtool gcc-4.8 g++-4.8
cd tensorflow/contrib/makefile/downloads/protobuf/
./autogen.sh
./configure
make
sudo make install
sudo ldconfig  # refresh shared library cache
cd ../../../../..
make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI OPTFLAGS="-Os" CXX=g++-4.8

TensorFlowアプリケーションのビルド

次にTensorFlowアプリケーションのビルドを行う。まずは必要なライブラリとツール群のビルド。

sudo apt-get install libjpeg-dev imagemagick

必要な画像ファイル群をダウンロードしてくる。

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/

TensorFlowアプリケーションのビルドを行う。画像認識のためのTensorFlowアプリケーションが生成される。

make -f tensorflow/contrib/pi_examples/label_image/Makefile

以下で実行してみる。上記Qittaページにもあるが、これはCOBOLの開発者であるGrace Hopper氏に対する画像認識をしているらしい。

実行してみると、"military uniform", “suit"など、それっぽい認識結果が出てきた。すばらしい。 実行時間は数秒だ。

pi@raspberrypi:~/work/tensorflow $ tensorflow/contrib/pi_examples/label_image/gen/bin/label_image
2017-06-04 02:01:56.437971: I tensorflow/contrib/pi_examples/label_image/label_image.cc:145] Loaded JPEG: 512x600x3
2017-06-04 02:01:57.798286: W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
2017-06-04 02:02:03.502602: I tensorflow/contrib/pi_examples/label_image/label_image.cc:379] Running model succeeded!
2017-06-04 02:02:03.506946: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] military uniform (866): 0.624293
2017-06-04 02:02:03.507012: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] suit (794): 0.0473982
2017-06-04 02:02:03.507050: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] academic gown (896): 0.0280926
2017-06-04 02:02:03.507085: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] bolo tie (940): 0.0156955
2017-06-04 02:02:03.507120: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] bearskin (849): 0.0143348

f:id:msyksphinz:20170604113101p:plain

もっと大雑把な画像は?

先ほどの、Raspibianのスクリーンショットを認識させてみよう。まずは認識できるように、png形式からjpeg形式に変換する。

convert /home/pi/2017-06-03-134714_1824x984_scrot.png /home/pi/2017-06-03-134714_1824x984_scrot.jpg

f:id:msyksphinz:20170604111922p:plain

実行結果は以下のようになった。やはり少し難しい?"trailer truck"や、"church"が予測され、しかも予測精度も低い。

pi@raspberrypi:~/work/tensorflow $ tensorflow/contrib/pi_examples/label_image/gen/bin/label_image --image=/home/pi/2017-06-03-134714_1824x984_scrot.jpg
2017-06-04 02:09:23.015846: I tensorflow/contrib/pi_examples/label_image/label_image.cc:145] Loaded JPEG: 1824x984x3
2017-06-04 02:09:24.281441: W tensorflow/core/framework/op_def_util.cc:332] Op BatchNormWithGlobalNormalization is deprecated. It will cease to work in GraphDef version 9. Use tf.nn.batch_normalization().
2017-06-04 02:09:29.875592: I tensorflow/contrib/pi_examples/label_image/label_image.cc:379] Running model succeeded!
2017-06-04 02:09:29.879767: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] trailer truck (283): 0.116827
2017-06-04 02:09:29.879827: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] church (690): 0.0843748
2017-06-04 02:09:29.879864: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] tractor (289): 0.0554093
2017-06-04 02:09:29.879898: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] wing (503): 0.0431268
2017-06-04 02:09:29.879933: I tensorflow/contrib/pi_examples/label_image/label_image.cc:273] hay (816): 0.0230417