Raspberry Pi AI cameraとPi Zero2 W でチュートリアルを試してみた
2024/9にRaspberry Pi AI Cameraの国内販売が始まり、簡単にエッジAI処理をRaspberry Piを用いて試せる環境が揃ってきました。
本稿では、主にこれからRaspberry Pi AI Cameraを初めて使うユーザを対象にカメラのセットアップ方法とチュートリアルのサンプルアプリを動かす方法を紹介します。
必要な機材リスト
# | Item | 必須 | メモ |
---|---|---|---|
1 | Pi AI Camera | * | 購入リンク: https://www.raspberrypi.com/products/ai-camera/ |
2 | Raspberry Pi | * | Pi3 B+/Pi 4/PI5/PI Zero2w/Compute Module 4にて動作確認済み。本記事ではPI Zero2wを使用しています |
3 | 電源ケーブル | * | |
4 | SDカード | * | |
5 | マウス | ディスプレイに接続する場合必要 | |
6 | モニター | ディスプレイに接続する場合必要 | |
7 | Keyboard | ディスプレイに接続する場合必要 | |
8 | HDMIケーブル | Raspberry Pi 4,5の場合MicroHDMI⇔HDMIが必要。Raspberrypi Zero 2向けには MiniHDMI⇔HDMI | |
9 | MicroUSBコネクタ | PI Zero2wを使用する場合、インターフェースがMicro USBのみのためUSB Type-Aの機器と接続するためのハブが必要です。 | |
10 | ケース&ヒートシンク | 必要に応じてご利用ください |
機材の準備
SDカードにOSの書き込み
- Raspberry Pi OS Imager (ダウンロード先)
こちらのツールを使うことで簡単にSDカードにOSイメージを書き込むことができます。
Windows, Mac, Linuxそれぞれに対応しています。
書き込み時に、ホスト名、SSH、Wifi、タイムゾーン、キーボードレイアウトの指定も可能です。
公式ドキュメント:
Raspberry PiにAI Cameraを接続
- Raspberry Pi AI Cameraを開封すると以下のようなものが入っています
-
同封物一覧
- AI Camera
- DSIケーブル ディスプレイ用FPC(Standard-Standard 20cm)
- DSIケーブル ディスプレイ用FPC(Standard-Mini 20cm)
Raspberry Pi 5、Pi Zeroシリーズを使用する場合はこちらのケーブルを使用します。 - 小型フォーカス調整工具(画像中央にある白い丸いもの)
- 工具を反時計回りに回すと近距離にピントが合い、時計方向に回転させると遠距離にピントが合います。
-
Raspberry Pi AI cameraとRaspberry Piを接続していきます。
- フラットケーブルには裏表の向きがあるのでご注意ください
- Raspberry Piとカメラのそれぞれの本体側接点(金属端子)が下向きになるように挿入してください。
- ケーブルを固定する手順
- ラッチを軽く引き上げて開きます。
- ケーブルを正しい向きで挿入します。
- ラッチを下ろしてケーブルを固定します。
- フラットケーブルには裏表の向きがあるのでご注意ください
チュートリアル手順
- RaspberryPi 公式ドキュメントに沿って進めていきます。
Raspberry Pi Zero2 Wでライブラリの更新処理や、大きなライブラリをインストールする場合、メモリが不足することにより数時間かかる場合があります。
時間に余裕をもって実施していただくか、必要に応じてswap領域の確保をお願いいたします。
-
必要なライブラリのインストール
-
sudo apt update && sudo apt full-upgrade
-
sudo apt install imx500-all
- 上記のコマンドを実行することで、IMX500センサーを動かすのに必要なファームウェアや関連ソフトウェアをまとめてインストールを行うことができます。以下の1~3を実行しています。
-
/usr/share/imx500-models/
にサンプルのAIモデルファイルの配置 -
rpicam-apps
にIMX500カメラ用のファイルの追加 - AI Camera向けパッケージ化ツールのインストール
-
- 上記のコマンドを実行することで、IMX500センサーを動かすのに必要なファームウェアや関連ソフトウェアをまとめてインストールを行うことができます。以下の1~3を実行しています。
-
/usr/share/imx500-models/
に配置されるAIモデルの一覧は以下になります。
- デバイスの再起動
sudo reboot
- 起動時にI2Cバス上に接続されたIMX500カメラセンサーを検出し、正しく認識・初期化していることを確認
サンプルスクリプトを試してみる
1. オブジェクト検知
実行スクリプト
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
実行結果
- 新しいAIモデルの書き込みの場合、AIモデルの書き込みに数分かかります。
- AI Cameraへのモデルの読み込み後、以下のように結果が可視化されます。
2.骨格推定
実行スクリプト
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
実行結果
pi@raspberrypi:~ $ cat /usr/share/rpi-camera-assets/imx500_posenet.json
{
"imx500_posenet":
{
"max_detections" : 5,
"threshold" : 0.4,
"offset_refinement_steps": 5,
"nms_radius": 10.0,
"network_file": "/usr/share/imx500-models/imx500_network_posenet.rpk",
"save_input_tensor":
{
"filename": "/home/pi/posenet_input_tensor.raw",
"num_tensors": 10
},
"temporal_filter":
{
"tolerance": 0.3,
"factor": 0.3,
"visible_frames": 8,
"hidden_frames": 2
}
},
"plot_pose_cv":
{
"confidence_threshold" : 0.2
}
}
- それぞれのパラメータの詳細は以下になります。
パラメータ | 説明 | デフォルト値 |
---|---|---|
max_detections | 検出するポーズ(人物)の最大数。 | 5 |
threshold | ポーズを検出する際のスコア(信頼度)のしきい値。これよりも低いスコアは無視されます | 0.4 |
offset_refinement_steps | 関節座標を微調整(補正)するステップ数。値を増やすと精度が上がる一方、処理負荷が高まる。 | 5 |
nms_radius | (NMS: Non-Maximum Suppression)で使用する半径。近い位置に重複して検出されたポーズをまとめたり除外したりするときに使用する。 | 10.0 |
network_file | PoseNet の学習済みモデルファイル(IMX500 用 .rpk )のパス。 |
/usr/share/imx500-models/imx500_network_posenet.rpk |
save_input_tensor.filename | 推論入力のテンソル(raw データ)を保存する先のファイルパス。デバッグや可視化に使用します。 | /home/pi/posenet_input_tensor.raw |
save_input_tensor.num_tensors | 何フレーム分の入力テンソルを連続して保存するか。指定回数分保存したら停止します。 | 10 |
temporal_filter.tolerance | ポーズが大きく変化した際、どの程度まで過去情報を維持するかを制御する許容誤差のしきい値。 | 0.3 |
temporal_filter.factor | 時系列フィルタの係数。値が大きいほど過去情報を強く反映し、出力が滑らかになりますが、動きの速い動作への追従が遅くなる場合があります。 | 0.3 |
temporal_filter.visible_frames | 連続してポーズが検出されているとき、過去何フレーム分の情報を利用するかを設定。 | 8 |
temporal_filter.hidden_frames | 一時的に検出が途切れた場合でも、直近の情報を維持してポーズを補完するためのフレーム数。 | 2 |
confidence_threshold (plot_pose_cv) | OpenCV などで結果を可視化するときに、可視化対象とする最低スコア。値が低い関節は表示対象外にして誤検出を減らします。 | 0.2 |
Picamera2のサンプルスクリプト
次にpicamera2のサンプルアプリを試していきます。
picamera2 ドキュメントは以下にあります。
環境構築
- 多くのサンプルアプリはOpenCVを使用します。そのため以下をインストールします。
sudo apt install python3-opencv python3-munkres
次にサンプルスクリプトを準備します。
git clone https://github.com/raspberrypi/picamera2.git
cd picamera2/examples/imx500
上記のフォルダにはそれぞれAIモデルのタスクに応じたサンプルスクリプトが格納されています。
- imx500_classification_demo.py
- Classification用
- imx500_object_detection_demo.py
- Object Detection用
- imx500_pose_estimation_higherhrnet_demo.py
- Pose Estimation用
- imx500_segmentation_demo.py
- Segmentation用
サンプルスクリプトの実行
1. クラス分類
実行スクリプト
python imx500_classification_demo.py --model /usr/share/imx500-models/imx500_network_efficientnet_bo.rpk
実行結果
- 左上に推論結果が表示されます。今回は正しくオレンジと判定されていることがわかります。
- COCOデータセット1に含まれている画像を画面越しに撮影してみて挙動を確認しています。
2. ObjectDetection
実行スクリプト
python imx500_object_detection_demo.py --model /usr/share/imx500-models/imx500_network_efficientdet_lite0_pp.rpk
実行結果
- 検出したオブジェクトのバウンディングボックスが表示されています。
- 正しくOrangeと認識できています
3. 骨格推定
実行スクリプト
python imx500_pose_estimation_higherhrnet_demo.py --model /usr/share/imx500-models/imx500_network_higherhrnet_coco.rpk
実行結果
- 検出したキーポイントが可視化されます。
- 3人のキーポイントを検出できていることがわかります
- こちらもCOCOデータセット1に含まれている画像を画面越しに撮影してみて挙動を確認しています。
4. セグメンテーション
実行スクリプト
python imx500_segmentation_demo.py --model /usr/share/imx500-models/imx500_network_deeplabv3plus.rpk
実行結果
まとめと感想
Raspberry Pi AI カメラでチュートリアルを一通り試してみました。
ラズパイにAIカメラを接続しサンプルスクリプトでAIを動かしてみるまで短時間でセットアップすることができすごいなと思いました。
これまでRaspberryPi Zero単体ではなかなかAIの実行までスペックが追いつかず難しかったですが、AI Cameraと組み合わせればAIの推論結果のみ受け取るだけなのでスムーズに実行することができました。
RaspberryPi Zero単体は非常に小さく、設置スペースが限られている場所でも活用できるのでますますエッジAIの利用がしやすくなってきたなと思いました。
-
Microsoft COCO: Common Objects in Context[2014] https://arxiv.org/abs/1405.0312 ↩ ↩2