RasPi4 遂に入手したので久しぶりの環境構築しました。
ほぼ、Jetson_nanoと同じ方法でできました。
本稿は前回のつづきで、アプリが動くところまで解説します。
【参考】
0.【Jetson_nano】インストールからTensorflow,Chainer,そしてKeras環境構築出来たよ♬
1.Raspberry Pi 4のディープラーニングで画像認識する環境をゼロから1時間で構築する方法
2.Raspberry Pi で OpenCV 4
3.RaspberryPiのキーボード入力の日本語化
###やったこと
・Raspi4imagerでSDにOSインストール
・環境構築;OpenCV/Tensorflowまで
・OpenCV/Tensorflow動作検証
・matplotlib
・環境構築;日本語入力まで
・これ書いてます
###・Raspberry Pi ImagerでSDにOSインストール
簡単にRaspiとubuntuのOSイメージなどをSDに焼けるようになったので、追記しておきます。
【参考】
・「圧倒的に速い」──ラズパイにOSをインストールする新ツール「Raspberry Pi Imager」
内容は、参考見てください。
リンク先から、環境に応じて以下をクリックしてインストーラー(imager_1.4.exe)をダウンロードして起動。
Raspberry Pi Imager for Windows
あとは、OSと書き込み先のUSBのSDを指定して、Writeして待つだけでインストール出来ました。
ちなみに、今回はRaspberry Pi Os 32 recommendedをインストールしました。
###・環境構築;OpenCV/Tensorflowまで
ここはからあげさんの環境構築手順(参考1)のとおり、実施しました。
$ 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が簡単にインストールできました.
あと、追加で開発用に以下をインストールしました。
$ sudo apt install jupyter-notebook
また、今回はからあげさんのスクリプトで一括インストールしましたが、最新との差分がある可能性が高いので参考2から以下のものを順次インストールしています。
$ sudo apt-get update
$ sudo apt-get upgrade
$ 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していませんが、上記の参考0でもやったように、以下のとおり、tf.keras....というので、kerasのLibを利用できます。
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で遊んでみた♬
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)はx、y方向の標準偏差で変えるとボケ度が変わる、最後の引数は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()
実行例は以下のとおり(静止画ですが)
少なくともこれが動いたので、OpenCVは利用できます.
###・matplotlib
$ sudo apt-get install python3-matplotlib
以下動作確認です。
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()
###・環境構築;日本語入力
ここで物体検出をためすのもいいのですが、今回は会話アプリを載せたいので、日本語入力ができるようにしたいと思います。
まず、昨夜の日本語化は完了しているものとして、参考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]
最初の画面に戻ってくると思うのでを選択し終了[Enter]で終了(キーボードの←→でカーソル移動可能)
ここで一度最新化
$ sudo apt-get update
またコマンドが打てるようになったらキーボードの日本語入力をインストールします。
$ sudo apt-get install -y uim uim-anthy
再起動すると配列などが反映します。
$ sudo reboot
再起動したらキーボードがJIS配列で打てるようになっているはずです→キー配列がUS配列じゃないかな?
###日本語フォントとIMEのインストール
もう一つ、日本語フォントとIMEを以下の参考の手順で入れます。
【参考】
ラズベリーパイ 日本語入力の設定
そもそも表示等は日本語になっているので、この作業は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でできた)
###切り替え一発キー
Jetson-nanoの時の切り替え一発キーが以下の手順で見つかりました。
すなわち、以下のように選ぶと、半角/全角キーで自動的に英文字とあを切り替えることができました.
また、入力も日本語キーボード配列に戻りました。
あれ、。。。キー入力の設定と上記のIMEはいらないかもですね
###まとめ
・OpenCV/Tensorflowを無事にインストールできた
・日本語入力(105キー配列)ができるようになった
・会話アプリをインストールしよう
・音声入力作って音声会話完成させたい
・監視カメラ作るかな。。。「そこの人、マスクつけなさい」