Raspberrry Pi4 でやってみた機械学習

# Raspberrry Pi4 でやってみた機械学習
## はじめに
今回、会社で学習用に存在した、Raspberrry Pi4を使ってインストールから解析するまでの説明をさせていただこうかなと思います。
やってみた流れは以下のようになります。

* インストールから起動まで
* SSHとRemote Desktop接続
* Coral AcceleratorとRaspberry Piカメラを使って画像解析とリアルタイム映像解析

## インストールから起動まで
### 準備したもの
* Raspberry Pi 4 Model B(8GB基盤) 
* SDカード(Sandisk Ultra 256GB) 
* SD カードリーダー
* Type-C電源アダプターとスイッチ
* ケース
* MicroHDMI-to-HDMIケーブル
* Coral USB Accelerator
* Raspberry Piカメラ
* モニター、USBキーボード、USBマウス
* Macパソコン
* Wi-Fi（無線LAN）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93548/aeae5566-c6d5-9147-7281-517368a512be.jpeg" width=50%>

### ダウンロードとインストール
Mac(Pro)を使用してRaspberry Pi環境をmicroSDカードにインストールします。
OS は従来 Raspbian と呼ばれていた Raspberry Pi OS を利用します。
[Raspberry Pi](https://www.raspberrypi.org/software/)公式サイトに提供してるRaspberry Pi Imager を利用するため、イメージファイルを事前にダウンロードしておく必要はありません。

以下の手順の通りに実行します。

#### **Raspberry Pi Imager のインストール**

MacOSだと `brew cask install raspberry-pi-imager` でインストール可能ですが、今回は公式サイトから「Raspberry Pi Imager for macOS」をダウンロードしてインストールします。

#### **Raspberry Pi OS をSDカードにインストール**

SD カードリーダーに microSD カードをセットし、スタートメニューから Raspberry Pi Imager を起動します。
![](https://i.imgur.com/0mdKh28.png)
CHOOSE SD CARD で書き込む microSD カードを選択し、 CHOOSE OS をクリックします。
OS を選択すると、自動でイメージをダウンロードできます。
![](https://i.imgur.com/9MX0Kds.png)
WRITE ボタンを押すと、書き込みが開始されます。
書き込みが完了すると、自動的にベリファイが走ります。
![](https://i.imgur.com/OBcR9nC.png)
しばらく待って、ベリファイが完了するとSDカードにRaspbianのインストールが完了です。
※Raspberry Pi Imagerを使うと、他のツールを利用する必要が無いため、非常に便利です。

## SSHとRemote Desktop接続

初期設定として、自分のMacからSSHとRemote Desktopが実行できるように準備します。
理由はモニター、USBキーボード、USBマウスの切替が面倒なので、モニターに繋がず、自分のMac上でRaspberry Piを利用するためです。

### 起動と接続
次に、以下の手順を実行していきます。
Raspbianを書き込んだmicroSDカードをRaspberry Pi4に挿入します。
初回のみ、HDMIケーブルをRaspberry Piに接続し、電源を入れて起動します。
起動シーケンスの後でログイン出来たら、以下の初期インストールを実行します。

「Welcome to the Raspberry Pi Deskop!」が表示したら「Next」を押します。
![](https://i.imgur.com/qcDE81D.png)
「国、言語、キーボードタイプ、タイムゾーンなど」をセットし、「Next」を押します。
![](https://i.imgur.com/pM8dnzm.png)
初期ユーザーとパスワードは pi と raspberry になっています、ここでは、新しいパスワードを設定し、「Next」を押します。
![](https://i.imgur.com/TQQlqKj.png)
スクリーン設定画面で「This screen shows a black border around the desktop」をオンにして「Next」を押します（再起動してから反映されます）。
![](https://i.imgur.com/7ACL1aR.png)
Wi-Fiネットワークを設定し、「Next」を押します。
![](https://i.imgur.com/ySyDdF1.png)
ソフトウェアの更新画面でスキップしてもいいですが、アップデートした良いので、「Next」を押します。
![](https://i.imgur.com/tX6GWm0.png)
アップデート中にタスクマネージャーを開くと、プロセスを確認出来ます。
![](https://i.imgur.com/iDg7xFA.png)
アップデートが完了したら、「Restart」を押して再起動を行います。
![](https://i.imgur.com/JA9KeSY.png)

### 初期設定と接続設定

**OS バージョン確認**

```
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.4.79-v7l+ #1373 SMP Mon Nov 23 13:27:40 GMT 2020 armv7l GNU/Linux
```

**パッケージ更新**

```
pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt upgrade -y
```

**vim インストール**

```
pi@raspberrypi:~ $ sudo apt install vim -y
```

**raspi-config による設定**

```
pi@raspberrypi:~ $ sudo raspi-config
```

次のようなキャラクタベースのUIが起動します。
![](https://i.imgur.com/qNrKqTD.png)
「5 Interfacing Options」を選択して、「P2 SSH」を選択しSSHを有効化と、「P3 VNC」を選択しVNCを有効化します。
![](https://i.imgur.com/YIfdleD.png)
※VNCが表示されない場合、以下のように手動でインストールしてください。

```
pi@raspberrypi:~ $ sudo apt update
pi@raspberrypi:~ $ sudo apt install realvnc-vnc-server realvnc-vnc-viewer
```

その後、以下のコマンドで再起動させます。

```
pi@raspberrypi:~ $ sudo reboot
```

**VNC Viewerの設定**
Raspberry Pi に割り振られた、private　IPアドレスを調べます。

```
pi@raspberrypi:~ $ ifconfig
もしくは
pi@raspberrypi:~ $ ping raspberrypi.local
```

VNC Viewerを起動します。
![](https://i.imgur.com/asGCNA8.png)
VNC Viewerの検索ボックスに、Raspberry Piに割り振られたprivate　IPアドレスを入力します。
![](https://i.imgur.com/BxMwXA5.png)
「Connect to address」を押してRaspberry Piのユーザーとパスワードを入れます。
問題なく設定出来たらトップバーにアイコンが表示されます。
![](https://i.imgur.com/7VjvrbJ.png)
ついでに、画面解像度が良くなるように設定します。

```
pi@raspberrypi:~ $ sudo vim /boot/config.txt
=====
これを追加します。
hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=85
=====
```

次はRaspberry Piをsleepしないように設定します。
方法は2つあります。
**方法１**

```
pi@raspberrypi:~ $ sudo vim /etc/lightdm/lightdm.conf
=====
これを追加します。
xserver-command=X -s 0 -p 0 -dpms
=====
```

**方法２**

```
pi@raspberrypi:~ $ sudo apt-get install xscreensaver
```

preferenceからscreensaverに行って、Display ModesタグのModeをDisable Screen Saverを選択します。その後、再起動させます。
![](https://i.imgur.com/z3Rj57d.png)

#### 自分のMacからSSHで接続する
自分のMacの「ターミナル」に以下のコマンドを入力します。
IPのところにRaspberry Piに割り振られたprivate　IPアドレスを入力します。

```
[~]$  ssh pi@192.168.0.107
```

この後、ログインパスワードを入力します。
![](https://i.imgur.com/43fNkvi.png)

#### 自分のMacから画面共有アプリケーションで接続する

自分のMacの「Screen Sharing」画面共有アプリを開きます。
接続先の入力部に、Raspberry Piに割り振られたprivate　IPアドレスを入力し、接続を押します。
![](https://i.imgur.com/xjRPW4d.png)
パスワードの入力部に、ログインパスワードを入力しサインインを押します。（パスワードを保存するチェックボックスをオンにすると次回入力が楽になります。）
![](https://i.imgur.com/nJVrk5p.png)
以下のように、raspberrypiの画面が表示されます。
![](https://i.imgur.com/SEVCPTN.png)

## CoralAcceleratorとRaspberry　Piカメラを使って画像解析とリアルタイム映像解析
### Raspberry Piにセットアップする

初めに、CoralAcceleratorの「[Get started](https://coral.ai/docs/accelerator/get-started/)」を行います。
Coral USB AcceleratorをRaspberry　Piに繋げます。
その後、以下の手順を実行します。

```
pi@raspberrypi:~ $ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
pi@raspberrypi:~ $ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
pi@raspberrypi:~ $ sudo apt-get update
```

次に、Edge TPUランタイムをインストールします。

```
pi@raspberrypi:~ $ sudo apt-get install libedgetpu1-std
```

次に、Raspberry　PiカメラをRaspberry　Piに繋げます。
その後、以下の手順を実行して、サンプル用に写真を撮ります。
Raspberry Pi Configurationを開きます。
![](https://i.imgur.com/1JdOtV1.png)
Interfacesタブからcameraをenabledにします。
![](https://i.imgur.com/oYXDyX8.png)
次のコマンドで写真を撮ります。

```
pi@raspberrypi:~ $ raspistill -o Desktop/image.jpg
```

### 画像解析しましょう

これらの手順に従って、[Coralが提供しているコンパイル済みのモデルとサンプルスクリプト](https://coral.ai/docs/accelerator/get-started/#3-run-a-model-using-the-tensorflow-lite-api)を使用して、画像分類を実行します。
まずは、GitHubからダウンロードを行います。

```
pi@raspberrypi:~ $ mkdir coral && cd coral
pi@raspberrypi:~ $ git clone https://github.com/google-coral/tflite.git
```

鳥の分類モデル、ラベルファイル、と鳥の写真をダウンロードします。

```
pi@raspberrypi:~ $ cd tflite/python/examples/classification
pi@raspberrypi:~ $ bash install_requirements.sh
```

以下の鳥の写真を使用して画像分類子を実行します。

```
pi@raspberrypi:~ $ python3 classify_image.py \
--model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--labels models/inat_bird_labels.txt \
--input images/parrot.jpg
```

![](https://i.imgur.com/idiudLP.png)
以下のような結果になります。
![](https://i.imgur.com/oyquWlf.png)


### リアルタイム映像解析

今回は、Coralが提供しているサンプルの中から「[Image recognition with video](https://coral.ai/examples/)」をRaspberry　Piカメラを利用して、リアルタイム映像解析を行います。
まずは、GitHubからダウンロードします。

```
pi@raspberrypi:~ $ mkdir google-coral && cd google-coral
pi@raspberrypi:~ $ git clone https://github.com/google-coral/examples-camera --depth 1

```

モデルをダウンロードします。

```
pi@raspberrypi:~ $ cd examples-camera
pi@raspberrypi:~ $ sh download_models.sh
```

gstreamerライブラリをインストールします。

```
pi@raspberrypi:~ $ cd gstreamer
pi@raspberrypi:~ $ bash install_requirements.sh
```

そして、デモを実行します。

```
pi@raspberrypi:~ $ python3 classify_capture.py
```

iPadで画像を表示して認識します。
結果として、以下の画像が得られました。
![](https://i.imgur.com/hZ8GBJZ.png)
得られた名前で検索を行い、結果が正しいことが確認できました。
![](https://i.imgur.com/OPSJusX.jpg)

以上で、学習結果の説明は終了となります。