Raspberry Pi AI Cameraのセットアップ手順

## 1. Raspberry Pi AIカメラの特徴

Raspberry Pi AIカメラは、Raspberry Piによって提供されるコンパクトなカメラモジュールで、Sony IMX500 インテリジェントビジョンセンサーをベースにしています。

こちらから購入可能です。
https://www.raspberrypi.com/products/ai-camera/

IMX500は、12メガピクセルのCMOSイメージセンサーと、さまざまな一般的なニューラルネットワークモデル向けのオンボード推論アクセラレーションを組み合わせており、ユーザーは別途アクセラレーターを用意することなく、高度なビジョンベースのAIアプリケーションを開発することが可能です。
(https://datasheets.raspberrypi.com/camera/ai-camera-product-brief.pdf)

- **解像度**: 12メガピクセルの高解像度で鮮明な映像をキャプチャ可能。
- **フレームレート**: 高速なフレームレートで、リアルタイムのAI処理に最適。
- **AI機能**: 顔認識や物体検出、動作検知など、様々なAIタスクをカメラ自体で処理可能。
- **接続性**: Raspberry Piと簡単に接続し、Pythonなどのプログラミング言語で制御可能。

https://www.raspberrypi.com/products/ai-camera/

![PXL_20241004_171740972.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/269444a6-f409-70c7-de57-384504abb984.jpeg)


## 2. Raspberry Pi AIカメラのセットアップ手順

次に、Raspberry PiとAIカメラのセットアップ手順を紹介します。公式の手順書に沿って進めていきます。

#### 必要なもの
- Raspberry Pi 4 Model B または Raspberry Pi 5 board.
- Raspberry Pi AIカメラ
- microSDカード（Raspberry Pi OS 64bit インストール済み）
- インターネット接続（Wi-Fiまたは有線）
- 電源アダプタ
- モニターとMicro HDMIケーブル

#### 手順
1.**Raspberry PiにAIカメラを接続**
   - Raspberry PiのカメラポートにAIカメラを接続します。
   - ケーブルがしっかりと接続されていることを確認してください。
   - ケーブルの指す向きを間違えないようにします。(**Raspberry Pi 4 Model Bの場合**)
![PXL_20241004_175347762~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/95a18e54-8073-eac1-daf6-03cfc5388b3b.jpeg)


  - **Raspberry Pi 5の場合**は同梱されている先の細いケーブルの方に差し替えます。
  - ケーブルを取り替えるために、まず黒い止め具を外す必要があります。
止め具の両端にある小さな爪に軽く指を引っ掛けて、上に引き上げます。この動作で止め具が緩み、フレキケーブルが外せます。
![PXL_20241004_205112967.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/711007bb-8ff3-963a-3a6e-29781416bafe.jpeg)

 - ケーブル交換後にRaspi基板に指す向きを間違えないようにします。
![PXL_20241004_205734174.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/e4c5d6d9-6669-3531-0916-7fa2fdcbd542.jpeg)



2.**IMX500のFirmwareのインストール**
  - [公式ドキュメント](https://www.raspberrypi.com/documentation/accessories/ai-camera.html#install-the-imx500-firmware)に従ってIMX500のfirmwareをインストールします。
  - ラズパイのTerminal上で以下を実行
```
sudo apt update && sudo apt full-upgrade
sudo apt install imx500-all
```
  - インストールが成功すると、imx500のfirmwareやAI modelがデバイスにインストールされます。
```
Setting up imx500-firmware (0.FF17.8) ...
Setting up imx500-models (1.5.2-2) ...
Setting up rpicam-apps-imx500-postprocess (1.5.2-2) ...
Setting up imx500-all (1.5.2-2) ...
```

 - インストール後、Raspberry PiをRebootします。
```
sudo reboot
```

 - 再起動後に正しく設定できていると、dmesgのログの中に`Device found is imx500`というキーワードが見つかります。
```
pi@raspberrypi:~ $ sudo dmesg | grep imx500
[    0.532671] platform 1f00110000.csi: Fixed dependency cycle(s) with /axi/pcie@120000/rp1/i2c@88000/imx500@1a
[    3.939666] rp1-cfe 1f00110000.csi: found subdevice /axi/pcie@120000/rp1/i2c@88000/imx500@1a
[    4.100494] imx500 6-001a: Device found is imx500
[    4.103828] rp1-cfe 1f00110000.csi: Using sensor imx500 6-001a for capture
```

## 3. 物体認識を動かしてみる

 - `rpicam-hello`というアプリケーションを使って、`mobilenet_ssd` を動かします。rpicam-hello自体やIMX500で動くAI Modelは、前のStepsで既にインストールされています。

```
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
```

 - IMX500への AI Firmwareのupdateに1,2分かかるので、少し待ちます。進捗がTerminalに表示されていますので、分かりやすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/f9cad693-bb34-9819-d8ab-687e5812db71.png)


 - uploadが完了すると、以下のようにリンゴの物体認識が動かせました。パフォーマンスも良好で30fps程度出ていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/f630b34a-e730-531c-34b5-1131e60380ab.png)

