2024年2月15日木曜日

Raspberry Pi 5 でリアルタイムな姿勢推定と物体検出

はじめに

この補足ページでは、これまで Raspberry Pi で姿勢推定や物体検出を行う方法を紹介してきました。例えば、下記のものです。
しかし、これらのページにはそれぞれ次のような問題があり、あまり実用的ではありませんでした。
  • 一つ目のページ:YOLO v3 による物体検出が遅く、認識後の映像が数秒間遅れる
  • 二つ目のページ:高価な USB Accelerator を使わないとやはり動作が遅い

そんな状況の中、2024 年 2 月に高速な Raspberry Pi 5 が発売されました。この Pi 5 と、動作の軽い認識器を組み合わせれば、実用に足る程度に高速に姿勢推定や物体検出を行うことができます。
「動作の軽い認識器を組み合わせれば」というところが重要で、どの認識器でも高速に、というわけにはいきませんので注意してください。

本ページではそのような例として、mediapipe による姿勢推定と、EfficientDet-Lite0 モデルによる物体検出を実行してみます。

USB接続のウェブカメラと Raspberry Pi のカメラモジュールのどちらを用いても構いません。

本ページの内容は 64-bit 版 OS をインストールした Raspberry Pi 5 でしか試していません(が、Pi 4 や Pi 3 でも動作すると思います)。 必須というわけではありませんが、本書の演習を全て終えた状態で行うことを推奨します。numpy などのツールがインストール済となるためです。

mediapipe による姿勢推定

ではまず、mediapipe による姿勢推定を試してみましょう。mediapipe は Google により開発された機械学習ライブラリです。 姿勢推定や手認識など、学習済の認識器を利用できます。こちらの mediapipe のデモページを見ると、何が可能かイメージしやすいでしょう。

これまでも、有志による mediapipe のインストール方法が公開されてきましたが、2023年8月に Raspberry Pi 用の mediapipe が正式に公開されたようです。本ページではこの公式によるインストール方法を紹介します。

まず、Raspberry Pi のターミナルを起動し、以下のコマンドで mediapipe をインストールしましょう。
sudo pip install mediapipe --break-system-packages
恐らく、一緒に OpenCV などもインストールされるでしょう。

インストールが終わったら、Kazuhito00 (KazuhitoTakahashi) さんが github で公開している mediapipe のサンプルプログラムを動作させてみましょう。 なお、Raspberry Pi のカメラモジュールでも動作させるため、下記のようにファイルをダウンロードします(git がないと言われたら「 sudo apt install git 」でインストールしてください)。
git clone https://github.com/neuralassembly/mediapipe-python-sample
ダウンロードが終わったら、下記のコマンドでサンプルプログラムのあるディレクトリに移動しましょう。
cd mediapipe-python-sample
下記の ls コマンドで、そのディレクトリに存在するファイルのリストを取得することができます。
ls 
ファイル名の末尾が「_picamera2.py」となっていないファイルが Kazuhto 00 さんによるオリジナルなファイルで、ウェブカメラで動作するものです。 末尾が「_picamera2.py」となっているファイルが、Raspberry Pi のカメラモジュールで動作するよう私が変更を加えたものです。

ここでは、姿勢推定 (sample_pose.py) と手認識 (sample_hand.py) を試してみましょう。 そして、Raspberry Pi にカメラが接続されていることを確認した上で、下記のコマンドを実行してみましょう。 USB 接続のウェブカメラを用いている場合のコマンドはこちらです。
python3 sample_pose.py 
そして、Raspberry Pi のカメラモジュールを用いている場合のコマンドはこちらです。
python3 sample_pose_picamera2.py 
典型的には、下記のような映像が得られるでしょう。人物の姿勢(骨格)が認識されていることがわかると思います。Raspberry Pi 5 を用いると、実用的な速度で認識が継続されることもわかるはずです。
どのような骨格点が認識されているのかは Pose landmark detection guide をご覧ください。
なお、mediapipe による姿勢推定は、映像中の一人の人物に対してのみ実行されますので注意してください。
なお、プログラムを終了するときは、映像上でキーボードの ESC キーをタイプします。

なお、手認識を行うサンプルプログラムは下記で実行できます。こちらは複数の手を認識することができます。ウェブカメラの場合のコマンドはこちらです。
python3 sample_hand.py 
そして、Raspberry Pi のカメラモジュールを用いている場合のコマンドはこちらです。
python3 sample_hand_picamera2.py 
典型的は映像は下記のようになるでしょう。
どのような骨格点が認識されているのかは Hand landmarks detection guide をご覧ください。
やはり、プログラムを終了するときは、映像上でキーボードの ESC キーをタイプします。

EfficientDet-Lite0 モデルによる物体検出

姿勢推定が終わったら、EfficientDet-Lite0 モデルによる物体検出も試してみましょう。 cd コマンドを実行し、ホームディレクトリに戻ります。
cd
そして、Google によるサンプルプログラムを下記コマンドでダウンロードします。Raspberry Pi のカメラモジュール対応ファイルが含まれています(一ファイルだけですが)。
git clone https://github.com/neuralassembly/mediapipe
ダウンロードが終わったら、下記コマンドでディレクトリを移動します。
cd examples/object_detection/raspberry_pi
そして、そのディレクトリで下記コマンドで学習済ファイルをダウンロードします。
wget https://storage.googleapis.com/mediapipe-models/object_detector/efficientdet_lite0/int8/1/efficientdet_lite0.tflite
ダウンロードが終わったら、物体検出のサンプルプログラムを実行します。ウェブカメラを用いてる場合のコマンドはこちらです。
python3 detect.py --model efficientdet_lite0.tflite
そして、Raspberry Pi のカメラモジュールを用いている場合のコマンドはこちらです。
python3 detect_picamera2.py --model efficientdet_lite0.tflite
下記のように、COCOデータセットによる 80 種類の物体検出を行えます。
こちらも、プログラムを終了するときは、映像上でキーボードの ESC キーをタイプします。

なお、映像の左右が反転するのを無効にしたければ、プログラム detect.py 中の下記の行を無効にするか削除すると良いでしょう。
image = cv2.flip(image, 1)
なお、Raspberry Pi のカメラモジュール用プログラム detect_picamera2.py ではあらかじめ無効にしてあります。

終わりに

以上、Raspberry Pi 5 と mediapipe を用いて非常に簡単に姿勢推定と物体検出を行うことができました。
認識速度も十分実用に足る速度だと感じたのではないでしょうか?

この機能を何に使うか、アイディアを膨らませてみましょう。

本ページの更なる発展として、下記ページを作成しましたので、あわせてご覧ください。

0 件のコメント:

コメントを投稿