機械学習・AI【エッジAI】Raspi5+SONY IMX500で30FPS物体検出チャレンジ!~環境整備編 vol.23

【エッジAI】Raspi5+SONY IMX500で30FPS物体検出チャレンジ!~環境整備編 vol.23

前回記事「vol22【エッジAI】Raspi5+SONY IMX500で30FPS物体検出チャンレンジ!~検出実行編」で30FPSを達成できましたと報告しましたが、それ以前にやったことを今回ご紹介します。

 

■Raspi5の構成

PCIe HATとNVMe SSD
01.png
ヒートパイプと5インチタッチディスプレイ
02.jpg
  • 本体:RasberryPi 5 8GB RAM
  • ストレージ:PCIe NVMe SSD (PCIe2での接続)
  • OS:RaspiOS 32bit (Bookworm)、
  • カメラ:RaspiberryPiAICamera(IMX500)
  • ソフトウェア:Python3.11、numpy-1.26.4,imx500-tools,python3-picamera2、python-opencv

 

Bookworm必須です!※よこしまな考え(YOLOの最新やpytorchをゴリゴリ動かしたい!モデルのコンバートもRaspi上でやりたい!)は捨てて、
「エッジAIとしての専用機で割り切るべし」・・です。

※後日別環境で同じようにセットアップしたら、32ビットよりも64ビットの方が楽でした。

ImagerでBookworm環境を選択
03.png

 

当初(前回のUSBカメラでの検証で使った)Ubuntu 24 Server LTS上ではダメで、かつその次にやったRaspiOS64ビットでもダメ※、最終的にIMXで動作検証が取れているとされるRaspiOS32ビット(Bookworm)での環境構築でようやく動作しました。

※前述の通り、64ビット(Python3.13)でセットアップできました。

「モデルのコンバートもRaspi上でやりたい(ptをそのまま渡されてもOK)」と思いましたが、
こちらもYOLOが要求するPytorchのインストールに失敗してNGでした。
結局モデルのコンバートはWSL2(Windows上のUbuntu24)で実行し、コンバート済のモデルのパッケージ化のみをRaspiで実行するようフローに落ち着きました。

結果的には、モデルの学習や生成を行うWindowsPC(with GPU)で、NASの動画や膨大な静止画に高速アクセスでき、最後にIMX用のモデルを作るというワークフローからするとWindows上にLunuxというのはとても良い構成に思います。

 

 

■Raspi5上でやったこと(準備)

 

参考として、@yokoyan_pwsさんの下記記事に詳しくやり方が書かれています。
https://qiita.com/yokoyan_pws/items/00d6fe0448ae329c7715

最初にこの記事に出会えていれば良かったのですが、私の場合は(猪突猛進で)、picamera2やimx500のgithubやCopilotさんのアドバイスで同様のことをしました。
遠回りになりましたが、色々と知ることが出来て良かったです。

 

・OSの準備
BookwormでRaspiを構成し、NVMeSSDでブート
sudo apt update

・Python環境の準備
Python3.11をインストールしvenv311を設定

・パッケージのインストール
sudo apt install -y imx500-all imx500-tools
sudo apt install -y python3-picamera2 rpicam-apps git python3-venv python3-pip

 

 

■WSL2上でやったこと(モデルのコンバート)

 

既存のYOLOモデルをIMX形式に変換する処理は、自由にOSを選択でき、超高速なWindows仮想マシン上のUbuntuで実行しました。
WSL2はUbuntu24.04.3LTSです。

途中、YOLOが要求するpytorchが上手く入らなくて、一度アンインストールしてからtorch==2.0.1+cu118 torchvision==0.15.2+cu118 を新たに入れたら変換が上手くいったという結末です。

コンバートはultralytics社が用意したYOLOのexportコマンドを実行するのですが、IMX形式にコンバートする際に、校正(最適化)をする都合上、モデル作成時に使ったtrain/valのイメージデータとクラスを定義したyamlデータが必要です。※

 

yolo export model=models/yolo11n.pt format=imx data=models/coco8.yaml
yolo export model=models/makuragi.pt format=imx data=models/makuragi.yaml

 

※「ptファイルだけあれば良い?」と思っていましたが、量子化時のモデル精度を担保するために必要なようです。(推測)

 

・コマンド履歴
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11 python3.11-venv python3.11-dev
python3.11 -m venv venv311
source venv311/bin/activate

