Raspberry PiとTensorFlowを使ったディープラーニングの開発環境構築

f:id:karaage:20170726015040j:plain:w640

Raspberry Pi4へのディープラーニング環境セットアップに関して

 最新のラズパイ4でのディープラーニングの開発環境構築に関して、以下記事でまとめています。今から、ラズパイ4で最速で環境構築したい方は、以下記事参照下さい。ラズパイ3にも対応しています(同じ要領でセットアップ可能です)。

 これ以降は、古い情報が含まれていることご了承ください。

Raspberry PiとTensorFlowでディープラーニング

 最近、人工知能とかディープラーニングに関して興味を持っていて、以下のような記事でまとめたりしました。

 ただ、本やネットの記事を見ただけだと、あまり頭の良くない自分には全然ピンとこないというのが正直なところです。そこで、今までChainerという日本製のディープラーニングのフレームワークを使って色々実験してみたのですが、サンプルを動かすことはできても、それ以上のことが何もできなくて中身の理解も進まないという歯がゆい状況が続いていました。そんな中Chainerがガンガン後方互換性を捨ててバージョンアップをしていくので、ついていくこともできない状況でした。

 そんな中、ちょっと前に話題になったディープラーニングを使った「きゅうりの仕分け」の記事

 なんとRaspberry Pi上でTensorFlowを動かして、ディープラーニングでリアルタイムにきゅうりの判別を行っているというではありませんか。自分もRaspberry PiとChainerで画像認識試したことあるのですが、そのときは1枚の画像の判別に30秒くらいかかっていて「Raspberry Piではディープラーニングは無理かな」と勝手に見切りをつけてしまっていました。

 自分の理解不足を棚に上げて、勝手にできないないと思い込んでいた自分が恥ずかしいです。そもそも、Raspberry Piは安価で小型なLinux機である上に、高性能なカメラモジュールもあるので、ディープラーニングのプラットフォームとしてはうってつけなハードウェアです。いい機会なのでまた1から勉強し直すために、Raspberry PiとTensorflowをベースに、ディープラーニングの実験ができる環境を構築して、また勉強し直してみることにしました。

f:id:karaage:20170726015040j:plain:w640
 Raspberry Pi + TensorFlow。この中にディープラーニングの環境がつまっています

 結論から言うと、この組み合わせかなり良いです。TensorFlowの公式チュートリアルはちゃんと動きますし。自前の画像データを学習から、学習済みのネットワークとRaspberry Piのカメラを使って画像判別までできるようになりました。今回は、環境の構築方法をまずご紹介しようと思います。

f:id:karaage:20170725234118p:plain:w640
 Raspberry Pi上で自前データを学習している様子

f:id:karaage:20170725234109p:plain:w640
 TensorFlowに付属のTensor Boardという可視化ソフトも動きます。ただかなり重いです

 ちなみに、もちろんRaspberry PiとTensorFlowを使ってディープラーニングしている人は、世の中にごまんといます。ごまんは言い過ぎかな、Raspberry Piが1000万台くらい売れてるらしいので、1000人くらいはいるでしょう(笑)。公開している人の例をいくつか参考リンクとして本記事の最後にリンク貼りました。人それぞれ前提が異なると思いますので、この記事が合わない方はそちらも参考にしてみて下さい。

Raspberry Pi +TensorFlowでのディープラーニング環境セットアップ

 追記:最新のバージョンでTensorFlowがRaspberry Piに正式対応してより簡単になりました。最新のセットアップ方法に関しては、以下の id:ueponx さんの記事を参照下さい。

 本記事もまだ有効なはずなので、昔のバージョンをインストールするための情報として残しておきます。

Raspberry Piセットアップ

 ハードウェアはRaspberry Pi 3が良いと思います。Raspberry Pi Zeroなどではまだ未確認です。

 以下記事参照に、Raspbianの基本的なセットアップまでを実施しましょう

 注意事項として、ディープラーニングは大量のメモリを消費するため/etc/dphys-swapfileを書き換えてスワップファイルを100->1024に増大しておくのが良いです。処理の途中で強制終了になる場合は、この設定で防ぐことができるときもあります(できないときもあります)。

 次に、以下のパッケージをインストールします。TensorFlow以外は必須ではありませんが、入れておくと便利だったり、色々応用ができます。

  • TensorFlow
  • Open CV/PIL
  • pandas/matplotlib
  • keras

 Python2とPython3の両方に関して説明します。1からビルドするとめちゃめちゃ時間がかかる(数時間とか)のですが、ここで紹介する方法は、極力ビルド不要のバイナリパッケージを使う方法なので、1時間もかからずインストールできると思います。

Python2でのセットアップ方法

