忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

ラズパイC++向けにLiteRT(TensorFlowLite)環境準備

ラズパイでYOLOモデルによる物体検出を行うためにLiteRTの環境を準備します。
LiteRTを利用することでラズパイ5のみ(AI HATなど追加装置なし)で60fpsぐらいの
高速物体検出ができるようになります。
OpenCVの時と同様にソースコードを自分でビルドする方法で対応します。
今回はbookwormで標準インストールされていたGCCでビルドします。
LiteRTの機能をフルに使用するにはClangでビルドします。
※実験中につき内容を変更する可能性があります。

まえおき

以前、ラズパイのC++向けにOpenCVの環境を準備して顔検出を行いました。
顔検出に使用するカスケード分類器のファイルを変更すれば顔以外にも色々なものを
検出できるようになりますが、対象物が傾いていると検出できません。

最近では物体検出にYOLOというアルゴリズム/ライブラリが使われる機会が多く、
You Only Look Onceの名の通り検出モデルをかなり簡単です。しかし、推論(検出)には
ある程度高スペックなPCが必要なのでラズパイで動かすのは少々厳しいです。
これに対してラズパイ等で実行可能なTensorFlowLiteというライブラリがあります。
これはラズパイ等でも高速に実行できる反面、検出モデルの作成方法がよく分かりません。

その界隈では有名なPINTO0309様が検出モデルやモデル間の変換等を公開しており、
これらを利用することでYOLOで自作したモデルをラズパイ上で高速推論できるように
なります。


LiteRTとは

TensorFlowというGoogleが開発した数値計算や大規模なニューラルネットを行う
ライブラリ/フレームワークがあります。TensorFlowは主に高性能なPC向けですが、
モバイル端末向けのTensorFlow Liteがあります。TensorFlow Liteは2024年9月に
LiteRTへと名称が変更されました。
TensorFlow Lite 2.18ぐらいでLiteRT 1.0へ移行したようです。

TensorFlow Lite 2.17とLiteRT2.1.6で比較を行っていますが、320×320の量子化モデル推論に対して

ラズパイ5の場合
 TensorFlow Lite:33ms(CPU使用率60%)
 LiteRT:7ms(CPU使用率40%)※3スレッド(4以上は電力不足で動かせなかった)
とLiteRTの方が明らかに高速かつ軽量で動きます。

ラズパイ4の場合
 LiteRT:53ms(CPU使用率56%)※4スレッド
といった速度で動きます。

OpenCVのカスケード分類器による検出の
 ラズパイ5で7ms(CPU使用率60%)
 ラズパイ4で23ms(CPU使用率70%)
と比べても問題ない性能を発揮します。

ただ、TensorFlow LiteからLiteRTへ移行してそれほど時間が経っていないので、
特にC++向けのLiteRTの情報はそこまで多くありません。ChatGPTおよびGemminiで
基本プログラムを作成した場合、TensorFlow Liteであればそれほど苦労せずコードが
生成されます。これに対してLiteRTはAPIに関する情報が見つからないのでヘッダ
ファイルを読んでいく必要があります。私はlitert/tools/run_model.ccを起点として
run_modelが使用している機能の確認、不足している機能の確認をChatGPTを使って
実施しました。
物体検出を行うためのプログラムについては別途説明予定です。

python向けのインストールはpip等数行で終わるはずなので今回は省略します。
ChatGPT等を使えばpython向けのインストール方法はすぐ分かると思います。


ラズパイで環境作成

まずcmakeの環境を確認しておきます
cmake --version
g++ --version
python3 --version
※機能を全て使用する場合はg++の代わりにClangを使用します。
LiteRTをClangでビルド

------------------------------------ ラズパイ4 buster の場合 ------------------------------------
busterは開発が終了しているのでupdate等を行うことができません。
v2.1.6だとCMakeのバージョンが3.20以上でなければconfigureが実行できません。
ラズパイ4でOSがbuster等だと条件に合わない場合があります。
既存のcmakeは維持したまま追加で別バージョンを入れることもできるので、
状況に合わせて対応が必要です。

また、g++およびgccのバージョンが10未満だとビルドでエラーになります。
Security: XNNPACK doesn't support BTI control flow integrity with GCC.
と出て、gccは一部機能が使えない様なので、Clang (バージョン11ぐらい)を
導入するという方法もありますがbusterだと色々制約が出てきます。
gcc10のソースをダウンロードして自分でビルドしたり等の作業が必要です。
一度cmakeを実行するとコンパイラの設定が固定されてしまうようなので、
gccを標準とは異なるフォルダにインストールした場合は、cmakeを新規に
実行する際に
CC=/opt/gcc-10/bin/gcc CXX=/opt/gcc-10/bin/g++ cmake-gui
等と指定する必要がある様です。
また、Binutilsのバージョンが合わないからソースからgcc10でビルドするとか
、ビルドするたびにg++のバージョンを指定する必要があるとか修正が多岐にわたります。
busterでもビルド可能なことは確認しましたが、素直にbookwormを使った方が簡単です。
----------------------------------------------------------------------------------------------------------

本題です。
LiteRTフォルダで12GBぐらいになるので、ストレージ容量には注意が必要です。
※不要ダウンロードを修正すれば4.0GBぐらい
ストレージは不要ダウンロードを修正すればOS等込みで16GBでギリギリ収まるぐらいです。
SDカードまたはeMMCは32GB以上を選定するのが無難でしょう。

