Unity
TensorFlow
OpenPose
coreML
PoseNet

PoseNetをマルチプラットフォームで実装してみた

目的

今月(2018/5/8)公開されたPoseNetを対象にTensorFlowJSで使われているモデルのウエイトは再利用可能か?について調査と、iOSUnityでの実装を試したのでまとめました。

PoseNetについて

最近になって、リアルタイムな姿勢推定が盛り上がっています。

  • OpenPose(2017/4) .. GPUでリアルタイム
  • PoseNet(2018/5) .. ウェブでリアルタイム

アプローチは違いますが、どちらもディープラーニングで姿勢推定を実現しています。
PoseNetのコンセプトとしては、他の姿勢推定ライブラリと比較し、特殊なハードウェアやカメラ、システムのセットアップが不要な点です。
ウェブカメラとブラウザを持っていれば手元で実行が可能です。

元々の論文ではCOCOのテストにあるOpenPoseよりも高精度を達成したそうです。
表のResNet152(single-scale)=0.665,ResNet152(multi-scale)=0.687でそれぞれCMU-Poseの0.618を超えるスコアになっています。

pose_score.png

また、PoseNetはブログでも紹介がありますので参考ください。
Real-time Human Pose Estimation in the Browser with TensorFlow.js

PoseNetモデル

モデルの構造は図のようになります。
ここでは、入力画像を513pxで処理しています。

model.png

PoseNetウエイトの変換

mobilenet.tsを参考にして、Pythonでモデルを実装しCoreMLに変換しました。

  1. ウエイトをモデルに設定
  2. checkpointと、graphを保存
  3. 2.を使い、freeze_graphの作成
  4. tfcoremlでCoreMLを作成

変換に使ったコードはこちらにあげています。

PoseNet(TypeScript) から iOS(Swift)への移植

静的型付け言語同士ですので、割と楽に移植できました。
numpyで使われれるような行列関数が使われないのも移植が楽なポイントです。
多次元配列についてはqoncept/TensorSwiftを利用しました。

端末@iPhone7でのパフォーマンス

tennis_result.png

画像サイズ毎に精度、計算量が違うので、処理速度が変わります。
フレームレートをあげて、無理をさせると端末の熱で処理が遅くなりましたので適度な速度で制限をかけるのがよさそうです。

Unityで動かす

iOS以外ではUnityでも実装しました。
推論環境のライブラリとしては、先日ml-agentsのDevelopにアップされたTensorFlowSharpのv1.7.1のPluginを試しました。
Win/Macで動作することは確認できましたが、iOSではnew TFGraph()をコールした時点でクラッシュします。
また、WindowsでDevelop Buildにチェックやブレークポイントを利用する場合にエラーになります。
これは、DotNetのバージョンが異なるのが問題ですので、TensorFlowSharpのv1.7.0を取得し、TensorFlowSharp.csproj<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>net46に変更し、出来上がったTensorFlowSharp.dllで上書きすることで回避できました。
iOSも再ビルドすることで回避できるかもしれませんが未調査です。
他には、UWP対応はまだのようです。

TensorFlowSharpはTensorFlowの正式なプロジェクトではなく、有志(Monoの有名な人)のプロジェクトです。
ml-agentsの推論環境としてTensorFlowSharpが使われていますが、Unityの為にTensorFlowSharpは作られていませんので、Unityでの不具合はどうしようもないところがあります。
iOSの不具合やUWP対応については、Issueで議論がありますので近いうちに解消すればいいなぁと思っています。

結論

PoseNetのウエイトの移植から、iOSのCoreML、UnityのTensorFlowSharpへの実装についてまとめました。
TensorFlowJSのウエイトはマルチプラットフォームで動くことが確認できました。
半年前の調査に比べAIのエコシステムの相互補完がいい感じに機能していることが感じれました。

今回SwiftやC#でPoseNetを実装をしました。
各プラットフォームへのローカライズは割と手間です。
また、UnityのAI環境は安定版でないことも確認できました。

以上です。この情報が参考になればと思います。

宣伝

以前にOpenPoseのモバイル対応についても記事を書いています。
よければご覧ください。

コードの公開先

References