Intel RealSenseに待望のSkeleton Tracking SDKが出た(cubemos製)ので触ってみた[Windows編]

2020.03.09

せーのでございます。

IntelのRealSenseシリーズといえばDepthカメラとしてデファクトスタンダードになりつつある高性能カメラです。
人物検知や骨格推定、物体検知などの機械学習の分野にもセンサーとして広く使われているこのRealSenseですが、
先日待望のRealSenseを使う前提の機械学習用のSDKかCubemosからリリースされましたので、早速触ってみたいと思います。

ハードルが高かった

RealSenseにもそのセンサーを操作するためのSDKは公開されていました。しかしそれはあくまでRealSenseに備わっているIRやDepth、RGBなどの各センサーを触るためのSDKでした。
また、それを使ったサンプルコードなどもあったのですがC++オンリーのものが多く、手軽にサクッと使うには少しハードルが高いものでした。

それを解消するためにミドルウェアを挟んで使うことが多く、代表的なのはNUITRACKというミドルウェアです。

ですがこのNUITRACK、RealSenseの場合にはLinux x64のOS、AMD64アーキテクチャにしか対応していませんでした。
私が使いたいのはRaspberry PiやJetsonなどのシングルボードで、そのアーキテクチャはarm64、NUITRACKはこの上では動きません。

これは自力でモデル作ってデプロイさせるしか方法はないか、と思っていたときにリリースされたのがこのcubemosのSkeleton Tracking SDKです。

特徴

このSDKの特徴は

  • GPUがあってもなくても動く
  • WindowsとLinuxで走る
  • C、C++、Python、C#とコードが豊富

です。
何よりPythonやC#が使えるのはありがたいです。30日間のトライアルライセンスがあるようなので、何はともあれ動かしてみましょう。

動かしてみた

ページから「Try for free」のボタンをクリックすると必要情報を入力の後、メールが届き、そこからSDKのダウンロードを行います。 Windows版とLinux版が入っているので、今回はWindows版のGettingStartを動かしてみます。

exeを叩くとインストーラが出てくるのでそのまま進めます。

インストールが終わったら、Program Files¥Cubemos¥SkeletonTracking¥scripts の中に入っている「post_installation.bat」というバッチを叩いてアクティベートさせます。アクティベートさせるライセンスのキーはメールの中に書いてあります。

ここで確認してほしいのがVisual Studio 2017の有無です。このSDKをアクティベートさせると、Visual Studio 2017で動かせるサンプルがソリューションの形でダウンロードされます。が、Visual Studio 2017がインストールされていない場合、この部分がエラーとなってサンプルがダウンロードされません。フリーのCommunity版で構わないので先にインストールしておきましょう。

インストールとアクティベートが終わったら、確認のためにサンプルexeを走らせてみましょう。
Program Files¥Cubemos¥SkeletonTracking¥bin の中にある[csharp-image.exe]というexeを起動させると予めコンパイルしてあるサンプルが動きます。これは中に入っているこの写真

の骨格検知をし、それぞれ18ポイントのキーに分け、その位置をデータで返す、というものです。下記のようなデータが返ってきたらインストール、アクティベートは共に正常、ということです。

ではGettingStartからやってみます。

