Coral Edge TPU Image Classification C++

Coral Edge TPU Image Classification C++

Google-coral/tflite examples に image classification が出ていたので、試してみました。
google-coral/tflite/cpp/examples/classification

おんちゃんは、これを 初めに、Ubuntu Mate 22.04 PC で、Bazel を使ってビルドしてみました。
その後、Jetson Nano 2G Armbian Jammy(Ubuntu 22.04) でも、動かしてみます。

Jetson Nano 2G Armbian Jammy(Aaarh64) 向けの C++プログラム を Ubuntu 22.04 PC 上でクロスビルドするには、
Ubuntu 22.04 PC 上 で、先に Tensorflow Lite の静的ライブラリーをクロスビルドします。

ARM64 ボード用の TensorFlow Lite を構築する の、"Bazel を使用した ARM64 のクロスコンパイル" を参考に、作成します。

その後に、TensorFlow Lite、Coral Edge TPU を使った、C++ プログラムを、Ubuntu 22.04 PC で、Bazel を使って、aarch64 向けの Cross Compile を行います。
このときに、先に作った、 TensorFlow Lite の静的ライブラリーをリンクして、aarch64 向けの実行ファイルを作成します。コッホ!!
PC版の Tensorflow Lite 静的ライブラリー も同じように作成してけば、
C++ プログラの作成が、同じ手順で、x86_linux 版と、aarch64_linux 版ができます。

1. Ubuntu 22.04 PC でのビルド。
1.1 Bazel のインストール(フルバージョン版) をします。
Ubuntu への Bazel のインストール
注) bazel-6.4.0 をインストールしてください。
最近、bazel-7.0.0 に上がったみたいですが、こちらは、NG です

注1) Jeton Nano Armibian Jammy での bazel のインストールは、同じ方法では、できません。
この場合は、最初から入っている、 bazel-bootstrup パッケージがありますが、 version 3.5.1 なので、NG です。
この場合は、ソースから Bazel をコンパイルする
Bazel をゼロからビルドする(ブートストラップ)
で、 scratch から、 bazel bootstrup を作成したほうが良いです。

注) /tmp (ramdisk) が、容量不足になるみたいなので、/tmp を、ファイルにする必要があるかも。
下記が、参考になるかも。
一時的に/tmp/の容量を増やす方法

cross tool は、google-coral/crosstool で、OK でた。
但し、aarch64 向けの、クロスビルドは、C++ 17 を指定します。
つかい方は簡単です。
bazel build --crosstool_top=@crosstool//:toolchains --compiler=gcc --cpu=aarch64 --cxxopt='-std=c++17' <OPTIONS> Target

2. runtime(libedgetpu.so.1) のインストール。
2.1 最近、mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite を classify.cc + libedgetpu で使うと、
Segmentation fault (core dumped)
になりだした。

前日まで問題なかったのに、急になりだした。
原因を調べてみたが、
どうも libedgetpuをビルドした時の、 Tensorflow バージョンを使わないといけないみたいです。

PC(Ubuntu Mate 22.04) で使える libedgetpu バージョンは、

$ sudo apt list 2>/dev/null | grep libedgetpu
libedgetpu-dev/coral-edgetpu-stable 16.0 amd64
libedgetpu-legacy-dev/coral-edgetpu-stable,now 15.0 amd64 [インストール済み]
libedgetpu1-legacy-max/coral-edgetpu-stable 15.0 amd64
libedgetpu1-legacy-std/coral-edgetpu-stable,now 15.0 amd64 [インストール済み]
libedgetpu1-max/coral-edgetpu-stable 16.0 amd64
libedgetpu1-std/coral-edgetpu-stable 16.0 amd64

libedgetpu-dev をビルドした、tensorflow バージョンを調べて、それを使わないといけないみたい。
今は、該当 バージョンが、わからない。

2.2 google-coral/libedgetpu を、自分でビルドしてみる。
ディフォルトは、Tensorflow 2.5 みたい。と言うか、 2.3 と 2.5 しかビルドできないとの事。

$ cd ~/local/coral/
$ git clone https://github.com/google-coral/libedgetpu.git
$ cd libedgetpu
Makefile を修正します。

注1) python3.9 を使います。
kivy_env3.9 は、過去の記事に記載しているので、そちらを参考にしてください。

$ make
out の下に作成されす。
早速、out/direct/k8/libedgetpu.so.1 , libedgetpu.so.1.0 を使って、Tensorflow 2.5 で、classify.cc をビルドしてみます。

