Raspberry Pi AI Kit で遊ぼう♪

# この記事は？

:::note info
Raspberry Pi AI Kit を、Python や C++ で遊べるようにしましょう♪

・初期設定
・サンプル
・自分で試したコード

　など、導線をまとめました。

:::

# Raspberry Pi AI Kit

Hailo 8L という機械学習モデル実行が　**けっこう速い**　モジュールキットです。
ラズパイ5 で遊べます。13 TOPS 性能。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478524/93843fc3-1a9d-f352-242e-d42886ea332d.png)


KSY

https://raspberry-pi.ksyic.com/main/index/pdp.id/1082/pdp.open/1082

スイッチサイエンス

https://www.switch-science.com/products/9695



# 用意するもの
　・ラズパイ5
　・5V / 5A ラズパイ用 Type-C 電源（推奨）
　・Micro SD カード
　・Raspberry Pi 5 用公式アクティブクーラー（推奨）
　・公式 Raspberry Pi カメラ (例： Camera Module 3 等)
　　または USB カメラ
  　（下記セットアップは、Raspberry Pi カメラ前提で書かれています）


# セットアップ

https://www.raspberrypi.com/documentation/accessories/ai-kit.html



```
->  Raspberry Pi Bookworm 64bit をインストール (Raspi Imager, MicroSD)

->  Raspberry Pi AI Kit を装着

sudo apt update && sudo apt full-upgrade
sudo rpi-eeprom-update

  (2023 年 12 月 6 日以降の ファームウェアなら OK、古ければ
  sudo raspi-config
  sudo rpi-eeprom-update -a
  sudo reboot now
  を実行　)

sudo reboot now

sudo apt install hailo-all
sudo reboot now

sudo raspi-config
 -> Advanced Options
   -> PCIe Speed
     -> Yes (enable PCIe Gen 3 mode.)
       -> Finish
       
sudo reboot now
```

# 動作確認

```
hailortcli fw-control identify
```

```
#  (ここは Raspberry Pi カメラ前提です)

rpicam-hello -t 10s


git clone --depth 1 https://github.com/raspberrypi/rpicam-apps.git ~/rpicam-apps

# 物体検出
rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov6_inference.json --lores-width 640 --lores-height 640

# Yolov8 
rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov8_inference.json --lores-width 640 --lores-height 640

# YoloX 
rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolox_inference.json --lores-width 640 --lores-height 640

# Yolov5 人物＆顔検出
rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov5_personface.json --lores-width 640 --lores-height 640

# 画像セグメンテーション
rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov5_segmentation.json --lores-width 640 --lores-height 640 --framerate 20

# 姿勢推定
rpicam-hello -t 0 --post-process-file ~/rpicam-apps/assets/hailo_yolov8_pose.json --lores-width 640 --lores-height 640
```

https://github.com/raspberrypi/rpicam-apps



Lチカ的な動作確認はこれで OK です。

簡単♪


# ソフト、ドキュメント


:::note info
Hailo 公式ガイドは、情報が良くまとまっています。

NPU チップメーカーが情報整えてくれているのは、とても好印象♪
:::

Hailo Developer Zone
https://hailo.ai/developer-zone/

全体の流れをつかむ
https://hailo.ai/developer-zone/journey-develop-a-sw-for-hailo-8/

ソフト
https://hailo.ai/developer-zone/software-downloads/

PC (Ubuntu) では、docker イメージを利用すると全て入ってます。
　→　Hailo AI Software Suite – Docker

ドキュメント
https://hailo.ai/developer-zone/documentation/

・Hailo AI Software Suite User Guide  (PDF / HTML)
・Hailo TAPPAS User Guide  (PDF / Github)
・HailoRT User Guide  (PDF / HTML)
・Hailo Dataflow Compiler User Guide  (PDF / HTML)
・Hailo Model Zoo User Guide  (PDF / Github)
・Hailo Integration Tool User Guide  (PDF)


# ここで Tips

### Hailo アプリ概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478524/26e1a0b3-46b4-20ab-4fcd-3883dc51dab0.png)

https://hailo.ai/products/hailo-software/hailo-ai-software-suite/#sw-overview

:::note info
・TAPPAS は上位ライブラリ。
　推論～その後の処理とかうまくやってくれるみたいです。
　(Template Applications And Solutions の略)

・HailoRT は、モデル読込、推論、テンソル出力、など基本的な使い方ができます。
　便利な各種コマンドも。

・Dataflow Compiler は、ホスト PC でモデル変換(onnx など)や作成などができるソフトです。

