2020年6月24日水曜日

Intel RealSenseでSkeleton Trackingを行うCubemosのライブラリをPythonで使ってみた

はじめに

(2022.11追記:調べたら、Skeleton Tracking SDK は既に利用できなくなっているようですね。Cubemos 社と Intel 社の契約が切れたのでしょうか。そのため、RealSense と骨格認識を組み合わせるには、mediapipe などを使うのが良いと思います)

距離を計測可能な深度カメラとして、Intel RealSense D415 および D435が良く知られています。

RealSense をロボットなどに搭載すれば、映像を取得できるだけではなく対象物までの距離も取得できるようになるというわけです。しかし、その「対象物」の位置自体はなんらかの方法で事前に見つけておく必要があります。例えば、人物までの距離を測定したい場合、人物の位置をあらかじめ知る必要があるのです。

RealSense を用いて人物の骨格の位置を得る方法として、Raspberry Pi と Coral USB Accelerator を用い、ディープラーニングの PoseNet を用いる方法を別サイトで紹介しました。
この方法により、RealSense を用いて人物の姿勢とその距離を得られるようになったのですが、この方法は Windows などの一般的な PC では速度が非常に遅いという難点がありました(そのため、上記ページではWindows 用プログラムは公開しませんでした)。

そこで、本ページでは、RealSense を用いて人物の骨格の位置を得る方法として、公式サイトで紹介されている Cubemos 社による Skeleton Tracking SDK を用いる方法を紹介します。これにより、Windows などの一般的な PC でも RealSense を用いて人物の骨格の位置を高速に得ることができます。

なお、Cubemos 社による Skeleton Tracking SDK は 75ドルの商品なのですが、本ページの内容は 30 日間の無料トライアルでも試すことができます。私自身は 30 日間の無料トライアルで本ページの内容を記しましたが、最終的このライブラリを購入する予定です。

実際に RealSense を用いて人物の骨格の位置を得ている様子が下図です。青~赤に色付けされているのは距離に相当し、骨格に相当する黄色の線分で表示されています。


本ページでは、これを Windows 10 + Python (Anaconda) で実現する方法を記します。RealSense は D415 と D435 が使えます。なお、公式によるシステム要件として以下が挙げられて言いますのでご注意ください。
  • CPUs: 6th to 10th generation Intel Core and Xeon Processors
  • GPUs: Intel Iris Pro, Inte HD Graphics 520, 530, 630

Skeleton Tracking SDK のインストール

ここでは、Skeleton Tracking SDK のインストールを行います。本ページではこの SDK を Windows 上の Python で利用することを意図しています。その場合、Visual Studio や RealSense SDK が PC にインストールされている必要はありません。

まず、Skeleton Tracking SDK のページにある「Try for free」ボタンをクリックしましょう。名前やメールアドレスを入力する欄が現れますので、英語で入力して Submit (送信) ボタンをクリックします。少し待つと、30日間の無料トライアル用のライセンスキーと、SDKのダウンロードリンクが書かれたメールが届きますので、まずは SDK をダウンロードしましょう。

ダウンロードした圧縮ファイル cubemos_SDK.zip を右クリックして「すべて展開」を選択することなどにより、展開してください。そして中に含まれている Windows 用のインストーラー(執筆時は cubemos-SkeletonTracking_2.3.1.6cffde4.exe )をダブルクリックし、インストールしましょう。なお、「Microsoft Visual C++ 2017 Redistributable (x64)」も(インストール済でなければ)合わせてインストールされます。

インストールが終わったら、ライセンスの設定を行います。このとき、職場や学校などのプロキシ環境下ではライセンスの設定ができません(Skeleton Tracking自体はプロキシ環境下でも実行できるのですが)。そのため、ライセンスの設定時のみは、PC をスマートフォンのテザリングなどによりインターネットに直接接続する必要があります。

さて、PCをインターネットに直接接続したら、エクスプローラーで「C:\Program Files\Cubemos\SkeletonTracking\scripts」に移動し、中にある「post_installation.bat」をダブルクリックして実行します。すると、以下のようなウインドウが現れますので、先ほど届いたライセンスキーをコピーして貼り付け、「OK」ボタンをクリックすると、ライセンスの登録が始まります。


