はじめに
こんにちは!
ソニーセミコンダクタソリューションズの平尾と申します。
2024年9月にRaspberry Pi AI Cameraが発売されました。このカメラを使うことで、エッジ環境でのAIモデル活用が手軽かつ簡単に実現できるようになりました。
AIを活用して「あったらいいな」と思うアプリケーションの1つに、冷蔵庫の在庫管理があるのではないでしょうか。「あるはず」と思い込んで帰宅したのに、実際には材料が足りなかった時の絶望感は、皆さん1回は経験されていることと思います (筆者は毎月のように経験しています…) 。
そこで今回は、Raspberry Pi AI CameraとRaspberry Pi Zero 2 W (以下、Pi Zero 2 W) を使用して、冷蔵庫内の在庫管理アプリケーションを開発しました!設置スペースを最小限に抑えるため、コンパクトなPi Zero 2 Wを採用しています。
本記事では、2種類のAIモデルを使用します。1つ目はRaspberry Pi財団がオープンソースとして公開しているOSSモデル、2つ目はユーザー独自のニーズに対応できるよう、ソニーセミコンダクタソリューションズが提供するBrain Builderで作成したカスタムモデルです。Brain Builderとは、AIの専門知識がなくてもGUIの操作だけで簡単にAIモデルを作成できる開発ツールです。Brain Builderに関する詳細は公式サイトを確認ください。
アプリケーション例は以下のとおりです。冷蔵庫内の在庫を検出し、定時に在庫情報をメールにて配信します。

この記事でできること
- Raspberry Pi AI Cameraを使用した物体検出アプリケーションの実行
- 本記事で作成するコードはこちら
- Raspberry Pi AI Cameraの推論結果をもとにした在庫通知システムの構築
- Brain Builderを使用した物体認識モデル作成
- Raspberry Pi AI CameraでのBrain Builderモデルの制御
必要機材
必要機材のリストは以下のとおりです。
Item | 必須 | メモ | |
---|---|---|---|
1 | Raspberry Pi AI Camera | * | 購入先はこちら |
2 | Raspberry Pi | * | 本記事ではPi Zero 2 Wを使用しています。対応可能機種はこちら |
3 | mini USBケーブル | * | 電源接続用 |
4 | micro SDカード | * | 32GB以上推奨 |
5 | モバイルバッテリー | * | Raspberry Piへの電源供給用 |
6 | マウス | 開発で必要な方のみ | |
7 | モニタ | 開発で必要な方のみ | |
8 | キーボード | 開発で必要な方のみ | |
9 | HDMIケーブル | 開発で必要な方のみ |
セットアップ
Raspberry Pi Imageの書き込み
Raspberry Pi OS Imager (ダウンロード先) を使うことで、SDカードへのOSイメージの書き込みができます。Windows、MacOS、Ubuntu対応です。
手順はこちらを参照ください。
Raspberry Pi AI Cameraセットアップ
Raspberry Pi AI Cameraの同封物は画像のとおりです。

- Raspberry Pi AI Camera
- mipi DSIケーブル ディスプレイ用FPC (Standard - Standard 20cm)
- Raspberry Pi 4シリーズに接続する場合はこちらのケーブルを使用します。
- mipi DSIケーブル ディスプレイ用FPC (Standard - Mini 20cm)
- Raspberry Pi 5、Pi Zeroシリーズに接続する場合はこちらのケーブルを使用します
- 小型フォーカス調整工具
- 工具をはめ込み、回すことでフォーカスの調整が可能です。
Raspberry Pi AI CameraとRaspberry Piを画像のように接続します。


ケーブルには表裏があります。接続の際は注意してください。

接続後、Raspberry Piの公式ドキュメントの手順に沿ってセットアップを進めてください。
動作確認
正しく接続できているかの確認のためにサンプルスクリプトを動かすことができます。物体検出のサンプルスクリプトを試す場合は以下のコードを実行します。
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
実行結果は以下のとおりです。画像内のリンゴの検知が正しく行えていることが確認できます。

