RaspberryPi 4BでTesorFlow LiteのPoseNet(姿勢推定)を動かしてみた | そう備忘録

RaspberryPi 4BでTesorFlow LiteのPoseNet(姿勢推定)を動かしてみた

PoseNet

人間の姿勢を推定する機械学習モデルのPoseNetをRaspberryPi 4Bで動かしてみた時の備忘録。

PoseNetはGoogleのTensorFlowのJavaScript版であるTensorFlow.jsを用いた機械学習モデルとPython版があるのだが、前者はWebブラウザでリアルタイムに姿勢推定ができる。

今回は後者のPython版をRaspberryPi 4Bにインストールして、ラズパイカメラ、そしてCoral USB Acceleratorで動かしてみた。

PoseNet

ハードウェア

用意したハードウェアは以下の通り。

RaspberryPi 4 Model B

RaspberryPi本体は4のModel B(メモリ4M)を使用した。

Coral USB Acceleratorは以前の記事でRaspberryPi 3 B+に接続したのだがラズパイ3はUSB2.0にしか対応していなかった。

一方、Coral USB AcceleratorはUSB3.0なので恐らく性能の100%は発揮していなかったと思われる。

今回はUSB3.0に対応しているラズパイ4に接続しているのでラズパイ3と比較してUSB部分がボトルネックになる可能性は低いと思われる。

ラズパイカメラ

ラズパイ用カメラモジュール。

このカメラに写った映像の人間の姿勢をPoseNetで推定する。

ラズパイとカメラとの接続方法やカメラの有効化、試し撮りについては以前の記事を参照して欲しい。

Coral USB Accelerator

Coral USB AcceleratorはGoogleがCoralというブランドで発売しているエッジデバイス向けのTPU(Tensor Processing Unit)。

ラズパイなどのLinuxコンピューターにUSB接続をして機械学習モデルの推論の計算をCoral USB Acceleratorで実行することにより高速化される。

上記のUSB接続するタイプと開発ボードタイプの2種類があるが今回はUSB接続をするCORAL USB Acceleratorを使用してる。

インストール

ラズパイ4へのインストール手順は以下の通り。

事前準備

以下のコマンドでパッケージ類を最新の状態にしておく。

sudo apt-get update
sudo apt-get upgrade

Pythonのバージョンの確認

以下のコマンドでPythonのデフォルトのバージョンを確認する。

python --version

自分の場合はPython 2.7.16だったので3.xに変更した。

詳細はこちらの記事を参照して欲しい。

cd /usr/bin
sudo unlink python
sudo ln -s python3 python
python --version

Python 3.7.3がPythonのデフォルトとして設定された。

Python3.7.3にバージョンアップされた

リポジトリの作成

ラズパイ4のLXTerminalから以下のコマンドでリポジトリの作成を行う。

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update

Edge TPUランタイムのインストール

以下のコマンドでEdge TPUのランタイム(スタンダード版)のインストールを行う。

sudo apt-get install libedgetpu1-std
Edge TPUランタイムのインストール

尚、最初はスタンダード版をインストールして動作確認をしている。

Edge TPUには最大周波数動作版があるのだが同時にインストールする事はできないので後ほどインストールをして比較してみたいと思う。

2021年12月11日 追記

以前は Edgetpu や whlファイルよりTensorFlow Liteのインタープリターをインストールしていたが、現在の手順は以下のコマンドでpycoralライブラリ(TensorFlow Liteを含む)をインストールする様に変更されていた。

sudo apt-get install python3-pycoral
python3-pycoralのインストール

上記を実行すれば下記の python3-edgetpuのインストールや whlファイルからのTensorFlow Liteのインストールは行わず、「PoseNetの導入」に進んでしまって良い。

python3-edgetpuのインストール

続いてpython3-edgetpuをインストールする。

sudo apt-get install python3-edgetpu

TensorFlow Lite

こちらのページにアクセスして該当のプラットフォームのPythonのバージョンに対応したPython whlファイルをインストールする。

