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のアクセラレターとの組み合わせかな?

2023年3月29日水曜日

VisionFive 2(Debian Image 202302 Released)でOpenCVをビルドする

目的


RISC-VのSBCであるVisionFive 2でOpenCVをソースからビルドしてみる。


環境




つまづきポイント


  • additional packagesにあるQtは依存関係のライブラリのバージョンアップデートによりリンクエラーとなってしまうため有効としない。
  • FFmepg、GStreamerのpkgconfigのパスがおかしいためにCMakeでエラーが発生する。
    pkgconfigファイル内のパスを直接編集する。


ライブラリのインストール


OpenCVに必要(とおもわれる)ライブラリを片っ端からインストールする。

$ sudo apt -y install build-essential cmake
$ sudo apt -y install python3-numpy python3-dev python3-matplotlib
$ sudo apt -y install libeigen3-dev libgflags-dev libgoogle-glog-dev
$ sudo apt -y install libopenblas-dev gfortran
$ sudo apt -y install libopenblas-openmp-dev
$ sudo apt -y install libblas-dev libatlas-base-dev libblis-dev
$ sudo apt -y install liblapacke-dev
$ sudo apt -y install liblapack-dev
$ sudo apt -y install libgtk-3-dev
$ sudo apt -y install libhdf5-dev


FFmpeg & GStreamerのpkgconfigの修正


VisionFive 2の開発元が提供するパッケージでFFmpeg、GStreamerなどのpkgconfigファイルでライブラリのパスが誤っている。
  • ライブラリは/usr/localにインストールだが、pkgconfigでは/code_mm/targetを参照している。。。

(69-imageのころからパスを変更したようだけど、pkgconfigファイルの中身はそのままみたい)

一括でパスを置換してしまう。

$ sudo sed -i 's@/code_mm/target/usr@/usr/local@g' /usr/local/lib/pkgconfig/*.pc


OpenCVのビルド


あとはOpenCVのソースコードをダウンロードして、ビルドする。
ビルドは4〜5時間ぐらいだったかも。

$ cd
$ mkdir opencv
$ cd opencv
$ git clone -b 4.7.0 https://github.com/opencv/opencv.git
$ git clone -b 4.7.0 https://github.com/opencv/opencv_contrib.git
$ mkdir build
$ cd build
$ cmake  \
    ../opencv \
    -DOPENCV_EXTRA_MODULES_PATH=~/opencv/opencv_contrib/modules/ \
    -DOPENCV_ENABLE_NONFREE=ON \
    -DBUILD_EXAMPLES=ON \
    -DOPENCV_ENABLE_NONFREE=ON \
    -DWITH_OPENMP=ON \
    -DBUILD_EXAMPLES=ON \
    -DWITH_QT=OFF \
    -DWITH_VULKAN=ON
$ make -j3
$ sudo make install

最後に


これで色々とできるようになった。つぎはTensorFlow Liteをやってみる。