結果は、 Segmentation faults は、無くなったが、予測結果が悪くなったみたい!!
Label : background Confidence: 0.5529
正解は、
Label :Porphyrio martinicus (Purple...
これも、困った。
classfiy.cc を修正版にして、再度、試すと、OK でした。

ちなみに、 runtime version (14)です。
なので、runtime version (14) 向け、mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite を作成します。

$ edgetpu_compiler mobilenet_v2_1.0_224_inat_bird_quant.tflite -m 14 -o ./tpu-14

2.2.1 別の Tensorflow バージョン向けの runtime(libedgetpu.so.1) をビルドするには、
workspace.bzl の TENSORFLOW_COMMIT、TENSORFLOW_SHA256 の値を変えます。

# TF release 2.5.0 as of 05/17/2021.
TENSORFLOW_COMMIT = "a4dfb8d1a71385bd6d122e4f27f86dcebb96712d"
TENSORFLOW_SHA256 = "cb99f136dc5c89143669888a44bfdd134c086e1e2d9e36278c1eb0f03fe62d76"

TENSORFLOW_COMMIT を一覧するには、
$ git ls-remote https://github.com/tensorflow/tensorflow
...
a4dfb8d1a71385bd6d122e4f27f86dcebb96712d refs/tags/v2.5.0
a8b6d5ff93a37ccba92137e1cab2ae2ee6640ad6 refs/tags/v2.5.0-rc0
...
Branches -> Stale に当るのか?

TENSORFLOW_SHA256 の値は、
$ echo TENSORFLOW_SHA256=$(curl -L "https://github.com/tensorflow/tensorflow/archive/a4dfb8d1a71385bd6d122e4f27f86dcebb96712d.tar.gz" | sha256sum | awk '{print $1}')

注1) Coral Edge TPU の向けの開発自体が終わっているみたい。その代わり、スマホの NPU 向けになっている気がします。
注2) それにしても、libedgetpu-dev/coral-edgetpu-stable 16.0 amd64 の、TensorFlow バージョンは、何だろうか?

ちなみに、kivy_env3.9(python3.9) の環境では、
tensorflow 2.8.4
tflite-runtime 2.5.0.post1
になっています。
tflite-runtime 2.5.0.post1 なのか?
tensorflow 2.8.4
なのか?

2.2.2 bazel を使わない方法もある。
こちらの方は、Jetson nano 2G Armbian Jammy で使う事になるので、必要です。
もちろん、Tensorflow 2.5 を使います。

$ sudo apt install libabsl-dev libflatbuffers-dev
$cd ~/local/tensorflow
$ git clone https://github.com/tensorflow/tensorflow tensorflow
$ cd tensorflow
$ git checkout a4dfb8d1a71385bd6d122e4f27f86dcebb96712d -b tf2.5
$ cd ~/local/coral/libedgetpu
TFROOT=<directory of="" tensorflow=""> make -f makefile_build/Makefile -j2 libedgetpu
注1) この方法だと、下記エラーになる。

api/allocated_buffer.h に追加
#include <cstddef>

注2) makefile_build/Makefile の中の
-labsl_flags を取る事。
注3) tf-2.5 以外で試すと、下記エラーになる。
make: *** '/home/nishi/local/coral/libedgetpu/makefile_build/../out//home/nishi/local/tensorflow/tensorflow-2.16/tensorflow/lite/c/common.o' に必要なターゲット '/home/nishi/local/tensorflow/tensorflow-2.16/tensorflow/lite/c/common.c' を make するルールがありません. 中止.
tf-2.5 以降は、tensorflow/lite/c/common.c が無いので、それが問題だ。

3. 結論として、Coral Edge TPU を、C++ で使うには、Tensorflow 2.5 を使う事にします。
一応、bazel 6.40 で、Ubuntu Mate 22.04 PC でビルドして、動作確認できました。

4. 参照、メモ
1) coral.ai/software

2) commit版 tensorflow 2.5 を、git clone する方法は?
Edge TPU runtime library (libedgetpu) の Makefile に記述がある。

$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow
$ git checkout a4dfb8d1a71385bd6d122e4f27f86dcebb96712d -b tf2.5

このブログ記事について

このページは、おんちゃんが2023年12月 2日 13:50に書いたブログ記事です。

ひとつ前のブログ記事は「Jetson Nano 2G Armbian 22.04(Jammy) Cuda Installing.」です。

次のブログ記事は「QR Code Decode C++ with qrdec.」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