Welcome to Mashykom WebSite



Raspberry Pi で Deep Learning



 AIを搭載したロボットを自作してみようと思い立って、Raspberry Piをロボットのコンピュータボードとして活用することにしました。OSとして Devian Buster がインストールされていることを前提とします。RaspberryPiの基本的なセットアップは完了しているとします。ssh接続及びVNCViewerを用いたデスクトップの表示も可能になっていると想定します。pythonのパッケージ等は Debian Buster のインストールと同時に同梱されるバージョンをそのまま使用しています。バージョンはPython 3.7.3 です。

2019年6月24日にRaspberry Pi 4 Model B が発売開始されましたが、ここでは、2018年6月発売のRaspberry Pi 3(Model B) を取り扱います。Raspberry Pi 4 では、HDMI が micro HDMI に、2個のUSB2ポートがUSB3にアップグレードされ、メモリが2-8ギガに拡大されています。基本的な特徴はあまり変化していません。

 このページでは、ラズパイの人工知能としての可能性を追求します。そのために、ディープラーニングの基本である畳み込みニューラルネットワークをラズパイに実装します。最も簡単なニューラルネットワークを実装したライブラリはscikit-learnの機能を取り込んだsklearnというpython用のパッケージです。

 次に、Kerasを用いて、畳み込みニューラルネットワークの代表的なライブラリであるTensorflowの活用を試みます。ただ、畳み込みニューラルネットワークの学習時間を短縮するためにはGPUが必須となっているので、(ラズパイに搭載されているCPUだと何日も必要となってしまうので)学習済みのモデルを使用することにします。GoogleのCoral Edge Accelerator を利用した機械学習については、Coral Edge TPU + RaspberryPiでObject Detectionに説明があります。

Last updated 2021.2.3


初めてのDeep Learning - scikit-learnを活用する


 ここからは、ディープラーニング(深層学習)のプログラムをラズパイに実際に組み込むことになります。最も取り扱いやすいscikti-learnから始めます。

 PCのターミナルからラズパイへssh接続をしてください。scikit-learnをインストールするために、


$ sudo apt-get update
$ sudo apt-get install python3-sklearn

と入力する。この結果、Scikit-learnの実行に必要な NumPy、SciPy、Matplotlib などのモジュールも同時にインストールされます。Pythonの各種モジュール、例えば、NumPy、SciPy、Matplotlib、sklearnなどは, /usr/lib/python3/dist-packagesディレクトリにインストールされます。

 sklearnのパッケージの内容は以下の通りです。

pi@raspberrypi:/usr/lib/python3/dist-packages/sklearn $ tree

 sklearnパッケージはscikit-learnの機能をまとめたもので、その内容全体を表示するとあまりに長くなるので、主なモジュールだけをリストアップすると、

cluster
datasets
	loads_iris
	loads_digits
decomposition
	PCA
feature_extraction
feature_selection
gaussian_process
linear_model
	Perception
metrics
mixer
model_selection
neural_network
	MLPClassifier
svm
	SVC
tree
utils

 となっています。機械学習で最初に登場するアヤメの分類と手書き文字の識別はsklearnでも簡単に解決できます。data-setsに配置されているloads_irisはアヤメの分類問題で使用されているデータを読みこむためのモジュールです。また、data-setsに配置されているloads_digitsは手書き文字の識別問題で使用される手書きデータを読み込みます。linear_modelには、単純なパーセプトロンのモデルが配置されており、neural_networkには、畳み込みニューラルネットワークの簡単なモデル(MLPClassifier)が含まれています。

 Scikit-Learnを用いた、Iris データの分類問題を取り上げます。Raspi のプログラミング・メニューから Thonny Python IDE を起動して、以下のコード実行して下さい。


from sklearn import datasets
import numpy as np
from sklearn.neural_network import MLPClassifier

iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target

mlp = MLPClassifier(hidden_layer_sizes=(100, ), max_iter=100000, tol=0.0001, random_state=1)
#clf = MLPClassifier(hidden_layer_sizes=(100, ), max_iter=10000, tol=0.00001, random_state=None)

mlp.fit(X, y)

y_pred = mlp.predict(X)

from sklearn.metrics import accuracy_score

print('Class labels:', np.unique(y))
print('Misclassified samples: %d' % (y != y_pred).sum())
print('Accuracy: %.2f' % accuracy_score(y, y_pred))

結果はこうなります。

Class labels: [0 1 2]
Misclassified samples: 7
Accuracy: 0.95

 Class labels はアヤメの種類です。以下の写真がそうです。

 パーセプトロン及び畳み込みニューラルネットワークの解説は、以下のDeep Learning入門ページを参照ください。