Getting Start (C#)

まず新しいソリューションを作ります。ここではC#のデスクトップアプリケーション=>コンソールアプリを作ります。
デスクトップアプリケーションが出てこない人はVisual Studio Installerから入れてください。

新しいソリューションが出来上がったらWindows上で動かすため、x64アーキテクチャをターゲットプラットフォームとする設定を行います。ビルド => 構成マネージャーより「アクティブ ソリューション プラットフォーム」の下のトグルボタンをクリックし、x64を選択します。もしなければ新規作成でx64を作成して選択します。

次にNuGetのパッケージマネージャを更新します。NuGetというのは.NET用のパッケージマネージャです。Pythonでいうpip、Node.jsでいうnpmですね。ツール => オプションをクリックして、左のツリーよりNuGetパッケージマネージャ => パッケージソースを選択します。
右上の+ボタンをクリックして新しいパッケージをインストールします。名前は任意で構いません。パスは Program Files¥Cubemos¥SkeletonTracking¥wrappers¥csharp¥nuget を選択します。順番も特にどこでも構いません。

パッケージのインストールが終わったら、それをプロジェクトの中に入れます。プロジェクト部分を右クリックして「NuGetパッケージの管理」を開きます。

左側に選択できるパッケージの一覧が並びます。右上の「パッケージソース」を先程インストールしたパッケージ名に選択し、そのまま左ペイン上部にある「参照」というタブをクリックすると2つのパッケージが出てくるので、両方インストールします。

これで環境設定は完了です。試しに人物検出の簡単なコードを書いて動かしてみましょう。メインメソッドを下記のコードに書き換えてみます。

using System;
/// 
/// This sample shows how to use the cubemos SkeletonTracking C# API in a console application /// 
/// 
namespace Cubemos.Samples
{
    class Program
    {
        static void Main(string[] args)
        {
            // Read an RGB image of any size 
            String cubemosSkelData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\Cubemos\\SkeletonTracking";
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(cubemosSkelData + "\\res\\images\\skeleton_estimation.jpg");

            // Decalre results container 
            System.Collections.Generic.List<Cubemos.SkeletonTracking.Api.SkeletonKeypoints> skeletonKeypoints;

            // Create cubemos API handle for Intel® Inference Plugin and specify the folder with the license key 
            var skeletontrackingApi = new Cubemos.SkeletonTracking.Api(cubemosSkelData + "\\license");

            // Load the CPU model 
            skeletontrackingApi.LoadModel(Cubemos.TargetComputeDevice.CM_CPU,
                cubemosSkelData + "\\models\\fp32\\skeleton-tracking.cubemos");

            // Send inference request and get the poses 
            skeletontrackingApi.RunSkeletonTracking(ref image, 128, out skeletonKeypoints);

            //Output the number of detected skeletons 
            Console.WriteLine("#Persons detected: " + skeletonKeypoints.Count);
            Console.Write("\nPress any key to exit...");
            Console.ReadKey(true);
        }
    }
}

簡単に解説すると13行目で上にある写真のパスを指定して画像を持ってきます。19行目でAPIを宣言して、22〜23行目でモデルをインポートします。fp32とあるのでResNetでしょうか。26行目で推論を行い、29行目で結果、この場合は見つけた人の人数を返しています。

ではこのソースをビルドして動かしてみます。このようなコンソール画面がでてきたら成功です。

ちなみにこの29行目をブレイクして中身を見てみるとこのようになっています。

配列が入っていて、その中にそれぞれの関節のX、Y座標とその信頼度が入っています。これをループして表示させると、最初に動かしたサンプルexeと同じものが出てきます。

サンプルexeのソースを見てみる

最初に動かしたサンプルexeのソースがC++版でもあるので見てみましょう。

まず環境変数を作ります。
%CUBEMOS_SKEL_SDK%という環境変数を SkeletonTrackingがインストールされたディレクトリで作ります。通常は[C:\Program Files\Cubemos\SkeletonTracking]となります。

次にGUI版のCMAKEをインストールします。3.10以上であればOKです。

CMakeを開いてソースコードに[C:\Program Files\Cubemos\SkeletonTracking\Samples]、バイナリの出力先は適当にディレクトリを作ってそこを指定します。ジェネレーターのプラットフォームはx64、使うVisual StudioはVisual Studio 15 2017と選択します。設定が終わったらConfigure、Generateと順番に押していきます。

そうすると出力先にVisual Studio 2017版でソリューションが出力されます。CMakeの[Open Project]ボタンでも開けますので、クリックして開きます。

そうすると先程のcsharp-image.exeのc++版[cpp-image]など数種類のサンプルが入っています。ビルドすると<先程CMakeで出力した先>/Cubemos/skeleton_tracking_build/cpp/image/Debug/cpp-image.exe の位置にexeが吐き出されていますので、叩いてみて、最初のサンプルexeと同じような表示(関節のポイント数とXY座標、信頼度)が出てくれば成功です。

まとめ

ということでまずはサンプルを動かしてみました。やはりC#などの高級言語で書かれていると人間には非常に読みやすいです。
他にもこのSDKはLinux版、Pythonでのサンプルや実際RealSenseカメラを使ったサンプルも出てくるので、このままやってみたいと思います!

参考サイト