RaspberryPiでHandGestureRecognitionをする!
作ったIoTにその機能を発揮させたいとき, 何らかの信号を送る必要がある時があります. 例えばスマホアプリから信号を送った信号によってIoT機器を操作することができます. しかしスマホを取り出したり, アプリを起動するのが面倒です. そこでスマホアプリよりも手軽な手のジェスチャーによる認識を考えます. 今回はRaspberryPiでも実行できる手のジェスチャー認識を作成しました. ぜひお試しを!
HandGestureRecognitionとは?
手の固有なジェスチャーで作り出す特徴量を検出して認識することです. カメラでキャプチャしている映像の中に現れる手を検出し, その手がどんな形をしているかを認識します. 手の検出にはMediaPipeを用いており, 同時に 21個からなる手の代表点を出力します. その手の代表点を2層のニューラルネットワークに入力し, 手の形を分類します. この手の形の分類結果に合わせてIoT機器に信号を送ることができます.
準備したもの
セットアップ
RaspberryPi
Raspberry Pi Imagerを使ってSDカードにUbuntu OSをインストールします. “Ubuntu Server 21.04.2 LTS"を選択し, micro SDカードに書き込みます.
MediaPipe
MediaPipeのインストールをします.
#Install build dependencies
sudo apt install -y cmake
sudo apt install -y protobuf-compiler
pip install cython
pip install numpy == 1.19.5
pip install pillow
# get sources
git clone https://github.com/tech-life-hacking/HandGestureRecognition.git
cd HandGestureRecognition
# Install mediapipe
pip install mediapipe-0.8-cp39-cp39-linux_aarch64.whl
Tensorflow
RaspberryPi向けにビルドされたTensorflowをインストールします.
使い方
# get sources
git clone https://github.com/tech-life-hacking/HandGestureRecognition.git
cd HandGestureRecognition
python example.py
簡単にソースの中身を説明すると, まずWEBカメラで取り込んだ映像をopencvで画像として切り出しています(cap.read()).
次にその画像の中にある手をMediaPipeで検出し, 21個の代表点を導出します(hands.process(image)).
最後にその手の21個の代表点をオフセット, 大きさや回転量を調整し, 2層のニューラルネットワークで手の種類に分類します(myhands.run(results)).
# example.py
while cap.isOpened():
# Capture images
success, image = cap.read()
# Flip the image horizontally for a later selfie-view display, and convert
# the BGR image to RGB.
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
small_image = cv2.resize(image, (0, 0), fx=0.25, fy=0.25)
# hand images to handlandmarks
results = hands.process(small_image)
# Recognize gestures
kind_of_hands = myhands.run(results)
# print a kind of hands
print(kind_of_hands)
おわりに
環境さえできれば, 簡単にジェスチャー認識できるようになるのでぜひやってみてください!