・なお、gstreamer は便利な動画ストリーミング系アプリ。コマンドの引数で色々できます。
　カメラ映像を取り込んで描画して rtsp 配信とか。
:::

### トレーニング済み学習モデル

*.hef  →  Hailo 用のモデルファイルです。今回は Hailo 8L 用を使います。(Hailo 8 ではない)

https://github.com/hailo-ai/hailo_model_zoo/blob/master/docs/PUBLIC_MODELS.rst

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478524/6fb8704c-c574-8d0c-f558-e62a5ffe7fee.png)

### Hailo Model Zoo

https://github.com/hailo-ai/hailo_model_zoo/



```
# モデルの速度などいろいろ確認
hailortcli run mymodel.hef


# モデルの input / output 確認
hailo parse-hef mymodel.hef

# Hef モデル中身確認

#*.dot ファイル生成
hailortcli run mymodel.hef --dot http://out.dot

# モデル構造の SVG 生成
sudo apt install graphviz 
dot -Tsvg http://out.dot -o dot.svg
```


# ①TAPPAS　上位ライブラリのコードで遊ぶ


:::note info
下記の hailo-rpi5-examples/basic_pipelines/detection.py サンプルコードを見ると、
スクリプト前半で推論結果の座標を得られるコードが書いています。
:::

### コード： (各 README 参照)

### Python

( import hailo → TAPPAS 呼び出し )



https://github.com/hailo-ai/hailo-rpi5-examples/blob/main/doc/basic-pipelines.md#running-with-different-input-sources

### gstreamer / bash スクリプト

https://github.com/hailo-ai/tappas/blob/4341aa360b7f8b9eac9b2d3b26f79fca562b34e4/apps/h8/gstreamer/raspberrypi/detection/detection.sh


# ②HailoRT　もう少しフレームワークぽく遊ぶ

:::note info
ほかの TensorFlow や Pytorch、onnx などのように、モデルから読み取って推論というのは、どちらかというと TAPPAS よりもこちらの HailoRT の方が近い使い方になると思います。
:::


### コード： (各 README 参照)

### Python

( import hailo_platform　→ HailoRT 呼び出し )

下記の **追加設定** をすると ラズパイ Python で使えるようになります。
チュートリアルもあります。

https://github.com/hailo-ai/Hailo-Application-Code-Examples/tree/main/runtime/python/hailo_onnxruntime_example


### Python で HailoRT を使えるようにする追加設定

```
# pyenv + venv 設定
# HailoRT の pip パッケージ (*.whl) インストール


# ターミナル開く
git clone git://github.com/yyuu/pyenv.git ~/.pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
exit

# 再度ターミナル開く
pyenv install 3.10.14
pyenv install --list

cd
mkdir playground
cd playground

python -m venv myenv310

cd ~/playground
python
>>> exit()

source myenv310/bin/activate
python
>>> exit()


# 公式サイトにログインし、
# HailoRT – Python package (whl) for Python 3.10, aarch64   -   ver.4.17.0
# をダウンロード
# (Bookworm デフォルトの Python 3.11 用のパッケージはまだ無いみたいです。 2024/6/23 現在)

pip install hailort-4.17.0-cp310-cp310-linux_aarch64.whl

python
>>>import hailo_platform
>>> print(hailo_platform.__version__)
>>> exit()

# 仮想環境を抜けるときは
deactivate


# たしか opencv を利用するサンプル実行などのためには、
pip install opencv-python

など必要だったかと思います（失念）

```

### チュートリアル

```
# チュートリアルが jupyter notebook で開きます。
hailo tutorial
```


試し書きしたコードです。

https://github.com/devemin/QuickPlay_RaspiAIKit/blob/main/2_1_hailort_infer.py

https://github.com/devemin/QuickPlay_RaspiAIKit/blob/main/2_2_multiprocess.py



### ※ Python / Picamera2 (ラズパイカメラ利用したい場合) についてメモ


:::note warn
（2024/9/11 現在）
どうやら 7/1 に、Hailo-RT の Python 3.11 whl パッケージがアップされたようです！なので下記の 6/23 の記載は当てはまらないと思いますが、まだ試しておりません。 

:::

:::note warn
（2024/6/23 現在）
いまは HailoRT + Python では、ラズパイカメラより USB カメラの方が良いかも、という話。
(USB カメラを利用するならスルーで OK です)

