RaspberryPi で TensorFlow on Docker

Docker環境をRaspberryPi上に構築する の続きです。

Docker 環境に TensorFlow をえいや

ここからは TensorFlow 環境を構築していきます。
前述で動作確認した環境に地道に構築していってもよいですが、せっかくなので Dockerfile を使用して Docker Image をビルドします。

Dockerfile でえいや

FROM resin/rpi-raspbian:stretch

ENV LANG C.UTF-8

ENV DEBIAN_FRONTEND noninteractive

ENV APP_ROOT /usr/src
WORKDIR $APP_ROOT
COPY src $APP_ROOT

RUN echo "deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi firmware" > /etc/apt/sources.list

RUN apt-get update -y
RUN apt-get install -y --no-install-recommends \
vim git less wget \
build-essential \
libatlas-base-dev \
python3-pip python3-dev python3-setuptools\
python3-scipy python3-h5py \
libraspberrypi-bin \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

RUN pip3 install --upgrade pip setuptools
RUN pip3 install rpi.gpio
RUN pip3 install numpy opencv-python
RUN pip3 install tensorflow
RUN pip3 install keras
RUN pip3 install jupyter

# Jupyter のデフォルトポート
EXPOSE 8888

参考

DEBIAN_FRONTEND=noninteractive ってなんだ

TensorFlow や Jupyter については、すでに公式や多くの方から Image が公開されていますが、今回は勉強をかねて Raspbian に地道にインストールしています。
(Dockerは独学なので、ご指摘等あればコメントください)

# build
$ docker build -t rpi-raspbian-stretch .

ビルドが完了したら、container を作成、起動します。
Jupyter を使用するのでデフォルトポート 8888 をバインドしますが、他のポートを使用する際は適宜読み替えてください。

$ docker run --name rpi-raspbian-stretch -ti -p 8888:8888 --privileged -d kohbis/rpi-raspbian-stretch

無事に起動していることが確認できたら、 container に接続して作業していきます。

$ docker exec -ti rpi-raspbian-stretch /bin/bash

まずは Jupyter を起動します。
ここまでで、個別のユーザ設定をしていない場合は、 root ユーザで起動することになります。
root ユーザでの起動は非推奨であるため Running as root is not recommended. Use --allow-root to bypass. というメッセージが表示されますが、今回はメッセージにある --allow-root オプションを指定して進めます。

jupyter notebook --allow-root --ip 0.0.0.0 --port 8888

Jupyter にブラウザからアクセスします。
初回のみ起動時に表示されている token 付き URL にアクセスする必要があります。

Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://(hostname or 127.0.0.1):8888/?token=********************
  • ラズパイ上で作業している場合は 127.0.0.1:8888
  • ラズパイに ssh して作業している場合は ラズパイのIPアドレス:8888

jupyter

Jupyter の画面が表示されたら最後に、 Hello World しましょう。
右上の new -> Python3 から Notebook を作成して、プログラムを実行します。

import tensorflow as tf

hello = tf.constant('Hello, TensorFlow !!')
sess = tf.Session()

print(sess.run(hello))

helloworld

画像のようになれば成功です。

今回は環境構築なので一旦ここまですが、次回以降は実際にカメラモジュールを使用して画像解析をやりたいです。

所感

Docker を導入したことで、ラズパイのローカルをキレイな状態に保つことに成功しました。
作業している最中には考えていませんでしたが、 Docker リポジトリにプッシュしてラズパイがないときでも開発を進めたり、といったこともできます。
個人的には Docker Image をビルドするので、複数の Image をラズパイのローカルに持ちたい場合は SD 容量は 8GB だと心もとないかな? という感覚です。

今後は 機械学習そのものに手を出すことが初めてなので、勉強と手探りで進めていこうと思います。
AI × IoT 頑張ります!