ラズパイ４を買ったのでからあげ本をやってみた その１

重い腰をあげてようやくラズパイ４を購入したので、機械学習をやろうと思い、からあげ本をやってみたときの備忘録です。

環境は以下になります。

- OS：ubuntu 20.04
- docker：20.10.7
- ラズパイ４ メモリ8GB
- web camera： Logitech C270

OSは etcher で焼いて使用しています。
https://www.balena.io/etcher/

作成したものは[コチラ](https://github.com/shun/docker-jupyterlab) にあります。
docker イメージも[docker hub](https://hub.docker.com/repository/docker/kudoshunsuke/docker-jupyterlab)にはpushしてあります。

# docker をインストール

自分の場合は基本的にクリーンな環境でやりたいこともあるのですが、セットアップにあれこれ時間がかかるのはどうだろうなぁということと、インストール手順とか忘れてしまうのでコードで残せるように基本的にdockerを使って色々やっています。

ubuntuの場合、一番簡単なのは以下かなぁと思っていつも最初に実行してインストールします。

```bash
$ curl -L https://get.docker.com | sudo bash
```

# dockerイメージの作成

現状tensorflowのバージョンとしては2.5.0が最新っぽいのでコレを使用します。
tensorflowのページを見ながらビルドもしてみたのですが、うまくいかなかったので
最終的には @PINTO さんの使用させていただきました。
感謝です！！
https://github.com/PINTO0309/Tensorflow-bin

2.5.0 のものは↓を使用しました。
https://github.com/PINTO0309/Tensorflow-bin/blob/main/tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh

コチラを使用したDockerfileは以下になります。

```Dockerfile
FROM ubuntu:20.04

ENV WORKUSER jupyter
ARG LOCALUID=1000
ARG LOCALGID=1000
ARG DEBIAN_FRONTEND=noninteractive

RUN apt update \
    && apt upgrade -y \
    && groupadd --gid $LOCALGID $WORKUSER \
    && useradd --uid $LOCALUID --gid $WORKUSER --shell /bin/bash --create-home $WORKUSER \
    && gpasswd -a $WORKUSER video \
    && apt install -y \
	curl \
	cython3 \
	gcc \
	gfortran \
	git \
	libatlas-base-dev \
	libatlas-base-dev \
	libatlas3-base \
	libblas-dev \
	libc-ares-dev \
	libeigen3-dev \
	libgfortran5 \
	libhdf5-dev \
	liblapack-dev \
	libopenblas-base \
	libopenblas-dev \
	libopencv-dev \
	libopenmpi-dev \
	openmpi-bin \
	python3-dev \
	python3-pip \
	tmux \
	vim \
        v4l-utils\
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /home/$WORKUSER
USER $WORKUSER

RUN pip3 install pip --upgrade \
    && curl -LO "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/main/tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh" \
    && bash ./tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh  \
    && pip3 install tensorflow-2.5.0-cp38-none-linux_aarch64.whl \
    && pip3 install -U --user six==1.15.0 wheel mock \
    && pip3 install pybind11  \
    && pip3 install keras_applications==1.0.8 --no-deps  \
    && pip3 install keras_preprocessing==1.1.0 --no-deps  \
    && pip3 install -U pandas \
    && pip3 install -U numpy==1.20.3 \
    && pip3 install -U opencv-python \
    && pip3 install -U jupyterlab \
    && pip3 install -U matplotlib \
    && pip3 install -U scipy \
    && pip3 install -U sklearn \
    && pip3 install -U seaborn \
    && rm tensorflow-2.5.0-cp38-none-linux_aarch64.whl \
    && rm tensorflow-2.5.0-cp38-none-linux_aarch64_download.sh \
    && rm -rf ~/.cache/pip

COPY ./jupyterlab/entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--no-browser"]
```

基本的には、[Example of Python 3.x + Tensorflow v2 series](https://github.com/PINTO0309/Tensorflow-bin)をベースにDockerfileを作成していたのですが、作成するときにも色々手こずりました。
躓いたところを以下に書いていきたいと思います。

## python公式の3.8系のdockerイメージだと何故かインストールに失敗する

最初はpython公式の3.8系のdockerイメージをベースにパッケージをインストールしていけばいいと思っていたのですが、どうもうまくいきません。

ちゃんと調べれてないですけど、@PINTO さんのところでも、tensorflow-2.5.0-cp38-none-linux_aarch64.whl はubuntu 20.04 と書いてあるので、python公式のdockerイメージはdebian busterなのでだめだったのかも。

## tensorflow-2.5.0-cp38-none-linux_aarch64.whlを入れるとnumpyが1.19のバージョンになる

tensorflow-2.5.0-cp38-none-linux_aarch64.whlを入れるとnumpyのバージョンが1.19.5 が入ります。
ですが、動かすためには1.20系をインストールする必要があるようです。

そのため、最初にtensorflow-2.5.0-cp38-none-linux_aarch64.whl をインストールし、その後1.20.3のバージョンのnumpyをインストールするようにしています。

## webカメラがOpenCV で開けない

これは、うーんと悩んでたんですけど、よくよく考えてみると、作成したjupyterユーザがvideoグループに属していないためでした。（たぶん）
なので、作成したjupyterユーザをvideoグループに追加しています。

# まとめ

これでようやくラズパイ上で機械学習ができるようになりました。
docker化したので、とりあえずdockerだけ入れておけばサクッとお試しで動かせるようにできたかなと思います。

まだ、からあげ本のチャプター２の１しか試せていないので、ほかも試していきたいと思います。
jupyterlab 上でwebカメラをリアルタイムで表示するのってどうするんだろう。。。

ここまでお付き合いしていただきありがとうございます。