🎉

RaspberryPi 5 + AI Kit で TAPPAS App を実行する

2024/11/15に公開

この記事について

この記事は、Raspberry Pi 5 + AI Kit の導入に関する話題をまとめています。
AI Kitとは、Rapsberry Pi 5に高速・低消費電力なAI処理機能を追加するキットです。

初回はRaspberry Pi財団が公開するソフトウェアを用いてAI Kitを動作させるところまでを説明しました。
第2回はHailoRT Python packageを使用して推論を実行する方法を紹介しました。
第3回はHailo社の公開ソフトウェア、TAPPASを使用していきます。
TAPPASはGStreamerをベースとして、パイプライン内でHailoデバイスを使用するためのプラグインのライブラリです。

今回の内容にはHailo社のアカウントの作成は必要ありません。

誰が書いているのか

株式会社アラヤのエッジAI チームの林です。
普段は、エッジAIシステムの開発などを行っています!

アラヤのエッジAIチームでは、アラヤの"人類の未来を圧倒的に面白く!"するというビジョンを達成するために、"すべてのモノにAIを乗せる"というミッションに取り組んでいます。

Hailo Raspberry Pi 5 Examples (Basic Pipelines)

TAPPASをインストールし、PythonからTAPPASを実行してコールバック関数で推論結果を受け取るサンプルです。

インストール

初回のセットアップの済んだ所から開始してください。

Hailo ExamplesのBasic Pipelines (Python)を実行します。
インストールはBasic Pipelines Installation Guideに従います。

git clone https://github.com/hailo-ai/hailo-rpi5-examples.git
cd hailo-rpi5-examples
source setup_env.sh
pip install -r requirements.txt
./download_resources.sh
./compile_postprocess.sh

インストールは上記コマンドの実行で完了です。
今後は実行のたびに、source setup_env.shを実行する必要があります。

上記のリンクの説明にもある通り、将来はTAPPAS(後述)に統合される予定です。

サンプルコマンド実行

Detection Exampleの実行例です

python basic_pipelines/detection.py --input resources/detection0.mp4

上の例では入力は動画ファイルですが、カメラを指定することも可能です。
(RPi camera は Still in Betaですが…)

  --input INPUT, -i INPUT
                        Input source. Can be a file, USB or RPi camera (CSI camera module). For RPi camera use '-i rpi' (Still in Beta). Defaults to /dev/video0

他にもPose Estimation Exampleや、Instance Segmentation Exampleのサンプルコマンドが準備されています。

補足

この方法でインストールを実行すると$TAPPAS_POST_PROC_DIR/usr/lib/aarch64-linux-gnu/hailo/tappas/post-process/にTAPPAS用の各種ライブラリがインストールされていました。
ファイル名をみると上記の3つ以外のタスクに向けた後処理用のライブラリも準備されていることがわかります。

また、上記3つのタスク用のHEFファイルはhailo-rpi5-examples/resources/以下にあります。

TAPPAS (Hailo公式)

TAPPASを実行してみます。

インストール

TAPPAS用のライブラリのインストール時は、Hailo Basic Pipelinesのセットアップ時に完了しています。
ここではTAPPASのサンプルコマンドをダウンロードして実行していきます。

git clone https://github.com/hailo-ai/tappas.git
git checkout v3.29.1

TAPPAS本体は既にインストールされています
インストール済みのTAPPASとバージョンを合わせるためにcheckoutをします

試しにdetectionを実行してみる

最初に先ほどインストールしたHailo Raspberry Pi 5 Examples (Basic Pipelines)ディレクトリでsource setup_env.shを実行してTAPPASの環境を設定します。
そしてdetectionディレクトリに移動してヘルプの表示。

cd tappas/apps/h8/gstreamer/general/detection
./detection.sh --help
略
  --print-gst-launch         Print the ready gst-launch command without running it
略

実行するGStreamerのコマンドを表示してみます。

./detection.sh --print-gst-launch

次のような引数でgst-launch-1.0を実行しようとしていることがわかります。