途中で「Visual Studio 用のファイルを生成するか? (y/n)」というようなメッセージが現れますが(スクリーンショットを取り忘れました)、Python で Skeleton Tracking SDK を使う限り不要なので、「n」を入力して Enter して先に進めます。

最終的にこのプログラムは終了するのですが、ライセンスの登録に成功したかどうかは注意して確認する必要があります。 ライセンス登録のログは「C:\Users\ユーザー名\AppData\Local\Cubemos\SkeletonTracking\logs」フォルダに格納されています。AppData フォルダは隠しフォルダになっているのでエクスプローラーで「隠しフォルダを表示する」設定を行わないと見られませんので注意してください。そのフォルダにあるログファイルをテキストエディタで開いたとき、ライセンスの設定がうまくいっていれば、末尾が下記のようになっているはずです。
(中略)
[CUBEMOS_LOG_20][2020-Jun-19 18:21:11.519998][info]Loaded the cubemos plugin C:\Program Files\Cubemos\SkeletonTracking\bin\cubemos_intel_inference_engine_plugin.dll
[CUBEMOS_LOG_21][2020-Jun-19 18:21:11.520994][debug]Cubemos handle is now valid
しかし、ライセンスの登録に失敗している場合は、その問題を解消しない限り Skeleton Tracking SDK は使えません。 私が遭遇したエラーとしては、まず下記のものがあります。
(中略)
[CUBEMOS_LOG_16][2020-Jun-12 17:24:28.132243][info]The provided activation key has been accepted for creation of the cubemos handle.
[CUBEMOS_LOG_17][2020-Jun-12 17:24:28.203042][error]Exception caught in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\engine.cpp and line 226 with error message: "boost::dll::shared_library::load() failed: 指定されたモジュールが見つかりません。"
このエラーの原因はよくわからなかったのですが、Skeleton Tracking SDK とともにインストールされる「Microsoft Visual C++ 2017 Redistributable (x64)」との連携がうまくいっていないのかもしれません。私の場合、一度 Skeleton Tracking SDK をアンインストールし、もう一度 Skeleton Tracking SDK をインストールしたらこの問題は解決しました。その際、再インストール時もスマホのテザリングによりPCを直接インターネットに接続したので、それが効いたのかもしれませんが未確認です。

