RaspberryPi(Pi3)を使ってopentrackでonnxruntimeを試してみた
はじめに
Windowsを再インストールしたので、それに伴ってWindows版のopentrackも新しいのにした。neuralnetという項目も増えていて試してみたら、顔認識できちんと顔が向いている方向も取れていた。面白そうなのでRaspberry piで使えるのかどうか確かめたくなり手を動かしてみた。 いろいろとハマって動作を確認できるまでに5日程度かかった。なんとか動くことは確認できた。
以下に
- ARM環境のRaspberry Piイメージをx86上のDockerで動かす方法の手順
- Raspberry Piでのonnxruntimeのビルド
- Raspberry Piでのonnxruntimeを使ったOpentrackのビルド
について記し、感想も加える。
Windows版を試してみた際の動画
結論から先に
結論から先にいうとonnxruntimeを使ったOpentrackについては素のPi3では使い物にならない。 Pi4は所持しているもののXを入れておらず、NASとして運用中なので試用できない。 新規に買おうかと思ったが、現在在庫がない状態が続いているような感じなので、まぁそのうちといった程度。 速度的におそらく30FPS程度出れば、使えるとは思う。というのもPC版では 30FPSは出ているから。しかし、Pi3では4FPS程度で、推論に200ms以上を要する状況だった。 残念ながら動きはするものの使用に必要な実行速度が得られなかった。推論側の最適化とモデルの最適化が必要なのだろうけど、今回は特にやっていない。
手順について触れていく
ARM環境のRaspberry Piイメージをx86上のDockerで動かす方法の手順
raspberry piでcmakeのビルド
1.8.xまでのonnxruntimeであれば、問題ないのだが、1.9.xになるとbusterのcmakeが古く、ビルドできないため、cmakeをソースからビルドする。 以下にその手順を記す。
現状のcmakeをアンインストール
sudo apt purge cmake
最新版のソースのダウンロードと展開、make とインストール
wget https://github.com/Kitware/CMake/releases/download/v3.21.3/cmake-3.21.3.tar.gz tar xvfz cmake-3.21.3.tar.gz cd cmake-3.21.3/ ./bootstrap make -j4 sudo make install
raspberry piでonnxruntimeのビルド
https://github.com/nknytk/built-onnxruntime-for-raspberrypi-linux を参考にした。
必要なパッケージのインストール
sudo apt-get update sudo apt-get install protobuf-compiler sudo apt-get install libcurl4-openssl-dev sudo apt-get install libatlas-base-dev
ソースのダウンロード、ビルド
git clone --single-branch --branch v1.9.1 https://github.com/microsoft/onnxruntime onnxrt191 cd onnxrt191 ./build.sh --use_openmp --config Release --arm --update --build --build_shared_lib --parallel --cmake_extra_defines "CMAKE_INSTALL_PREFIX=${HOME}/onnxruntime-linux-arm32v7l-1.9.1" make install
色々ハマったが、結局の所、コマンド一発でビルドは成功する。 ライブラリは他所に移動するので、明示的にパスを指定した。
固める
tar cf /home/pi/onnxruntime-linux-arm32v7l-1.9.1.tar ./onnxruntime-linux-arm32v7l-1.9.1
ホスト側で以下を実行し、Windows側へコピー
docker cp 7ccad61c7a1e:/home/pi/onnxruntime-linux-arm32v7l-1.9.1.tar ./
onnxruntimeを加えてopentrackのビルド
opentrackのビルドについて、必要なパッケージ等は以下2つの過去記事を参考にしてほしい。
tarで固めたのをscpなどでraspberry pi側へ移動。
cd ~ tar xvf onnxruntime-linux-arm32v7l-1.9.1.tar
Opentrack最新版のダウンロードとmake
git clone --single-branch --branch opentrack-2021.1.2 https://github.com/opentrack/opentrack cd opentrack git submodule update --init mkdir build cd build cmake .. \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DONNXRuntime_ROOT=${HOME}/onnxruntime-linux-arm32v7l-1.9.1 \ -DONNXRuntime_INCLUDE_DIR=${HOME}/onnxruntime-linux-arm32v7l-1.9.1/include/onnxruntime/core/session/ \ -DONNXRuntime_LIBRARY=${HOME}/onnxruntime-linux-arm32v7l-1.9.1/lib/libonnxruntime.so \ -DSDK_ARUCO_LIBPATH=.${HOME}/aruco/build/src/libaruco.a \ -DCMAKE_INSTALL_PREFIX=install cmake --build . -- -j 8
実機ではなくdockerの方でビルドしたら、実機にバイナリを移して実行した際にカメラがオープンできなくて、原因がわからなかった。そのため、実機でのビルドに切り替えた。 実機でビルドするとどうもgccが壊れているようでバグが出るので、clangに変更してビルドするようにした。
opentrackでの稼働確認
OpenMPの環境変数(OMP_NUM_THREADS)がうまく読み込まれないようなので、ソースを直接弄ってスレッド数を1,2,4と変えて試してみた。 このブログを書くにあたってドキュメントを見ていたらOpenMPオプションはdeprecatedになっているようだ。知らなかった。
スレッド数を増やすと処理速度は上がった。 しかしながら、それでも処理速度は4FPS程度だった。
ハマった点
どうも実機のgccがバグっていた。 onnxruntimeのビルドに使う、スクリプトに必要なオプションがうまく理解できなかった。 ソースのダウンロード、サブモジュールのダウンロード、ビルド等に結構な時間がかかり、それのトライアンドエラーを繰り返していたのでそこに2~3日取られてしまった。 うまくいく方法を見つけられたので、そこからはビルドの待ち時間のみであったが、数時間かかった。
感想
RaspberryPiでチューニングなしの顔識別が4FPS程度しか出ないのに、スマホでの顔識別は使える程度には動いているのすごいと思った。NNAPIとかは最適化されているんだろうなと思った。
Pi4で最適化したら使えるようになるのかな。