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 カメラ : パソコン・周辺機器
・関連記事
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
・関連コンテンツ