2020年5月6日水曜日

Raspberry Pi + RealSense + Coral USB Accelerator + PoseNet で深度情報と姿勢情報を表示する

以下は、古くなったのでサポートを停止した情報です。代替ページとして「Raspberry Pi 5 でリアルタイムな姿勢推定と物体検出」をお勧めします。

1. はじめに

Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」では、Raspberry Pi と Coral USB Accelerator というディープラーニングの推論を高速化するデバイスを利用し、人間の姿勢を推定しました。

人間の骨格を推定する方法としては Microsoft Kinect というセンサを用いるものがあります。Kinect では三次元空間における人間の位置を求めますので、センサから人間までの距離も知ることができます。しかし、上で見た PoseNet を用いる方法では、人間までの距離を知ることはできません。

一方、対象までの距離を知ることのできるセンサとして、Intel RealSense D415 や D435 が知られています。これはデプスセンサとも呼ばれます。デプスは日本語でいうと深度であり、距離と同じような意味です。

このデプスセンサと PoseNet を組み合わせると、人間の姿勢(骨格)だけではなく人間までの距離を知ることができます。使用例を示したのが下図です。


PoseNet による人間の姿勢(骨格)が黄色の円と線の組み合わせで表現されており、対象物までの距離が色付けされて表示されていることがわかります。

本ページではこれを実現する方法を解説します。なお、RealSense はやや高価なセンサですので、お持ちでない方は本ページを読み物としてお楽しみください。

なお、本ページと同様の内容を Windows で実現したい場合、別サイトに「Intel RealSenseでSkeleton Trackingを行うCubemosのライブラリをPythonで使ってみた」というページを作成しましたので、必要に応じてご覧ください。

2. 準備と必要なもの

本ページの演習を実行するのに必要な物品は下記の通りです。
  • Raspberry Pi (NOOBS 3.3.1 (Raspbian 2020-02-13)で試しました。RealSense SDK のビルドには高い計算能力が必要なので Pi 4 B を推奨します。Pi 3 B+などでもできないわけではありません)
  • RealSense D415 または D435 (本ページの例はすべて D435 で行ったもの)
  • Google Coral Accelerator
これらを接続して実際に使用している様子が下図になります。RealSense D435 と Google Coral Accelerator がどちらも Raspberry Pi 4 の USB 3 ポートに接続されていることがわかります。

Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」を試した方なら、カメラの代わりに RealSense D435 が使われていることが想像できるでしょう。


本ページの以下の演習に進む前に、まず Coral USB Accelerator による姿勢推定の演習を実行しておいてください。

すなわち、「本書のディープラーニングの演習をkeras + TensorFlowで実行する方法」に従い、まず本書に必要なPython3 用ツールをインストールします。
そして、「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」に従い、TensorFlow Lite をインストールして姿勢推定の演習まで進むのでした。

それが終わったら以下に進みましょう。

3. Raspberry Pi で RealSense SDK をビルドする

まず、本演習を実行するためには、Raspbian で fake KMS という OpenGL のドライバーが有効になっていなければなりません。ただし、NOOBS 3.3.1 (Raspbian 2020-02-13) ではデフォルトで有効になっていました。

念のため確かめてみましょう。ターミナルを開いて以下のコマンドを実行します。なお、本ページではコマンドの先頭に「$」を付けて表示しますが、実行すべきコマンドは「$」を省いたもの、すなわわち「grep fkms /boot/config.txt 」ですので注意してください。
$ grep fkms /boot/config.txt 
dtoverlay=vc4-fkms-v3d
#dtoverlay=vc4-fkms-v3d
上の命令は、/boot/config.txt というファイルから、「fkms」という文字を含んだ行を抽出しています。上に記されているように、先頭に「#」がついていない 「dtoverlay=vc4-fkms-v3d」という行が存在すれば fake KMS は有効ですので先に進みましょう。

もし、先頭に「#」のついた「#dtoverlay=vc4-fkms-v3d」という行しか存在しない、あるいはどちらの行も存在しない場合は、/boot/config.txt の末尾に 「dtoverlay=vc4-fkms-v3d」を追記して Raspberry Pi を再起動する必要があります。

さて、fake KMS の確認が終わったら、RealSense SDK ビルドに必要なツールをインストールするために以下のコマンドを順に実行します。
$ sudo apt update
$ sudo apt install git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev cmake
以上が終わったら、RealSense SDK のビルドに進みます。

Pi 3 B+ などを利用する方への注意
Pi 3 B+ などでは、メモリが足りないためこの先で行う RealSense SDK のビルドに失敗します。 そのため、メモリの代わりに microSD カードを使うスワップ領域のサイズを増やします。 デフォルトではスワップ領域のサイズは 100MB なのですが、以下のコマンドを実行することでそれを 2GB に増やします。 メモリが 2GB または 4GB の Pi 4 B をお使いの方はこの操作は不要です。
$ sudo swapoff -a
$ sudo rm -f /swapfile
$ sudo fallocate -l 2G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

まず、Raspberry Pi に RealSense が接続されていたら外しておきましょう。 そして、ターミナルで以下のコマンドを順に実行します。RealSense SDK のダウンロードと、USB の設定が行われます。
$ git clone https://github.com/IntelRealSense/librealsense.git

$ cd librealsense

$ sudo ./scripts/setup_udev_rules.sh
最後のコマンドを実行すると、以下のメッセージが現れますので、Enterキーを押して処理を先に進めます。
Setting-up permissions for RealSense devices