HailoRT / Python パッケージは、公式サイトからラズパイ ARM64 用の pip (*.whl) パッケージを選んでダウンロードし、pyenv / venv 環境にインストールすることになりますが、これは Python 3.8/3.9/3.10 用しか今はない（2024/6/23 現在）みたいなので、pyenv / venv で仮想環境を利用します。

しかし、Bookworm ラズパイ OS における プレインストールされた Python 3.11 では、import Picamera2 は正しく動いて映像が読み込めますが、仮想環境の Python 3.8/3.9/3.10 では import Picamera 2 は PyQT5 のインストール？がうまくいかないせいか何なのか、ラズパイカメラからの画像を Python / OpenCV の GUI に表示する事ができませんでした。（自分のためした範囲で）

USB カメラ画像は普通に読み込み表示できるので、Python HailoRT ではひとまず USB カメラ使うのが良いかもです。hailo-rpi5-examples (TAPPAS サンプル) の README によれば、 **Picamera2 対応は coming soon らしい** ので、期待してしばし待とうと思います。

（あるいは opencv-python の Gstreamer オプションを有効にしてビルドして、仮想環境の方の Python にインストールして、gstreamer から ラズパイカメラの映像を読み込む方法でも良いかもしれない？）

なお、HailoRT + C++ なら現在も普通にラズパイカメラを使えると思います。
:::



参考：　(pyenv + virtualenv)

Raspberry Pi 5でHailo-8 AIアクセラレータを使用する

https://www.ucl.nuee.nagoya-u.ac.jp/en/blog/2024/2024-05-14-raspi5hailo/

参考：　(pyenv, venv 使い方)

pyenvとvenvで仮想環境を構築する

https://qiita.com/yabish/items/93c4e043e4c8dbc60cad

参考：

Using picamera2 in virtual environments
(pyenv Python 3.10 に Picamera2 インストール試すも、GUI は動かず)

https://forums.raspberrypi.com/viewtopic.php?t=361758


### C++

https://github.com/hailo-ai/hailort/tree/master/hailort/libhailort/examples/cpp



# ③自前で学習やカスタムモデル変換など（ホストPC→ラズパイ）

こちらの方の記事が参考になりました！感謝✨
(hailomz compile コマンドで変換されています。)

Raspberry Pi AI Kitでカスタムモデルを使う方法

https://qiita.com/ysuito/items/a1cdd6e291aa4cb01ca6


Python コードで変換
（ホストPC Ubuntu に hailo の Docker イメージを使いました。）
参考：

https://www.macnica.co.jp/business/semiconductor/articles/hailo/144988/

https://www.macnica.co.jp/business/semiconductor/articles/hailo/145097/

https://www.macnica.co.jp/business/semiconductor/articles/hailo/144843/


### チュートリアル

```
# チュートリアルが jupyter notebook で開きます。
#（ホストPC Ubuntu Docker 上で実行）

hailo tutorial
```


試し書きしたコードです。
onnx を hef に変換した Python スクリプトです。

https://github.com/devemin/QuickPlay_RaspiAIKit/blob/main/4_convert_onnx_hef.py



# 以下はメモ


### NVMe 2枚刺し

・NVMe ２枚刺しできる NVMe Base Duo for Raspberry Pi 5 
これ使うと、MicroSD でなく、SSD + AI Kit もできるかもしれない？

（2024/10/22 追記）→　起動できました。


https://x.com/devemin/status/1801763033494208753


https://x.com/devemin/status/1848738153194262641


### gstreamer コマンド例

ラズパイ5 で Raspberry Pi Camera Module v3 の映像出せたコマンド

```
gst-launch-1.0 libcamerasrc name=src_0 auto-focus-mode=2 ! queue name=queue_src_scale max-size-buffers=3 max-size-bytes=0 max-size-time=0 ! videoscale ! 'video/x-raw,format=RGB,width=1024,height=768,framerate=30/1' ! videoconvert ! videoscale ! autovideosink
```


### マルチプロセス推論のサンプル実行について

hairoRT ドキュメント p76 にあるように、


```
sudo systemctl enable --now hailort.service
```

を実行してからじゃないとできない





# 参考


### 利用例

https://x.com/tier_iv_japan/status/1734136102808694800

https://x.com/devemin/status/1801523894932910561

https://x.com/devemin/status/1801050043366908250

https://x.com/devemin/status/1800431920029007899


### 自分のツイートスレッド

https://x.com/devemin/status/1798329007764804040


### 試したサンプルコードを置いておきます

https://github.com/devemin/QuickPlay_RaspiAIKit/tree/main


以上です。
読んでいただき、ありがとうございます♪