sabo laboratory

備忘録的な技術系ブログです。組み込み、ガジェットなどなどについて書いていきます。

raspberry pi zero wにtensorflow+Kerasを導入

raspberry zero w

ようやく市場への供給が進んで手に入るようになった。 秋葉原秋月電子でケースとセットで2500円くらいで入手。 なんだか思ってたより高いけど、今回はこれに機械学習の推論をさせることを目指して遊んでみる。

raspberry pi zero SETUP

raspberry pi zero にraspbian stretchを導入する。 最初はRaspbian-stretch-liteで進めようとしたが、どうもWiFiの設定がうまくいかなかったので、素直にstretch-desktopを選んだ。

インストールしたRaspbianのバージョンは以下の通り。

www.raspberrypi.org

Raspbian Stretch with desktop
Image with desktop based on Debian Stretch
Version: April 2019
Release date: 2019-04-08
Kernel version: 4.14
Release notes: Link

USB接続でインストールを済ませるため、以下のサイトを参考にさせていただいた。

www.daipanman.com

参考サイト先とやや違う作業はWiFiの設定。rasp-configで進めた。

pi@raspberrypi:~$ sudo raspi-config

Install Tensorflow

以下のサイトを参考にさせていただき、導入を進めた。

ken5owata.hatenablog.com

qiita.com

まずメモリ不足に対応するため、スワップサイズを拡張する。

pi@raspberrypi:~$ sudo vi /etc/dphys-swapfile

CONF_SWAPSIZE=2048

pi@raspberrypi:~$ sudo /etc/init.d/dphys-swapfile restart

次に必要な環境を準備する。 以下パッケージを導入する。

pi@raspberrypi:~$ sudo apt-get install -y libhdf5-dev
pi@raspberrypi:~$ sudo pip install h5py

最後にTensroflowを導入する。 ラズパイ向けのTensorflowを提供している下記サイトから、pipでインストール可能なファイルをダウンロードしてくる。 とりあえず安定板の1.12を選択。cp27のarmv6lを選んでダウンロードする。

Links for tensorflow https://www.piwheels.org/simple/tensorflow/

pi@raspberrypi:~$ wget https://www.piwheels.org/simple/tensorflow/tensorflow-1.12.0-cp27-none-linux_armv6l.whl

ようやくtensorflowをインストール。結構時間がかかる(大体1~2時間ぐらい?)

pi@raspberrypi:~$ sudo pip install tensorflow-1.12.0-cp27-none-linux_armv6l.whl

簡単に動作を確認しておく。 pythonを起動して、tensorflowをインポートしてエラーが起きなければたぶん大丈夫。

pi@raspberrypi:~$ python
>import tensorflow as tf
>

install Keras

Kerasを導入する。 Tensorflowの流れで導入しようとするとエラー発生。

なので、以下のサイトを参考に、関連パッケージを導入。 そのあとにKerasを導入。

qiita.com

pi@raspberrypi:~$ sudo apt-get install python-h5py
pi@raspberrypi:~$ sudo apt-get install python-scipy

pi@raspberrypi:~$ sudo pip install keras

Kerasの公式ドキュメントからサンプルを試す。 ResNet50のモデルを試してみる。 認識させる画像は自分で用意する必要がある。

keras.io

pi@raspberrypi:~$ nano vgg16.py

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np

model = ResNet50(weights='imagenet')

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

preds = model.predict(x)
print('Predicted:', decode_predictions(preds, top=3)[0])

pi@raspberrypi:~$ python vgg16.py

とりあえずサンプル通りの出力が得られた。 model.predict(x)を実行して予測結果が得られるまでに大体十数秒かかる。 まだ試していないが、カメラの映像がからリアルタイムで認識させるのには、ラズパイゼロとこのモデルでは厳しそう。

次はもう少し軽量のNASNetMobileを試そうとしたが、なんだかうまくいっていないのでまた今度試してみる。