レビュー

AI自作レビュー、「USBケーブルの種類を見分けるAIモデル」をトレーニングしてAIカメラを作ってみた【Raspberry Pi AI Camera】


2024年9月に登場した「Raspberry Pi AI Camera」は、カメラセンサー内にAI処理用のプロセッサを内蔵しており、カメラそのものにAIモデルを読み込ませてAIカメラとして使うことができます。ドキュメントも充実しており、比較的簡単にAIモデルを自作できそうだったので、実際に「USBケーブルの種類を見分けるAIモデル」をトレーニングして実行してみました。

Raspberry Pi AI Camera – Raspberry Pi
https://www.raspberrypi.com/products/ai-camera/

Raspberry Pi -Ultralytics YOLO ドキュメント
https://docs.ultralytics.com/ja/guides/raspberry-pi/

SONY IMX500 - Ultralytics YOLO Docs
https://docs.ultralytics.com/ja/integrations/sony-imx500/

・目次
◆1:Raspberry Pi AI Cameraとは?
◆2:データセットの用意
◆3:AIモデルのトレーニング
◆4:AIモデルの変換
◆5:カメラにAIモデルを読み込ませて実行

◆1:Raspberry Pi AI Cameraとは?
Raspberry Pi AI CameraはRaspberry Piシリーズ向けのカメラモジュールで、ソニーのインテリジェントビジョンセンサー「IMX500」を搭載しています。IMX500はイメージセンサー内にAI処理プロセッサとAIモデル保存用のメモリを搭載しており、Raspberry Piではなくカメラ側でAI処理を実行できます。

AIチップ内蔵カメラ「Raspberry Pi AI Camera」レビュー、AI処理をカメラ側で実行するので母艦デバイスが非力でもOK - GIGAZINE


Raspberry Pi AI CameraをRaspberry Pi 5に装着するとこんな感じ。


今回は「USBケーブルの種類を見分けるAIモデル」を作ってRaspberry Pi AI Cameraで実行してみます。なお、以下の手順は2024年12月6日時点のものです。


◆2:データセットの用意
AIモデルは「モデルトレーニング用の画像データを収集」「データセットを用いてモデルをトレーニング」「トレーニングしたモデルをRaspberry Pi AI Cameraで実行できるように変換」という手順で作成します。今回は自分でデータセットを用意せず、以下のリンク先で公開されている「『USB Type-Aケーブル』『USB Type-Cケーブル』『Micro-USBケーブル』『Mini-USBケーブル』の画像を合計3567枚含むデータセット」をダウンロードして使います。

Type of Cable Dataset
https://universe.roboflow.com/professional-elective-3/type-of-cable


データセットのダウンロードにはRoboflow Universeのアカウントが必要なので、画面左上のヒト型のボタンをクリック。


「Sign in with work email」をクリック。


メールアドレスを入力して「Next」をクリック。


名前を入力して「Save」をクリック。


パスワードを入力して「Save」をクリック。


アカウントの作成が完了すると自動的に元の画面に戻るので「Download Project」をクリック。


画面左でデータセットのバージョンを選択してから「YOLOv8」をクリック。今回は11月3日のバージョンを選択しました。


「Show download code」にチェックを入れて「Continue」をクリック。


規約とプライバシーポリシーをよく読んで同意のチェックを入れてから「Continue」をクリック。


もう一度「Continue」をクリック。


コード出力画面が表示されたら「Terminal」をクリックするとデータセットダウンロード用のコマンドが表示されます。あとでコマンドを実行してデータセットをダウンロードするので、ひとまずコマンドをコピーしてどこかに書きとめておきます。


◆3:AIモデルのトレーニング
AIモデルのトレーニングはUltralyticsドキュメントに沿って実行します。なお、トレーニングはRaspberry Pi 5でも実行可能ですが、とてつもなく時間がかかるので、今回はGeForce RTX 3090を搭載したUbuntuマシンでトレーニングします。

まず、以下のコマンドを実行して各種パッケージを最新の状態にアップデートし、必要なパッケージをインストールします。

sudo apt update && sudo apt upgrade

sudo apt install docker.io curl


次に、NVIDIAの最新ドライバをインストールします。まず、以下のコマンドを実行して最新ドライバのパッケージ名を調べます。

sudo apt search nvidia-driver


今回の実行結果はこんな感じ。最新バージョンは「nvidia-driver-550」であることが分かります。

……
nvidia-driver-535-server-open/noble-updates 535.216.03-0ubuntu0.24.04.1 amd64
NVIDIA driver (open kernel) metapackage

nvidia-driver-550/noble-updates,noble-security,now 550.120-0ubuntu0.24.04.1 amd64 [インストール済み]
NVIDIA driver metapackage

nvidia-driver-550-open/noble-updates,noble-security 550.120-0ubuntu0.24.04.1 amd64
NVIDIA driver (open kernel) metapackage
……