Remove all RealSense cameras attached. Hit any key when ready
処理が終わると以下のメッセージが現れます。
udev-rules successfully installed
そして、以下のコマンドを順に実行します。
$ mkdir build

$ cd build

$ cmake ../ -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=true -DBUILD_PYTHON_BINDINGS:bool=true
最後のコマンドを実行したとき、メッセージ中に以下のように「No internet connection」という警告が含まれることがあります。 これは、インターネットに接続されていないと判定されていることを意味しますので、このまま進むのは好ましくありません(実は本ページの演習の範囲でならばこのまま進んでも演習はできてしまうのですが)。

この問題を解決するため、上記最後のコマンドを何度か再実行してみましょう。キーボードの「↑」キーで直前に実行したコマンドを表示し、 Enterキーを押すことで再実行できます。何度か同じコマンドを再実行し、下記の警告が出なかったときに先に進みましょう。
(略)

CMake Warning at CMakeLists.txt:16 (message):
  No internet connection, disabling BUILD_WITH_TM2


CMake Warning at CMakeLists.txt:22 (message):
  No internet connection, disabling IMPORT_DEPTH_CAM_FW

(略)
以上で RealSense SDK をビルドするための準備が整いました。次のコマンドでビルドが開始されますが、1時間以上かかる可能性がありますので、 時間が十分あるときに実行しましょう。

なお、コマンド中の「-j4」の「4」は、4つのビルド処理を同時に実行することを意味します。Pi 4 B のメモリ 4GB 版では問題なくビルドできましたが、Raspberry Pi にあまり負荷をかけたくない場合は「-j2」や「-j1」とするのが良いでしょう。

また、Pi 3 B+ などでは上で設定したように microSD カードをスワップ領域として使いますので、microSD カードをに負荷をかけないため、「-j1」で実行すべきだと思います。
$ make -j4
さて、ビルドが終わったら、以下のコマンドを実行してビルドされたプログラムをインストールしましょう。
$ sudo make install
さらに、以下の2コマンドを順に実行し、ビルドした Python3 用のモジュールを利用可能にする設定を行いましょう。
$ echo "export PYTHONPATH=$PYTHONPATH:/usr/local/lib" >> ~/.bashrc

$ source ~/.bashrc

4. 動作テスト

RealSense SDK のインストールが終わったら、動作テストを行ってみましょう。 本ページ上部の写真のように、Raspberry Pi の青色の USB 3 ポートに Coral USB Accelerator と RealSense D415 または D435 を接続しましょう。

ターミナルを起動し、以下のコマンドを実行します。
$ realsense-viewer
以下のようなアプリケーションが起動しますので、左側のトグルを「on」にすると、通常の映像(RGB Camera)と深度画像(Stereo Module)を見ることができます。


なお、今回 Pi 4 B と Pi 3 B+ で試したところ、どちらの場合も RealSense を Raspberry Pi に直接接続して動作させることができました。 しかし、2年くらい前に Pi 3 B で RealSense を動作させたときは、RealSense を電源付きの USB ハブ(セルフパワータイプの USB ハブ)を介して Raspberry Pi に接続しないと、RealSense への電力が足りず動作しないという経験をしました。

Raspberry Piのバージョンが上がったことが原因なのか、私が用いた電源が変わったためか、あるいは RealSense のファームウェアが更新されたことが原因なのか検証していませんが、電力の問題は意識しておいた方が良いかもしれません。

さて、以上が終わったら、RealSense で PoseNet を動かしてみましょう。RealSense の通常の画像で姿勢推定を行い、その結果を通常の画像と深度画像の両方に描画します。

そのプログラムは、「Raspberry Pi + Coral USB Accelerator + TensorFlow Lite で物体検出と姿勢推定を試してみよう」で用いた project-posenet 内に含まれています。 以下のコマンドを実行してみましょう。
$ cd project-posenet
$ python3 pose_camera_realsense_cv.py
通常の画像と深度画像用の2つのウインドウに結果が表示されます。深度画像に対する結果が冒頭の画像であるというわけです。ただし、冒頭の画像は結果が見やすくなるよう黄色い線を太く表示させていますのでご了承ください。

なお、冒頭の画像の深度画像は、realsense-viewer の深度画像にくらべて背景がなめらかではないことに気づかれたかもしれません。 これは、realsense-viewer の深度画像には様々なフィルタが適用されているからです。realsense-viewer でそれらのフィルタのオン・オフを切り替えると、フィルタの効果を知ることができます。

それらのフィルタを PoseNet 用プログラムに適用することもできますが(例えばこちらを参考に)、動作が遅くなるのでそれは行いませんでした。冒頭の図をよく見るとわかるように、フレームレートはおよそ 6~7 fps 程度です。

以下のように、解像度 480x360 でプログラムを実行すると、フレームレートは 8 fps 程度に上昇します。
$ python3 pose_camera_realsense_cv.py --res 480x360
それ以外には1280x720という解像度もサポートしていますが、動作は遅いのであまり実用的ではないかもしれません。
$ python3 pose_camera_realsense_cv.py --res 1280x720
最後に、PoseNet の動作原理を知りたいという方は、別サイト内の 「姿勢推定を行うPoseNetをWindowsなどのPCで実行する」というページの末尾にに解説を記しましたので興味のある方はご覧ください。

5. おわりに

以上です。お疲れさまでした。