2023年3月30日木曜日

VisionFive 2(Debian Image 202302 Released)でTensorFlow Lite XNNPACK delegate

目的


RISC-VのSBCであるVisionFive 2でTensorFlow LiteのXNNPACK delegateを実行してみる。
RISC-V CPUでTensorFlow Lite。


環境


  • VisionFive 2 Debian Image 202302 Released
  • OpenCV 4.7.0(build from source)
  • TensorFlow Lite v2.12 Python Interpreter(build from source)


つまづきポイント


  • RISC-V CPU向けのTensorFlow Lite Python Interpreterは提供されていない。
    このため、ソースからビルド(CMakeを使う)が必要。
    ただし、バグがありビルドできないためパッチをあてて対処。


構築


今回はOpenCVを使ってUSBカメラのキャプチャした画像をEfficientDet Liteを使って物体検出してみる。
なお、動作させてみるPythonコードは自分のリポジトリを使用。



OpenCVのビルド&インストール


まず、OpenCVをソースビルドし、インストールする。
これは、自分の前回のブログを参照。


TensorFlow Lite(Python Interpreter)のビルド&インストール


TensorFlow v2.12.0でビルドを行う。
CMakeでビルドする必要があるが、r2.12ブランチではバグがありビルドできない。。。(masterブランチでは修正済みの模様)
このため、tensorflow/lite/CMakeLists.txtを修正する。
自分がやっているTensorFlow Liteのyoctoのレシピであるmeta-tensorflow-liteにあるパッチをあてて対処。


TensorFlowのリポジトリをcloneし、パッチをあてて、ビルドしてみる。
ビルドはおおよそ30分ぐらい?

$ sudo apt install swig libjpeg-dev zlib1g-dev python3-dev python3-numpy
$ sudo apt install python3-pybind11
$ sudo apt install python3-setuptools
$ sudo apt install python3-wheel
$ sudo apt install python3-pip

$ cd ~
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow/
$ git checkout v2.12.0
$ git apply ~/meta-tensorflow-lite/recipes-framework/tensorflow-lite/files/001-v2.12-Fix-CMAKE_Build_Error.patch

$ export BUILD_NUM_JOBS=4
$ ./tensorflow/lite/tools/pip_package/build_pip_package_with_cmake.sh
pip3 install /home/user/tensorflow/tensorflow/lite/tools/pip_package/gen/tflite_pip/python3/dist/tflite_runtime-2.12.0-cp310-cp310-linux_riscv64.whl


EfficientDet LiteをTensorFlow Lite Modelにエクスポート


モバイル向けの物体検出モデルであるEfficentDet LiteをTensorflow Liteにエクスポートする。
これはホストPC(やGoogle Colaboratory)で実行する。
以前、自分が作成したエクスポート用のノートブックを利用。
エクスポートしたモデル(今回はEfficientDet-Lite0)をボードにSCPなどで転送しておく。
今回は/home/user/modelsの配下に格納。


動作確認


USBカメラを接続して動作確認してみる。

$ cd ~
$ git clone https://github.com/NobuoTsukamoto/tflite-cv-example.git 
$ cd tflite-cv-example/detection/python
$ python3 object_detection_tflite_capture_opencv.py --model /home/user/models/efficientdet-lite0_fp32.tflite --label ../models/coco_labels.txt --thread 4

なお、コードではカメラIDを0固定で指定しているので、適宜書き換え(いつか直す)。
動作させたときの画面キャプチャ。
EfficientDet Lite0 FP32でだいたい500~600ms(4 Threads)。




最後に


今回はRISC-V CPUでTensorFlow Liteをやってみた。VisionFive 2だと割とサクサク動いて感動!(たしかにラズパイ4と比べるとだけど)。

次はEdgeTPUのアクセラレターとの組み合わせかな?

0 件のコメント:

コメントを投稿