Raspberry Pi AI Camera で転倒検知してみた

# Raspberry Pi AI Camera で転倒検知してみた

本サンプルは、画像に基づく人体の姿勢分析機能を開発する方法を示すことを目的としており、人体が転倒状態にあるかどうかをリアルタイムで検出するために使用されます。このサンプルは、コンピュータビジョンの骨格のキーポイント検出技術を Raspberry Pi AI Camera と組み合わせて利用し、軽量なエッジ側の転倒検出機能を実現しています。

---

## システム概要

- **目標**: 人体の姿勢をリアルタイムで監視し、転倒行為の有無を検出する。
- **用いた技術**:
  - HigherHRNet モデルを使用して人体のキーポイントを検出する。
  - 幾何学的計算を応用して人体の姿勢の特徴 (例えば、体の角度) を分析する。
  - Raspberry Pi + Raspberry Pi AI Camera を組み合わせて、リアルタイムの推論と処理を行う。


以下の画像は本システムを実際に利用して、人が立っているか転倒しているかを検知させてみた様子です。
![image_stand.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994885/169a74d4-ce32-4929-846d-a5f347f73472.png)![image_fall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994885/9db170b1-f310-4f24-b12d-988eb0caa8e9.png)



---

## 今回利用した技術

### 1. キーポイント検出
本システムは HigherHRNet モデルを用いて画像内の人体のキーポイントを検出し、COCO 形式で人体のキーポイントを出力します。HigherHRNet は、高解像度で効率的かつ正確なネットワークで、豊富な人体姿勢の詳細を捉えることができます。

以下は主なステップです：
- エッジデバイスを使用してリアルタイムのビデオストリームをキャプチャーする。
- 各フレームの画像に対して人体検出を行い、人体のキーポイント座標を抽出する。

---

### 2. キーポイント処理
以下のルールに基づいてキーポイントを処理し、計算を簡略化します：
1. **頭部の点**:
   - COCO 形式での頭部の 5 つのキーポイント (目、鼻、口、耳) (score>0 の有効性条件を満たすもの) を選択する。
   - これら 5 つの点の平均値を計算し、最終的な頭部座標とする。

2. **膝の点と足の点**:
   - 左右の膝と左右の足のキーポイントそれぞれについて平均を求め、左右の膝の点と左右の足の点を得る。
   - 左右の膝の点の平均値を全体の膝の点とし、左右の足の点の平均値を全体の足の点とする。

---

### 3. 姿勢分析
幾何学的計算を通じて人体の姿勢を分析します：
1. 頭部 - 膝部の線と膝部 - 足部の線の間の角度を計算する。
2. 閾値を設定する。
3. 角度に基づいて人体が転倒状態にあるかどうかを判定する：
   - 角度が予め設定した閾値範囲を超える場合、転倒と判定する。
![fall_down_sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994885/dc9cab52-b2ea-4275-b57a-4876fc6f8197.gif)


---

## ハードウェア環境
- **処理ユニット**: Raspberry Pi (Raspberry Pi 4 Model Bまたはそれ以上の機種を推奨)
- **エッジデバイスモジュール**: Raspberry Pi AI Camera
- **ネットワーク接続**: モデルと依存関係をダウンロードするためにインターネットに接続する必要がある

---

## ソフトウェア環境
- Python 3.11 (Raspberry Piに搭載済み)
- Python 3 - OpenCV 4.6 (APTを通じてインストール)
- Python 3 - Munkres

---

## インストールと使用方法

1. **依存関係のインストール**:
   ```bash
   apt install python3-opencv imx500-all python3-munkres
   ```

2. **HigherHRNet モデルのダウンロード**：
   *もしすでに APT を通じて imx500-all をインストールしている場合は、このステップをスキップできます*
   [Raspberry Pi Repo](https://github.com/raspberrypi/imx500-models/raw/refs/heads/main/imx500_network_higherhrnet_coco.rpk) から必要なモデルファイルをダウンロードしてください。

3. **システムの実行**:
   ```bash
   python main.py --model <path to model> 
   ```

4. **主なパラメータの説明**:
   - `--model`: RPK モデルの位置。apt を通じて imx500-all をインストールした場合は変更する必要がない。
   - `--detection-threshold`: 人体検出器の閾値。 `[0,1]` の範囲で通常は変更する必要がない。
   - `--fall-threshold`: 転倒判定閾値。 `[0,100]` の範囲で 45 が推奨。通常は変更する必要がないが、エッジデバイスの角度などに応じて必要に応じて変更する。


---

## 最適化と改善

1. **モデル性能の最適化**:
   - Model zoo のモデルはこのシーンに対して最適化されていないため、性能が不十分な場合があります。よりよい結果のためには、人が転倒している画像を含むデータセットを利用してモデルのトレーニングを行うことを検討するべきだろう。
   

---

## 参考文献
- [HigherHRNet 公式ドキュメント](https://github.com/HRNet)
- [COCO データセットのキーポイント定義](https://cocodataset.org/)
- [IMX500 Pose Estimiation](https://github.com/raspberrypi/picamera2/blob/main/examples/imx500/imx500_pose_estimation_higherhrnet_demo.py)

---

# 本システムのデモ

今回作成したシステムでいくつかの姿勢を取って確かめてみました。


![fall_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994885/3ba1440b-6e09-4e85-b596-eade8fc6bee2.gif)

# サンプル公開

   - GitHub上で公開していますので、ご使用になる場合はそちらからダウンロードをお願いします。
[https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/tree/main/examples/falldown-detection](https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/tree/main/examples/falldown-detection)
---

# 困った時は

もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。  
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。
-------------------------------------
<!-----------------RasPiのみに関連する記事の場合、下記のAITRiOSサポートへの誘導は記載しないでください。------------------->  
- [Support (FAQ)](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/support)
 
<!-----------------RasPiのみに関連する記事の場合、下記のAITRiOSサポートへの誘導は記載しないでください。------------------->  
また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
- [Contact Us](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/contact-us)
 
<!-----------------RasPiに関する記事が含まれる場合は下記を追加してください。------------------->  
RaspberryPiに関連する疑問がある場合は、下記フォーラムをご確認、ご活用ください。
- [Raspberry Pi Forums](https://forums.raspberrypi.com/)