RaspberryPiでHandGestureRecognitionをする!

9月 11, 2021

作ったIoTにその機能を発揮させたいとき, 何らかの信号を送る必要がある時があります. 例えばスマホアプリから信号を送った信号によってIoT機器を操作することができます. しかしスマホを取り出したり, アプリを起動するのが面倒です. そこでスマホアプリよりも手軽な手のジェスチャーによる認識を考えます. 今回はRaspberryPiでも実行できる手のジェスチャー認識を作成しました. ぜひお試しを!

HandGestureRecognitionとは?

手の固有なジェスチャーで作り出す特徴量を検出して認識することです. カメラでキャプチャしている映像の中に現れる手を検出し, その手がどんな形をしているかを認識します. 手の検出にはMediaPipeを用いており, 同時に 21個からなる手の代表点を出力します. その手の代表点を2層のニューラルネットワークに入力し, 手の形を分類します. この手の形の分類結果に合わせてIoT機器に信号を送ることができます.

MediaPipe Hands

準備したもの

セットアップ

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)

おわりに

環境さえできれば, 簡単にジェスチャー認識できるようになるのでぜひやってみてください!