Raspberry Pi に tensorflow , OpenCV , Keras をインストール 

# 概要
Raspberry Pi にTensorflowをインストールする方法 2021/11/13版
[Operating system images](https://www.raspberrypi.com/software/operating-systems/)で2021/11/13時点に配布されているRaspberry Pi OSやUbuntuを試しましたが、色々と面倒でした。
個人的には、手持ちの古いRaspberry Pi OS BUSTER(Raspberry Pi OS 9　2020-02-13-raspbian-buster.zip）を使う方が比較的簡単でしたので、そちらの手順を記載※しておきます。
※初級者、AIハンズオン参加者　向けの参考資料を兼ねておりまして、このような判断をしています

## 環境
・Raspberry Pi4
・SDカード 64GB
・有線のインターネット環境（初期設定時にあれば楽）

インストール後の環境

```
$ uname -a
Linux  5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux
$ python3 --version
Python 3.7.3
$ pip3 --version
pip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7)
$ python3
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> print(np.__version__)
1.20.0
>>> import cv2
>>> print(cv2.__version__)
4.5.4-dev
>>> import keras
Using TensorFlow backend.
>>> keras.__version__
'2.5.0'
>>> exit()
```

## OSをSDカードへ書き込み
[Operating system images](https://www.raspberrypi.com/software/operating-systems/)から過去のOSダウンロードができないので。
過去にダウンロードしていたBUSTER(Raspberry Pi OS 9　2020-02-13-raspbian-buster.zip）を利用。

書き込みには[Raspberry Pi Imager](https://www.raspberrypi.com/software/)を使います。
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/a19da8ca-c1ef-41d8-26e0-a83e7557cf74.jpeg)
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/0012c180-18a7-969b-3de3-f3c07c48b371.jpeg)
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/f8c165f1-d796-2f43-5627-69284ba87bc0.jpeg)
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/aca116bc-c35a-647e-689b-4505ab85d9df.jpeg)

## OS インストール
![IMG_7610.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/abf64797-5d1f-191a-a0bd-9a3f58379fd5.jpeg)
![IMG_7611.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/30a48aba-b3fc-2bf1-7bde-1721c4b6cbb1.jpeg)
![IMG_7617.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/59cc846b-aea1-8e6f-e475-4749811ddfe5.jpeg)
![IMG_7618.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/63a76e18-f9db-acbc-6a5c-58c9c6fc9ae4.jpeg)
![IMG_7619.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/90acf47e-710b-7769-1f91-51dbaa940556.jpeg)
![IMG_7620.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273559/582ed4a4-dc38-bcdf-4637-5fed9a3b798d.jpeg)

更新など

```
$ sudo apt update
sudo apt dist-upgrade
取得:1 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB]
取得:2 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
E: Repository 'http://archive.raspberrypi.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'oldstable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
E: Repository 'http://raspbian.raspberrypi.org/raspbian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Do you want to accept these changes and continue updating from this repository? [y/N] y
47.6 kB を 5秒 で取得しました (8,962 B/s)
パッケージリストを読み込んでいます... 完了
E: http://raspbian.raspberrypi.org/raspbian/dists/buster/InRelease の取得に失敗しました
E: http://archive.raspberrypi.org/debian/dists/buster/InRelease の取得に失敗しました
E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
$ sudo apt dist-upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
$ sudo apt-get update
取得:1 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
取得:2 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB]
パッケージリストを読み込んでいます... 完了
E: Repository 'http://raspbian.raspberrypi.org/raspbian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
E: Repository 'http://archive.raspberrypi.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'oldstable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
```

リリースが情報変更となったことを許容するオプション付きで update する

```
$ sudo apt-get update --allow-releaseinfo-change
取得:1 http://archive.raspberrypi.org/debian buster InRelease [32.6 kB]
取得:2 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB]
取得:3 http://archive.raspberrypi.org/debian buster/main armhf Packages [393 kB]
取得:4 http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages [13.0 MB]
取得:5 http://raspbian.raspberrypi.org/raspbian buster/contrib armhf Packages [58.8 kB]
取得:6 http://raspbian.raspberrypi.org/raspbian buster/non-free armhf Packages [104 kB]
13.6 MB を 24秒 で取得しました (570 kB/s)
パッケージリストを読み込んでいます... 完了
N: Repository 'http://archive.raspberrypi.org/debian buster InRelease' changed its 'Suite' value from 'testing' to 'oldstable'
N: Repository 'http://raspbian.raspberrypi.org/raspbian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
```

upgrade する

```
$ sudo apt upgrade
```

## 必要なものをインストール

```
$ sudo pip install --upgrade pip
$ sudo pip3 install --upgrade setuptools
$ sudo pip3 install numpy==1.20.0
$ sudo apt-get install -y libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran python-dev libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libopenblas-base libblas-dev liblapack-dev cython libatlas-base-dev openmpi-bin libopenmpi-dev python3-dev
$ sudo pip3 install keras_applications==1.0.8 --no-deps
$ sudo pip3 install keras_preprocessing==1.1.0 --no-deps
$ sudo pip3 install h5py==2.9.0
$ sudo pip3 install pybind11
$ pip3 install -U --user six wheel mock
```

## Tensorflowのインストール
### 環境の確認
```
$ uname -a
Linux tagraspi4lcd 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux
$ python3 --version
Python 3.7.3
$ pip3 --version
pip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7)
$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> print(np.__version__)
1.20.0
>>> quit()
```

### [GithubのPINTO0309/Tensorflow-bin](https://github.com/PINTO0309/Tensorflow-bin)を利用させて頂きます
cp37(Python 3.7.3)、armv7l、numpy 1.20.0になるので以下をダウンロードします。
tensorflow-2.5.0-cp37-none-linux_armv7l_numpy1200_download.sh

```
$ mkdir -p ~/Env/tensorflow
$ cd  ~/Env/tensorflow
$ pwd
/home/pi/Env/tensorflow
$ wget "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/main/tensorflow-2.5.0-cp37-none-linux_armv7l_numpy1200_download.sh"
$ sudo bash ./tensorflow-2.5.0-cp37-none-linux_armv7l_numpy1200_download.sh
$ sudo pip3 uninstall tensorflow
Skipping tensorflow as it is not installed.
 $ ls
tensorflow-2.5.0-cp37-none-linux_armv7l.whl  tensorflow-2.5.0-cp37-none-linux_armv7l_numpy1200_download.sh
$ sudo -H pip3 install tensorflow-2.5.0-cp37-none-linux_armv7l.whl
```

### tensorflow のバージョン確認
```
 $ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
>>> tensorflow.__version__
'2.5.0'
>>> exit()
```

## OpenCVのインストール
### 必要なものをインストール
```
$ sudo apt update
$ sudo apt install build-essential
$ sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
```

### 作業ディレクトリに opencv と opencv_contrib を落とす
```
$ mkdir -p ~/Env/opencv
$ cd  ~/Env/opencv
$ pwd
/home/pi/Env/opencv
$ wget -O opencv4.x.zip https://github.com/opencv/opencv/archive/refs/heads/4.x.zip
$ unzip opencv4.x.zip
$ wget -O opencv_contrib4.x.zip https://github.com/opencv/opencv_contrib/archive/refs/heads/4.x.zip
$ unzip opencv_contrib4.x.zip
$ ls
opencv-4.x  opencv4.x.zip  opencv_contrib-4.x  opencv_contrib4.x.zip
```

### メモリ不足回避のためスワップサイズを拡張
#### /etc/dphys-swapfile
```
$ sudo cp /etc/dphys-swapfile /etc/dphys-swapfile.org
$ sudo vi /etc/dphys-swapfile
```

変更点
#CONF_SWAPSIZE=100　先頭に#を追加しコメントアウト
CONF_SWAPSIZE=2048　追加

```
# /etc/dphys-swapfile - user settings for dphys-swapfile package
# author Neil Franklin, last modification 2010.05.05
# copyright ETH Zuerich Physics Departement
#   use under either modified/non-advertising BSD or GPL license

# this file is sourced with . so full normal sh syntax applies

# the default settings are added as commented out CONF_*=* lines


# where we want the swapfile to be, this is the default
#CONF_SWAPFILE=/var/swap

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
#CONF_SWAPSIZE=100
CONF_SWAPSIZE=2048

# set size to computed value, this times RAM size, dynamically adapts,
#   guarantees that there is enough swap without wasting disk space on excess
#CONF_SWAPFACTOR=2

# restrict size (computed and absolute!) to maximally this limit
#   can be set to empty for no limit, but beware of filled partitions!
#   this is/was a (outdated?) 32bit kernel limit (in MBytes), do not overrun it
#   but is also sensible on 64bit to prevent filling /var or even / partition
#CONF_MAXSWAP=2048
```

再起動します

```
$ sudo reboot
```

### cmake
DOPENCV_EXTRA_MODULES_PATHはopencv_contrib-4.xディレクトリの場所に合わせます。
-DCMAKE_INSTALL_PREFIXはインストール先を設定します。

```
$ cd opencv-4.x
mkdir build
cd build
cmake .. -DOPENCV_EXTRA_MODULES_PATH=$HOME/Env/opencv/opencv_contrib-4.x/modules/ -DCMAKE_INSTALL_PREFIX=/usr
```

### make
Raspberry Pi 4で３時間程度かかります。

```
$ make -j4
```

### インストール

```
$ sudo make install
```

### 動作確認
```
$ python3
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
4.5.4-dev
>>> quit()
```

## Keras のインストール
### pipでKeras をインストール
```
$ sudo pip3 install Keras
```

### keras のバージョン確認
```
$ python3
Python 3.7.3 (default, Jan 22 2021, 20:04:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>> keras.__version__
'2.5.0'
>>> exit()
```