KIHARA BLOG:社内ラズコンでめざせ優勝!

Raspberry Pi(ラズパイ)で機械学習とか音声認識とか姿勢推定とかしながら組み込みシステムを構築して、社内ラズコンで優勝をめざすブログです。勉強中:Raspberry Pi、Linux、Python、Coral EdgeTPU、PoseNet、Julius

ラズパイ5日目①:Raspberry Pi + Google Edge TPU で機械学習する

1週間ぶりのラズパイ!平日は仕事なもんで、週末にしか触れません。社内ラズコンは3月中旬… システム構築、間に合うか?!

さて、前回までで音声認識に光が見えたので、今回は骨格検出…の前に機械学習に挑戦!

Edge TPUとは?

公式サイトによると coral.ai

Edge TPUは、低電力デバイス向けの高性能ML推論を提供するGoogleが設計した小さなASICです。 たとえば、MobileNet V2などの最先端のモバイルビジョンモデルを400 FPSで電力効率の高い方法で実行できます。```

むつかしいので色々なサイトで勉強した結果…
機械学習に特化したGoogleの自社開発プロセッサ「TPU(Tensor Processing Unit)」を、エッジコンピューティング向けにした製品群のこと。
エッジコンピューティングというのは、簡単にいうと、インターネットを介さずに現場近くの高速端末機器を使って高速処理を実現すること。 「Coral」というのはGoogleのオリジナルブランド。

要するに、ラズパイ(に限らないが)でAI処理を実現するための外付けの処理端末、と考えてよさそうです。
私が使うのは、ラズパイにUSB接続できるタイプのAccelerator ですが、マイコンとTPUが一体になったDev Boardという商品もあるもよう。

Edge TPUをラズパイに接続する

Edge TPU AcceleratorをUSBポートに挿すだけです。
f:id:KIHARA0223:20200111105913j:plain

なお、Raspberry Pi 3 Model B+がUSB2.0なのに対し、Edge TPU AcceleratorはUSB3.0ということで、場合によっては理論速度の半分以下まで速度が落ちるそうです。
理論速度に近づけたければ、USB3.0ポートのあるRaspberry Pi 4の方がよさそうです。
まぁ性能低いことを知っていてラズパイ3を選んだので、覚悟の上です。

こちらのサイトでUSB2.0USB3.0との処理速度を比較されています。詳細が気になる方はこちらを参照願います。
misoji-engineer.com

公式サイトにインストール手順が掲載されていますが、ちょこちょこ追加でやらなきゃいけないことがあったので独自でまとめておきます。
coral.ai

Edge TPU Runtime をインストールする

Edge TPUと通信するにはEdge TPU Runtime が必要になります。
Terminalからapt-getコマンドでインストールします。

$ echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list

$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

$ sudo apt-get update

$ sudo apt-get install libedgetpu1-std

最大クロック周波数バージョンのRuntimeをインストールする(任意)

最大クロック周波数(デフォルトの2倍)で動作するRuntimeのバージョンに変更します。ただし、公式サイトによれば「処理速度は向上するが消費電力も増加し、Acceleratorが高温になる」とのこと。火傷の恐れもあるらしい。ですので、必須の設定ではありません。
が、私がやりたい骨格検出処理をラズパイ3で実現するには処理速度向上が必要なため、この設定を行うことにしました。
Terminalからapt-getコマンドでインストールします。

$ sudo apt-get install libedgetpu1-max

TensorFlow Lite をインストールする

公式サイトによると、インストールにはいくつか方法があるそうです。

There are several ways you can install TensorFlow's APIs, but to get started with Python, the easiest option is to install the tflite_runtime package. This package provides the bare minimum code required to run an inference with Python (primarily, the Interpreter API), thus saving you a lot of disk space.
TensorFlowのAPIをインストールする方法はいくつかありますが、Pythonを始めるには、tflite_runtimeパッケージをインストールするのが最も簡単なオプションです。このパッケージは、Python(主にInterpreter API)で推論を実行するために必要な最小限のコードを提供するため、ディスクスペースを大幅に節約できます。

To install it, follow the TensorFlow Lite Python quickstart, and then return to this page after you run the pip3 install command.
これをインストールするには、TensorFlow Lite Pythonクイックスタートに従ってください。pip3installコマンドを実行した後、このページに戻ります。

というわけで、別ページを参考にしながらインストールします。
www.tensorflow.org

Terminalからpip installコマンド(Pythonパッケージ用インストールコマンド)でOS、Python3のバージョンに応じたパッケージをインストールします。 f:id:KIHARA0223:20200111205924p:plain

RaspbianなのでARM32かARM64のどちらかなのですが、わからなかったのでgetconf LONG_BITコマンドで確認します。

$ getconf LONG_BIT
32

32ビットOS(ARM32)であることがわかりました。
また、Python3のバージョンは以下のコマンドで確認できます。

$ python3 --version
Python 3.7.3

パッケージが判明したら、インストールを実行します。

$ pip3 install tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl
Requirement 'tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl' looks like a filename, but the file does not exist
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Processing ./tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl
Could not install packages due to an EnvironmentError: [Errno 2] そのようなファイルやディレクトリはありません: '/home/pi/tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl'

怒られた。
「えっなんで?!pipのバージョン違う??」と焦ったが、インストーラ(whlファイル)ダウンロードし忘れてただけでした。まぬけ(笑)
パッケージダウンロード後、インストールし直します。

$ wget https://www.tensorflow.org/lite/guide/pythonhttps://dl.google.com/coral/python/tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl

$ pip3 install tflite_runtime-1.14.0-cp37-cp37m-linux_armv7l.whl

サンプルを動かしてみる

GitHubからサンプルプロジェクトをコピーして動かしてみます。

$ mkdir coral && cd coral

$ git clone https://github.com/google-coral/tflite.git

$ python3 classify_image.py --model models/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels models/inat_bird_labels.txt --input images/parrot.jpg
INFO: Initialized TensorFlow Lite runtime.
----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
121.1ms
10.0ms
10.3ms
10.3ms
9.8ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.76562

このサンプルプロジェクトは、写真を読み込んでどの鳥か推測させる、という処理をしています。結果を見ると、正しく「赤色のコンゴウインコ」と推測できていることがわかります。
f:id:KIHARA0223:20200111213638j:plain

かなりスムーズにEdge TPUの設定ができました。自分で機械学習のモデルを作ったりもできるそうなので、システムづくりがひと段落したら遊んでみたいです。

以下のサイトでは、ドライバーを学習させるという取り組みをされています。
misoji-engineer.com