0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hailo8(Raspberry Pi AI HAT+)でYOLOX Nanoがうまく動かない謎

Last updated at Posted at 2025-01-13

1.この記事の内容

Raspberry Pi AI HAT+(26TOPS版)の理解を深めるために,hailo_model_zooを参考に,自前学習のモデルとしてYOLOX Nanoの実行を試みました.

結果として,ソフトウェアとしてはエラーなく動作する状態に持っていくことができましたが,期待する検知結果が出力されない状態となり,謎を残したままいったん区切りとしました.

本記事は,ここまでの内容を書き留めたものとなります.

1-1.使用環境

  • ホストPC
    • Windows 11 Home 23H2
    • Ubuntu 22.04.4 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2+ x86_64)
    • Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz 2.90 GHz
    • RAM 64GB
    • NVIDIA GeForce RTX4070 Ti
  • 実行環境

2.内容

Raspberry Pi AI HAT+でYOLOXを動かすための大まかな流れは下記の通りです.

これらを実行可能なDocker環境をGitHubで公開しています.

学習データとしてCOCO Datasetを使用します.
デフォルトのdocker-compose.yamlではホストPCの$HOME/work/dataset/coco2017/にデータセットを格納した状態であることを前提としています.

ls $HOME/work/dataset/coco2017/
annotations  train2017  val2017

また,Hailoデバイス向けの実行ファイルを生成するコンパイル用のコンテナのみ,Hailo Developer Zoneからダウンロードする必要があります.

machine_learning/compiler/hailo/docker/whl

  • Dataflow Compiler (hailo_dataflow_compiler-3.29.0-py3-none-linux_x86_64.whl)
  • Hailo Model Zoo (hailo_model_zoo-2.13.0-py3-none-any.whl)
    を置いた状態で,下記を実行してコンテナのビルドと起動を行います.
cd /path/to/machine_learning
./scripts/make_env.sh
./scripts/compose_up.sh

2-1.YOLOモデルの学習

YOLOモデルの学習は,オフィシャルのリポジトリMegvii-BaseDetection/YOLOX(commit: d872c71bf63e1906ef7b7bb5a9d7a529c7a59e6a)を流用(clone)して実行しました.

YOLOの学習が可能なDocker環境は筆者のGitHubで公開しています.

手順はREADMEに記載していますが,学習部分だけまとめると下記のとおりです.
Hailo8へのコンパイルではONNX形式へ変換しておく必要がありますので,tools/export_onnx.pyでPyTorch形式からONNX形式へ変換します.

docker-compose exec yolox bash
cd external/yolox
git clone https://github.com/Megvii-BaseDetection/YOLOX.git
cd YOLOX
mkdir weights
wget -P ./weights https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.0/yolox_tiny.pth
python -m yolox.tools.train -f exps/default/yolox_tiny.py -c ./weights/yolox_tiny.pth -d 1 -b 8 --fp16 -o
python tools/export_onnx.py --output-name weights/yolox_tiny.onnx -n yolox-tiny -c weights/yolox_tiny.pth

2-2.学習済みモデルをHailo8向けにコンパイル

ONNX形式の学習済みモデルをHailoデバイスで実行可能なhefファイルへ変換します.

コンパイルで使用するコンフィグファイルには,ネットワーク定義ファイル(networks),アロケータファイル(alls),後処理定義ファイル(nms)の3種があります.

コンパイルコマンドhailomz compileの引数に指定するコンフィグファイルはネットワーク定義ファイルとアロケータファイルで,後処理定義ファイルはアロケータファイル内から参照する作りのようです.

docker-compose exec hailo_compiler bash
cd compiler/hailo
ln -s /workspace/external/yolox/YOLOX/YOLOX_outputs/yolox_tiny/yolox_tiny.onnx weights/yolox_tiny.onnx
hailomz compile --ckpt weights/yolox_tiny.onnx --calib-path /dataset/coco2017/val2017/ --yaml cfg/networks/yolox_tiny.yaml --model-script cfg/alls/yolox_tiny.alls

2-3.Hailoデバイスへのデプロイと実行

コンパイルした実行ファイルをRaspberryPiに転送します.

Raspberry Pi AI HAT+で推論する環境はこちらに用意しています.

./02_inference-camera-image/run.shでターゲットとする実行ファイル(hefファイル)を指定できるようにしており,コンパイルした実行ファイルはmodelsディレクトリに置いてください.

YOLOX Tinyを実行する際は,run.shMODELS変数に"yolox_tiny.hef"を指定し,(正しく動作しませんが)YOLOX Nanoを実行する際は,"yolox_nano.hef"を指定してください.

git clone https://github.com/ryoma-jp/samples.git
cd samples/python/gui_app
./build-image.sh
./enter-docker.sh
./02_inference-camera-image/run.sh

YOLOX TinyとYOLOX Nanoを実行した結果はそれぞれ下図の通りです.
※Raspberry Pi CameraでRaspberry Piのデスクトップを撮影した検知結果です.

YOLOX Tiny

YOLOX-Tiny.png

YOLOX Nano

YOLOX TinyとYOLOX Nanoの差は,各畳み込みチャネル数が異なる点と,ヘッド部分にDepthwise Separable Convolutionがあるかどうかくらいですが,正しい検知結果が出力されない結果となりました.
※YOLOX Tinyも船の上の鳥を人間違えていますが・・・

前処理の誤り有無を中心にデバッグを進めたものの,原因は分からず,いったん深追いはしないこととしました.

YOLOX-Nano.png

3.さいごに

汎用的なアプリケーションを開発する場合は,Hailo Model Zooなどで公開されているhefファイルをそのまま使用するだけで十分だと思いますが,ニッチなモデルを自前で学習する場合などは,ONNX化とコンパイルが必要です.

これ以外の開発も一つのPC上で実行するためにホストPCのシステムを可能な限り汚さないように,すべてDockerコンテナ上で実行できるように作りましたが,なかなか上手くいかず多くの試行錯誤を繰り返すこととなりました.

このような使い方をする人は少ないかもしれませんが,参考になれば幸いです.

4.関連リンク

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?