Linux(ARM 32)のPython3.7のURL部分をコピーする。

Python Whlファイル

上記でコピーしたURLを貼り付けて下記のコマンドでインストールする。

pip3 install https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp37-cp37m-linux_armv7l.whl

実行結果は以下の通り。

whlファイルインストール結果

whlファイルとは

ここで指定したwhlファイルについて補足説明をしておく。

通常だとOS毎にソースコードからビルドする必要がある所をビルド済みのファイルを配ることでインストールを簡単にする仕組みがwhlファイル。

OSやPythonのバージョン毎に異なるwhlファイルが用意されているので指定するファイル名が異なる。

PoseNetの導入

続いてgit cloneコマンドでGoogleのCoralからファイルをPoseNetプロジェクトのファイル類をコピーする。

git clone https://github.com/google-coral/project-posenet.git
project-posenetのディレクトリが作成される

project-posenetディレクトリが作成されるのでカレントディレクトリを移動してインストールシェルを実行する。

cd project-posenet
sh install_requirements.sh
インストールシェルの実行

以上でインストールは終了。

実行

プログラムはいくつか入っているのだがパイカメラに写った人の映像をリアルタイムで姿勢推定を行い表示するプログラムを実行してみる。

python pose_camera.py

尚、下記の写真のようにラズパイカメラの前にタブレットを置いてタブレットにはフリー素材の子供達が様々なポーズをしている写真を表示して認識させてみた。

PoseNet実行の様子

下記の3枚の写真は何秒か間隔を空けて取得した画面ショット。

中央の写真ではほぼ全ての姿勢が推定されているのに対して左右の写真では認識されていない子供が居たり左腕が違う子供の右腕と関連付けられてしまっていることが分かる。

認識の

しかし次のフレームでは直ぐに正しく認識されるようになっているので複数のフレームの値を取得して異常値を弾くようにすればほぼ正確な値が取得できるようになるのでは無いかと予想される。

またPoseNetの認識速度の平均は24.1ms(41.49fps)、TrueFPS:2.59となった。

ソースコード

下記の画面ショットはソースコードの一部だが、起動時の主なパラメーターは、

  • –mirror:カメラとモニターの両方が自分を向いている時に左右を反転させる
  • –model:モデルの指定
  • –h264:動画ファイルの指定
  • –jpeg:画像ファイルの指定

等が出来ることが分かる。

ソースコード

戻り値

PoseNetからの戻り値(配列)は以下の様なレイアウトになっていた。

[Pose({
 'nose': Keypoint(<nose>, [215.09305   83.374596], 0.9952394962310791),
 'left eye': Keypoint(<left eye>, [210.04732  88.41889], 0.9912079572677612),
 'right eye': Keypoint(<right eye>, [210.77309  78.2418 ], 0.97700434923172),
 'left ear': Keypoint(<left ear>, [212.97354   96.757065], 0.9153686165809631),
 'right ear': Keypoint(<right ear>, [213.21773   71.458305], 0.8358359336853027),
 'left shoulder': Keypoint(<left shoulder>, [237.43112 107.17285], 0.9950342178344727),
 'right shoulder': Keypoint(<right shoulder>, [240.9757    61.178204], 0.997093915939331),
 'left elbow': Keypoint(<left elbow>, [274.4954  119.28459], 0.9283619523048401),
 'right elbow': Keypoint(<right elbow>, [279.05884  70.98039], 0.9199962615966797),
 'left wrist': Keypoint(<left wrist>, [270.1218   98.87551], 0.7172378301620483),
 'right wrist': Keypoint(<right wrist>, [274.57166 108.21463], 0.617720901966095),
 'left hip': Keypoint(<left hip>, [314.95624   98.210724], 0.9897955060005188),
 'right hip': Keypoint(<right hip>, [313.01355  65.55809], 0.979564368724823),
 'left knee': Keypoint(<left knee>, [365.04742  95.45074], 0.9917586445808411),
 'right knee': Keypoint(<right knee>, [366.85825   68.654625], 0.9853310585021973),
 'left ankle': Keypoint(<left ankle>, [422.057    100.966774], 0.9265909790992737),
 'right ankle': Keypoint(<right ankle>, [422.06375  73.19163], 0.9459201097488403)}, 0.9240624308586121),
 Pose({
'nose': Keypoint(<nose>, [192.      241.64706], 0.9938794374465942),
 'left eye': Keypoint(<left eye>, [188.02208 245.91217], 0.9934948086738586),
 'right eye': Keypoint(<right eye>, [187.65892 235.85362], 0.9917553663253784),
                 ・
                 ・
                 ・
                 ・
                 ・
}, 0.7476128339767456)]

