2024年2月19日月曜日

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

1. はじめに

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 で下記のページの演習を終えておきましょう。カメラは 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 を実行しています。
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 を用いている方は、Spyder で ml-mediapipe-03-janken.py を読み込んだ上で、下記の設定をして実行してください。
  • 「実行」→「ファイルごとの設定」において「外部システムターミナルで実行」を選択
  • さらに、 コマンドラインオプションで「ml-mediapipe-hand.h5」を指定
さて、いずれかの方法で実行すると、じゃんけん用の画面と映像画面の 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つの手の形を認識してダストボックスの開閉を行うシステムです。下記の工学院大学 知能機械研究室の卒業論文を元にしています。 以上、お疲れさまでした。

0 件のコメント:

コメントを投稿