Raspberry Piで機械学習する

Raspberry Piに人工知能を搭載

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

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

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

Last updated: 2018.9.14


関連記事
Movidius NCS + RaspberryPiでObject Detection
RaspberryPiへのRaspbian OS のインストール
Ubuntu 16.04のインストール:RaspberryPi
ROS(Robot Operating System)のインストール
OpenCVで画像処理/Mac
Deep Learningと人工知能
PythonのTutorials/Jupyter Notebook
My GitHub repositories

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

  ここからは、ディープラーニング(深層学習)のプログラムをラズパイに実際に組み込むことになります。最も取り扱いやすいscikti-learnから始めます。
  PCのターミナルからラズパイへssh接続をしてください。scikit-learnをインストールするために、
$ sudo apt-get update
$ sudo apt-get install python-sklearn
と入力する。この結果、Scikit-learnの実行に必要なNumPy、SciPy、Matplotlibなどのモジュールも同時にインストールされます。Pythonの各種モジュール、例えば、NumPy、SciPy、Matplotlib、sklearnなどは, /usr/lib/python2.7/dist-packagesディレクトリにインストールされます。
  sklearnのパッケージの内容は以下の通りです。
pi@raspberrypi:/usr/lib/python2.7/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)が含まれています。パーセプトロン及び畳み込みニューラルネットワークの解説は、以下のページを参照ください。
Deep Learningと人工知能

**************************************************************
Kerasを用いてTensorFlowまたはTheanoを使う
**************************************************************

Theanoをインストールするためには、実行時に必要な付随するモジュールを準備することが必要です。以下のように、準備作業をしてください。
$ sudo apt-get update
$ sudo apt-get install liblapack-dev libhdf5-dev python-h5py
ニューラルネットワークのトレーニングを容易にする目的で開発されたライブラリーの一つにKerasがあります。KerasはTheanoをベースとしてPythonで構築され、広く利用されています。通常、KerasはTheanoとTensorflowなどの畳み込みニューラルネットワークのライブラリと組み合わせて使用されます。現在、Theano、Tensorflow及びCNTKなどをバックエンドとして利用できます。Kerasの標準インストールで、デフォルトでは、Tensorflowがバックエンドになっています。
  KerasとTheanoのインストールは以下のようにpipコマンドを使った入力が必要です。TensorFlowもついでにインストールしておきましょう。
$ sudo pip install keras theano
$ sudo pip install tensorflow
これで、Keras、Theano及びTensorflowのインストールは完了です。Keras、Theano、Tensorflowなどの関連パッケージは以下のように、/usr/local/lib/python2.7/dist-packagesディレクトリにインストールされます。

pi@raspberrypi:/usr/local/lib/python2.7/dist-packages $ ls
Keras-2.1.5.dist-info                      mock
PyYAML-3.12.dist-info                  mock-2.0.0.dist-info
Theano-1.0.1.dist-info                   pbr
WebIOPi-0.7.1-py2.7-linux-armv7l.egg  pbr-4.0.2.dist-info
bin                                              protobuf-3.5.2.post1-nspkg.pth
easy-install.pth                            protobuf-3.5.2.post1.dist-info
external                                      tensorflow
funcsigs                                      tensorflow-1.1.0.dist-info
funcsigs-1.0.2.dist-info                theano
google                                        yaml
keras
  インストールしたパッケジのバージョンを調べるために、以下のスクリプトを作成します。
# -*- coding: utf-8 -*-
try:
    import keras
    kerasExists = True
except ImportError:
    kerasExists = False
	
if kerasExists == True:
    print('kerasのバージョンは{0}です'.format(keras.__version__))
else:
    print('kerasがインストールされていないか、まだ設定が済んでいません')


try:
    import theano
    theanoExists = True
except ImportError:
    theanoExists = False

if theanoExists == True:
    print('theanoのバージョンは{0}です'.format(theano.__version__))
else:
    print('theanoはインストールされていません')
このスクリプトを実行すると、homeディレクトリに.keras/keras.json というファイルが作成されます。このスクリプトはインストールしたパッケージのバージョンを調べることを目的としています。kerasをimportするだけでもkeras.jsonファイルは作成されるはずです。
  このkeras.jsonファイルのバックエンドの指定は以下のようになっています。

pi@raspberrypi:~ $ sudo nano .keras/keras.json
{
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "image_data_format": "channels_last", 
    "backend": "tensorflow"
}
  KerasのバックエンドとしてTheanoを用いるためには、双方が適切なバージョンになっていることは当然必要ですが、keras.jsonを書き換えるための以下の作業が追加的に必要です。バックエンドとしてtheanoを使用するときは、 "backend": "theano"と修正します。これで、Kerasを用いてTheanoを利用できるようになりました。デフォルトのままで、Tensorflowをバックエンドとして使用するときもこの作業は必要ありません。
 ここでは、Tensorflowをバックエンドとして使用します。

 学習済みのVGG16及びResNet50を用いて画像識別を行ってみました。画像分類の結果が表示されるまでに10分以上かかります。やはり、Raspberry PiのCPUの能力では時間がかかりすぎます。ロボットに搭載して、web カメラからの映像から物体を識別させて、移動操作するための実用には向かないと思われます。

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

Movidius NCS を用いてObject Detectionのページに



トップページに戻る