なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

RaspberryPi(Pi3)を使ってOpentrackでonnxruntimeを試してみた

RaspberryPi(Pi3)を使ってopentrackでonnxruntimeを試してみた

はじめに

Windowsを再インストールしたので、それに伴ってWindows版のopentrackも新しいのにした。neuralnetという項目も増えていて試してみたら、顔認識できちんと顔が向いている方向も取れていた。面白そうなのでRaspberry piで使えるのかどうか確かめたくなり手を動かしてみた。 いろいろとハマって動作を確認できるまでに5日程度かかった。なんとか動くことは確認できた。

以下に

について記し、感想も加える。

Windows版を試してみた際の動画

www.youtube.com

結論から先に

結論から先にいうとonnxruntimeを使ったOpentrackについては素のPi3では使い物にならない。 Pi4は所持しているもののXを入れておらず、NASとして運用中なので試用できない。 新規に買おうかと思ったが、現在在庫がない状態が続いているような感じなので、まぁそのうちといった程度。 速度的におそらく30FPS程度出れば、使えるとは思う。というのもPC版では 30FPSは出ているから。しかし、Pi3では4FPS程度で、推論に200ms以上を要する状況だった。 残念ながら動きはするものの使用に必要な実行速度が得られなかった。推論側の最適化とモデルの最適化が必要なのだろうけど、今回は特にやっていない。

手順について触れていく

ARM環境のRaspberry Piイメージをx86上のDockerで動かす方法の手順

takeshich.hatenablog.com

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つの過去記事を参考にしてほしい。

takeshich.hatenablog.com

takeshich.hatenablog.com

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で最適化したら使えるようになるのかな。