TensorFlowインストール

 Raspberry PiへのTensorFlowのインストールです。ソースからビルドすると大変そうですが、Raspberry Pi用にバイナリパッケージを用意して下さる神のような方がいるので、ありがたく利用させていただきます(非公式な点には注意下さい)。

 上記サイトのREADMEの通りインストールしましょう。具体的には、以下のコマンドを実行します。

$ sudo apt-get install python-pip python-dev
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ sudo pip uninstall mock
$ sudo pip install mock
Open CV・PILのインストール

 画像処理に使用するOpenCV・PILというライブラリをインストールします。学習に使用する画像データの前処理等に使用します。以下コマンドでインストールできます。

$ sudo apt-get update
$ sudo apt-get install python-imaging
$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv

 Open CVに関しては以下参照ください

グラフ可視化関係(pandas/matplotlib)

 matplotlibで簡単なグラフを描けると色々便利なのでインストールします。

$ sudo apt-get install python-pandas
$ sudo apt-get install python-matplotlib

 matplotlibの使い方は以下参照ください

keras

 kerasは、TensorFlowを便利に使うことができるようになるラッパープログラムです。TensorFlow ver1.2からはTensorFlow内部に取り込まれるのでインストールは不要らしいのですが、Raspberry Pi用のバイナリのTensorFlowはまだv1.1.0なのでインストールします。

 以下のコマンドを実行ください。いきなりsudo pip install kerasをしても(多分)よいのですが、最初の2行実行しておいた方がインストールの時間短縮になります。

$ sudo apt-get install python-scipy
$ sudo apt-get install python-h5py
$ sudo pip install keras

Python3でのセットアップ方法

 基本はPython2と同様の流れです。ここでは、TensorFlow・Open CV・Kerasをインストールします。Python3に関しては、id:ueponx さんの以下記事が非常に参考になりました(ほぼそのまま)。

 今回は私が実行したコマンドを自分のためにメモしておきますが、詳しくは上記記事を見た方がよいです。重要なのは、OpenCVとTensorFlowはビルド済みのパッケージをインストールする点です。Raspberry Pi3でビルドしようとするとめちゃめちゃ時間かかりますので大きなメリットです。

OpenCVインストール

 以下記事のOpen CVの部分を参照下さい。

TensorFlowインストール

 Raspberry Piに正式対応したTensorFlowのインストール方法です。Raspbian Buster with Desktop 2019-09-26で、以下コマンドでインストールできました。

$ sudo pip3 install -U pip
$ sudo pip3 install -U setuptools
$ sudo pip3 install wrapt --upgrade --ignore-installed
$ sudo pip3 install --default-timeout=1000 tensorflow==1.13.1

 ネットワークの状態が悪いと失敗することがあったので、安定したネットワーク環境で実施して下さい。途中何度かエラーがでたので調べながら上記の方法にたどり着きました。参考にしたサイトは以下です。

TensorFlow - raspberry pi3Bに現在tensorflowがインストール出来ません。|teratail

ERROR: Cannot uninstall 'wrapt'. during upgrade · Issue #30191 · tensorflow/tensorflow · GitHub

 またTensorFlow内蔵のKerasでモデルの重みを読み込むとき以下のエラーが出ました。

`load_weights` requires h5py when loading weights from HDF5.

 以下でh5pyをapt-getでインストールしましょう。

$ sudo apt-get install python3-h5py

 以下は古い情報ですが、参考までに残しておきます。昔は以下コマンドでセットアップできました。

$ sudo apt-get install libblas-dev liblapack-dev python3-dev libatlas-base-dev gfortran python3-setuptools
$ sudo pip3 install numpy
$ pip3 install tensorflow
$ sudo apt-get install python3-h5py
$ sudo pip3 install keras

 古いバージョンからアップデートしたとき、TensorFlowのインポートで以下のようなエラーが出るときがあります。

RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb

 numpyのバージョンが原因だったのですが、以下のようにあの手この手で何度もアンインストールしないと、いつまでも古いバージョンのnumpyが残り続けてしまいました。削除してからNumpy再インストールしたらエラーは消えました。

$ pip3 uninstall numpy
$ sudo pip3 uninstall numpy
$ sudo apt-get remove python3-numpy

Mac/Linux機へのTensorflowインストール

 ディープラーニングの学習は、ネットワークの規模が大きくなるとRaspberry Piでは時間やメモリの関係で辛くなってきます。その場合、学習をPC(若しくはクラウド)上で実施して、Raspberry Pi(+カメラモモジュール)で判別するのがよいでしょう(キュウリの仕分けもそのような構成をとっています)。

 Mac/LinuxへのTensorflowのインストールに関しては、下記記事を参照下さい。

公式サイトのGET STARTED TUTORIALSが最強

 いよいよ環境がととったら、最初に何をすべきかですが、地道にGoogle公式のTensorflowのチュートリアルを順にこなしていくのが一番よいかなというのが、私の結論です。

