2025年3月31日

025-1.SPIKEプライム+ラズパイ+AIカメラを組み合わせてロボットを作る-第1回「AIカメラを準備する」

この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」とRaspberry Pi(以下、ラズパイ)とAIカメラを組み合わせたロボットを作る方法について紹介します。(文/松原拓也)

◆ 材料をそろえる

ロボットの構成を考えます。
AIカメラの制御はラズパイで行います。モーターの制御をラージハブで行って、ラージハブ~ラズパイ間はUARTで通信することにします。ラージハブ側のプログラムはSPIKE-RTで作ります。
「Build HAT」という拡張基板をラズパイに取り付ければ、ラージハブが不要でモーターの制御ができますが、今回はその方法は使いません。

AIカメラは公式の「Raspberry Pi AI Camera」を使います。
このカメラはソニー製のインテリジェントビジョンセンサ「IMX500」を搭載しています。通常のカメラとは違って、カメラの内部でAIの機能をハードウェア的に処理することができます(AIアクセラレータ)。
このため、ラズパイ側の処理の負担を抑えることができます。実売価格は12,760~14,740円です。詳細については次のページに書かれています。
https://www.raspberrypi.com/products/ai-camera/ </

ラズパイは数多くの種類がありますが、今回はラズパイ5(4GB版) を使うことにします。
ラズパイ5は動作中、チップが激しく発熱します。その熱を下げないと、ラズパイは性能を十分に発揮することができません。そこで、冷却用のクーラー が必要です。公式のクーラーは「Raspberry Pi 5用公式ケース(に付属するクーラー)」と「Raspberry Pi 5用公式アクティブクーラー」の2種類があります。両方を組み合わせるという方法もあります。
公式ケースの場合はSoCにヒートシンクを粘着テープで貼り付けます。一度貼り付けてしまうと、取り外すのが大変です。アクティブクーラーの場合は複数のチップをヒートシンクで覆って冷やします。アクティブクーラーは基板にピンを挿し込む構造なので、取り外すことを推奨していないとのことです。
この記事では公式ケースを使うことにします。

AIカメラを取り付けます。
フレキシブルケーブルは2種類(ラズパイ5用/それ以外)同こんされています。ここでは、ラズパイ5用を使用します。
コネクタ部分のツメを1.5mmくらいスライドさせると、フレキシブルケーブルを抜き差しできるようになります。ツメを元の位置に戻すと、フレキシブルケーブルが固定されます。

公式ケースにはフレキシブルケーブルを通すための穴がありません。そこで、LANポートの穴にフレキシブルケーブルを通すことにします。これが公式の使い方なのかどうかは不明です。

ラズパイ用の電源を用意します。
ラズパイ5の場合、電源コネクタの形状はUSB Type-Cです。電源の電流は5A以上を推奨していますが、それを入手するのは難しいです。
ここでは秋月電子通商で売っている3.8Aの電源を使うことにします。
ロボット化させる場合にはモバイルバッテリーでラズパイを動かさないといけません。大きな電流を流せるモバイルバッテリーが必要となります。

テクニック系のパーツを使って、カメラ台を作ってみました。上下方向にカメラを動かすことができます。 これでAIカメラの取り付けは完了です。


◆ ソフトを入手する

次のページの「Getting started」の内容の通りに、IMX500のファームウェアをインストールします。
https://www.raspberrypi.com/documentation/accessories/ai-camera.html
「LXTerminal」を起動して、「sudo apt update」「sudo apt full-upgrade」「sudo apt install imx500-all」のコマンドを入力します。実行後、ラズパイを再起動します。
これでファームウェアのインストールは完了です。

「picamera2」というライブラリの関連ファイルをGitから入手します。
https://github.com/raspberrypi/picamera2/
LXTerminalを起動して、「git clone https://github.com/raspberrypi/picamera2.git」と入力します。

ダウンロードが完了すると、「/home/ユーザー名」フォルダの中に「picamera2」フォルダが出来上がります。この中にツールやプログラムが格納されます。
続いて、Python用開発環境「Thonny」を起動して、File(ファイル)→Open(開く)をメニュー選択、「picamera2」→「examples」→「imx500」の順にフォルダを開きます。
拡張子が「py」のファイルがサンプルプログラムです。

「imx500_pose_estimation_higherhrnet_demo.py」を実行中の画面です。
このプログラムはポーズ推定(Pose estimation)といって、人のポーズを検出することができます。手や足や胴体の他に目・耳・鼻の位置がわかります。PoseNetという技術が使われています。
学習データはあらかじめ用意されています。

「imx500_segmentation_demo.py」を実行中の画面です。
このプログラムはセグメンテーション(Segmentation)といって、画像の要素を切り分けます。たとえば、風景の写真があったら「自動車」と「道路」を切り分けたりします。
この画像の場合だと、「リンゴ」と「手」を切り分けています。手が緑色に塗られていますが、これで一つの固まりという意味です。

「imx500_classification_demo.py」を実行中の画面です。 このプログラムでは分類(Classification)という処理を行います。この例では「リンゴ」を撮影していますが、「piggy bank(ブタの貯金箱)」「buckeye,horse chestnut,conker(トチノキという植物)」「toilet tisssue,toilet paper,bathroom tissue(トイレットペーパー)」という複数の結果を表示しています。いずれも不正解です。名前の右側にある数値は信頼値(confidence values)です。
学習データは「imx500_network_mobilenet_v2.rpk」というファイルを使用しています。拡張子の「rpk」はIMX500独自のフォーマットのようです。

認識可能な物体については「assets/imagenet_labels.txt」というテキストファイルに書かれています。
「golden retriever」「mantis, mantid」「gar, garfish, garpike, billfish, Lepisosteus osseus」「croquet ball」「maillot, tank suit」「radio telescope, radio reflector」「tile roof」「volcano」などで、なんと1000種類の物体が登録されています。


◆ 物体を認識する

「imx500_object_detection_demo.py」を実行中の画面です。 このプログラムでは、物体検出(Object detection)によって、画像を認識します。「MobileNet SSD」という技術を使っています。 ここでは正しく「apple(リンゴ)」「person()」と認識しています。カッコ内の数値は信頼値(confidence values)です。
学習データはあらかじめ用意されています。学習データのファイルは「imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk」です。

「imx500_object_detection_demo_mp.py」はマルチプロセッシング(multiprocessing)に対応した物体検出を行います。1つ前に実行した「imx500_object_detection_demo.py」よりも処理速度が上がっているはずですが、違いが実感できません。

テキストファイルの「assets/coco_labels.txt」には物体検出の名前が列挙されています。「airplane」「orange」「cat」「bottle」「chair」「microwave」「teddy bear」など、全部で80種類の物体が登録されています。
ここまでは既存の学習データを使ってきましたが、オリジナルの学習データを作りたい場合にはソニーセミコンダクタソリューションズが提供している「AITRIOS」というプラットフォームが提供しているツールを使います。


今回はAIカメラを導入方法だけを紹介しました。どうやってロボットとしてまとめていくかは次回以降に考えます。

(動作中の様子)

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。