LoginSignup
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-09

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が簡単にインストールできました.
あと、追加で開発用に以下をインストールしました。

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していませんが、上記の参考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()

実行例は以下のとおり(静止画ですが)
2020-02-08-215532_1920x1080_scrot.png
少なくともこれが動いたので、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()

moving_fig.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]
最初の画面に戻ってくると思うのでを選択し終了[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でできた)
pinta_selectArea.jpg

2020-02-09-221858_1920x1080_scrot.png

切り替え一発キー

Jetson-nanoの時の切り替え一発キーが以下の手順で見つかりました。
すなわち、以下のように選ぶと、半角/全角キーで自動的に英文字とあを切り替えることができました.
また、入力も日本語キーボード配列に戻りました。
2020-02-09-223602_896x434_scrot.png

あれ、。。。キー入力の設定と上記のIMEはいらないかもですね

まとめ

・OpenCV/Tensorflowを無事にインストールできた
・日本語入力(105キー配列)ができるようになった

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3