3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Pi AI Cameraで動くオリジナルAIモデルを作ろう①【物体検知モデル】

3
Last updated at Posted at 2025-09-02

はじめに

本記事では、Raspberry Pi AIカメラでオリジナルの物体検知AIモデルを作成し、実際に動かすまでのステップを、初心者の方でも実践できるように解説します。

Raspberry Pi AIカメラにてオリジナルのAIモデルを動かすには、学習用のコードの準備、学習済みモデルをカメラ向けに小型化・最適化したりと、いくつかのステップが必要になります。
そのため、ややハードルが高く感じられることもあるかもしれません。

そこでRaspberry Pi AIカメラ上で動作可能なAIモデルを簡単に構築できるように、開発者向けにサンプルコードを公開しています。
このサンプルを活用することで、自作の物体検知モデルをAIカメラで実行することが可能になります。

今回はチュートリアルとして、すでに公開されている図形(丸・三角・四角)のデータセットを使用し、学習からデプロイまでの手順をご紹介します。

image.png

ちなみに、本記事の第2弾であるキーポイント検出モデル編はこちらで公開しています。

🎯 この記事の概要

  • サンプルコードを使って、オリジナルAIモデルを作成する手順
  • Dockerあり/なしでの学習環境の構築方法
  • 実際に生成されるモデルファイルとその使い方

image.png

🔧 環境要件

  • Raspberry Pi + AIカメラ

  • 学習用に使用するPC
     - NVIDIA GPU推奨(学習時)
     - OS: Ubuntu 22.04
     - Python 3.10

ローカルでの環境構築

ここではローカル環境に学習環境を構築する場合をご紹介します。
Docker上で学習する場合はレポジトリのREADMEのDockerのセクションをご参照ください。

① まずはリポジトリをクローンします。

git clone https://github.com/SonySemiconductorSolutions/aitrios-rpi-training-samples.git
cd aitrios-rpi-training-samples

image.png

②セットアップ
必要なパッケージをインストールします。

sudo apt update
sudo apt -y install --no-install-recommends
apt-utils build-essential libgl1 libgl1-mesa-glx
libglib2.0-0 python3 python3-pip python3-setuptools git gnupg

③Python3.10の仮想環境の構築・有効化
本チュートリアルではPython3.10を想定しているのでまずは3.10が入っていることを確認しましょう。

インストールするライブラリのバージョン依存関係があるので、必ずPython3.10系を使うようにしましょう

python3.10 --version

このように表示されれば、Python3.10がインストールされています。
image.png

まだの方はたとえば以下の手順でpython3.10をインストールします。

sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.10 python3.10-venv python3.10-dev

次に仮想環境を構築します。

python3.10 -m venv .venv
source .venv/bin/activate

image.png

④パッケージのインストール

pip install .
pip install -e third_party/nanodet/nanodet

nanodetのインストールがうまくいかない場合には、以下のコマンドでインストールをお願いします。
python3 setup.py install

インストールが正しくできていることを確認します。
image.png

Step 1: モデルを学習する

  • サンプルでは以下の7つの設定ファイルを用意しています。
    image.png

.ini ファイルの役割

本チュートリアルでは、AIモデルの学習・量子化・評価に関する各種設定を .ini ファイルで管理しています。

セクション 内容
[SOLUTION] モデルの再学習や検証の実行可否など、全体の制御設定
[MODEL] モデル構造の指定(入力サイズ、クラス数など)
[DATASET] 使用するデータセットの識別名
[TRAINER] 学習時の設定(エポック数、バッチサイズ、学習率など)
[QUANTIZER] モデル量子化のパラメータ設定
[VALIDATOR] 学習後のモデル検証の条件(スコア閾値など)

✅ ポイント
Pythonコードを直接書き換えることなく、設定値の変更だけで柔軟に学習条件を調整できるのが特徴です。
使用するデータセットやタスクの選択から、パラメータの調整も可能です。

物体検知のAIモデルを作成する

今回は物体検知のAIモデルを作成してみます。
データセットはオリジナルの

image.png

使用するのは、公開されている図形(丸・三角・四角)のデータセットです。