Kerasを用いてTensorFlowを使う


 TensorFlowをインストールするためには、実行時に必要な付随するモジュールを準備することが必要です。以下のように、準備作業をしてください。

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install liblapack-dev libhdf5-dev python3-h5py

 必要なモジュールをインストールしておきます。こららすべてが必要とは限りませんが、念のために。すでにインストールされているモジュールのときは、上書きされません。

$ sudo apt-get install python3-protobuf python3-termcolor python3-yaml python3-pydot python3-pyasn1 python3-pyasn1-modules python3-rsa python3-markdown python3-cachetools python3-future python3-dill python3-tqdm python3-pil python3-pip python3-wheel python3-setuptools python3-matplotlib python3-h5py python3-scipy python3-grpcio python3-requests-oauthlib python3-werkzeug

 ニューラルネットワークのトレーニングを容易にする目的で開発されたライブラリーの一つにKerasがあります。KerasはTheanoをベースとしてPythonで構築され、広く利用されています。通常、KerasはTensorflowなどの畳み込みニューラルネットワークのライブラリと組み合わせて使用されます。現在、Keras は Tensorflow 2.x と統合されました。Kerasの標準インストールで、デフォルトでは、Tensorflowがバックエンドになっています。

 TensorFlow 2.x をインストールしましょう。TensorFlow の公式サイトで推薦されているコマンド、$ sudo pip3 install tensorflow を使用すると、Tensorflow 1.4 バージョンがインストールされてしまいます。ここでは、このgithub にある ARM 用TensorFlow wheel を利用します。Tensorflow 2.4 が最新バージョンですが、Tensorflow 2.3 をダウンロードします。


$ python3 -m pip install tensorflow-hub tensorflow-datasets https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.3.0/tensorflow-2.3.0-cp37-none-linux_armv7l.whl 

$ python3 -m pip install keras 

 これで、Keras と Tensorflowのインストールは完了です。Keras 及び Tensorflowなどの関連パッケージは、/usr/local/lib/python3.7/dist-packagesディレクトリにインストールされます。バージョンはTensorFlow 2.3 と表示されます。。

 インストールしたパッケージのバージョンを調べるために、以下のコードを入力します。

>> import tensorflow as tf
>> tf.__verion__

 ここでは、Tensorflowに組み込まれたKerasを使用します。MNIST データを用いて、手書き数値の分類をしてみましょう。以下のような手書き数字のデータが使用されます。

 Raspi のプログラミングのメニューから、Python IDE を起動します。以下のコードを実行してみましょう。


from __future__ import absolute_import, division, print_function, unicode_literals
from tensorflow.keras import datasets, layers, models
 