## 4. Picamera2 で物体認識を動かしてみる。
 - Picamera2は、Raspberry Pi財団が提供する新しいPythonライブラリで、Raspberry Piカメラモジュールを簡単に制御するためのツールです。
 - [公式ドキュメント](https://www.raspberrypi.com/documentation/accessories/ai-camera.html#picamera2) を参考にして、picamera2のインストールをします。

```
sudo apt install python3-opencv python3-munkres
git clone https://github.com/raspberrypi/picamera2.git
```

 - picamera2をcloneしたディレクトリの下にある、examples/imx500フォルダに移動して、picamera2のサンプルスクリプトを実行します。モデルはYoloV8のモデルを指定します。
```
cd picamera2/examples/imx500
python imx500_object_detection_demo.py --model /usr/share/imx500-models/imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk
```

 - 以下のようにリンゴが検出できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/f88e7f7a-0c3c-5c99-5885-cb6b8959e547.png)

 - 他に利用可能なpose estimationやsegmentationのAI Modelは`/usr/share/imx500-models/`以下に置かれているようです。他のAIタスクも簡単に試せるのは非常に魅力的です。
 ```
 pi@raspberrypi:~ $ ls -la /usr/share/imx500-models/
total 98716
drwxr-xr-x   2 root root    4096 Oct  4 19:31 .
drwxr-xr-x 241 root root   12288 Oct  4 19:59 ..
-rw-r--r--   1 root root 2574800 Sep 28 14:37 imx500_network_deeplabv3plus.rpk
-rw-r--r--   1 root root 3722528 Sep 28 14:37 imx500_network_efficientdet_lite0_pp.rpk
-rw-r--r--   1 root root 6285760 Sep 28 14:37 imx500_network_efficientnet_bo.rpk
-rw-r--r--   1 root root 5576144 Sep 28 14:37 imx500_network_efficientnet_lite0.rpk
-rw-r--r--   1 root root 6838704 Sep 28 14:37 imx500_network_efficientnetv2_b0.rpk
-rw-r--r--   1 root root 6681664 Sep 28 14:37 imx500_network_efficientnetv2_b1.rpk
-rw-r--r--   1 root root 6826864 Sep 28 14:37 imx500_network_efficientnetv2_b2.rpk
-rw-r--r--   1 root root 2104384 Sep 28 14:37 imx500_network_higherhrnet_coco.rpk
-rw-r--r--   1 root root   67056 Sep 28 14:37 imx500_network_inputtensoronly.rpk
-rw-r--r--   1 root root 5222544 Sep 28 14:37 imx500_network_levit_128s.rpk
-rw-r--r--   1 root root 5072400 Sep 28 14:37 imx500_network_mnasnet1.0.rpk
-rw-r--r--   1 root root 4079808 Sep 28 14:37 imx500_network_mobilenet_v2.rpk
-rw-r--r--   1 root root 3612448 Sep 28 14:37 imx500_network_mobilevit_xs.rpk
-rw-r--r--   1 root root 2335520 Sep 28 14:37 imx500_network_mobilevit_xxs.rpk
-rw-r--r--   1 root root 3281696 Sep 28 14:37 imx500_network_nanodet_plus_416x416_pp.rpk
-rw-r--r--   1 root root 3118976 Sep 28 14:37 imx500_network_nanodet_plus_416x416.rpk
-rw-r--r--   1 root root 1663152 Sep 28 14:37 imx500_network_posenet.rpk
-rw-r--r--   1 root root 3440912 Sep 28 14:37 imx500_network_regnetx_002.rpk
-rw-r--r--   1 root root 4054464 Sep 28 14:37 imx500_network_regnety_002.rpk
-rw-r--r--   1 root root 5464912 Sep 28 14:37 imx500_network_regnety_004.rpk
-rw-r--r--   1 root root 6211824 Sep 28 14:37 imx500_network_resnet18.rpk
-rw-r--r--   1 root root 4081184 Sep 28 14:37 imx500_network_shufflenet_v2_x1_5.rpk
-rw-r--r--   1 root root 1597680 Sep 28 14:37 imx500_network_squeezenet1.0.rpk
-rw-r--r--   1 root root 3965824 Sep 28 14:37 imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk
-rw-r--r--   1 root root 3126656 Sep 28 14:37 imx500_network_yolov8n_pp.rpk
```

## 5. 結果と感想
必要なツールのインストール手順も非常に簡単で、`apt`コマンドを使うだけで、あっという間にセットアップが完了しました。特に面倒な手順もなく、初心者でもスムーズに導入できるのが魅力的です。

実際にAIカメラを使ってみたところ、パフォーマンスも非常に良好で、処理の遅延はほとんど感じられませんでした。顔認識などの物体認識タスクも、リアルタイムでスムーズに実行され、カメラの応答性も高いです。

Raspberry PiにAIカメラを接続してから短時間でセットアップを完了できたことで、すぐにIMX500を使ったEdge AIを体験することができました。エッジデバイス上でのAI処理をこれほど簡単に試せるのは、大きなメリットだと感じました。AIカメラに興味がある方には、ぜひこの体験をおすすめしたいです。