【RasPi4入門】環境構築；OpenCV/Tensorflow、日本語入力♪

RasPi4　遂に入手したので久しぶりの環境構築しました。
ほぼ、Jetson_nanoと同じ方法でできました。
本稿は前回のつづきで、アプリが動くところまで解説します。
【参考】
0.[【Jetson_nano】インストールからTensorflow,Chainer,そしてKeras環境構築出来たよ♬](https://qiita.com/MuAuan/items/eaf0940491d7232377c7)
1.[Raspberry Pi 4のディープラーニングで画像認識する環境をゼロから1時間で構築する方法](https://karaage.hatenadiary.jp/entry/rpi4-dl-setup)
2.[Raspberry Pi で OpenCV 4](https://qiita.com/tomo_vn/items/eea677eb00488d4c2291)
3.[RaspberryPiのキーボード入力の日本語化](https://qiita.com/sukinasaki/items/426068d6e87169fa3d88)
###やったこと
・Raspi4imagerでSDにOSインストール
・環境構築；OpenCV/Tensorflowまで
・OpenCV/Tensorflow動作検証
・matplotlib
・環境構築；日本語入力まで
・これ書いてます
###・Raspberry Pi ImagerでSDにOSインストール
簡単にRaspiとubuntuのOSイメージなどをSDに焼けるようになったので、追記しておきます。
【参考】
・[「圧倒的に速い」──ラズパイにOSをインストールする新ツール「Raspberry Pi Imager」](https://www.itmedia.co.jp/news/articles/2006/05/news031.html)
内容は、参考見てください。
[リンク先](https://www.raspberrypi.org/downloads/)から、環境に応じて以下をクリックしてインストーラー(imager_1.4.exe)をダウンロードして起動。
Raspberry Pi Imager for Windows
あとは、OSと書き込み先のUSBのSDを指定して、Writeして待つだけでインストール出来ました。
ちなみに、今回はRaspberry Pi Os 32 recommendedをインストールしました。

###・環境構築；OpenCV/Tensorflowまで
ここはからあげさんの環境構築手順（参考１）のとおり、実施しました。

```からあげさんの環境構築手順.
$ git clone https://github.com/karaage0703/raspberry-pi-setup
$ cd raspberry-pi-setup
$ ./setup-opencv-raspbian-buster.sh
$ ./setup-tensorflow-raspbian-buster.sh
```
これでOpenCVやTensorflowが簡単にインストールできました.
あと、追加で開発用に以下をインストールしました。

```jupyter-notebook.
$ sudo apt install jupyter-notebook
```
また、今回はからあげさんのスクリプトで一括インストールしましたが、最新との差分がある可能性が高いので参考2から以下のものを順次インストールしています。

```OS環境を最新.
$ sudo apt-get update
$ sudo apt-get upgrade
```

```CMake環境.
$ sudo apt-get install build-essential cmake unzip pkg-config
```

```イメージファイル用ライブラリ.
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
```

```ビデオストリーム用ライブラリ.
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev 
$ sudo apt-get install libxvidcore-dev libx264-dev
```

```画像表示用ライブラリ.
$ sudo apt-get install libgtk-3-dev 
$ sudo apt-get install libcanberra-gtk*
```

```演算用ライブラリ.
$ sudo apt-get install libatlas-base-dev gfortran
```
###・OpenCV/Tensorflow動作検証
動作検証は以下のコードを使いました。
kerasはinstallしていませんが、上記の参考０でもやったように、以下のとおり、tf.keras....というので、kerasのLibを利用できます。

```py
import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
```
結果は以下のとおり、

```
$ python3 tensorflow_ex.py
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 41s 685us/sample - loss: 0.2220 - acc: 0.9342
Epoch 2/5
60000/60000 [==============================] - 41s 676us/sample - loss: 0.0962 - acc: 0.9700
Epoch 3/5
60000/60000 [==============================] - 41s 678us/sample - loss: 0.0688 - acc: 0.9788
Epoch 4/5
60000/60000 [==============================] - 41s 678us/sample - loss: 0.0539 - acc: 0.9830
Epoch 5/5
60000/60000 [==============================] - 41s 678us/sample - loss: 0.0435 - acc: 0.9857
10000/10000 [==============================] - 3s 295us/sample - loss: 0.0652 - acc: 0.9812
```
###・OpenCV動作検証
こちらは、以下の参考で動かした以下のコードを動かしてみます。
流石に動作はのろいですが、カメラ撮影画像を動画として保存できました。
【参考】
・[RasPi:OpenCVで遊んでみた♬](https://qiita.com/MuAuan/items/be1baf8c409e9a1e80bf)

```py
import numpy as np
import cv2

# cv2.cv.CV_FOURCC
def cv_fourcc(c1, c2, c3, c4):
    return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
        ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)

cap = cv2.VideoCapture(0) #'dougasozai_car.mp4')
GRAY_FILE_NAME='douga_camera_5s.avi'
FRAME_RATE=30
ret, frame = cap.read()

# Define the codec and create VideoWriter object
height, width, channels = frame.shape
out = cv2.VideoWriter(GRAY_FILE_NAME, \
                      cv_fourcc('X', 'V', 'I', 'D'), \
                      FRAME_RATE, \
                      (width, height), \
                      True)  #isColor=True for color

# ウィンドウの準備
cv2.namedWindow('frame')
cv2.namedWindow('gray')
cv2.namedWindow('hsv')
cv2.namedWindow('mask')
cv2.namedWindow('res')
cv2.namedWindow('gaussian')

while ret == True:
    #ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    hsv =cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    hsv =cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # ガウシアン平滑化
    # (5, 5)はｘ、ｙ方向の標準偏差で変えるとボケ度が変わる、最後の引数はint,ボーダータイプらしいが数字の意味不明    
    g_frame = cv2.GaussianBlur(frame, (15, 15), 0)
    gg_frame = cv2.cvtColor(g_frame, cv2.COLOR_BGR2GRAY)

    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # Bitwise-AND： mask and original image
    res = cv2.bitwise_and(frame,frame, mask= mask)
    cv2.imshow('frame',frame)
    cv2.imshow('gray',gray)
    cv2.imshow('hsv',hsv)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    cv2.imshow('gaussian',g_frame)
    #書込みgrayならグレー画像、frameなら拡張子変更
    #カラーなら、out = cv2.VideoWriter()でisColor=True、グレーならFalse
    out.write(g_frame)  #OK by cv_fourcc('X', 'V', 'I', 'D')
    #なんかKey押せば止まる
    if cv2.waitKey(1000*5) >= 0:  
        break
    ret, frame = cap.read()
cap.release()
out.release()
cv2.destroyAllWindows()
```
実行例は以下のとおり（静止画ですが）
![2020-02-08-215532_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/a9a92ac5-6418-4b70-b604-9d108608e4c3.png)
少なくともこれが動いたので、OpenCVは利用できます.
###・matplotlib
```
$ sudo apt-get install python3-matplotlib
```
[以下動作確認](https://qiita.com/MuAuan/items/e69251066486b7ba04c4)です。

```py
import matplotlib.pyplot as plt
import numpy as np
import matplotlib

x = np.linspace(0, 5, 10)
y = x ** 2

matplotlib.rcParams.update({'font.size': 18, 'font.family': 'sans', 'text.usetex': False}) 
fig = plt.figure(figsize=(8,6))  #(width,height)
for i in range(10):
    x_offset=np.round(0.05*4,decimals=2)
    y_offset=np.round(0.05*i,decimals=2)
    width=0.3
    height=0.3
    axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes
    axes2 = fig.add_axes([x_offset, y_offset, width, height]) # insert axes

    # main figure
    # possible marker symbols: marker = '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ...
    # possible linestype options ‘-‘, ‘--’, ‘-.’, ‘:’, ‘steps’
    axes1.plot(x, y, color='r', lw=3, linestyle='--',marker='o' , label=r"$y = x^2$")
    axes1.legend(loc=1) # upper light corner
    axes1.grid(True)
    axes1.set_xlabel('x')
    axes1.set_ylabel('y')
    axes1.set_title('title')

    # insert
    axes2.plot(y, x, 'g', label=r"$x = y^2$")
    axes2.legend(loc=2) # upper left corner
    axes2.set_xlabel('y')
    axes2.set_ylabel('x')
    axes2.set_title('insert title;'+str(x_offset)+"_"+str(y_offset))
    plt.pause(1)
    fig.savefig("./fig/moving_fig"+str(i)+".png", dpi=200)
    plt.clf()
```
![moving_fig.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/b3f49381-e507-9d4c-3f75-d66dd6367d64.gif)

###・環境構築；日本語入力
ここで物体検出をためすのもいいのですが、今回は会話アプリを載せたいので、日本語入力ができるようにしたいと思います。
まず、昨夜の日本語化は完了しているものとして、参考3にしたがいます。
「RaspberryPiはデフォルトではキーボードがUS配列になっているのでJIS配列にしていきます。」
どっちかというと、JIS配列になっている気がしたけど、。。。

```
$ sudo raspi-config
```
1.4 Internationalisation Optionsを選択(移動はキーボードの↑↓)
を選択して、ENTERキー押下
2.I3 Change Keyboard Layoutを選択し、[Enter]
3.Generic　105-key(Intl) PCを選択し[Enter]
4.Otherを選択し[Enter]
5.Japaneseを選択し[Enter]
6.Japanese - Japanese(OADG 109A)を選択し[Enter]
7.The default for the keyboard layoutを選択し[Enter]
8.No compose keyを選択し[Enter]
最初の画面に戻ってくると思うので<Finish>を選択し終了[Enter]で終了(キーボードの←→でカーソル移動可能)
ここで一度最新化

```
$ sudo apt-get update
```
またコマンドが打てるようになったらキーボードの日本語入力をインストールします。

```
$ sudo apt-get install -y uim uim-anthy
```
再起動すると配列などが反映します。

```
$ sudo reboot
```
再起動したらキーボードがJIS配列で打てるようになっているはずです→キー配列がUS配列じゃないかな？
###日本語フォントとIMEのインストール
もう一つ、日本語フォントとIMEを以下の参考の手順で入れます。
【参考】
[ラズベリーパイ 日本語入力の設定](https://www.inex.co.jp/rasbpi/rasb10-08.html)
そもそも表示等は日本語になっているので、この作業はIMEだけ入れればいいかもですが、一応丸っと入れました。

```
$ sudo apt-get update
```
日本語fontsのインストール

```
$ sudo apt-get install fonts-vlgothic
```
以下が肝心な日本語IMEのインストール
上記と異なるIMEです。

```
$ sudo apt-get install ibus-anthy
```
途中（y/n）y ENTER

最後に再起動して日本語の表示を有効にします。

```
$ sudo reboot
```
以下のようなイメージです。この上段のバーの右端に英語-日本語などが選べるようになっていると思います.
とりあえず、これで日本語入力ができるようになりました。
ただし、このままだと切り替えは一々上段で選ぶ必要があります。
右端部分の拡大図（Pintaでできた）
![pinta_selectArea.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/52026ca0-6a58-c7a4-2cf6-3889e211e5f5.jpeg)

![2020-02-09-221858_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/b207a063-0072-8017-789a-cb85e8c5029d.png)
###切り替え一発キー
[Jetson-nanoの時](https://qiita.com/MuAuan/items/9b2b63d12e094ad2e739)の切り替え一発キーが以下の手順で見つかりました。
すなわち、以下のように選ぶと、半角/全角キーで自動的に英文字とあを切り替えることができました.
また、入力も日本語キーボード配列に戻りました。
![2020-02-09-223602_896x434_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/fb11133e-840f-e330-004b-d49392f99202.png)

あれ、。。。キー入力の設定と上記のIMEはいらないかもですね
###まとめ
・OpenCV/Tensorflowを無事にインストールできた
・日本語入力（105キー配列）ができるようになった

・会話アプリをインストールしよう
・音声入力作って音声会話完成させたい
・監視カメラ作るかな。。。「そこの人、マスクつけなさい」