実装
概要
本記事では物体検出モデルを使用し、冷蔵庫内のペットボトルの個数をカウントし、毎日定時に在庫情報をメールで通知するシステムを作っていきます。筆者自身コーヒーが大好きで、ボトルコーヒーを常備していますが、買い忘れることもしばしば、、、。忘れずに買って帰るシステムを作りましょう!
Raspberry Pi AI Camera撮影スクリプト
物体検出には、Raspberry Pi AI Cameraセットアップ時にインストールされる物体認識のサンプルモデルの1つであるnanodet_plus_416×416.rpk
を使用します。モデルの一覧はusr/share/imx500-models
ディレクトリで確認できます。
このモデルはcocoデータセットで学習されており、そのラベルの1つにbottle
が含まれています。このラベルを用いてペットボトルの個数カウントを実装します。
物体検出のコードについては、Raspberry Pi財団が公開している物体認識のサンプルスクリプトを参考にします。まず、以下のコマンドでスクリプトをクローンします。
git clone https://github.com/raspberrypi/picamera2.git
動作確認は以下のコマンドで実行できます。
python picamera2/examples/imx500imx500_object_detection_demo.py --model=/usr/share/imx500-models/imx500_network_nanodet_plus_416×416.rpk
実行結果は以下のとおりです。ペットボトルの検出が正しく行えていることが確認できます。(ついでに下のテーブルまで検知されていますね!)

もちろん、複数個の検出も可能です。