image.png

iniファイルが格納されているsamplesフォルダに移動し、以下のコマンドを実行するとiniファイルを読み込み学習が開始されます。

以下のコマンドでは、指定された .ini ファイルをもとに、モデルの学習および量子化を行います。

cd samples

imx500_zoo imx500_zoo nanodet_plus_card.ini

image.png

このような形で学習が開始されます。
image.png

学習とモデルの量子化が完了すると以下のようにメトリクスが表示されます。
mAPが0.84,AP@50で0.99となっており学習がうまくできていることがわかります。
image.png

完了すると以下のようなモデルファイルが生成されます。

./samples/model/nanodet_plus_card/
├── nanodet_plus_card.keras # floatモデル
└── nanodet_plus_card_quantized.keras # 量子化済みモデル(IMX500にデプロイ可)

Step 2: 学習済みモデルを量子化・変換する

次に量子化済みのモデルをAI Cameraにデプロイできる形にコンバート・パッケージを行います。

ここの作業は引き続きvenvの環境内で行ってください。
AIモデルの量子化はモデルを作成したときと同じTensorFlowのバージョンで行う必要があります。

pip install edge-mdt[tf]

次にコンバートしていきます。

cd ./samples/model/nanodet_plus_card/
imxconv-tf -i nanodet_plus_card_quantized.keras -o convert_result

変換するファイルは _quantizedのプレフィックスがついているモデルを使用します。
image.png

実行すると以下のように変換が始まります。
image.png

Ubuntu側とRaspberryPiのTensorflowのバージョンが一致していない場合にエラーになることがあります。

RuntimeError: Failed to load the model. Tensorflow version mismatch trying to load model created in 2.13.1 with 2.15.1.

以下でRaspberryPi側のバージョンをUbuntuのバージョンと一致させることで解決できます。

pip install tensorflow==2.13.1

Step 3: AIカメラ用にパッケージ化する

⭐️ここからはRaspberry Piでの操作になります⭐️

先ほどのコンバートしたフォルダをRaspberry Piに移動します。
今回はconvert_resultにあたります。

sudo apt install imx500-tools

image.png

このステップを実行する前に、convert_result/packerOut.zip が正しく生成されている必要があります。

AIモデルが使用する色の配列を指定して、packageするためにjsonを以下のように事前に作成します。
例として、input_format_bgr.jsonとして以下を保存します。

[{"ordinal": 0, "format": "BGR"}]

パッケージを行います。上記手順で作成したjsonも忘れずに指定します。

imx500-package -i convert_result/packerOut.zip -o rpk_output_folder -f input_format_bgr.json

BGRを明示指定しないとモデルの色チャネルが不整合となり推論精度が低下してしまいます。
多くのAIモデルはRGB順で学習されていますが、今回使用するnanodetはBGR順が想定されています。
そのため、-f オプションでBGRを指定することでパッケージング時に適切なチャネル変換を組み込むことができます。

処理が成功すると以下のようにrpkのファイルが作成されます。
image.png

Step 4: Raspberry Pi上で実行する

Raspberry Pi上で必要なライブラリをインストールします。

sudo apt install python3-opencv python3-munkres
git clone https://github.com/raspberrypi/picamera2.git
cd picamera2/examples/imx500/
  • 物体検知用のクラスファイルを作成します。 custom_label.txtを作成し以下の内容を記載します。
pi@raspberrypi:~/Desktop/Tutrial/picamera2/examples/imx500 $ cat custom_label.txt
circle
triangle
rectangle

オリジナルモデルを AI Cameraで実際に動かしてみます。
モデルは作成したnetwork.rpkを選択し、ラベルは上記で作成したcustom_label.txtを選択します。

python3 imx500_object_detection_demo.py --model rpk_output_folder/network.rpk --labels custom_label.txt

実行結果

以下のようにオブジェクトを検出することができています。
今回のデータセットサンプルでは丸、四角、三角を対象としており、以下のように正しく検知できていることがわかります。
circle_crop.gif

rectangle_crop.gif

triangle_crop.gif

応用:自作データセットに置き換えるには?