gst-launch-1.0 filesrc location=/home/araya/tmp/tappas/apps/h8/gstreamer/general/detection/resources/detection.mp4 name=src_0 ! \
decodebin ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
videoscale qos=false n-threads=2 ! \
video/x-raw, pixel-aspect-ratio=1/1 ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
videoconvert n-threads=2 qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailonet hef-path=/home/araya/tmp/tappas/apps/h8/gstreamer/general/detection/resources/yolov8m.hef batch-size=1 nms-score-threshold=0.3 nms-iou-threshold=0.45 output-format-type=HAILO_FORMAT_TYPE_FLOAT32 ! \
queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailofilter function-name=yolov8m so-path=/home/araya/tmp/tappas/apps/h8/gstreamer/libs/post_processes//libyolo_hailortpp_post.so config-path=null qos=false ! \
queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailooverlay qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
videoconvert n-threads=2 qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
fpsdisplaysink video-sink=xvimagesink text-overlay=false name=hailo_display sync=false

ここでは、インストール済みのTAPPASを使って別のサンプルプログラムを実行しようとしているために不都合がいくつか生じます。

まず、後処理ライブラリのパスが違います。
引数をso-path=$TAPPAS_POST_PROC_DIR/libyolo_hailortpp_post.soに変更してみましょう。

次に、入力動画が無いので、適当なものを準備します。
Hailo Raspberry Pi 5 Examples (Basic Pipelines)からhailo-rpi5-examples/resources/detection0.mp4をresources/にコピーします。
引数をlocation=resources/detection0.mp4としておきます。

最後にHEFファイルを準備します。
引数の中にyolov8m.hefの文字があるので、Yolov8mのHailo-8L用のファイルを探します。
TAPPASのv3.29.1に対応するModelZooはv2.12なので
Hailo Model ZooからPublic models-For Hailo-8L-Object Detectionのリンクをたどって下を開きます。
Public Pre-Trained Modelsの中からyolov8m.hefをダウンロードします。
ダウンロードしたyolov8m.hefresources/に配置します。

これで準備は完了です。
下のコマンドを実行すると、正しく物体検出タスクが動きました。

gst-launch-1.0 filesrc location=resources/detection0.mp4 name=src_0 ! \
decodebin ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
videoscale qos=false n-threads=2 ! \
video/x-raw, pixel-aspect-ratio=1/1 ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
videoconvert n-threads=2 qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailonet hef-path=/home/araya/tmp/tappas/apps/h8/gstreamer/general/detection/resources/yolov8m.hef batch-size=1 nms-score-threshold=0.3 nms-iou-threshold=0.45 output-format-type=HAILO_FORMAT_TYPE_FLOAT32 ! \
queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailofilter function-name=yolov8m so-path=$TAPPAS_POST_PROC_DIR/libyolo_hailortpp_post.so config-path=null qos=false ! \
queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
hailooverlay qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
videoconvert n-threads=2 qos=false ! queue leaky=no max-size-buffers=30 max-size-bytes=0 max-size-time=0 ! \
fpsdisplaysink video-sink=xvimagesink text-overlay=false name=hailo_display sync=false

GStreamerコマンドを使って動画ファイルに書き出す

GStreamerパイプラインでHailoを使うことが出来たので、様々な入出力に対応可能になりました。
試しに物体検出結果の動画をファイルに出力します。

まずは環境設定

sudo apt install gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-ugly

次に出力先をファイルに変更します。
先ほどのコマンドパイプラインからfpsdisplaysink video-sink=…の部分を次のように書き換えます。

videoconvert ! x264enc ! mp4mux ! filesink location=video.mp4

video.mp4が出力されました。
ただし、Windows標準のプレイヤーでは再生できませんでした (VLCプレイヤーでは再生可能)。

おまけ

最近の Raspberry Pi OS ではスクリーンショットをとるためにCLIコマンドの grim コマンドを使いました

AI Hat+ が発売されました。AI Kitとは違い、Hailo-8とHailo-8Lを選ぶことが出来ます

本記事では AI Kit ではなく、Hailo-8 (m.2 A+E Key) と E Key用のm.2 HATを組み合わせて使用しています(使用しているHEFファイルはHailo-8L用です)

まとめ

Raspberry Pi 5 + AI Kit の導入に関する話題をまとめています。
今回までにRaspberry Pi 5 + AI Kitを導入して、Hailo社の提供するTAPPASを動作する環境を構築しました。

エッジAIからLLM構築まで気軽にご相談ください!
株式会社アラヤの先端研究支援
株式会社アラヤのエッジAI
SubnetX

Discussion