ROCK5BでHailo-8を使って爆速YOLO

**基本的にうろ覚えです。**
ここに書いてある手順通りにやってもダメだったぞ！！てなったら教えてください

すごい今更感＆なぜ今（今日は元旦）感がありますが、前々からやりたかったことなのでメモとして残します。
今年のいかこうは技術記事書きまくるのでよろしくお願いします。

# Hailo-8を使う
動作環境を以下に示します。Hailoはrock5bの背面m.2に刺して使いました。
|機器|概要|
|-|-|
|PC|ROCK5 model B|
|OS|Ubuntu 5.10.0-1012-rockchip|
|Hailo|Hailo-8 M.2 AI Acceleration Module|

Hailo-8を使うには主に3つのソフトをインストールする必要があります。
1. Hailo PCle ドライバとファームウェア
2. HailoRT
3. 使いたい言語ごとのHailoライブラリ

# 1. Hailo PCle ドライバとファームウェアのインストール
```bash:前準備
sudo apt update
sudo apt upgrade -y
sudo apt install -y cmake dkms
```

Hailo系のソフトはそれぞれのバージョンが違うと使えないみたいなので気をつけて
今回は`v4.19.0`でやってみた
```bash
git clone -b v4.19.0 https://github.com/hailo-ai/hailort-drivers.git
cd hailort-drivers/linux/pcie
make all
sudo make insttall_dkms
```
```bash
cd ~/hailort-drivers
./download_firmware.sh
sudo mv hailo8_fw.4.19.0.bin /lib/firmware/hailo/hailo8_fw.bin
sudo cp linux/pcie/51-hailo-udev.rules /etc/udev/rules.d/
```
```bash
sudo cp linux/pcie/hailo_pci.conf /etc/modprobe.d/
sudo vim /etc/modprobe.d/hailo_pci.conf
```

`hailo_pci.conf`内の二つの行のコメントをはずします。
```conf:hailo_pci.conf
# Modprobe information used for Hailo PCIe driver, edit this file when needed.

# Disables automatic D0->D3 transition, should be set on platforms that
# does not support such transition.
options hailo_pci no_power_mode=N # この行のコメントを外す

# Determines the maximum DMA descriptor page size (must be a power of 2), needs to be
# set on platforms that does not support large pcie transactions.
options hailo_pci force_desc_page_size=4096 # この行のコメントも外す
```

# 2. HailoRTをインストール
[Hailo Developer Zone](https://hailo.ai/developer-zone/software-downloads/)で以下の選択肢で
`HailoRT-Ubuntu package(deb) for arm64`と
`HailoRT-Python package(whl) for Python 3.10, aarch64`をダウンロードします。

|項目|内容|
|-|-|
|Software Package|AI Software Suite|
|Software Sub-Package|HailoRT|
|Architecture|ARM64|
|OS|Linux|
|Python Version|3.10|

`hailort_4.19.0_arm64.deb`と`hailort-4.19.0-cp310-cp310-linux_aarch64.whl`がダウンロードされていることが確認できたら
```bash:HailoRTをapt install
$ sudo apt install ./hailort_4.19.0_arm64.deb
$ hailortcli fw-control identify　# このコマンドでHailo-8が認識されていることを確認

# 出力例
Executing on device: 0000:01:00.0
Identifying board
Control Protocol Version: 2
Firmware Version: 4.19.0 (release,app,extended context switch buffer)
Logger Version: 0
Board Name: Hailo-8
Device Architecture: HAILO8
Serial Number: HLLWM2B225102960
Part Number: HM218B1C2FAE
Product Name: HAILO-8 AI ACC M.2 M KEY MODULE EXT TEMP
```

# 3. PythonでHailoを使う
```bash:pythonのhailoライブラリをpip install
pip install hailort-4.19.0-cp310-cp310-linux_aarch64.whl
```

Hailoでyoloを使うには専用のモデルが必要です。ここからモデルを持ってきます。

https://github.com/hailo-ai/hailo_model_zoo/blob/master/docs/public_models/HAILO8/HAILO8_object_detection.rst

とりあえず、一番強そうなのを動かします。
```bash:yolov10xモデルをwget
mkdir models
cd models
wget https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.13.0/hailo8/yolov10x.hef
```

あと、適当にテスト用の動画をとってきます
```bash
mkdir videos
cd videos
wget https://videos.pexels.com/video-files/854100/854100-hd_1920_1080_25fps.mp4
```

これでいごかす環境は整いました。githubにプログラムをpushしたので勝手に使ってください

https://github.com/Kyaramel/HailoYOLODetection

うおおおおうごいた！！！
あとでHailoなしのyolov10xと比較してみたけど、かなり早くなってる！！！
![mv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669438/37a889c9-3211-fa1e-25d1-32a699c5ba11.gif)



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

https://hailo.ai/developer-zone/documentation/hailort-v4-19-0/?sp_referrer=install/install.html#ubuntu-installer-requirements