.ini ファイル内の以下の項目を書き換えることで、任意のデータで学習が可能です。

  • [DATASET] NAME = YourDatasetName
  • [MODEL] CLASS_NUM = クラス数
  • [TRAINER] CONFIG = あなたのYAML設定ファイル

また、custom_label.txt も新しいクラスに応じて変更してください。

⭐️オリジナルデータの詳細な学習手順はこちら⭐️

1. データセット準備

データセットを準備します。
画像データはあらかじめ撮影して保存しておきます。この時点で学習用と評価用に画像のフォルダを分けて保存しておくとアノテーションする際に便利です。
本学習ツールはCOCO形式のアノテーションファイルをサポートしているので、対応したラベリングツールであればどれでも大丈夫です。

COCO形式のJSONファイルは以下のような構成になっています。

{
  "images": [
    {
      "id": 1,
      "file_name": "image001.jpg",
      "width": 416,
      "height": 416
    }
  ],
  "annotations": [
    {
      "id": 1,
      "image_id": 1,
      "category_id": 1,
      "bbox": [x, y, width, height]
    }
  ],
  "categories": [
    {
      "id": 1,
      "name": "class1"
    },
    {
      "id": 2,
      "name": "class2"
    }
  ]
}

Any Labelingなどを使った場合に、アノテーションファイルのクラス数が0ではなく、1から始まる形でラベリングが行われます。一方で、本ツールは0からの番号でラベリングファイルを読み込んでいます。

そのためクラス数の整合を保つために、コード側に以下の修正が必要になります。(ラベリングファイルのクラス数を修正していただくことも可能です。)

クラスIDマッピングの修正を以下に行います。
third_party/mct/coco_evaluation.py

# 修正前
labels = (output[2].numpy()).squeeze()

# 修正後  
labels = (output[2].numpy() + 1).squeeze()

2.データセットの配置

データセットを配置します。保存先はどちらでも大丈夫ですが今回は例として以下の構造で配置します。
dataディレクトリは新しく作成しています。

data/
└── your_dataset_name_coco/
    ├── train/
    │   └── (画像ファイル)
    ├── val/
    │   └── (画像ファイル)
    ├── annotations_train.json
    └── annotations_val.json

重要: 今回の例ではアノテーションファイルはデータセットの階層の上部に配置しています(train/valディレクトリ内ではありません)

3. 必要なファイル変更1 (データセットクラスの作成)

今回は、card_detection.pyをコピーして修正していきます。

class YourDataset:
    def __init__(self, config):
        self.config = config
        # 既存コードをコピー

    def setup(self):
        # こちらをオリジナルのデータセットパスに変更してください。
        self.data_path = "./data/your_dataset_name_coco"
        self.train_path = os.path.join(self.data_path, "train")
        self.valid_path = os.path.join(self.data_path, "val")
        self.annotations_path = self.data_path  

4. 必要なファイル変更2 (third_party/nanodet/your_dataset.pyの作成)

card_detection.pyをコピーして作成していきます。

class YourDataset:
    def _get_dir(self, cfg, is_train=True):
        if is_train:
            dir = copy.deepcopy(cfg.data.train)
            js = "annotations_train.json"  # 使用するファイル名に変更
            pt = self.train_path
        else:
            dir = copy.deepcopy(cfg.data.val)
            js = "annotations_val.json"   # 使用するファイル名に変更
            pt = self.valid_path

        dir["img_path"] = pt
        dir["ann_path"] = os.path.join(self.annotations_path, js)  # 重要!
        return dir

5. データセットのインポートを行います。

src/imx500_zoo/datasets/__init__.py に追加:

from imx500_zoo.datasets.your_dataset import YourDataset

6. INIファイルの作成

samples/your_dataset.ini を作成します。
クラス名,バッチサイズなどを変更します。
以下は変更する例となります。必須と書いているポイントはデータセットに応じて変更が必要な箇所になります。


[SOLUTION]
FRAMEWORK = keras
RETRAIN = True
VALIDATE = True

