ラズパイAIカメラで物体検出
新年、明けましておめでとうございます。
仕事納めの翌日から体調が悪くなり、インフルA型と判明、年末の帰省をキャンセルせざるをえず、家庭内感染を避けるために部屋に閉じこもった年末を過ごしました。年末年始の帰省前には宴会をしないと心に決めた年末でした。(という状況の中で、この投稿を書いてます)
ラズパイ用AIカメラとは?
2024年9月にソニーが英国Raspberry Pi社と共同開発したAIアクセラレーター搭載のイメージセンサー「IMX500」を使ったカメラモジュールです。通常のイメージセンサーは画像データをケーブル経由で渡すのですが、このIMX500では内蔵するAIアクセラレーターの処理結果も返すことで、ラズパイ側でAIの処理をしないですみます。NVIDIAのGPUのある環境と違って、ラズパイだとどうしてもAI処理にGPUが使えなくてもどかしいところがあったのですが、既存のラズパイに対してカメラを変更するだけでAI処理ができるようになります。
モデルはMobileNetSSDがプリインストールされていて、これまでと同じrpicamやlibcameraなどのライブラリで使えます。
環境構築
AIの処理は全てカメラ側で行うため、ボード自体の能力はそんなに高くなくていいと思われるので、今回はすでに使わなくなったラズパイ3B+のボードを使います。ここにカメラケーブルでAIカメラを接続するだけです。
OSは今時点で最新のBookwormの64bit版です。
ソフトのインストール
ソフトのインストール方法は公式サイトに記載されてあるので、その手順で行なってみます。
sudo apt update && sudo apt full-upgrade
sudo apt install imx500-all
準備はこれだけで完了なので、かなり簡単ですね。
プリインストールモデルでの物体検出
以下のコマンドですぐにカメラが立ち上がり、カメラ画像から検出された物体がバウンディングボックスに表示されてます。
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
フレームレートを30で指定しましたが、WiFiが少し不安定な中のVNC経由だからか、実際は10fps前後でした。マウスや人、カップなどはある程度認識しましたが、スマホは認識せず、赤いタイのお守りを人形をテディベアと認識するということもありましたが、マウスやカップもフレームによっては認識しないケースが多く、精度は高くはなさそうです。このあたりは、閾値である程度調整できるかもしれませんが、動いているモデルがMobileNetSSDということもあるのかもしれません。
ちなみに骨格推定も今回記事には詳しくは載せませんが、骨格推定も以下のコマンドでできます。PoseNetが動作しますが、かなり処理が重く、精度も全然でした。
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
既存モデルの移植
ここからは、プリインストールモデル以外のものを入れてみます。YoloのUltralytics社のサイトでIMX500環境の構築方法についての説明があり、yolov8nだけですが、移植はできるようです。ラズパイ4か5とありますが、ここではラズパイ3でも動かしています。
まず最初にyolov8nモデルをIMX500フォーマットにエクスポートします。以下のpythonコードを実行して、生成されるフォルダーごとまるごとダウンロードします。(ちなみにultralyticsのバージョンが古いとimx500はサポートされてませんというエラーが出ます。ここでは8.3.55を使用しました。)
from ultralytics import YOLO
# Load a YOLOv8n PyTorch model
model = YOLO("yolov8n.pt")
# Export the model
model.export(format="imx") # exports with PTQ quantization by default
# Load the exported model
imx_model = YOLO("yolov8n_imx_model")
# Run inference
results = imx_model("https://ultralytics.com/images/bus.jpg")
さて、ラズパイ上に戻り、以下のコマンドで必要なパッケージを入れた後に再起動します。
sudo apt update && sudo apt full-upgrade
sudo apt install imx500-all imx500-tools
sudo apt install python3-opencv python3-munkres
reboot
この後、用意しているモデルをRPKファイルにパッケージ化し、以下のコマンドでpicamera2で動かせるようにします。
git clone -b next https://github.com/raspberrypi/picamera2
cd picamera2
pip install -e . --break-system-packages
cd examples/imx500
実行すると、しばらくFirmのUpload時間がありますが、その後にカメラ画像が立ち上がり、物体検出が開始します。
Ultralytics社のサイトではこのラズパイAIカメラ環境のベンチマークはcoco8データセットで、AP50-95で0.522、推論時間は66.66msec/frameなので、数字的にはそんなに悪くないような気がするのですが、精度やスピードはちょっとこのままでは実用上は難しそうな気がするので、少なくとも用途に応じた学習は行なった方が良さそうです。(スピードは、ラズパイ3の画像表示が影響しているかもしれません)
まとめ
ラズパイで物体検出などのAIがサクっと動くという点では非常に魅力的で、今後の可能性を感じます。
値段は今時点で12,760円で、ラズパイ5(4GB)よりも価格が高いので、正直なところ、もっと価格が下がって欲しいとは思いますが、それでもラズパイでAIを動かすための一つのオプションとなりそうです。
今年も新しいことにどんどんチャレンジしていき、結果を出していく一年にしていきたいと思います。Zennでも学んだこと、感じたことを発信していますので、本年もどうぞよろしくお願いします。
Discussion