TensorFlow Core

 実際に1文字ずつ打っていく(写経する)のが一番ですが、pythonを起動して、チュートリアルを1文ずつコピペしていくだけでもかなり違うかなと思います。

 どうしても英語が辛かったら、Google翻訳で日本語訳したものを読めば良いかなと思いますが、ほとんど専門用語なのでそんなに変わらないかなと思います。

日本語訳

本で理論を補完

 チュートリアルだけやっても、よくわからない単語が出てきたり、そもそもTensorflowの中で何をやっているのかさっぱりイメージできないこともあります。そんな頭パッパラパーな状態の方は、本で理論を補完してやるのがよいです。

 オススメは、以下2冊くらいです。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

  • 作者:斎藤 康毅
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/09/24
  • メディア: 単行本(ソフトカバー)
 これは色々なところで勧められていますが、間違いなく名書です。しっかりやれば陳腐化しない10年は使える知識が身につくと思います。逆に、即効性(すぐこれを読むとディープラーニングで凄いことができる)という本ではないです。

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~

  • 作者:巣籠 悠輔
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2017/05/30
  • メディア: 単行本(ソフトカバー)
 理論と実践面の両方に関してバランス良く書かれた本です。pythonの基礎や理論的な話は、「ゼロから作るディープラーニング」と重複する箇所もあるのですが、TensorFlowの詳しい解説もあるので、公式のチュートリアルを補完する意味合いであった方がよいかなと思います。

 その他、ディープラーニングといえば、花形のアプリケーションは画像認識です。画像認識をしたい場合は、画像処理関係の知識も欲しいところですね。特にディープラーニングで頻出するCNN(Convolutional Neural Network)に関しては、画像フィルタそのものだったりします。画像フィルタに関しては、以下の記事でまとめていますので、興味のある方は参考にしてみて下さい。

自前データの学習・評価・判別

 一通りチュートリアルを終えたら、やってみたくなるのが自前データを学習させて判別ですね。チュートリアルは動かせても、自前データの学習は実際にやろうとすると、結構色々大変だったりします。参考記事に挙げた先人達の知見を参考に、Tensorflowのチュートリアルのニューラルネットワークをベースとした、自前のデータを学習から、評価・判別までできるソフトを作ってみました。GitHubで以下のリポジトリにあげてあります。

 これを使えば、自前の様々な画像データを学習させて、実際にRaspberry Piのカメラを使って判別するということが誰でも簡単にできるようになります。使い方はREADMEに書いてありますが、多分これだけではイマイチわからない人が多数と思いますので、これを使って実際どのように自前のデータを学習して、構築したネットワークをどう使えばよいのかを、別の記事で実例を交えて詳しく解説したいなと思います。来週くらいに公開しようかな。気が向いたら。

まとめ

 Raspberry PiとTensorFlowを使ったディープラーニングの開発環境を構築しました。こちらの環境で、顔認識の実験をしてみましたので、もしよろしければ以下記事も応用例として合わせてご覧下さい。

 また、有料noteでチュートリアルを公開しています。「Google Colaboratory」を使用することで、環境構築することなく、画像認識や自然言語処理といった実践的な例題に取り組むオリジナルのチュートリアルになっています。教師データの取得をスクレイピングのスクリプトで簡略化したり、パラメータを変えることでどのように学習が変わるかを体験したりと、手軽に手を動かしながら学べる内容になっています。Raspberry Piでの画像認識の応用例もありますので、もしよろしければご検討下さい。

 なお、マガジンでセットで買うのがお得かもです!(宣伝)

 Raspberry Pi 3

 SDカード

 カメラモジュール

関連記事

 キュウリの仕分けに関しては、つい先日行ったMFT2017でも展示されていました。Raspberry Piでリアルタイムに判別していました。

 Raspberry PiとChainerでディープラーニングやりたい方は上記記事参照下さい

参考記事

Raspberry Pi 人工知能ツールをインストール【Python3】 - Qiita

Raspberry Pi でディープラーニング環境構築 - ゼロから始める機械学習

raspberry pi 3にTensorFlowを入れて画像認識させる - 寝台急行はまなす

Raspberry Pi 深層学習ライブラリで物体認識(Keras with TensorFlow・Open CV) - Qiita

ようやくTensorFlowがRaspberryPiを正式にサポート - uepon日々の備忘録

変更履歴

  • 2020/01/14 ラズパイ4での環境構築に関してリンク追記
  • 2019/11/06 TensorFlowのインストール方法修正
  • 2019/02/02 チュートリアルに関して追記
  • 2018/10/30 スワップファイルに関して追記
  • 2018/08/13 最新のTensorFlowのセットアップに関するリンクを追記
  • 2018/05/04 Python3でのセットアップ方法を追記
  • 2017/08/16 顔認識の実験へのリンクを追記