こんにちは!ソニーセミコンダクタソリューションズ(SSS)の山田です。普段はAIを用いたアプリケーションの開発などをしています。
今回はAITRIOSのLocalStudioサービスの一つであるBrainBuilderとPiAICameraを使って、デジタルメータ検知(DigitalMeterDetection)を行います。
この記事を読んでわかること
- Brain Builder for AITRIOSの使い方
- PiAICameraの使い方
- ApplicationModuleLibraryの使い方
はじめに
インフラ系の現場では機器のメータを人が目視で読み取っており、苦労していると聞きます。
そこでこの記事では、BrainBuilderのDetector、RaspberryPiから出ているPiAICamera、Applicationを簡単に作れるApplicationModuleLibraryを使ってガスメータを読み取りを行います。
この記事は2025年3月16日時点の情報に基づいて作成されています。
BrainBuilder
BrainBuilderとはSSSのAITRIOSプラットフォーム上でエッジAIモデルを簡単に構築・トレーニングできるツールです。現在は画像分類、物体認識、異常検知等のモデル学習環境を用意しています。BrainBuilderを使うと簡単にPiAICamera上で動作するモデルの学習を行うことができるので、今回はこれを使っていきます!
基本的にはインストール手順から使用方法まで公式ドキュメントのGetStartedに記載されています。この記事では公式ドキュメントに従って進めていきます。
1.インストール&セットアップ
BrainBuilderのダウンロードページから各環境にあったインストーラをダウンロードします。5GB以上あるので、PCの容量をあけてからダウンロードしてみてください。 基本は有料サービスなのですが、10日間の無料トライアルから始めることができます。(2025/3月現在)
インストーラを起動して、指示に従ってインストールを進めます。
ライセンスの設定後、BrainBuilderを起動出来たら、アカウントを作成し、ログインします。
もし上手くインストールできなかった場合は公式のトラブルシューティングページをご覧ください。よくある不具合事例がまとめられています。
2.データセット作成
ログインするとこのような画面が出てくると思います。自分は既にプロジェクトがありますが、新規にモデルを作りたい場合は右上のプロジェクトを作成
をクリックします。
データセットの名前と使用するモデルタイプを選択します。今回はObjectDetectionを使ってデジタルメータ読み取りを行うので、Detector
を選択します
アップロードデータ
より、学習させたいデータをアップロードします。
3.アノテーション
アップロード出来たら次に、アノテーションというAIモデルに正解を教えてあげる作業を行います。
ここでの作業が今から作るAIモデルにとっての正解になるので、とても大切な作業です。BrainBuilderではUIから簡単にアノテーション作業ができます。とはいえ、何枚もの画像をアノテーションするのはなかなか大変ですが、根気よくアノテーションしていきます。
4.学習
一通りアノテーションを終えたら、いよいよモデルの学習です。と言ってもほとんどすることはなく、指示に従ってポチポチしていくだけで学習が始まります。
5.検証
学習が終わると、以下の様に検証結果を見ることができます。データセットの一部を学習に使わずに、検証用に振り分け、それを使って精度評価をしてくれます。この学習では同じ数字で角度を変えた画像を数枚学習させただけなので、100%になっています。
検証結果の詳細も見られます。100%となっていた通り、すべて検出されていることが分かります。
それでは学習に使っていない数字を認識させたらどうなるでしょうか?BrainBuilder内で試すことができます。
以下のテスト
に試したい画像をアップロードします。学習に使っていない数字を含んだ画像をアップロードしてみます。
以下のような結果になりました。0と1は正しく認識できていますが、2は検出されず、7は横の1と合わせて0と認識されてしまっています。今回の学習データでには0,8,1
しか入っていなかったので、このモデルにとってはこれ以外の数字は認識することができません。そのことから考えると今回の結果は納得です。
学習データセットの一部を使ったデータでの検証では、学習が上手く行ったかの判断はできますが、運用時の精度評価としてはまた別ものであることが分かります。当たり前のことではありますが、学習データセットと似たデータでの推論
は高い精度が出せ、学習データセットにないデータの推論
の精度は低くなります。なので、実際に使う環境を意識して、データセット収集、アノテーションを行う事が重要になりそうです。
6.モデルのエクスポート
それでは学習したモデルをAI Cameraに載せて動かしていきましょう!!
ちなみに先ほどのデータでは精度やクラス数で不十分だったので、データを集めて学習し直したモデルを使います。
AIモデルのダウンロード
をクリックしてモデルをダウンロードします。
様々なフォーマットでモデルがエクスポートされます。この後の作業ではモデル変換過程の中間生成物であるPackerOut.zip
を使います。
ちなみに”.keras”のモデルをNetronというアプリで開くと、以下の様にモデルの構造を見ることができます。このブロックのつながりにデータを流すことで、先ほどの様な推論が行われています。ワクワクしますね。
モデルのパッケージング
RPiの公式ページのPackagingを参考にモデルのパッケージングをして行きます。これはモデルをAI Cameraで動作させるために、RPKというファイルにパッケージングする作業です。先ほどダウンロードしたPackerOut.zip
を使います。
sudo apt install imx500-tools
imx500-package -i <path to packerOut.zip> -o <output folder>
# ex) imx500-package -i ./packerOut.zip -o ./digitalmeter
これで.rpk
が生成されればモデルの準備は完了です!!!
RaspberryPi AI Cameraの準備
RaspberryPi AICameraとはソニーが出しているIMX500をRaspberryPi用にモジュール化したものです。基本的には公式ドキュメントを参考にセットアップできます。ただ、英語なのでRaspberry Pi AI Cameraのセットアップ手順がとてもまとまっていて分かりやすいです。こちらの2章が完了すればOKです!
ApplicationModuleLibrary(ModLib)
ModLibとはAITRIOSから出している、IMX500向けのアプリケーションを簡単に実装できるライブラリです。今回はこれを使ってDigitalMeterDetectionを行ってみようと思います。まずはサンプルを動かしてみようと思います。
- git clone
git clone https://github.com/SonySemiconductorSolutions/aitrios-rpi-sample-app-gui-tool-client-dev
- ReadMeにある手順に従ってbuild
make build
sudo apt update && sudo apt full-upgrade
sudo apt install imx500-all
sudo apt install python3-opencv python3-munkres python3-picamera2
python -m venv .venv --system-site-packages
. .venv/bin/activate
pip install unify-<version>-py3-none-any.whl
- Exampleの実行
aitrios-rpi-application-module-library/examples/aicam/detector.py
のサンプルを実行してみます。ラズパイが出しているRaspberry Pi Model ZooのSSDMobileNetV2FPNLite320x320
を動かすサンプルです。
. .venv/bin/activate
python ./examples/aicam/detector.py
コードを見てみるととてもシンプルですね。これだけでAIモデルを動かせるのは有り難いです。
from modlib.apps import Annotator
from modlib.devices import AiCamera
from modlib.models.zoo import SSDMobileNetV2FPNLite320x320
device = AiCamera() #デバイス選択
model = SSDMobileNetV2FPNLite320x320() #モデル選択
device.deploy(model) #IMX500へデプロイ
#推論結果を表示するモジュール
annotator = Annotator(thickness=1, text_thickness=1, text_scale=0.4)
#推論開始
with device as stream:
for frame in stream: #1フレーム分のループ処理
detections = frame.detections[frame.detections.confidence > 0.55]
labels = [f"{model.labels[class_id]}: {score:0.2f}" for _, score, class_id, _ in detections]
annotator.annotate_boxes(frame, detections, labels=labels)
frame.display()
作成したモデルを動かしてみる
BrainBuilderのモデルをModLibを使って動かしてみたいと思います。基本的には先のサンプルで動かしたSSDMobileNetV2FPNLite320x320
と同じなのですが、BrainBuilderのモデルはoutput tensorの配列が違うので、そこだけ書き換えたclassを用意します。
他のモデルを動かしたいときはmodlib/models/zoo/models.py
にデフォルトで対応しているモデルclassがあるので、参考にしてみてください。
from modlib.apps import Annotator
from modlib.devices import AiCamera
from modlib.models import COLOR_FORMAT, MODEL_TYPE, Model, Detections
from modlib.models.post_processors import pp_od_bcsn
import numpy as np
* from typing import List
# BrainBuilderのモデル用のmodelクラス
class DigitalMeterDetection(Model):
def __init__(self, model_path, label_path):
super().__init__(
model_file=model_path,
model_type=MODEL_TYPE.RPK_PACKAGED,
color_format=COLOR_FORMAT.RGB,
preserve_aspect_ratio=False,
)
self.labels = np.genfromtxt(label_path, dtype=str, delimiter="\n")
def pre_process(self, image: np.ndarray) -> np.ndarray:
raise NotImplementedError("Pre-processing not implemented for this model.")
# BrainBuilderモデルのoutput tensorの並びは Boxes - Classes - Scores - Numberなのでbcsnを選択
def post_process(self, output_tensors: List[np.ndarray]) -> Detections:
return pp_od_bcsn(output_tensors)
## 以降は基本的に先ほどのサンプルと同じ
device = AiCamera()
# 作成したDMDモデル用のクラス呼び出し
model = DigitalMeterDetection(
# 先ほど作成したrpkへのpath
model_path="/home/pi/ws/DigitalMeter-imx500/dm/dmd_v1.rpk",
# BrainBuilderで生成されたlebels.txtへのPATH
label_path=f"/home/pi/ws/DigitalMeter-imx500/labels.txt"
)
device.deploy(model)
annotator = Annotator(thickness=1, text_thickness=1, text_scale=0.4)
with device as stream:
for frame in stream:
detections = frame.detections[frame.detections.confidence > 0.55]
print(detections)
labels = [f"{model.labels[class_id]}: {score:0.2f}" for _, score, class_id, _ in detections]
annotator.annotate_boxes(frame, detections, labels=labels)
frame.display()
結果
いざ動作チェック!
ガスメータの前でラズパイ&電源をもってうろうろするわけにはいかなかったので、ディスプレイにガスメータを写したものを検出させました。
ちゃんと検出してますね!成功です!
おわりに
BrainBuilder、PiAICamera、ApplicationModuleLibraryを使って、デジタルメータ検知を行いました。実際の現場ではデジタルメータを人が目視で読み取っており、手間がかかっているケースがあると聞きます。メータ自体をIoT化する手もあると思いますが、Raspberry PiとAICameraを置くだけのソリューションもコストメリットの観点から一つの選択肢になるのではないでしょうか。
また、実は今回一番苦労したのがデータセットを集めるところでした。自宅のガスメータだとあまり数字が変わらず、数字のバラエティーを集めるのが大変でした。(いつもより長めにシャワーを浴びてみたのですが…)
結局は同僚にガスメータを送ってもらったり、数字部分だけを加工してデータセットを作りました。おそらく実運用する際にもこのような課題は出てくると思います。最近では今あるデータセットを元に、欲しいデータを生成することも簡単に出来るので、次はそれを試してみたいと思います。
困った時は
もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。
また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。