以下のコマンドを実行して「nvidia-driver-550」をインストールし、再起動します。

sudo apt install nvidia-driver-550

sudo reboot


再起動したら、以下のコマンドを実行してGPUを正しく認識できているか確かめます。

nvidia-smi


以下の様にGPUのモデル名などが正しく表示されたらOK。

+-----------------------------------------------------------------------------------------+

| NVIDIA-SMI 550.120 Driver Version: 550.120 CUDA Version: 12.4 |

|-----------------------------------------+------------------------+----------------------+

| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |

| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |

| | | MIG M. |

|=========================================+========================+======================|

| 0 NVIDIA GeForce RTX 3090 Off | 00000000:01:00.0 Off | N/A |

| 76% 61C P2 203W / 350W | 2875MiB / 24576MiB | 87% Default |

| | | N/A |

+-----------------------------------------+------------------------+----------------------+


続いて、Dockerコンテナ内でGPUを使用可能にするために「nvidia-container-toolkit」をインストールします。

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update

sudo apt install -y nvidia-container-toolkit


続いてUltralyticsのコンテナをpullします。

t=ultralytics/ultralytics:latest

sudo docker pull $t


次に、作業用ディレクトリを作成して移動します。今回は「imx500_test」という名称にしました。

mkdir imx500_test && cd imx500_test


作業用ディレクトリに移動したら、「◆2:データセットの用意」で保存しておいたデータセットダウンロード用コマンドを実行します。

curl -L "https://universe.roboflow.com/ds/○○○?key=○○○" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip


続いて、作業用ディレクトリ内にモデルトレーニング用のPythonスクリプトを保存します。任意のエディタで以下の内容のPythonスクリプトを作成すればOK。今回は「test.py」という名前のファイルにスクリプトを保存しました。

from ultralytics import YOLO

model = YOLO('yolov8n.pt')

results = model.train(

data='data.yaml',

epochs=100,

imgsz=640,

device='0'

)


ここまで準備できたらコンテナを起動します。

sudo docker run -it --ipc=host --gpus all -v ~/imx500_test:/imx500_test $t


コンテナを起動したら、作業用ディレクトリに移動してPythonスクリプトを実行するとトレーニングが始まります。GeForce RTX 3090を搭載したマシンの場合、約30分でトレーニングが完了しました。

cd /imx500_test

python test.py


トレーニングが完了すると、標準出力の末尾に「成果物の保存先ディレクトリ」が表示されます。

Results saved to /ultralytics/runs/detect/train5


「成果物の保存先ディレクトリ」に移動。

cd /ultralytics/runs/detect/train5


「成果物の保存先ディレクトリ」に含まれる「weights」というディレクトリを丸ごと作業用ディレクトリにコピーします。

cp -rf weights/ /imx500_test/100epoch_model


コピーが完了したらコンテナから出ます。

exit


作業用ディレクトリに移動して中身を確認。

cd ~/imx500_test

ls


中身はこんな感じ。「weights_100epoch」というディレクトリが含まれていたらトレーニングは成功です。

100epoch_model README.dataset.txt README.roboflow.txt data.yaml roboflow.zip runs test test.py train valid weights_100epoch yolo11n.pt yolov8n.pt


◆4:AIモデルの変換
AIモデルのトレーニングが完了したら、モデルデータをRaspberry Pi 5に移して、Raspberry Pi AI Cameraで実行できるように変換します。まず、Raspberry Pi 5にRaspberry Pi AI Cameraを接続。なお、Raspberry Pi 5はRAM容量8GBのモデルを使っています。


Raspberry Pi 5にモニターやキーボードも接続して、OSを起動します。


Ubuntuマシンで作成した「weights_100epoch」というディレクトリを物理メディアやコマンドラインツールを使ってRaspberry Pi 5にコピーします。今回はホームディレクトリの直下にコピーしました。


Raspberry Pi 5に必要なパッケージをインストールして再起動。

sudo apt install imx500-all imx500-tools python3-opencv python3-munkres

sudo reboot


続いてPython関連のパッケージをインストール。

sudo apt install python3-pip python3.11-venv


モデル変換用の仮想環境を作成して、作成した仮想環境に入ります。

python3 -m venv ~/imx_python

source ~/imx_python/bin/activate


仮想環境に入ったら、必要なパッケージをインストールして再起動します。

pip install -U pip

pip install ultralytics[export]

sudo reboot


再起動したら、もう一度仮想環境に入り、作業用のディレクトリを作って移動します。今回は「imx500」という名前のディレクトリを作成しました。

source ~/imx_python/bin/activate

mkdir imx500 && cd imx500


作業用ディレクトリで以下のコマンドを実行すると、モデル変換処理が始まります。