Pi Zero 2 Wではプレビューを表示し続けると動作が重くなる場合があります。その場合はpicam2.start(config, show_preview=True)
をpicam2.start(config, show_preview=False)
に変更してください。
検出結果の解析
実装の前にRaspberry Pi AI Cameraの物体検出モデルの出力について確認します。カメラからの出力はparse_detections
関数のnp_outputs
で受け取り、結果はlast_detections
に格納されます。
last_detections
にはDetection
クラスのオブジェクトとして、検出サンプルごとのデータが格納されます。Detection
クラスのデータメンバは以下のとおりです。
-
category
:検出サンプルのカテゴリ -
conf
:検出結果の確信度 (confidence score) -
box
:検出結果の位置情報 (x,y,w,h)
よって、人の検出情報はcategory = bottle
の有無によって判定できます。
在庫情報取得システム
一般的な冷蔵庫では、扉を開けるとライトが点灯し、閉めた後は一定時間経過すると消灯する仕組みになっています。この特性を考慮すると、ライトが消灯した状態では光量不足により、AIの誤推論が発生する可能性があります。一方で、扉を閉める直前から閉めた直後の期間は、冷蔵庫内のライトが点灯した状態となり、扉を閉める直前からライトの消灯までの時間が最も良好な撮影環境になります。また、冷蔵庫のドアが閉まっている間は基本的に在庫状況が変化することはないため、最後に開閉したタイミングの推論結果を最新の在庫情報として管理するのが効率的です。
では、どのようにして扉の開閉の情報を取得すれば良いでしょうか?Raspberry Piに加速度センサなどの外部センサを接続して検知する方法も考えられますが、本プロジェクトではRaspberry Pi AI Cameraのみを使用する方針で進めます。具体的には、カメラで撮影した画像の画素値を分析して開閉状態を判定します。
扉の開閉検知方法
まず、冷蔵庫を開けた状態と閉めた状態でそれぞれ撮影を行い、画像の画素値の平均を計測します。この情報をもとに適切な閾値を設定し、以下のロジックで開閉状態を判定します:
- 画素値の平均が閾値より高い → 扉が開いている状態 (ライト点灯)
- 画素値の平均が閾値以下 → 扉が閉じている状態 (ライト消灯)
そして、画素値の平均が閾値以下になる直前の数フレーム分 (つまり、扉を閉める直前の明るい状態) の画像を入力とした物体検出の結果をもとに最新の在庫情報を更新します。
実装は以下のとおりです。スクリプト内の以下の2点は自身の環境に合わせて変更してください。
- num_frames:検出に使用するフレーム数、検出精度が悪い場合に調整
- img_threshold:ライトの点灯/消灯の閾値
from collections import deque
import threading
detection_label = "bottle"
num_frames = 30 # Number of frames to retain
check_detections = deque(maxlen=num_frames) # Store detection data for the past num_frames frames
latest_frame = 0 # Store the average pixel value of the latest frame (for calculation)
current_status = None # Status used for notifications
img_threshold = 45 # Threshold for average pixel value
def check_outofstack():
"""
Check if objects are out of stock based on detection history.
Updates status when stock level changes are detected.
"""
global current_status
if latest_frame > img_threshold:
Append_last_detections()
else:
if len(check_detections) != 0:
current_status = max(sublist.count(detection_label) for sublist in check_detections)
# Check for objects in detection area
def Append_last_detections():
"""
Append detected objects to the detection history queue.
Extracts labels from current detections and adds them to the history.
"""
global check_detections
tmp_list = []
detections = last_detections
labels = get_labels()
if detections == []:
check_detections.append([])
return
else:
for detection in detections:
tmp_list.append(labels[int(detection.category)])
check_detections.append(tmp_list)
return
メール通知機能
最後に、ユーザーの利便性を高めるためのメール通知機能を実装します。この機能により、ユーザーが設定した時間に冷蔵庫の最新在庫情報を毎日定期的にメールで受け取ることができます。これにより、仕事終わりなど外出先から冷蔵庫の在庫情報を確認できます。配信時間はdelivery_time
を変更することで設定可能です。また、送信者側のメールアドレスはGmail
の使用を想定しています。
メール通知の実装
Pythonの標準ライブラリであるsmtplib
とemail
パッケージを使用して、シンプルなメール送信機能を実装します。また、定期実行にはschedule
ライブラリを活用します。メールの内容については変更可能です。
スクリプト内の以下の3点は自身の環境に合わせて変更してください。
-
sender
:送信側のメールアドレス (Gmailを想定した実装になっています。) -
password
:Gmailのアプリパスワード (取得方法は公式サイトを確認ください。) -
receiver
:受信側のメールアドレス
import schedule
import time
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
# Email settings
delivery_time = "18:00"
sender = "Sender's_Email_Address (gmail)"
password = "Your_own_Password" # For Gmail, use app password
receiver = "Recipient's_Email_Address"
def send_email():
# Create email content
if current_status == None:
subject = "AICamera_demo_在庫連絡"
body = "在庫情報未検出です"
elif current_status == 0:
subject = "AICamera_demo_在庫連絡"
body = "在庫なし!!買って帰ろう!!!!"
else :
subject = "AICamera_demo_在庫連絡"
body = "在庫は残り"+str(current_status)+"個です"
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = receiver
msg['Date'] = formatdate()
# Send email
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
smtp.login(sender, password)
smtp.send_message(msg)
print(f"メール送信成功: {time.strftime('%Y-%m-%d %H:%M:%S')}")
except Exception as e:
print(f"エラー発生: {e}")
def schedule_task():
while True:
schedule.run_pending()
time.sleep(1)
今回作成したコードはこちらから取得可能です。
Brain Builderを用いたAIモデル作成
データ収集
本記事ではBrain Builderを用いて冷蔵庫内の卵の個数カウントを行うモデルの作成を行います。なお、卵の学習データについてはOpen Images Dataset V7を用いて集めています。集めたデータのサンプルは以下のとおりです。Brain Builderの物体検出AIモデルの学習には、ラベルごとに150枚程度の画像が必要なため、本記事では150枚のデータを集めて学習します。こちらをzipとしてまとめておきます。
Brain Builderのインストール
Brain Builderはこちらからインストール可能です。クラス分類(Classifier)と物体検出(Detector)についてはフリートライアル期間がありますので、まずはそちらで試していきます。インストール後、こちらの手順に沿って環境構築を行ってください。
プロジェクトの作成
Brain Builderではプロジェクト単位でデータセット・AIモデルを管理します。まずは新規プロジェクトを作成してみましょう。
-
画面右上の
プロジェクトを作成
をクリックします。ポップアップが表示されるので任意のプロジェクト名を設定してください (本記事ではEgg_Detector
としています) 。 -
画面右上の
データセットの作成
をクリックします。任意のデータセット名を設定し、モデルタイプはDetector
を選択します。 -
ダッシュボードが表示されるので、画面右上の
アップロードデータ
を選択し、参照
より先ほど用意したzipファイルを選択し、アップロードの開始
を行います。これでプロジェクトの作成とデータ準備は完了です。
学習
Detectorの学習では学習データに対してラベリングを行う必要があります。ラベリングについてはBrain Builder内で行うことができます。ラベリングから学習の流れは以下のとおりです。
-
注釈
タブを選択し、右上の+ ボタン
から新しいクラスの追加を行い、任意のクラス名のクラスを追加します (本記事ではEgg
としています) 。 -
画面に表示されている画像内の検出物体の領域にBoundingBoxを作成し、ラベルを選択します。画面右上の
<>
から画像を切り替えながら、学習データすべてにラベリングを行います。 -
学習
タブを選択し、ラベリングしたデータをもとにAIモデルの学習を行います。学習の際はパラメータとしてクイック (Quick)
,バランス型 (Balanced)
,徹底的 (Through)
が選択可能です。選択後、右下の
学習
から学習を開始することができます。 -
学習終了後、
評価
タブから学習の結果が確認できます。また、画面下部の検証画像から評価データごとの推論結果が確認可能です。いくつか確認してみると、概ね正しく認識できているようですね。
AIモデルのダウンロード
-
エクスポート
タブを選択し、AIモデルのダウンロード
から作成したAIモデルをzip形式でダウンロードします。 -
zipファイルを展開し、中身を確認します。今回使用するのは以下の2つのファイルです。この2つのファイルはRaspberry Pi AI Camera側で使用するので、転送しておいてください。
- packerOut.zip
- labels.txt
Package処理
作成したAIモデルをRaspberry Pi AI Cameraで動かすために.rpk
形式へと変換します。変換の手順についてはこちらを参照してください。本記事ではnetwork.rpk
として保存しています。
撮影スクリプト
Brain Builderで作成したAIモデルを動かすコードについては、私たちソニーセミコンダクタソリューションズが公開しているgithubから取得可能です。以下のコマンドでスクリプトをクローンします。
git clone https://github.com/SonySemiconductorSolutions/aitrios-rpi-model-zoo.git
aitrios-rpi-model-zoo/models/object-detection/brainbuilder
に移動し、先ほど作成した.rpk
ファイルを配置します。その後、以下のコードで動作確認が可能です。
python app.py --model=network.rpk
実行結果は以下のとおりです。卵が正しく検出できていることが確認できます。