pip install onnxruntime numpy
pip install --upgrade pip
cd venv311
mkdir src
sudo nano src/test.py
python src/test.py
pip install ultralytics
yolo export model=yolo11n.pt format=imx data=coco8.yaml
yolo predict model=yolo11n_imx_model source='https://ultralytics.com/images/bus.jpg'

yolo export model=yolo11n.pt format=imx data=coco8.yaml
yolo export model=models/yolo11n.pt format=imx data=models/coco8.yaml

cd data
wget https://raw.githubusercontent.com/ultralytics/ultralytics/main/ultralytics/datasets/coco8.yaml -P models/

yolo export model=models/yolo11n.pt format=imx data=models/coco8.yaml
cd ..
yolo export model=models/yolo11n.pt format=imx data=models/coco8.yaml
pip install onnxscript
yolo export model=models/yolo11n.pt format=imx data=models/coco8.yaml

pip uninstall torch
pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 -f https://download.pytorch.org/whl/torch_stable.html

yolo export model=models/yolo11n.pt format=imx data=models/coco8.yaml
yolo export model=models/makuragi.pt format=imx data=models/makuragi.yaml

 

 

■Raspi5上でやったこと(パッケージ、検出実行)

 

・パッケージの生成

WSL上のUbuntuで生成したモデルのディレクトリとymlファイルを作業ディレクトリにコピーしておきます。
次に。生成されているpackerOut.zipに対してimx500-packageコマンドを掛けます。

cd ~/models/makuragi_model/
imx500-package -i packerOut.zip -o out

正常にコンバートが完了すると
out/netowork.rpk
というファイルが生成されるので、名前を変えておきます。(yolov11n.rpkだとかmakuragi.rpkだとか)

・配置


パッケージ化したrpkファイルと、list.txtをモデル置き場(~/edgeai/models/yolo11n_imx)に置きます。
※格納ディレクトリ名は適当です。(私が使っている環境)

 

・サンプルのダウンロード
picamera2のサンプルをリネームして~/edgeai/srcにコピーします。

cd ~
git clone https://github.com/raspberrypi/picamera2.git
cd ~/picamera2/examples/imx500
cp imx500_object_detection_demo.py ~/edgeai/src/detector.py

・検出の実行


edgeai/src/detector.pyを実行します。
せっかくなので、コンバートしたてのyolov11nモデルを使ってみましょう。

source venv311/bin/activate
cd ~/edgeai/src/
python3 detector.py --model ~/edgeai/models/yolo11n_imx/yolo11n.rpk --labels ~/edgeai/models/yolo11n_imx/labels.txt --threshold 0.15 --bbox-normalization --bbox-order xy

 

モデルをカメラに転送するのに数十秒かかります。
暫くするとビューア(Qtベース)が起動して検出が実行されます。
(閾値を0.15で実行しているので過敏に反応することと思います。)

 

コンバートしたモデルで上手く検出しない場合は、https://github.com/raspberrypi/picamera2.gitのREADME.mdなどを参照してModelZOOのモデルとlistファイルを使うと良いです。

引数として渡す--modelと--labelsの部分を切り替えるだけです。

 

 

■次に湧きおこる欲望→静止画、ログ保存、クラス指定

 

サンプルプログラムを実行させると、「動画上で検出するだけかい!」「静止画を保存できんのかい?」「ログは出せんのかい?」などと欲望がふつふつを湧いてくることと思います。

・・というのが次の記事での内容になります。

 

次は
・検出結果を静止画保存する!
・静止画保存するクラスを限定したい
・検出ログを書きだしたい
・FPSを知りたい

といった内容を実現します。
今回サンプルとして保存したdetector.pyをVSCode上でモリモリを変更していきますよ。

 

 

▼この記事を書いたひと

001@2x.png

R&Dセンター 松井 良行

R&Dセンター 技術戦略担当部長。コンピュータと共に35年。そしてこれからも!

 

 

おすすめの関連記事


機械学習・AIの最新記事


お問い合わせ

ご意見・ご質問などお気軽にお問い合わせ下さい。
ナカシャクリエイテブ株式会社

●富士見事務所 TEL : 052-228-8733 FAX : 052-323-3337
〒460-0014 愛知県名古屋市中区富士見町13−22 ファミール富士見711  地図
交通部 R&Dセンター

Email:メールでのお問い合わせ