yolo export model=~/weights_100epoch/best.pt format=imx


以下のように途中でエラーが発生しますが、自動的に解決してくれるので変換完了までしばらく待ちます。RAM容量8GBのRaspberry Pi 5では約15分かかりました。


モデル変換処理が完了すると「ホームディレクトリ/weights_100epoch/best_imx_model」に各種ファイルが出力されるので、出力先に移動してRaspberry Pi AI Cameraに読み込ませるモデルデータを作成します。

cd ~/weights_100epoch/best_imx_model

mkdir output

imx500-package -i packerOut.zip -o output


「ホームディレクトリ/weights_100epoch/best_imx_model/output」の中に「network.rpk」という名前のモデルデータが出力されたら変換処理は完了です。これで仮想環境は用済みなので、以下のコマンドで仮想環境から抜けておきます。

deactivate


◆5:カメラにAIモデルを読み込ませて実行
今回の手順で作成したAIモデルをRaspberry Pi AI Cameraに読み込ませるには、Raspberry Piのカメラ関連リポジトリ「picamera2」の特定コミットが必要なので、以下の手順でリポジトリをクローンしてチェックアウトします。

cd

git clone -b next https://github.com/raspberrypi/picamera2

cd picamera2

git checkout c2f8ab5ce55f3b240fe3db2471a47bfec72d8399


次に、以下のコマンドを実行して「picamera2」に含まれるパッケージをシステムにインストールします。

pip install -e . --break-system-packages


インストールが完了したら「picamera2」の中の「examples/imx500」に移動します。

cd examples/imx500


最後に、以下のコマンドを実行するとAIモデルがRaspberry Pi AI Cameraに読み込まれてAIカメラが起動します。初回実行時にはAIモデルの読み込みのために数十秒の待ち時間が生じます。

sudo python imx500_object_detection_demo.py --model ~/weights_100epoch/best_imx_model/output/network.rpk --fps 25 --bbox-normalization --ignore-dash-labels --bbox-order xy --labels ~/weights_100epoch/best_imx_model/labels.txt


実行結果はこんな感じ。新しいウィンドウが開いて、カメラの映像が表示されています。


USB Type-Aケーブルをカメラに映すと「USB」と表示されました。


USB Type-Cケーブルを近づけると「Type C」と正しく認識しました。しっかりUSBケーブルの種類を見分けられています。


Raspberry Pi AI Cameraはカメラ側でAI処理を実行するため、Raspberry Pi 5には負荷がかかりません。「USBケーブルの種類を見分けるAIモデル」を実行している際のRaspberry Pi 5のシステム状況を「htop」で確認した結果が以下。CPUやRAMに余裕があるのでAIを実行しつつ他のソフトウェアを実行することもできます。


「USBケーブルの種類を見分けるAIモデル」が動作する様子をOBS Studioで録画してみました。Raspberry Pi 5側に余裕があるので「AIを実行しつつ、OBS Studioを起動して720pで画面を録画する」という操作もこなせます。

「USBケーブルの種類を見分けるAI」を作ってみた【Raspberry Pi AI Camera】 - YouTube


ちなみに、Raspberry Pi AI Cameraには白いドーナツ型の「ピント調整ツール」が付属しています。


ピント調整ツールをカメラにセットして時計回りに回転するとフォーカス距離を遠く、反時計回りに回転するとフォーカス距離を近くに調整できます。これにより、「USBケーブルを見分けるAIモデル」のような小さい物体を対象にしたものから「道路上の物体を見分けるAIモデル」のような大きい物体を対象にしたものまで扱うことができます。


なお、Raspberry Pi AI Cameraはオンラインショップなどで入手可能で、記事作成時点ではAmazon.co.jpで税込1万4980円で入手できます。

Amazon.co.jp: Raspberrypi AI Camera ラズベリーパイ AI カメラ : パソコン・周辺機器

この記事のタイトルとURLをコピーする

・関連記事
AIチップ内蔵カメラ「Raspberry Pi AI Camera」レビュー、AI処理をカメラ側で実行するので母艦デバイスが非力でもOK - GIGAZINE

Raspberry Pi 5に後付けAI処理モジュール「Raspberry Pi AI HAT+」を取り付けてAIカメラを作ってみたよレビュー - GIGAZINE

Raspberry Pi 5にCore Ultra超えのAI専用プロセッサを追加できる「Raspberry Pi AI Kit」を取り付けてAIカメラ化してみたよレビュー - GIGAZINE

機械学習でGIGAZINEの関連記事を自動生成するサーバーを作ってみました - GIGAZINE

ついにRaspberry Pi 5にグラボを接続して画面出力に成功したので手順をまとめてみた - GIGAZINE

in レビュー,   ソフトウェア,   ハードウェア,   動画, Posted by log1o_hf

You can read the machine translated English article here.