もう一つ遭遇したのは、以下のエラーです。 CPU がサポート外だと言われています。
(中略)
[CUBEMOS_LOG_9][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 79 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 6"
[CUBEMOS_LOG_10][2020-Jun-19 18:06:42.372179][error]Hardware information reading failed: An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. 
[CUBEMOS_LOG_11][2020-Jun-19 18:06:42.372179][error]Exception thrown in file C:\Users\sid\Documents\core_binaries\sources_and_scripts\core\modules\engine\src\internal_api.cpp and line 134 with error message: "An attempt to activate the cubemos SDK was made on an incompatible CPU (Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz) . In order to avoid consuming the license, the process will abort here. Please retry activation on a compatible hardware. . Return code: 1"
古い PC がサポート外と言われるならわかるのですが、私の場合、2020年に購入した Surface Laptop 3 (Core i7-1065G7) でもこのエラーが出ました。サポートに問い合わせたらまだサポート外だそうです。古い PC だけでなく、新しいPC でもサポート外のエラーが出ることがあるのは注意が必要です。

最終的に、私の場合 2016年頃に購入した Surface Pro 4 (Core i7-6650U) でライセンス登録に成功しました。

なお、ライセンスの登録に成功すると、その情報が C:\Users\ユーザー名\AppData\Local\Cubemos フォルダに格納されます。同一マシンの別ユーザーで Skeleton Tracking SDK を使いたい場合(例えば、ライセンス登録するユーザーとプログラム開発をするユーザーが違う場合など)、このフォルダを別ユーザーにコピーすれば問題なく使えます。

Anacondaのインストールと設定

SDKをインストールしたら、それを使うための環境である Anaconda をインストールしましょう。Anaconda は、Python で機械学習を行うためのパッケージを提供するプラットフォームです。Python での機械学習の利用が容易になるので用います。 以下では、Windows 10 に Anaconda をインストールし、含まれている開発環境 Spyder で Python を利用する方針で記します。

その前に、いくつか設定が必要です。まず、下図のような Windows 10 の環境変数を設定するウインドウを表示します。このウインドウの表示方法は、Google などで検索すれば見つかるでしょう。

そして、上側にある「新規」ボタンを押し、 変数名に
CUBEMOS_SKEL_SDK
を、変数値に
C:\Program Files\Cubemos\SkeletonTracking
を入力してOK という変数を新規で作成し、以下の値を保存しましょう。下図の最上部に見えているように「CUBEMOS_SKEL_SDK」というユーザー環境変数が保存されます。


なお、環境変数 CUBEMOS_SKEL_SDK は、SDKのインストール時に「システム環境変数」(上図の下半分の領域)として自動的に登録されています。しかし、本ページで用いる Spyder では「システム環境変数」(下半分)ではなく「ユーザー環境変数」(上半分)しか読み込まないようなので、 「ユーザー環境変数」に新たに追加する、というわけです。

次に、Windows 10に Anaconda をインストールします。 「Anaconda のページ」をページ末尾までスクロールすると、下記のような内容が現れます。


64ビット版 Windows をご利用の場合、Python 3.8 用の「64-Bit Graphical Installer」をクリックします。なお、上図には macOS や Linux 用のリンクも見えます。ですから、それらの OS でも本ページの内容は実行可能なはずです。本ページの以下では Windows を例に実行方法の解説を行いますのでご了承ください。

ダウンロードが完了すると、「ダウンロード」フォルダなどに「Anaconda3-2020.07-Windows-x86_64.exe」のようなファイルが保存されています。ダブルクリックし、Anaconda のインストールを開始しましょう。

インストールが終わったら、スタートメニューの「A」の項目に下図のように「Anaconda3 (64bit)」という項目が増えています。 このうち「Anaconda Prompt (Anaconda3)」を選択して実行してください。


現れた下記の画面がプロンプトであり、ここでコマンド(命令)を実行することで、各種ツールのインストールを行います。「neura」の部分はユーザー名であるので人により異なります。


まず、プロンプト上で下記のコマンドを入力して実行して、「仮想環境」と呼ばれるものを作成します。「仮想環境」とは、Anacondaのデフォルトの環境とは別に、本ページ用の環境を作るために用います。ここでは本ページの演習を実行するために作成する仮想環境の名称を「cubemos」としました。
また、Anaconda は Python 3.8用のものをダウンロードしましたが、仮想環境は Python 3.7 用のものを作成しますのでご注意ください。
conda create -n cubemos python=3.7
なお、以後長いコマンドが続きます。ブラウザ上で上のコマンドをコピーし、下図のようにプロンプトの左上のアイコンをクリックして現れるメニューから「貼り付け」を選択すればコマンドをプロンプトに貼り付けられます。


すなわち、本ページからコピーしたコマンドを上図の方法でプロンプトに貼り付け、Enterキーを入力することでコマンドを実行するのです。この方法により、確実にコマンドを実行するようにしましょう。

なお、このとき「Continue creating environment (y/[n])?」や「Proceed (y/[n])?」と聞かれますので、どちらの場合もキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。 仮想環境の作成が完了したら、下記のコマンドを実行して作成した仮想環境「cubemos」に入ります。
conda activate cubemos
その結果、プロンプトの行頭が「(base)」から「(cubemos)」に変化しており、環境が「base」から「cubemos」に変わったことがわかります。

そのままの状態で、下記の3つのコマンドを一つずつ順に実行して、本ページの演習に必要なツールをインストールしましょう。これらコマンドは特に長いので、一つずつ注意してコピーして実行しましょう。先ほどと同様、 「Proceed (y/[n])?」などと聞かれたときはキーボードで「y」をタイプして「Enter」キーを押して作業を進めてください。
conda install py-opencv spyder console_shortcut toml

pip install pyrealsense2

pip install --find-links="%CUBEMOS_SKEL_SDK%\wrappers\python" cubemos-skeletontracking
なお、最後のコマンドは以前の Cubemosのバージョン(バージョン2系)では以下でした。
pip install --find-links="%CUBEMOS_SKEL_SDK%\wrappers\python" cubemos-core cubemos-skel
これらのコマンドの実行が終わると(正確には一つ目のコマンドの実行が終わると)、スタートメニューの「Anaconda3 (64bit)」の項目には「Anaconda Prompt (cubemos)」や「Spyder (cubemos)」が追加されています。どちらも、仮想環境 cubemos で必要なツールです。「Anaconda Prompt (cubemos)」は仮想環境 cubemos へツールをインストールしたいときに、「Spyder (cubemos)」は仮想環境 cubemos でPythonプログラムを実行するときに用います。

ここまでが終わったらプロンプトを閉じ、スタートメニューから「Anaconda3 (64bit)」の「Spyder (cubemos)」を実行してください。カッコ内の文字が cubemos であることが重要です。

起動した Spyder(cubemos) で、メニューから「ツール」→「現在のユーザーの環境変数」を選択してください。警告画面でOKすると、以下のように Spyder で読み込まれている環境変数のリストが現れます。先ほど自分で登録した「CUBEMOS_SKEL_SDK」が存在することがわかります。それを確認できたら、この画面を閉じて構いません。


なお、仮想環境 cubemos 用のSpyder が起動して、インターフェースが日本語ではなかった場合、メニューから「Tools」→「Preferences」を選択し、現れたウインドウで「General」→「Advanced settings」を選択してLanguageを日本語に設定してください。その際、再起動を促されますのでそれに従えばインターフェースが日本語になります。

Skeleton Tracking SDK を Windows の Anaconda 上の Python で使ってみる

以上が終わったら、サンプルファイルを実行してみましょう。Skeleton Tracking SDK をインストールした PC に RealSense D415 または D435 を接続しましょう。本ページのスクリーンショットは D435 で試した結果です。

neuralassembly/realsense-cubemos-skeletonのページに移動し、「Clone」→「Download ZIP」とたどることで、realsense-cubemos-skeleton-master.zip をダウンロードしましょう。realsense-cubemos-skeleton-master.zip は圧縮ファイルなので、右クリックして「すべて展開」を選択することなどにより、展開してください。中に含まれる realsense_skeleton.py がサンプルプログラムなので、先ほど起動した Spyder (cubemos) のメニューから「ファイル」→「開く」を選択して読み込みます。

実行する前に、Spyder (cubemos) のメニューから「実行」→「ファイルごとの設定」を選択します。現れたウインドウで、下図のように、「コンソール」→「外部システムターミナルで実行」にチェックを入れ、OKボタンをクリックします。


以上が終わったら、Spyder (cubemos) のメニューから「実行」→「実行」を選択します。以下のように3つのウインドウが開きます。順に、カラー画像(骨格表示)、深度画像、上記2枚の重ね書きです。

カラー画像(骨格表示)


深度画像


上記2枚の重ね書き

これらはプログラム中の132~134行目で表示されています。不要ならばコメントアウトなどしてください。
        cv2.imshow('color', color_image)
        cv2.imshow('depth', depth_image)
        cv2.imshow('overlay', added_image)

少しだけコメント

関数 render_result の内部にあるfor 文
for index, skeleton in enumerate(skeletons):
の内部では、
skeleton.joints[i][0] : 関節 i の x 座標
skeleton.joints[i][1] : 関節 i の y 座標
skeleton.confidences[i] : 関節 i の confidence 
を用いることができます。2つの関節の confidence がともに 0.5 以上のときにその間が線分で結ばれます。「関節 i」の数字 i (0~17) は、「C:\Program Files\Cubemos\SkeletonTracking\docs\doc_doxygen\html\group__skeleton.html で表示される図の数値 (1~18) から 1 を引いたもの」となっています。 

おわりに

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




「高校数学からはじめるディープラーニング」、「Raspberry Piではじめる機械学習」を執筆しました。