動作確認ができたので、在庫情報を通知するためにスクリプトを修正します。内容についてはOSSモデルの時と同様のため割愛します。最終的なコードはこちらから取得可能です。
実験
OSSモデルを使用した結果
実際に作成したコードを動かして動作確認をしてみましょう。冷蔵庫にペットボトルをいくつか用意しました。ペットボトルの配置に応じてRaspberry Pi AI Cameraを設置します。ちなみにRaspberry Piの耐久温度は0 - 80度となっており、冷蔵庫内でも動作可能です。
冷蔵庫内では以下のように配置しています。

物体検出結果
bottle
が3本の場合の実行結果ですが、冷蔵庫の扉が閉まる直前に正しく個数がカウントできています。(ついでに冷蔵庫の検出もできていますね。)

通知結果
次に通知の確認をしてみます。デバッグのために冷蔵庫の開け閉めのたびに通知が来るような変更をしてコードを実行しました。デバッグ用のコードはgithub内のapp_debug.py
として掲載しています。冷蔵庫内のペットボトルの個数を4個→2個→0個と変更しながら3回通知検証をしてみました。結果3回とも正しく検出結果の通知ができました。
Brain Builderモデルを使用した結果
次にBrain Builderで作成したモデルの動作確認をします。冷蔵庫内に卵を用意し、配置に合わせてRaspberry Pi AI Cameraの設置位置も変更しました。

物体検出結果
Egg
が3つの場合の実行結果ですが、bottle
の時と同様、冷蔵庫の扉が閉まる直前に正しく個数がカウントできています。

通知結果
実行結果は以下のとおりです。Egg
の数を3個→0個と変化させて確認してみました。bottle
の時と同様、通知も正しく行えていますね!
まとめ
今回はRaspberry Pi AI CameraとPi Zero 2 Wを使用して冷蔵庫内の在庫管理アプリケーションを作ってみました。bottle
の検知についてはOSSモデルでお手軽にできるので、ぜひお試しください。また、冷蔵庫の在庫管理といえば今回試したペットボトルや卵だけでなく、牛乳、調味料などなど個人によって検知したいものが異なると思います。その場合は、ぜひBrain Builderを使用したAIモデル作成を試していただければと思います!
困った時は
もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。
また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
RaspberryPiに関連する疑問がある場合は、下記フォーラムをご確認、ご活用ください。