2020年2月9日日曜日

Edge TPUをWindowsで動かす(Coral January 2020 Updates)

目的


Edge TPU Python APIをWindowsで動作させる。


動機


2020.1.29にCoral January 2020 Updatesがリリースされた。このリリースでWin, Macがサポートされた。このため、Windowsについて動作することを確認しようと思った。



自分が作成したEdge TPU Python APIを使ったサンプルを動作させるところまで。



Windows環境のセットアップ


環境


試した環境は以下の通り。
  • OS: Windows 10 Home, バージョン 2004, OSビルド 19041.21
  • CPU: AMD Ryzen 7 1700
  • メモリ: 16GB
  • Coral USB Accelerator


セットアップ


Python環境


Python環境はAnaconda 2019.10(Python3.7)をインストールする。

Anaconda Promptを立ち上げ、仮想環境を作成しておく。

> conda create -n coral anaconda


Edge TPU runtimeのインストール


Install the Edge TPU runtime - On Windows を参考に、Edge TPU runtimeをインストールする。ダウンロードしたファイルを解凍後、edgetpu_runtimeフォルダ内にあるinstall.batを実行する。


TensorFlow Lite interpreterのインストール


TensorFlow - Python quickstartを参考に、TensorFlow Lite interpreterをインストールする。

> pip install https://dl.google.com/coral/python/tflite_runtime-2.1.0-cp37-cp37m-win_amd64.whl

これでTensorFlow Lite APIからEdge TPUを使うことが可能。Run a model using the TensorFlow Lite AP のサンプルが動作できる。

[注意]
TensorFlow Lite API の場合、Edge TPUをPCに接続していない場合、
"Failed to load delegate from edgetpu.dll"
のエラーとなる。一見、Edge TPU runtimeのインストールに失敗していそうに思えるので注意。


Edge TPU Python APIのインストール


Coral - Edge TPU Python API for Mac and Windows を参考に、Edge TPU Python API for Windowsをインストールする。

> pip install https://dl.google.com/coral/edgetpu_api/edgetpu-2.13.0-cp37-cp37m-win_amd64.whl

これでインストールは完了。


動作確認


以前、作成したサンプルはRaspberry Pi + PiCamera用であったので、OpenCVベースに変更したものを用意した。とりあえず、現時点はObject detectionのサンプルのみ。

PCに接続できるカメラがないため、動画ファイル(スマホで撮影)入力。

モデルはSSDLite MobileNet EdgeTPU



その他


Edge TPU Compilerのバージョンアップ


Coral January 2020 Updatesでは、Edge TPU Compilerもバージョンアップした(2.0.291256449)。今回のバージョンで少しはまった点について。

SSDLite MobileNet EdgeTPU に含まれるTF-Liteモデル(Full integer quant model)をEdge TPU Compilerでコンパイルしたところ、推論実行時に
"ValueError: Dectection model should have 4 output tensors!This model has 12."
でエラーとなってしまった。

前回のEdge TPU Compiler(2.0.267685300)では問題なく、モデルも変わってはいない。

原因は、もともとのTF-Liteモデルが確かにoutputが12個あったので、Edge TPU Python APIが期待するoutputの個数ではなかったためである。

通常、TF-Liteモデルを生成する際、tocoで4つのoutput_arraysを指定するはずだが、SSDLite MobileNet EdgeTPUのpre-trainedモデルには異なるoutputが指定されていたと思われる(おそらく、もともとはPixel4向けなのでpostprocessingが異なるのかもしれない)。なので、今回のバージョンアップでは正しくコンパイルできるようになった...ということかもしれない。

SSDLite MobileNet EdgeTPUはcheckpointからexport、tocoで変換することで、Edge TPUで動作することは確認できた。

(もとのSSDLite MobileNet EdgeTPUのTF-Liteモデルはどうやって使うのだろうか?)

0 件のコメント:

コメントを投稿