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

<!-----------------
記事本文は下記レビュー観点を意識したうえで、自由に記載してください。 
 - [ ] 非公開情報はないか
 - [ ] 社内用語が使われていないか
 - [ ] 共通ワーディングを利用しているか
 - [ ] 技術的間違いがないか
 - [ ] リンク切れを起こしていないか
 - [ ] 政治、宗教等センシティブな領域に言及していないか (CATOPE対応)
 - [ ] 文体の統一/誤字チェック（JustRight対応）
 - [ ] その他不適切な表現・内容が含まれていないか
 - [ ]  問い合わせに関する文言を記載しているか  　
------------------->  

## はじめに

こんにちは！

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

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に関する詳細は[公式サイト](https://developer.aitrios.sony-semicon.com/en/studio/brain-builder)を確認ください。

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

<img width="1200" alt="title" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/06915321-84e3-4ec1-a089-f9e2a995be4b.png">

## この記事でできること
- Raspberry Pi AI Cameraを使用した物体検出アプリケーションの実行
    - 本記事で作成するコードは[こちら](https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/tree/main/examples/outofstock-detection)
- Raspberry Pi AI Cameraの推論結果をもとにした在庫通知システムの構築
- Brain Builderを使用した物体認識モデル作成
- Raspberry Pi AI CameraでのBrain Builderモデルの制御

## 必要機材
必要機材のリストは以下のとおりです。
|    |  Item  |  必須  |  メモ  |
| ---- | ---- | ---- | ---- |
|  1  |  Raspberry Pi AI Camera  |  *  |  購入先は[こちら](https://www.raspberrypi.com/products/ai-camera/)  |
|  2  |  Raspberry Pi  |  *  | 本記事ではPi Zero 2 Wを使用しています。対応可能機種は[こちら](https://www.raspberrypi.com/documentation/accessories/ai-camera.html#prerequisites)  |
|  3  |  mini USBケーブル  |  *  | 電源接続用  |
|  4  |  micro SDカード  |  *  | 32GB以上推奨  |
|  5  |  モバイルバッテリー  |  *  | Raspberry Piへの電源供給用  |
|  6  |  マウス  |    | 開発で必要な方のみ  |
|  7  |  モニタ  |    | 開発で必要な方のみ  |
|  8  |  キーボード  |    | 開発で必要な方のみ  |
|  9  |  HDMIケーブル  |    | 開発で必要な方のみ  |

## セットアップ

### Raspberry Pi Imageの書き込み
Raspberry Pi OS Imager ([ダウンロード先](https://www.raspberrypi.com/software/)) を使うことで、SDカードへのOSイメージの書き込みができます。Windows、MacOS、Ubuntu対応です。
手順は[こちら](https://www.raspberrypi.com/software/)を参照ください。

### Raspberry Pi AI Cameraセットアップ
Raspberry Pi AI Cameraの同封物は画像のとおりです。

<img width="1200" alt="AICamera" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/da018aa3-8295-4a50-844c-468daaf90a05.jpeg">

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

<img width="1200" alt="AICamera_connect" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/2b38fa8f-7bea-41f7-a92d-e5555e4e4b32.jpeg">

<img width="1200" alt="Raspi_connect" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/7ad2c0a7-f768-4da3-b509-23aab010126d.jpeg">

:::note warn 

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

:::

<img width="1200" alt="Raspi_cable" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/a1410b17-4e71-49fc-b849-a8a48cbb9b80.png">

接続後、Raspberry Piの[公式ドキュメント](https://www.raspberrypi.com/documentation/accessories/ai-camera.html#ai-camera)の手順に沿ってセットアップを進めてください。

### 動作確認
正しく接続できているかの確認のためにサンプルスクリプトを動かすことができます。物体検出のサンプルスクリプトを試す場合は以下のコードを実行します。

`rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30`

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

<img width="1200" alt="detection_sample_apple" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/5f084a29-bb10-4f5a-bbd7-7f7ec37fc150.png">

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

### Raspberry Pi AI Camera撮影スクリプト
物体検出には、Raspberry Pi AI Cameraセットアップ時にインストールされる物体認識のサンプルモデルの1つである`nanodet_plus_416×416.rpk`を使用します。モデルの一覧は`usr/share/imx500-models`ディレクトリで確認できます。

このモデルは[cocoデータセット](https://cocodataset.org/#home)で学習されており、そのラベルの1つに`bottle`が含まれています。このラベルを用いてペットボトルの個数カウントを実装します。

物体検出のコードについては、Raspberry Pi財団が公開している[物体認識のサンプルスクリプト](https://github.com/raspberrypi/picamera2/tree/f6b356357dcee4a20045858154daa1978082ab70/examples/imx500)を参考にします。まず、以下のコマンドでスクリプトをクローンします。

```bash
git clone https://github.com/raspberrypi/picamera2.git
```

動作確認は以下のコマンドで実行できます。

```bash
python picamera2/examples/imx500imx500_object_detection_demo.py --model=/usr/share/imx500-models/imx500_network_nanodet_plus_416×416.rpk
```

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

<img width="1200" alt="one_bottle_sample" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/b7c46fa4-8680-4c73-ac81-753ebdc35e35.jpeg">

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

<img width="1200" alt="bottle_sample" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/51410529-07f7-48cf-90e0-72e8a837f8aa.jpeg">

::: note warn

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：ライトの点灯/消灯の閾値

```Python
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のアプリパスワード (取得方法は[公式サイト](https://support.google.com/mail/answer/185833?hl=ja)を確認ください。)
- `receiver`：受信側のメールアドレス

```python
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)
```

今回作成したコードは[こちら](https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/tree/main/examples/outofstock-detection)から取得可能です。

## Brain Builderを用いたAIモデル作成
### データ収集
本記事ではBrain Builderを用いて冷蔵庫内の卵の個数カウントを行うモデルの作成を行います。なお、卵の学習データについては[Open Images Dataset V7](https://storage.googleapis.com/openimages/web/index.html)を用いて集めています。集めたデータのサンプルは以下のとおりです。Brain Builderの物体検出AIモデルの学習には、ラベルごとに150枚程度の画像が必要なため、本記事では150枚のデータを集めて学習します。こちらをzipとしてまとめておきます。

**データセット例**
<img width="1200" alt="egg_dataset" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/6ef7fc6c-f46d-4fb2-b431-90682b68546d.png">

### Brain Builderのインストール
Brain Builderは[こちら](https://developer.aitrios.sony-semicon.com/en/studio/brain-builder)からインストール可能です。クラス分類(Classifier)と物体検出(Detector)についてはフリートライアル期間がありますので、まずはそちらで試していきます。インストール後、[こちら](https://developer.aitrios.sony-semicon.com/en/studio/get-started-guide)の手順に沿って環境構築を行ってください。

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

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

    <img width="1200" alt="make_project" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/fba6ac54-18f5-41e8-9b14-0a977099545a.png">

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

    <img width="1200" alt="made_project" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/a620191f-48a9-4d5d-a604-50e59e70785a.png">

    <img width="1200" alt="make_dataset" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/b8fca3bb-500d-4251-ab1c-eb2b1f04f63e.png">

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

    <img width="1200" alt="upload_dataset" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/0a988429-8754-4679-8af1-aac8294182aa.png">

### 学習
Detectorの学習では学習データに対してラベリングを行う必要があります。ラベリングについてはBrain Builder内で行うことができます。ラベリングから学習の流れは以下のとおりです。
1. `注釈`タブを選択し、右上の` + ボタン`から新しいクラスの追加を行い、任意のクラス名のクラスを追加します (本記事では`Egg`としています) 。

    <img width="1200" alt="labeling_initialize" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/51d1da21-377b-4fd4-ba73-372b14958401.png">

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

    <img width="1200" alt="labeling" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/e472e3a5-f2d7-4dbe-9577-9bd2585f2916.gif">


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

    <img width="1200" alt="train_initialize" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/fb854224-9927-4626-823d-2316f945f505.png">

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

    <img width="1200" alt="training_term" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/6d708d33-caf7-4d48-96d7-f3046b28b048.png">

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

    <img width="1200" alt="evaluate" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/c19bbf99-993a-4a39-9c00-530522b41228.png">
   
   また、画面下部の検証画像から評価データごとの推論結果が確認可能です。いくつか確認してみると、概ね正しく認識できているようですね。

    <img width="1200" alt="result_sample4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/e0eef21f-ae1e-4bc5-b85e-3b21c5e1e92f.png">

    <img width="1200" alt="result_sample5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/70c55cdb-2b02-4450-9d78-5191f97e2a7c.png">

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

    <img width="1200" alt="export_ai_model" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/ff7ee961-16d6-403a-a798-a06693a9da0f.png">

2. zipファイルを展開し、中身を確認します。今回使用するのは以下の2つのファイルです。この2つのファイルはRaspberry Pi AI Camera側で使用するので、転送しておいてください。
    - packerOut.zip
    - labels.txt

### Package処理
作成したAIモデルをRaspberry Pi AI Cameraで動かすために`.rpk`形式へと変換します。変換の手順については[こちら](https://developer.aitrios.sony-semicon.com/en/raspberrypi-ai-camera/documentation/imx500-packager)を参照してください。本記事では`network.rpk`として保存しています。

### 撮影スクリプト
Brain Builderで作成したAIモデルを動かすコードについては、私たちソニーセミコンダクタソリューションズが公開している[github](https://github.com/SonySemiconductorSolutions/aitrios-rpi-model-zoo/tree/main/models/object-detection/brainbuilder)から取得可能です。以下のコマンドでスクリプトをクローンします。

```
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
```

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

<img width="1200" alt="egg_sample" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/d7d074d3-c992-400d-81f3-5097da6ce202.jpeg">

動作確認ができたので、在庫情報を通知するためにスクリプトを修正します。内容についてはOSSモデルの時と同様のため割愛します。最終的なコードは[こちら](https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/tree/main/examples/outofstock-detection)から取得可能です。

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

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

<img width="1200" alt="bottle_setup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/6293afad-40a6-46fe-87e1-dc1aca08b1ea.png">

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

<img width="1200" alt="bottle_refrigirator" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/c90734e1-72e9-4b84-bbf7-e3d2ad5dcb86.png">

#### 通知結果
次に通知の確認をしてみます。デバッグのために冷蔵庫の開け閉めのたびに通知が来るような変更をしてコードを実行しました。デバッグ用のコードは[github](https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/blob/main/examples/outofstock-detection/src/OSS_model/app_debug.py)内の`app_debug.py`として掲載しています。冷蔵庫内のペットボトルの個数を4個→2個→0個と変更しながら3回通知検証をしてみました。結果3回とも正しく検出結果の通知ができました。

**在庫数4個の場合**
<img width="1200" alt="bottle_4_stock" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/7e83947e-b26e-4c2f-bbbb-3ee5e49bfc08.jpeg">

**在庫数2個の場合**
<img width="1200" alt="bottle_2_stock" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/2f21c18f-a76d-4cb3-bf8b-1505aec7872e.jpeg">

**在庫数0個の場合**
<img width="1200" alt="bottle_0_stock" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/175b30a6-ef29-4b28-9175-391bc3052b93.jpeg">

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

<img width="1200" alt="egg_setup" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/983b2480-bdcc-4a31-8811-c24a979d1966.png">

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

<img width="1200" alt="egg_refrigirator" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/2b9e3573-788e-476c-8922-18532d295758.png">

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

**在庫数3個の場合**
<img width="1200" alt="egg_3_stock" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/ba4c6950-dd7b-47f1-91e5-a3cf93931b60.jpeg">

**在庫数0個の場合**
<img width="1200" alt="egg_0_stock" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964705/aeb97aa7-b1f0-4774-9a4f-8dd324e5ed46.jpeg">

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

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

- [Support (FAQ)](https://support.aitrios.sony-semicon.com/hc/ja)

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

- [Contact Us](https://support.aitrios.sony-semicon.com/hc/ja/requests/new)

<!-----------------RasPiに関する記事が含まれる場合は下記を追加してください。-------------------> 
RaspberryPiに関連する疑問がある場合は、下記フォーラムをご確認、ご活用ください。
- [Raspberry Pi Forums](https://forums.raspberrypi.com/)