Poseが人間1人に対応していてそれぞれ体の各部位(鼻、左目、右目・・・)のX、Y座標と確率スコアが返されていて、Poseの最後にも確率スコアがあった。

最大周波数での動作

インストール

続いてEdge TPUの最大周波数動作版を試してみることにした。

尚、下記のコマンドで最大周波数動作版をインストールするとスタンダード版はアンインストールされてしまうので同時にはインストールができない。

sudo apt-get install libedgetpu1-max

「了解」を選択する。

「了解」を選択

「はい」を選択する。

「はい」を選択する

インストールされた。

インストールされた

尚、python3-edgetpuもアンインストールされてしまうので以下のコマンドでインストールし直した。

sudo apt-get install python3-edgetpu

実行結果

速度は22.8ms(43.85fps)、TrueFPS:3.83と約47.9%の速度向上が見られた。

ただ、こちらのCoralの記事にもあるが最大周波数での動作はCoral USB Acceleratorがかなり熱くなる可能性があるので注意が必要だ(very hot to the touchと書いてある)

最大周波数動作版

64ビット版

TensorFlowLiteインタープリターの64ビット版が用意されているのでラズパイ4のOS(Raspbian)も64ビットで動作をさせて処理速度を見ることにした。

現在のカーネル

念の為、現在のカーネルを確認する。

uname -a

arm7lと表示されているので現在は32ビットで動作している事が分かる。

現在のカーネルを確認する

config.txtを編集

/boot/config.txtを編集して、

arm_64bit=1

を追記して再起動後、同じく uname -a で現在のカーネルが64ビットになっている事を確認する。

カーネル8になっていることを確認する

64ビット版TensorFlowLiteインタープリター

再びこちらのページから今度はLinux(ARM 64)のPython3.7のURLをコピーして以下のコマンドを実行する。

64ビット版のTensor Flow Light
pip3 install https://github.com/google-coral/pycoral/releases/download/release-frogfish/tflite_runtime-2.5.0-cp37-cp37m-linux_aarch64.whl

実行結果

64ビット、最大周波数動作版にて同じ写真で姿勢推定を実行してみた所、速度は23.7ms(42.26fps)、TrueFPS:4.36と32ビット版と比較して約13.8%の速度向上が見られた。

64ビット最大周波数動作

比較結果

それぞれの環境での比較結果は以下の通り。

 

スタンダード(32bit)

最大周波数(32bit)

最大周波数(64bit)

ms

24.1ms

22.8ms

23.7ms

fps

41.49fps

43.85fps

42.26fps

TrueFPS

2.59

3.83

4.36

以上で今回の記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

2件のフィードバック

  1. 伊藤慎一 より:

    私はラズパイ4+Coral USB Accelerator+PoseNetに関してとても興味があったので、まさにドンピシャの内容で非常に勉強になりました。
    このようにまとまった記事があるとほんとにありがたいです。
    そう備忘録サイトを通じてわたしはどんどんできることが増えております。
    ありがとうございます。

    • souichirou より:

      伊藤慎一さん
      嬉しいコメントですね、ありがとうございます。
      PoseNetの記事がドンピシャとの事、良かったです。
      先日たまたま触ってみて面白かったので記事にしてみました。
      お役立てたようで何よりです。

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。