mnist = 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 = models.Sequential()
model.add(layers.Flatten(input_shape=(28, 28)))
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(10, activation='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, verbose=2)
 

 結果は以下の通りです。手書き数字のサンプル数は6万個で、エポック数5回での正答率は約97%です。

... model.evaluate(x_test,  y_test, verbose=2)
10000/10000 - 2s - loss: 0.0786 - acc: 0.9755
[0.07864293793202377, 0.9755]

 mobilenet と言われるモデルを取り上げましょう。以下のコードを実行してみましょう。使用される画像は images という名前のディレクトリの下に配置されています。

from tensorflow.keras.applications.mobilenet import MobileNet
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions
import numpy as np

model = MobileNet(weights='imagenet')
#model = load_model('mobilenet.h5', custom_objects={
#                   'relu6': mobilenet.relu6,
 #                 'DepthwiseConv2D': mobilenet.DepthwiseConv2D})
#model=MobileNet(input_shape=None, alpha=1.0, depth_multiplier=1, dropout=1e-3, include_top=True, weights='imagenet', input_tensor=None, pooling=None, classes=1000)

img_path = 'images/elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

#model.summary()

preds = model.predict(x)

# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print('Predicted:', decode_predictions(preds, top=3)[0])

以下の結果が得られます。


>>> %Run mobilenet.py
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json
40960/35363 [==================================] - 0s 1us/step
Predicted: [('n02504458', 'African_elephant', 0.8889344), ('n01871265', 'tusker', 0.062422995), ('n02504013', 'Indian_elephant', 0.048526045)]

 この例では以下にある像の画像'elephant.jpg'を用いています。

elephant.jpg

inceptionv3 モデルを用いたときの結果は

>> %Run inceptionv3.py
Predicted: [('n02504458', 'African_elephant', 0.62373435), ('n01871265', 'tusker', 0.30816576), ('n02504013', 'Indian_elephant', 0.03479352)]

 となります

 学習済みのVGG16及びResNet50を用いた画像識別を試みましたが、メモリ不足で実行できませんでした。やはり、Raspberry Piの1ギガCPUの能力では無理があります。

TensorFlow Lite で Object Detection: Webcamera 編

 PythonでTensorFlow Liteを使用すると、 Raspberry PiやEdgeTPUを備えたCoralデバイスなど、Linuxベースの組み込みデバイスに最適です。PythonでTensorFlow Liteモデルの実行をすばやく開始するには、すべてのTensorFlowパッケージではなく、TensorFlow Liteインタープリターのみをインストールします。この簡略化されたPythonパッケージをtflite_runtimeと言います。

 tflite_runtimeパッケージは、完全なtensorflowパッケージの数分の1のサイズであり、TensorFlow Lite(主にInterpreter Pythonクラス)で推論を実行するために必要な最小限のコードが含まれています。公式サイトの説明によれば、TensorFlow Liteランタイムパッケージをインストールするには、次のコマンドを実行します。


pip3 install https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp37-cp37m-linux_armv7l.whl

 このコマンドは OS が Debian Buster 、Python のバージョンが Python 3.7 に対応しています。

 OpenCV のインストールが済んでいない時は、以下のコマンドを打って cv2 をインストールして下さい。


$ sudo apt-get install python3-opencv

 TensorFlow のGitHubから物体検出用のパッケージをダウンロードします。


git clone https://github.com/tensorflow/examples --depth 1

cd examples/lite/examples/object_detection/raspberry_pi

# The script takes an argument specifying where you want to save the model files
bash download.sh /tmp

 /tmp ディレクトリにモデルとラベルが保存されていることを確認して下さい。/tmp ディレクトリへの保存は一時的なので、Raspiを終了すると消えます。MobileNet modelを使用するごとに読み込む必要があります。これを避けるために、/tmpの代わりに、/home/pi/examples とすれば、入力は1回で済みます。

 公式ページでは、Picamera を用いた物体検出のコードになっていますが、ここでは、Webcamera 使用します。Picamera ではなく Webcamera を利用するときは、detect_picamera.py において、with picamera を用いた部分を以下のように修正します。

 上記のスクリプトを detect_webcam.py という名称で detect_picamera.py と同じホルダーに保存して下さい。 annotation.py にも、Picamera に関係する部分があるので、これも修正する必要があります。このサイトの記事にあるスクリプトを参考にしました。以下のスクリプトです。

 古い annotaion.py スクリプトを上記の新しいコードと入れ替えて下さい。以下のコマンドを使って画像分類のアプリを実行します。

 以下のスクリプトを使用するためには、Raspberry Pi に Webcamera を接続して下さい。


cd examples/lite/examples/object_detection/raspberry_pi
python3 detect_webcam.py \
  --model /home/pi/examples/detect.tflite \
  --labels /home/pi/examples/coco_labels.txt

 このコマンドを実行します。Devian Buster では正常に作動するはずです。それ以外では、エラーがいくつか出るかもしれません。エラーを一つずつ潰していけば成功します。幸運を!

 なお、TensorFlow Object Detection API はこの公式サイトのgithubに掲載されています。このサイトの説明に従って Object Detection API のインストールを行うと、「python3 -m pip install --use-feature=2020-resolver . 」というコマンドがエラーを出して、終了します。なので、このコマンドを使用せずに、以下の手順でインストールを実行します。


git clone https://github.com/tensorflow/models.git

protoc のインストール
$ apt install -y protobuf-compiler
$ protoc --version  # Ensure compiler version is 3+

cd models/research

# Compile protos.
protoc object_detection/protos/*.proto --python_out=.

# Install TensorFlow Object Detection API.
cp object_detection/packages/tf2/setup.py .
sudo python3 setup.py install  

 と入力すると、/usr/local/lib/python3.7/に Object Detection API がインストールされます。

 Object Detection API をRasPiなどで使用できるように修正されたスクリプトがこのGithub Repoに紹介されています。以下のようにダウンロードします。


git clone https://github.com/vardanagarwal/Proctoring-AI

 Raspberry Pi で、このスクリプトを実際に実行してみました。なお、ディレクトリ名「coco models」「tflite mobnetv1 ssd」に空白があるので、それをアンダーバー「_」に変えて下さい。空白のあるディレクトリには移動できません。


cd Proctoring-AI/coco_models/tflite_mobnetv1_ssd
python3 seg_tflite.py

 と入力すると、ライブカメラからの映像が表示されます。ここで使用されているモデルは、 SSD MobileNet です。詳しい説明は、この記事で紹介されています。


*************
 次に、Coral Edge TPU を利用して、リアルタイムの物体検出をしたいと思います。物体検出の処理スピードは数十倍に加速化すると思われます。

Coral Edge TPU を用いてObject Detectionのページに

トップページに戻る