基本的に
・ソースコードをタウンロード
・cmakeで設定
・ビルド
と単純です。

ただし、2026年8月時点ではLiteRT/litert/vendorsのCMakeListsの設定がおかしいらしく、
cmakeを行うたびに
既にダウンロード済みの大容量ファイルを毎回ダウンロードして展開する
という謎の挙動をするのでCMakeListsを修正した方が良さそうです。

今回はシェルを起動した時点のディレクトリで実行することを前提とします。
ディレクトリを変更する場合は各個対応してください。

ソースコードのダウンロードしてフォルダ移動
git clone https://github.com/google-ai-edge/LiteRT.git
cd LiteRT

ステータス確認
git status

タグ一覧
git tag

色んなバージョンがあるのでバージョンを指定します。
git checkout v2.1.6

今回は2026年8月5日時点で最新のv2.1.6を指定しました。
再度ステータスを表示すると
git status

HEAD detached at v2.1.6
nothing to commit, working tree clean

等と表示されてバージョンがv2.1.6に固定されたことが分かります

vendors の CmakeLists 修正

cmakeでConfigureを行うたびに大容量ファイルを無駄にダウンロード&展開するので
今のうちにCmakeListsを修正しておきます。
今回はソースコードにLiteRT/litertを指定しますが、その中にある
LiteRT / litert / vendors / CMakeLists.txt
が諸悪の根源なので修正します。
・QUALCOMM
・SAMSUNG
の2つは強制的にダウンロードが行われるほか設定をOFFにしても勝手にONになるので
修正することを推奨します。使う機能と関係ないのにオンラインにしないとcmakeが通ら
ない+自プロジェクトの設定を変えるとcmakeが実行されてオンラインじゃないとビルド
できないとか色々影響があります。
特にQUALCOMMはラズパイで使わないのに8GBぐらい占拠します。
gitから取得したタイミングでCmakeListsが変わる可能性が有るので、
修正内容についてはChatGPT等で確認するのが良いでしょう。

ダウンロードしたタイミングで内容が異なる可能性があるので、ファイルの内容を
ChatGPT等に提示して修正案を生成してください。
※修正しなくてもcmakeとbuildは実行可能です

CMakeの設定

cmakeでビルド項目を設定します。
ディレクトリ移動してビルドフォルダを作成
cd ~/LiteRT
mkdir build
cd build

ChatGPTが回答する設定項目が怪しいのでcmake-guiで設定項目を確認しながら進めます。
cmake-gui
ソース:LiteRT/litert
ビルド:LiteRT/build
LiteRT直下にCMakeListsが無いのでlitertまたはtfliteのどちらかを指定します。
今回はLiteRTをビルドするのでソースに「LiteRT/litert」を設定します。
ソースフォルダとビルドフォルダを設定したら
Configure


UnixMakefiles
Use default native cmopilers
を選択して
Finish

必要なファイルをダウンロード&展開するので10分ぐらいかかります。
本来は時間がかかるのは初回だけのはずですが、先の説明の通り修正しておかないと
Configureするだけで毎回10分かかります

Configure中に赤文字で警告が出ます。
CMake Warning at /home/pi/LiteRT/build/xnnpack/CMakeLists.txt:434 (MESSAGE):
  Security: XNNPACK doesn't support BTI control flow integrity with GCC.
  Continuing.
GCCだとXNNPACKのBTI機能がサポートされないとの事です。
GCCの代わりにClangを指定すると解消されます。

初回のConfigureが通ったらその他オプションを設定します。
Clangを使用しない場合はKLEIDIAI関連を停止しないとビルド時にエラーになります。

CMAKE_BUILD_TYPE:Release
標準だと何も表示されずRelease扱いっぽいが一応明示的に指定しておく

LITERT_DISABLE_KLEIDIAI
:ON
KLEIDIAI関連は無効にしておかないとビルドでエラーになるかも

LITERT_ENABLE_GPU
:OFF
LITERT_ENABLE_NPU:OFF
LITERT_ENABLE_QUALCOMM:OFF
LITERT_ENABLE_SAMSUNG:OFF
この辺はラズパイと関係ないのでついでにOFFにしておく
※ただしCMakeListsを修正しないと強制的にONに戻される可能性あり

XNNPACK_ENABLE_KLEIDIAI:OFF
KLEIDIAI関連でGCCでビルドする場合はこれをOFFにしておかないとエラーになる。

Configure
Generate

この時点でbuildフォルダが10GB程度になります。
※不要ファイルを修正している場合は3.5GB

Generateが完了したら念のためフォルダ移動してビルド
cd ~/LiteRT/build
make -j3

OpenCVのビルドと同様に空きメモリや放熱には要注意。
ラズパイ5でj4(4並列)だと電流不足で落ちるかも
ラズパイ5のj3でビルド完了まで45分ぐらい
j3でメモリ消費は瞬間最大3.3GBぐらい。4GB以上のモデルならJ3可?
2GBモデルなどの場合は並列数を減らすなど。
電力を潤沢に供給できている場合やラズパイ4ならj4でもOK。

これでビルド完了。
OpenCV等と違い、共有ライブラリはほぼ生成されないのでinstallを実行しても意味がなさそう。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント