ラベル mediapipe の投稿を表示しています。 すべての投稿を表示
ラベル mediapipe の投稿を表示しています。 すべての投稿を表示

2024年2月19日月曜日

Raspberry Pi 5 と mediapipe で AI とじゃんけん勝負してみた

1. はじめに

(2026.5 動作確認済)
Raspberry Pi 5 でリアルタイムな姿勢推定と物体検出」にて、Raspberry Pi 5 と Google による機械学習ライブラリ mediapipe を用いると、姿勢推定や物体検出などをリアルタイムに行えることを紹介しました。

mediapipe 自体は有志の方のビルドにより Raspberry Pi 4 などでも実行できたのですが、認識に若干の遅れがあり、実用にはもう一声、と個人的には思っていました。高性能な Raspberry Pi 5 の登場により、それがより実用的な速度で実行できるようになったというわけです。

一方、本書では伝統的な機械学習の手法により手認識を行っていました。すなわち、手の形がうまく切り出せるように画像を前処理して二値化し、その二値化画像により手の形(グー、チョキ、パー)を認識する、というわけです。
その手法は(Pi Zero のように)性能の低い Raspberry Pi でも高速に動作する、というメリットはありますが、手の形がうまく切り出せるような背景をうまく選んだり、二値化のパラメータを調整する必要がありました。

ディープラーニングを利用した mediapipe の手認識を使えば、そのような試行錯誤による前処理は不要になり、それが Raspberry Pi 5 の登場により身近になったというわけです。

というわけで、本書で紹介した「手認識によるコンピュータとのじゃんけん勝負」を Raspberry Pi 5 と mediapipe を用いてより安定化させてみましょう。一度のこの安定した認識の快適さを覚えてしまうと、もうこれまでの手法には戻れないと感じる方は多いのではないかと思います。

実際に Raspberry Pi 5 とじゃんけん勝負をしている様子が以下の写真です。Raspberry Pi 用のカメラモジュールを用いていますが、USB接続のウェブカメラやノートPCのカメラでも動作します。
システムが動作している様子を示した動画が以下です。



2. 準備

というわけで準備です。Raspberry Pi 5 や Pi 4 で下記のページの演習を終えておきましょう。カメラは USB 接続のウェブカメラでも Raspberry Pi 用カメラモジュールでも構いません。 なお、Windows を用いている方ならば、上記ページと合わせて下記のページを終えることで、本ページの内容を体験することができます。macOS でも概ね動作するとは思いますが、音声が鳴るかどうかは未確認ですのでご了承ください。Windows や macOS の場合、カメラはノート PC 本体のカメラか USB 接続のウェブカメラを用いることになるでしょう(どちらも「ウェブカメラ」という扱いです)。

3. では実行してみよう

Raspberry Pi の場合、下記のコマンドで本ページ用のサンプルファイルをダウンロードしてください。
git clone https://github.com/neuralassembly/mediapipe-janken
なお、こちらに含まれるファイルは、 Kazuhito00 (KazuhitoTakahashi) 氏が作成した mediapipe 用のサンプルファイル sample_hand.py をベースに作成しています。

ダウンロードが終わったら、下記コマンドでサンプルファイルの存在するディレクトリに移動してください。
cd mediapipe-janken
Windows や macOS の場合は、こちらの mediapipe-janken のページより、緑色のボタンを「Code」→「Download ZIP」とたどり、 mediapipe-janken-main.zip をダウンロードしてください。ダウンロードが終わったら、ファイルを右クリックして「すべて展開」してください。

さて、あとは実行です。Raspberry Pi 5 で USB 接続のウェブカメラを用いている場合、下記のコマンドで実行してください。 学習済のファイル ml-mediapipe-hand.h5 を指定してプログラム ml-mediapipe-03-janken.py を実行しています。なお、OS Trixie で仮想環境上の Python 3.11 を利用している場合、コマンド実行前に「 pipenv shell 」で仮想環境に入ること、そして2025年10月時点でウェブカメラしか利用できないことに注意して下さい。
python3 ml-mediapipe-03-janken.py ml-mediapipe-hand.h5
Raspberry Pi 5 でカメラモジュールを用いている方は下記コマンドです。
python3 ml-mediapipe-03-janken-picamera2.py ml-mediapipe-hand.h5
Windows や macOS を用いている方は、学習済ファイル ml-mediapipe-hand.h5 を Anaconda の Spyder で 作り直す必要があります。詳細は「本書の演習を Windows / macOS を用いて Anaconda 上の Spyder で実行する方法」をご覧ください。

さて、いずれかの方法で実行すると、じゃんけん用の画面と映像画面の 2 つが現れると思います。じゃんけん用の画面で「じゃんけん開始」ボタンを押すとじゃんけんスタートです。
手認識が安定しており、快適なじゃんけんが楽しめると思います。

コンピュータが出すじゃんけんの手は、人間とコンピュータの出した過去3回の手の履歴から決まっています。本書第7章で解説したように、「次にグーを出しやすい履歴」、「次にチョキを出しやすい履歴」、「次にパーを出しやすい履歴」の3つのクラスへの分類を、単純パーセプトロンでオンライン学習しています。

プログラムを終了するには「じゃんけん開始」ボタンをもう一度押してじゃんけんを止め、その後じゃんけん用の画面の右上の「×」ボタンをクリックしてください。

4. 学習済データ(h5 ファイル)の作成方法

上の例では学習済のデータとして ml-mediapipe-hand.h5 を利用しました。これは、ml-learn フォルダに存在する、グー、チョキ、パーのデータをもとに学習してつくられます。 そのコマンドは、Raspberry Pi の場合、下記の通りです。
python3 ml-mediapipe-02-learn.py test.h5
既存データをもとに再学習が行われ、 test.h5 として保存されます。このデータは、ml-mediapipe-hand.h5 と同様に学習済ファイルをして利用できます。なお、コマンド中の「test.h5」の部分は保存するファイル名ですから任意ですが、拡張子「.h5」は変更しないでください。

学習は、ニューロン 200 個からなる中間層 1 層の三層ニューラルネットワーク(二層ニューラルネットワークと呼ぶ人もいる)で実現しています。
入力ベクトルは 21関節×2次元座標の 42 次元の座標からなるベクトルなので、このような単純なネットワークで十分と思われます。


また、手の座標は、五本の指の付け根の位置(上図の0, 5, 9, 13, 17の位置)の重心を原点 (0.0) とし、さらにその重心と手首の位置(上図の 0 の位置)までの距離が 1 になるような規格化を行っていますので、手の位置や大きさにほとんどよらない座標となっているはずです。

学習に用いるデータ数は、まず私が用意した ml-learn ディレクトリにあるファイル data_guXXX.csv、 data_chokiXXX.csv、 data_paXXX.csv が 40×3=120 ファイルあります。 各ファイルに対し、書籍p.281図8-14 のように回転を加え(10度ごと36通り)、さらに画像の左右反転の有無で2通りの変換が行われますので、トータルで120×36×2=8640 個のデータをグー(0)、チョキ(1)、パー(2)の3つに分類することになります。

以上から、カメラに対する手の位置や距離、さらに手の角度および左手か右手かにほとんどよらない認識を実現しています。

5. 学習データの作成方法

最後に、 ml-learn ディレクトリにある学習用データファイル data_guXXX.csv、 data_chokiXXX.csv、 data_paXXX.csv の作成方法を記します。 作成には、ml-mediapipe-01-record.py (ウェブカメラ用) または ml-mediapipe-01-record-picamera2.py (カメラモジュール用) のどちらかを用います。ml-mediapipe-01-record.py の場合、下記のコマンドを実行します。
python3 ml-mediapipe-01-record.py 
Windows を用いる場合は、「外部システムターミナルで実行」の設定が必要です。

このプログラムの実行により、手の骨格が表示された画面が現れるはずです。この画面上で「g」キーを押すと data_guXXX.csv ファイルが、「c」キーを押すと data_chokiXXX.csv ファイルが、「p」キーを押すと data_paXXX.csv ファイルが保存されます。このファイルには、上記の21関節の点の座標と visibility という量の数値がコンマと改行で区切られて保存されています。visibility は認識には使われていません。

以上とここからの流れは、本書付録PDF(電子版には書籍末尾についています) の24ページとほぼ同じなので、必要に応じて参照してください。ml-learnディレクトリに格納されたファイルのみが学習に利用されます。

6. 終わりに

いかがでしたか?

本書の伝統的な機械学習の手法によるじゃんけんを体験した方ほど、mediapipe を用いたじゃんけんがいかに画期的であるか、伝わりやすいのではないかと思います。 Raspberry Pi のような小型なシステムでここまでできるということを踏まえ、この力をどう使うか、考えてみると面白いでしょう。

応用例の一つとして、「Raspberry Pi 5 と mediapipe で手認識するダストボックス」を紹介します。



動画をみてわかる通り、こちらは連続する3つの手の形を認識してダストボックスの開閉を行うシステムです。下記の工学院大学 知能機械研究室の卒業論文を元にしています。 以上、お疲れさまでした。

2024年2月15日木曜日

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

はじめに

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

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

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

本ページの内容は OS として 64-bit 版 Trixie Bookworm をインストールした Raspberry Pi 5 と Pi 4、および 64-bit 版 Bullseye をインストールした Pi 4 で試しました。「本書の内容を Pi Zero ~ Pi 5 で実行する方法」の内容をすべて終え、64-bit OS で TensorFlow 2.15 が動作する状態で本ページの内容を実行してください。

用いるカメラは、OS として Bookworm または Bullseye を用いている場合は、USB接続のウェブカメラと Raspberry Pi のカメラモジュールのどちらを用いても構いません。OS として Trixie を用いている場合はUSB接続のウェブカメラのみしか利用できませんのでご注意ください。

mediapipe による姿勢推定

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

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

Trixie で仮想環境の Python 3.11 を用いる場合、Raspberry Pi のターミナルを起動し、以下のコマンドで mediapipe をインストールしましょう。
pipenv install mediapipe==0.10.9 opencv-contrib-python==4.11.0.86
Bookworm の場合は以下のコマンドで mediapipe をインストールしましょう。
sudo pip install mediapipe==0.10.9 opencv-contrib-python==4.11.0.86 --break-system-packages
Bullseye の場合はコマンド末尾の「--break-system-packages」は不要で、以下のコマンドを実行することになります。
sudo pip install mediapipe==0.10.9 opencv-contrib-python==4.11.0.86
場合によっては、OpenCV など、必要なライブラリもインストールされるでしょう。

インストールが終わったら、Kazuhito00 (KazuhitoTakahashi) さんが github で公開している mediapipe のサンプルプログラムを動作させてみましょう。 なお、Raspberry Pi のカメラモジュールでも動作させるため、下記のようにファイルをダウンロードします(git がないと言われたら「 sudo apt -y 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 のカメラモジュールで動作するよう私が変更を加えたものです。
Trixie で仮想環境の Python 3.11 を利用している場合、2025年10月時点で、ウェブカメラで動作するプログラムしか動作しませんのでご注意ください。

ここでは、姿勢推定 (sample_pose.py) と手認識 (sample_hand.py) を試してみましょう。
Trixie の場合、「pipenv shell」を事前に実行し、仮想環境の Python 3.11 を利用する状態にしておいてください。
そして、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 mediapipe/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 を用いて非常に簡単に姿勢推定と物体検出を行うことができました。
認識速度も十分実用に足る速度だと感じたのではないでしょうか?

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

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