RaspberryPi 4BでTesorFlow LiteのPoseNet(姿勢推定)を動かしてみた
Contents
PoseNet
人間の姿勢を推定する機械学習モデルのPoseNetをRaspberryPi 4Bで動かしてみた時の備忘録。
PoseNetはGoogleのTensorFlowのJavaScript版であるTensorFlow.jsを用いた機械学習モデルとPython版があるのだが、前者はWebブラウザでリアルタイムに姿勢推定ができる。
今回は後者のPython版をRaspberryPi 4Bにインストールして、ラズパイカメラ、そしてCoral USB Acceleratorで動かしてみた。
ハードウェア
用意したハードウェアは以下の通り。
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のデフォルトとして設定された。
リポジトリの作成
ラズパイ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には最大周波数動作版があるのだが同時にインストールする事はできないので後ほどインストールをして比較してみたいと思う。
以前は Edgetpu や whlファイルよりTensorFlow Liteのインタープリターをインストールしていたが、現在の手順は以下のコマンドでpycoralライブラリ(TensorFlow Liteを含む)をインストールする様に変更されていた。
sudo apt-get install 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部分をコピーする。
上記でコピーした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ファイルについて補足説明をしておく。
通常だとOS毎にソースコードからビルドする必要がある所をビルド済みのファイルを配ることでインストールを簡単にする仕組みがwhlファイル。
OSやPythonのバージョン毎に異なるwhlファイルが用意されているので指定するファイル名が異なる。
PoseNetの導入
続いてgit cloneコマンドでGoogleのCoralからファイルをPoseNetプロジェクトのファイル類をコピーする。
git clone https://github.com/google-coral/project-posenet.git
project-posenetディレクトリが作成されるのでカレントディレクトリを移動してインストールシェルを実行する。
cd project-posenet
sh install_requirements.sh
以上でインストールは終了。
実行
プログラムはいくつか入っているのだがパイカメラに写った人の映像をリアルタイムで姿勢推定を行い表示するプログラムを実行してみる。
python pose_camera.py
尚、下記の写真のようにラズパイカメラの前にタブレットを置いてタブレットにはフリー素材の子供達が様々なポーズをしている写真を表示して認識させてみた。
下記の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ビットになっている事を確認する。
64ビット版TensorFlowLiteインタープリター
再びこちらのページから今度はLinux(ARM 64)のPython3.7のURLをコピーして以下のコマンドを実行する。
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%の速度向上が見られた。
比較結果
それぞれの環境での比較結果は以下の通り。
スタンダード(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のアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
私はラズパイ4+Coral USB Accelerator+PoseNetに関してとても興味があったので、まさにドンピシャの内容で非常に勉強になりました。
このようにまとまった記事があるとほんとにありがたいです。
そう備忘録サイトを通じてわたしはどんどんできることが増えております。
ありがとうございます。
伊藤慎一さん
嬉しいコメントですね、ありがとうございます。
PoseNetの記事がドンピシャとの事、良かったです。
先日たまたま触ってみて面白かったので記事にしてみました。
お役立てたようで何よりです。