ONNX ファイル(yolo)を Hailo's HEF 形式に変換する

ゴール
最近ラズパイ5で動作するRaspberry Pi AI HAT+ AIアクセラレータを購入した
自作モデルを動かしたくなったが、すぐには出来なさそうなので色々調べながらやっていく
変換方法がわかるのと、hef ファイル生成までやって実機で動くとこまで確認したい。
変換したいモデル : yolov8m, yolov8s のカスタムトレーニングモデル

hailo コミュニティーにそれっぽい記事を見つけた
どうも「データから行う方法」と「モデルから行う方法」の2つがあるみたい
モデルから行う方法に興味もあるけど、一旦簡単そうな「データから行う方法」で試してみたい
Bring Your Own Data (BYOD) - The most recommended way is using the retraining Docker containers from the Hailo Model Zoo. This will allow you to use some of the most popular networks, (re)trained on your own custom data (see this link for an end-to-end example in our GitHub repo).
データから行う方法 - (適当訳) 推奨、Hailo Model-Zoo というソフトウェアがあるのでそれを使ってカスタムデータから学習を行う方法。example はこちら https://github.com/hailo-ai/hailo-rpi5-examples/blob/main/doc/retraining-example.md
Bring Your Own Model (BYOM) – This method requires a deeper understanding of the model and the conversion flow from ONNX or TensorFlow Lite (TFLite) to Hailo’s HEF format. We suggest using the DFC user guide and tutorials. This approach may present more challenges compared to using the retraining Docker containers from the Model Zoo, but for some, the ride is as enjoyable as the destination :blush: (see this link for DFC tutorials).
モデルから行う方法 - (適当約) 挑戦的、変換の際にはモデルや変換フローの深い理解が求められます。Hailo Model-ZooのリトレーニングDockerコンテナを使用するよりも挑戦的ですが、DFC ユーザーガイドとチュートリアルを活用することで対応可能です。

この example を参考にやっていく。この example では
- 環境構築
- yolo モデルの学習
- torch -> onnx
- onnx -> hef
という流れだが、onnx 形式のファイルはすでにあるので
- 環境構築
- onnx -> hef
の2つだけで行けそう
まず hailo の developer-zone からHailo AI Software Suite – Docker をダウンロード。
したら中身にシェルファイルがあるので実行して Docker コンテナ立てる
実行終わったら自動的にコンテナの中に入ってる
$ sudo ./hailo_ai_sw_suite_docker_run.sh
...
Welcome to Hailo AI Software Suite Container
To list available commands, please type:
----------------------------------------------------
HailoRT: hailortcli -h
Dataflow Compiler: hailo -h
Hailo Model Zoo: hailomz -h
TAPPAS: hailo_run_app -h
----------------------------------------------------
(hailo_virtualenv) hailo@hailo@kota-XiroGA3:/local/workspace$
ローカルのデータセット、モデルを Docker コンテナ内にコピー
$ sudo docker cp {ローカル}/best.onnx hailo_ai_sw_suite_2024-10_container:/local/workspace/hailo_model_zoo/hailo_model_zoo/best.onnx
$ sudo docker cp {ローカル}/custom_datasets hailo_ai_sw_suite_2024-10_container:/local/workspace/hailo_model_zoo/hailo_model_zoo
hailomz compile
コマンドを使ってモデルの変換
$ hailomz compile yolov8m --ckpt=best.onnx --hw-arch hailo8 --calib-path val/images/ --classes 3 --performance
hailo_model_zoo リポジトリ の画像を見る感じ、変換するにはいくつか作業があるけど hailo compile
コマンドを使ったら一つでやってくれるのかな?

Docker コンテナ内で GPU を認識してなかった。
nvidia-docker2
をサポートしてるみたい、非推奨だけどしょうがない
インストールして docker を再起動
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
作り直したらコンテナ内で nvidia-smi
通った
$ sudo ./hailo_ai_sw_suite_docker_run.sh
...
----------------------------------------------------
HailoRT: hailortcli -h
Dataflow Compiler: hailo -h
Hailo Model Zoo: hailomz -h
TAPPAS: hailo_run_app -h
----------------------------------------------------
(hailo_virtualenv) hailo@kota-XiroGA3:/local/workspace$ nvidia-smi
Thu Jan 9 19:05:07 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 560.35.05 Driver Version: 560.35.05 CUDA Version: 12.6 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 4060 Ti Off | 00000000:06:00.0 On | N/A |
| 0% 32C P8 11W / 160W | 568MiB / 8188MiB | 6% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+

今度は [error] Mapping Failed (Timeout, allocation time: 31m 3s)
というエラーが出るようになった。
以下記事を見るとメモリを増やすとかすればいいみたい、Amazon でポチったので後々増やす
とりあえず performance
フラグ入れるとメモリを使うっぽいので外して実行すると通った。
(yolov8m, yolov8s) x (hailo8, hailo8l) の 4 パターン作った
モデルサイズ | hailo デバイス | できたファイル |
---|---|---|
yolov8m | hailo8 | yolov8m_hailo8.hef |
yolov8m | hailo8l | yolov8m_hailo8l.hef |
yolov8s | hailo8 | yolov8s_hailo8.hef |
yolov8s | hailo8l | yolov8s_hailo8l.hef |

har
(Hailo Archive file) も生成されているので profile してみる
hailo profiler yolov8s_hailo8.har
185.84 FPS ?????? まじか、凄すぎる
実機で検証
ラズパイ5 x hailo 8 環境に hailoRT をインストール
インストール方法は下のリンクから
$ hailortcli benchmark yolov8s_hailo8.hef
すごい、本当に 185 fps 出るんだ
4 パターンの出力まとめ
モデルサイズ | hailo デバイス | fps(fw_only) | fps(streaming) |
---|---|---|---|
yolov8m | hailo8 | 29.6648 | 29.6628 |
yolov8m | hailo8l | 22.5244 | 22.5913 |
yolov8s | hailo8 | 50.5127 | 50.5136 |
yolov8s | hailo8l | 185.593 | 185.597 |

Hailo の AI カメラでも実行してみた
環境構築はこの記事がわかりやすいと思います。
--hef-path
で HEF ファイルを渡せるようになっているので渡してみる
$ python basic_pipelines/detection.py -i rpi -f --hef-path yolov8m_hailo8.hef
30 fps ぐらいで推論できた、ちょっと感動もの
yolov8s でも 30fps だったから多分カメラモジュールがボトルネックになってそう

一旦終わりにする
やり残したこと
-
performance
フラグをつけて実行できるようにする

hailo compile で CUDA を使えるようにする
hailomz compile したところ CUDNN を検出できてない?
CUDNN version should be 8.9 or higher, found ..
dpkg 確認したところ libcudnn8 等の必要なライブラリはあった、しかしパスが通ってなかった
通した
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
OK使えた