[MODEL]
NAME = NanodetPlus
INPUT_SIZE = 416
SCALE_FACTOR = 1.5
BOTTLENECK_RATIO = 0.5
FEATURE_CHANNELS = 128
# CLASS_NUM = 3
CLASS_NUM = 4 # カテゴリ数に変更
MEAN = [103.53, 116.28, 123.675]
STD = [57.375, 57.12, 58.395]

[DATASET]
NAME = YourDataset #クラス名(必須)

[TRAINER]
NAME = NanodetPlusTrainer
# BATCH_SIZE = 10
BATCH_SIZE = 3 #バッチ変更(必須)
NUM_WORKERS = 15
# NUM_EPOCHS = 20
NUM_EPOCHS = 50 #学習エポックをバッチ数の減少にあわせて増加(任意)
LEARNING_RATE = 1e-3
# CONFIG = ./config/nanodet-plus-m-1.5x_416_card.yml
CONFIG = ./config/nanodet-plus-m-1.5x_416_your_dataset.yml # Yamlファイルのパス(必須)

[QUANTIZER]
NAME = MctKeras
# BATCH_SIZE = 14
BATCH_SIZE = 2 # バッチ数(任意)
CALIB_ITERATIONS = 20

[VALIDATOR]
NAME = KerasObjectDetectionValidator
SCORE_THRESHOLD = 0.35

ちなみに、設定ファイルの中で書き換えなくていいパラメータ(MEAN,STD)がありますが以下の役割があります。

  • ImageNetデータセット(BGR順)における全画像の画素平均値であり、入力データの正規化(Normalization)に使用
  • 入力画像からこの値を減算してZero-centering(0を基準に正規化)を行い、データの分布を整える前処理パラメータ
  • 事前学習済みBackboneが学習した際の特徴量分布に入力データを一致させるために、転移学習ではそのままのパラメータを使用する必要がある

7. YAMLファイルの作成

samples/config/nanodet-plus-m-1.5x_416_your_dataset.yml を作成:

save_dir: workspace/nanodet-plus-m-1.5x_your_dataset
model:
  arch:
    head:
      num_classes: 4  # クラス数
    aux_head:
      num_classes: 4  # クラス数
data:
  train:
    name: CocoDataset
    img_path: data/your_dataset_name_coco/train
    ann_path: data/your_dataset_name_coco/annotations_train.json
    input_size: [416,416]
  val:
    name: CocoDataset
    img_path: data/your_dataset_name_coco/val
    ann_path: data/your_dataset_name_coco/annotations_val.json
    input_size: [416,416]
class_names: ['class1', 'class2', 'class3', 'class4']

実行

imx500_zoo samples/your_dataset.ini

学習結果と量子化後の精度は、aitrios-rpi-training-samples/resultsのjsonに保存されます。

image.png

学習が完了すると、aitrios-rpi-training-samples/modelにモデルが生成されます。

よくあるエラーとその対策

最後によくあるエラーについてまとめました。もし他に遭遇したエラーなどありましたらお気軽にコメントいただければと思います。

  • モデルのコンバート時にエラーになってしまう
    • 原因: sdsp.app.AppKt は Java 17 (class file version 61.0) でコンパイルされているため。
    • 対処方法: Javaのバージョンを Java 17 以上にアップデートする必要があります
Error: LinkageError occurred while loading main class sdsp.app.AppKt  
java.lang.UnsupportedClassVersionError: sdsp/app/AppKt has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

エラー発生時に以下のようにJava のバージョンを確認するとJava 17以下が使用されているかと思います。
image.png

その場合、以下のようにアップデートをする必要があります。

sudo apt install openjdk-17-jdk

困った時は

もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただければと思います。

もしRaspberryPiに関連する疑問がある場合は下記フォーラムも確認、活用できます。

まとめ

Raspberry Pi AI カメラで利用できるAIモデルの学習チュートリアルを一通り試してみました。
オリジナルの画像やデバイスに合わせてモデルを再学習・展開することで、さまざまなエッジAIアプリケーションに応用可能です。

ぜひ、あなた自身のユースケースにもチャレンジしていただければと思います。

最後まで記事を読んでいただきありがとうございました。
もしこの記事が参考になりましたらいいねしていただければと思います。

3
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?