ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Raspberry Pi/python】Raspberry Pi 4にTensorFlow環境を作ってサンプルを動かしてみる

 色々と耳にしてはいましたが、今まで一切触れてこなかったTensorFlowなるものをRaspberry Pi 4に入れてみようと思って入れてみました。

 一応サンプルが動くまではいったのですが、よくわからないエラーやWARNINGなどが出るのと処理が結構遅かったりするのでどこかおかしいのかもしれないという状態ですが、自分がやった一通りの手順をメモしておきたかったので記事にした次第です。

 間違ってるところなどありましたら、コメントで指摘していただけると幸いです。

 では、始めます。


0:前提
 Raspberry Pi 4でOpenCVが動く環境まで持っていっている状態から始めています。

 OpenCVをまだ入れてない状態であれば、以下の記事を参考にしてOpenCVが入っている状態まで進めてください。


1:TensorFlowのインストール
 まずはTensorFlowをインストールするために、以下のコマンドを実行します。

$ sudo apt-get update
$ sudo apt-get upgrade
$ pip3 install tensorflow

 最後のpip3 install tensorflowの途中で以下のような赤文字が出て正常にインストールできずに終わる場合があります。

tensorboard 2.0.2 has requirement setuptools>=41.0.0, but you'll have setuptools 40.8.0 which is incompatible.

 その場合は以下のコマンドで一度tensorflowをアンインストールしてから、--upgradeオプションを付けてもう一度インストールを実行します。

$ pip3 uninstall tensorflow
$ pip3 install --upgrade tensorflow

 TensorFlowがインストールできているかはpythonを起動させて確認します。

$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2020-07-15 17:10:19.083737: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory
>>> tf.__version__

 
 最後の行でのバージョンが表示されていればOKです。
 ちなみに「E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory」というエラーが出ていますが、これが出ていてもどうやら問題ないようなので無視しても大丈夫なようです(※詳しく調べ切れてはいませんが、とりあえずサンプルを動かすのは問題なかったです)


2:Kerasのインストール
 次にKerasというのをインストールします。

 インストールコマンドは以下の通りです。

$ pip3 install keras

 Kerasがインストールできているかはpythonを起動させて確認します。

$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
2020-07-15 17:18:16.884242: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory
>>> keras.__version__

 TensorFlowの時と同じように、出ているエラーは気にせずに最後の行でのバージョンが表示されていればOKです。

 import kerasの実行した際に以下のようなエラーが出ることがあります。

ImportError: Keras requires TensorFlow 2.2 or higher. Install TensorFlow via `pip install tensorflow`

 これはTensorFlowとKerasのバージョンが合っていないというエラーになります。
 解決方法としてはKerasのダウングレードしかないようだったので、以下のコマンドを実行して本記事執筆時点でTensorFlowに合ったKerasのバージョンをインストールします。

$ pip3 uninstall keras
$ pip3 install keras==2.3.1

 インストールが終わったら再度pythonでインポートしてエラーがなければOKです。


3:サンプルの実行
 これでようやくサンプルを動かす環境ができたのでサンプルを実行していきます。

 適当なディレクトリを作成してそこに移動し、以下のgitコマンドを実行してサンプルをcloneしてきます。

$ git clone https://github.com/fchollet/deep-learning-models.git

 cloneが終わると「deep-learning-models」というディレクトリができているので移動します。

$ cd deep-learning-models

 解析するためのサンプル画像ですが、以下のものを使用するので「deep-learning-models」ディレクトリの中に「bench.png」として保存してください。
・bench.png
f:id:rikoubou:20200715174556p:plain

 この画像を解析するために「deep-learning-models」ディレクトリの中にある「inception_v3.py」を編集していきます。

 inception_v3.pyをエディタで開いて以下のように書き換えます。

・35行目「.を_に変更」
 修正前:from keras.applications.imagenet_utils import _obtain_input_shape
 修正後:from keras_applications.imagenet_utils import _obtain_input_shape

・157行目「include_topをrequire_flattenに変更」
 修正前:include_top=include_top
 修正後:require_flatten=include_top

・401行目「解析するファイル名を変更」
 修正前:img_path = 'elephant.jpg'
 修正後:img_path = 'bench.png'

 編集が済んだら上書き保存し、inception_v3.pyを実行してみます。

$ python3 inception_v3.py
Using TensorFlow backend.
2020-07-15 17:47:15.269213: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory
WARNING:tensorflow:From /home/pi/.local/lib/python3.7/site-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.
Instructions for updating:
If using Keras pass *_constraint arguments to layers.
WARNING:tensorflow:From /home/pi/.local/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:4070: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.

WARNING:tensorflow:From /home/pi/.local/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:4074: The name tf.nn.avg_pool is deprecated. Please use tf.nn.avg_pool2d instead.

WARNING:tensorflow:From /home/pi/.local/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:422: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.

Predicted: [[('n03891251', 'park_bench', 0.9735911), ('n04208210', 'shovel', 0.0012295641), ('n02747177', 'ashcan', 0.0010040886), ('n03388043', 'fountain', 0.00087099895), ('n02892201', 'brass', 0.00074983406)]]

 色々とエラーやWARNINGが出ていますが、最後の結果としては「'park_bench', 0.9735911」と公園のベンチが97%ほどという結果となり、ちゃんと画像の解析ができています。

 以上がRaspberry Pi 4にTensorFlow環境を作ってサンプルを動かしてみるまでの方法です。

 実行してみると結果が出るまでかなり時間がかかるので、リアルタイムで判別というのは難しそうです。また動いているとはいえ、エラーやWARNINGが出まくっているのでその辺りも気持ちが悪いです。
 なので環境の問題点がわかる方はコメントいただければと思います。

 TensorFlowにはLiteという軽いものもあるようなので、そっちも機会があれば試してみたいです。


・参考資料