110
94

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RaspberryPi AI Cameraで冷蔵庫の在庫管理してみた。

Last updated at Posted at 2025-06-10

はじめに

こんにちは!

ソニーセミコンダクタソリューションズの平尾と申します。

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に関する詳細は公式サイトを確認ください。

アプリケーション例は以下のとおりです。冷蔵庫内の在庫を検出し、定時に在庫情報をメールにて配信します。

title

この記事でできること

  • 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の同封物は画像のとおりです。

AICamera
  • 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を画像のように接続します。

AICamera_connect Raspi_connect

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

Raspi_cable

接続後、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

実行結果は以下のとおりです。画像内のリンゴの検知が正しく行えていることが確認できます。

detection_sample_apple

実装

概要

本記事では物体検出モデルを使用し、冷蔵庫内のペットボトルの個数をカウントし、毎日定時に在庫情報をメールで通知するシステムを作っていきます。筆者自身コーヒーが大好きで、ボトルコーヒーを常備していますが、買い忘れることもしばしば、、、。忘れずに買って帰るシステムを作りましょう!

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

実行結果は以下のとおりです。ペットボトルの検出が正しく行えていることが確認できます。(ついでに下のテーブルまで検知されていますね!)

one_bottle_sample

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

bottle_sample

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のみを使用する方針で進めます。具体的には、カメラで撮影した画像の画素値を分析して開閉状態を判定します。

扉の開閉検知方法

まず、冷蔵庫を開けた状態と閉めた状態でそれぞれ撮影を行い、画像の画素値の平均を計測します。この情報をもとに適切な閾値を設定し、以下のロジックで開閉状態を判定します:

  1. 画素値の平均が閾値より高い → 扉が開いている状態 (ライト点灯)
  2. 画素値の平均が閾値以下 → 扉が閉じている状態 (ライト消灯)

そして、画素値の平均が閾値以下になる直前の数フレーム分 (つまり、扉を閉める直前の明るい状態) の画像を入力とした物体検出の結果をもとに最新の在庫情報を更新します。

実装は以下のとおりです。スクリプト内の以下の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の標準ライブラリであるsmtplibemailパッケージを使用して、シンプルなメール送信機能を実装します。また、定期実行には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としてまとめておきます。

データセット例
egg_dataset

Brain Builderのインストール

Brain Builderはこちらからインストール可能です。クラス分類(Classifier)と物体検出(Detector)についてはフリートライアル期間がありますので、まずはそちらで試していきます。インストール後、こちらの手順に沿って環境構築を行ってください。

プロジェクトの作成

Brain Builderではプロジェクト単位でデータセット・AIモデルを管理します。まずは新規プロジェクトを作成してみましょう。

  1. 画面右上のプロジェクトを作成をクリックします。ポップアップが表示されるので任意のプロジェクト名を設定してください (本記事ではEgg_Detectorとしています) 。

    make_project
  2. 画面右上のデータセットの作成をクリックします。任意のデータセット名を設定し、モデルタイプはDetectorを選択します。

    made_project make_dataset
  3. ダッシュボードが表示されるので、画面右上のアップロードデータを選択し、参照より先ほど用意したzipファイルを選択し、アップロードの開始を行います。これでプロジェクトの作成とデータ準備は完了です。

    upload_dataset

学習

Detectorの学習では学習データに対してラベリングを行う必要があります。ラベリングについてはBrain Builder内で行うことができます。ラベリングから学習の流れは以下のとおりです。

  1. 注釈タブを選択し、右上の + ボタンから新しいクラスの追加を行い、任意のクラス名のクラスを追加します (本記事ではEggとしています) 。

    labeling_initialize
  2. 画面に表示されている画像内の検出物体の領域にBoundingBoxを作成し、ラベルを選択します。画面右上の<>から画像を切り替えながら、学習データすべてにラベリングを行います。

    labeling
  3. 学習タブを選択し、ラベリングしたデータをもとにAIモデルの学習を行います。学習の際はパラメータとしてクイック (Quick), バランス型 (Balanced), 徹底的 (Through)が選択可能です。

    train_initialize

    選択後、右下の学習から学習を開始することができます。

    training_term
  4. 学習終了後、評価タブから学習の結果が確認できます。

    evaluate

    また、画面下部の検証画像から評価データごとの推論結果が確認可能です。いくつか確認してみると、概ね正しく認識できているようですね。

    result_sample4 result_sample5

AIモデルのダウンロード

  1. エクスポートタブを選択し、AIモデルのダウンロードから作成したAIモデルをzip形式でダウンロードします。

    export_ai_model
  2. 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

実行結果は以下のとおりです。卵が正しく検出できていることが確認できます。

egg_sample

動作確認ができたので、在庫情報を通知するためにスクリプトを修正します。内容についてはOSSモデルの時と同様のため割愛します。最終的なコードはこちらから取得可能です。

実験

OSSモデルを使用した結果

実際に作成したコードを動かして動作確認をしてみましょう。冷蔵庫にペットボトルをいくつか用意しました。ペットボトルの配置に応じてRaspberry Pi AI Cameraを設置します。ちなみにRaspberry Piの耐久温度は0 - 80度となっており、冷蔵庫内でも動作可能です。

冷蔵庫内では以下のように配置しています。

bottle_setup

物体検出結果

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

bottle_refrigirator

通知結果

次に通知の確認をしてみます。デバッグのために冷蔵庫の開け閉めのたびに通知が来るような変更をしてコードを実行しました。デバッグ用のコードはgithub内のapp_debug.pyとして掲載しています。冷蔵庫内のペットボトルの個数を4個→2個→0個と変更しながら3回通知検証をしてみました。結果3回とも正しく検出結果の通知ができました。

在庫数4個の場合
bottle_4_stock

在庫数2個の場合
bottle_2_stock

在庫数0個の場合
bottle_0_stock

Brain Builderモデルを使用した結果

次にBrain Builderで作成したモデルの動作確認をします。冷蔵庫内に卵を用意し、配置に合わせてRaspberry Pi AI Cameraの設置位置も変更しました。

egg_setup

物体検出結果

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

egg_refrigirator

通知結果

実行結果は以下のとおりです。Eggの数を3個→0個と変化させて確認してみました。bottleの時と同様、通知も正しく行えていますね!

在庫数3個の場合
egg_3_stock

在庫数0個の場合
egg_0_stock

まとめ

今回はRaspberry Pi AI CameraとPi Zero 2 Wを使用して冷蔵庫内の在庫管理アプリケーションを作ってみました。bottleの検知についてはOSSモデルでお手軽にできるので、ぜひお試しください。また、冷蔵庫の在庫管理といえば今回試したペットボトルや卵だけでなく、牛乳、調味料などなど個人によって検知したいものが異なると思います。その場合は、ぜひBrain Builderを使用したAIモデル作成を試していただければと思います!

困った時は

もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。

また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。

RaspberryPiに関連する疑問がある場合は、下記フォーラムをご確認、ご活用ください。

110
94
0

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
110
94

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?