画像から深度推定 on HoloLens
Tokyo HoloLens ミートアップ vol.14
@miso_3g @hiro6391
自己紹介
@miso_3g
• 自社でHoloLens買ってもらえないので出向先で遊んでる人
@hiro6391
• 仕事でHoloLensデモや深層学習をやったりやらなかったり
2
HoloLensでマップ作るの大変ですよね
• 遠くのマップは作れない
• ゆっくりウロウロ…
• 画像から奥行きを求めれば遠くのマップも作れるのでは?
• →深層学習を用いた画像からの深度推定を HoloLens 単体でやってみた
• クラウドや Research mode もアリかもしれないけど
http://fastdepth.mit.edu/2019_icra_fastdepth.pdf
3
深層学習
モデル
4
https://youtu.be/JJo-ZF0Oc-Y
やったこと
1. モデル選択
2. 学習済モデルを ONNX 形式に変換
3. Unity + Windows Machine Learning (WinML) で実装
5
モデル選択
• 精度を求めると計算量が多いモデルになりがちだが、 HoloLens での動作
を考慮して軽量なモデルを選択する
• 今回は国際会議 ICRA 2019 に受理された FastDepth を選択
• http://fastdepth.mit.edu/
• https://github.com/dwofk/fast-depth
• 最適化すると Jetson TX2 で 178fps (on GPU) / 27fps (on CPU)
• 今回は最適化してないので全然早くなかった
6
ONNX 形式に変換
• FastDepth は PyTorch (v0.4.1) 実装と学習済モデルが公開されている
• PyTorch の ONNX 変換機能を使う。簡単!
• https://pytorch.org/docs/stable/onnx.html
• しかし、WinMLRunner で正しく動作するか確認すると…
• https://github.com/Microsoft/Windows-Machine-Learning/tree/master/Tools/WinMLRunner
• 最新の PyTorch 1.0.1 で出力しても…
7
# モデル読み込み(実装依存)
checkpoint = torch.load(args.evaluate)
model = checkpoint[’model’]
# ONNXファイル出力
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, ”fastdepth.onnx”)
Creating session [FAILED]
No suitable kernel definition found for op BatchNormalization
Load Model: C:UsersmatsunoDownloadsfastdepth.onnx [FAILED]
Input size 2 not in range [min=1, max=1].
00000165072AB28C
ONNX のバージョンとバグ
• ONNX のバージョン:https://github.com/onnx/onnx/blob/master/docs/Versioning.md
• ONNX のバグ
• Got error with upsampling operation https://github.com/onnx/onnx/issues/1655
• PyTorch の GitHubから ONNX 1.2 を出力するバージョンを探してきて、
インストールした PyTorch のコードを差し替えたらうまくいった
• https://raw.githubusercontent.com/pytorch/pytorch/03c06ec93db58e444df13e075a74297a9f9a9524/torch/onnx/symbolic.py
8
ONNX version File format version
Operator set
version ai.onnx
Operator set
version ai.onnx.ml
1.0 3 1 1
1.1 3 5 1
1.1.2 3 6 1
1.2 3 7 1
1.3 3 8 1
1.4.1 4 9 1
WinML対応
PyTorch 0.4.1
PyTorch 1.0.x
WinML で実装
• UnityでWinMLを利用するプロジェクトの作成
• アキヒロさんのブログが参考になりました
• http://akihiro-document.azurewebsites.net/post/hololens_windowsmachinelearningunity/
• 基本的な手順は
1. Unityプロジェクトを作る
2. Unity側で必要な物を実装(GameObject設置、イベント登録など)
3. UWPプロジェクトをビルド
4. Visual StudioでUWPプロジェクトを開いてビルドターゲットのバージョンを1809に変更
5. ONNXファイルをAssetsにDrag & Drop
6. VSが自動でモデルのインタフェースを生成してくれるのでそれを利用して推論部分を実装
7. Unity側をいじったらUWPプロジェクトを再ビルド
• ONNXファイルを毎回読み込み直す必要はない
9
Unityの座標系とモデルの入出力
• Unityとモデルの座標系を変換
• PhotoCaptureで取得したカメラ画像をクロップしてモデルに入力、モデルの推論結果を基に
メッシュを作って表示
• PhotoCapture ⇒ モデル
• 原点とY軸の向きが違うので注意
• モデル ⇒ 表示
• PhotoCaptureFrameから変換行列が取得できるので変換は簡単
• 詳細は @rakusan さんのQiita記事などを参考にすると良いです
• https://qiita.com/rakusan/items/6af7d35dc7b0222952fa
• https://docs.microsoft.com/ja-jp/windows/mixed-reality/locatable-camera 10
[撮影]
PhotoCapture
[推論]
モデル
[表示]
ワールド座標系
(0, 0)
(0, 0)
(224, 224)
まとめ/所感
• ONNX 生成から HoloLens での動作・表示までの流れを紹介した
• ONNX のバージョンとバグに注意
• 座標変換に注意
• 推論に2秒くらいかかる
• HoloLens 2 でどれだけ早くなるか(≒精度の高いモデルを使えるか)
楽しみです!
• ソースコードを公開しました
• https://github.com/miso3/HoloFastDepth
11

画像から深度推定 on HoloLens

  • 1.
    画像から深度推定 on HoloLens TokyoHoloLens ミートアップ vol.14 @miso_3g @hiro6391
  • 2.
  • 3.
    HoloLensでマップ作るの大変ですよね • 遠くのマップは作れない • ゆっくりウロウロ… •画像から奥行きを求めれば遠くのマップも作れるのでは? • →深層学習を用いた画像からの深度推定を HoloLens 単体でやってみた • クラウドや Research mode もアリかもしれないけど http://fastdepth.mit.edu/2019_icra_fastdepth.pdf 3 深層学習 モデル
  • 4.
  • 5.
    やったこと 1. モデル選択 2. 学習済モデルをONNX 形式に変換 3. Unity + Windows Machine Learning (WinML) で実装 5
  • 6.
    モデル選択 • 精度を求めると計算量が多いモデルになりがちだが、 HoloLensでの動作 を考慮して軽量なモデルを選択する • 今回は国際会議 ICRA 2019 に受理された FastDepth を選択 • http://fastdepth.mit.edu/ • https://github.com/dwofk/fast-depth • 最適化すると Jetson TX2 で 178fps (on GPU) / 27fps (on CPU) • 今回は最適化してないので全然早くなかった 6
  • 7.
    ONNX 形式に変換 • FastDepthは PyTorch (v0.4.1) 実装と学習済モデルが公開されている • PyTorch の ONNX 変換機能を使う。簡単! • https://pytorch.org/docs/stable/onnx.html • しかし、WinMLRunner で正しく動作するか確認すると… • https://github.com/Microsoft/Windows-Machine-Learning/tree/master/Tools/WinMLRunner • 最新の PyTorch 1.0.1 で出力しても… 7 # モデル読み込み(実装依存) checkpoint = torch.load(args.evaluate) model = checkpoint[’model’] # ONNXファイル出力 dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, ”fastdepth.onnx”) Creating session [FAILED] No suitable kernel definition found for op BatchNormalization Load Model: C:UsersmatsunoDownloadsfastdepth.onnx [FAILED] Input size 2 not in range [min=1, max=1]. 00000165072AB28C
  • 8.
    ONNX のバージョンとバグ • ONNXのバージョン:https://github.com/onnx/onnx/blob/master/docs/Versioning.md • ONNX のバグ • Got error with upsampling operation https://github.com/onnx/onnx/issues/1655 • PyTorch の GitHubから ONNX 1.2 を出力するバージョンを探してきて、 インストールした PyTorch のコードを差し替えたらうまくいった • https://raw.githubusercontent.com/pytorch/pytorch/03c06ec93db58e444df13e075a74297a9f9a9524/torch/onnx/symbolic.py 8 ONNX version File format version Operator set version ai.onnx Operator set version ai.onnx.ml 1.0 3 1 1 1.1 3 5 1 1.1.2 3 6 1 1.2 3 7 1 1.3 3 8 1 1.4.1 4 9 1 WinML対応 PyTorch 0.4.1 PyTorch 1.0.x
  • 9.
    WinML で実装 • UnityでWinMLを利用するプロジェクトの作成 •アキヒロさんのブログが参考になりました • http://akihiro-document.azurewebsites.net/post/hololens_windowsmachinelearningunity/ • 基本的な手順は 1. Unityプロジェクトを作る 2. Unity側で必要な物を実装(GameObject設置、イベント登録など) 3. UWPプロジェクトをビルド 4. Visual StudioでUWPプロジェクトを開いてビルドターゲットのバージョンを1809に変更 5. ONNXファイルをAssetsにDrag & Drop 6. VSが自動でモデルのインタフェースを生成してくれるのでそれを利用して推論部分を実装 7. Unity側をいじったらUWPプロジェクトを再ビルド • ONNXファイルを毎回読み込み直す必要はない 9
  • 10.
    Unityの座標系とモデルの入出力 • Unityとモデルの座標系を変換 • PhotoCaptureで取得したカメラ画像をクロップしてモデルに入力、モデルの推論結果を基に メッシュを作って表示 •PhotoCapture ⇒ モデル • 原点とY軸の向きが違うので注意 • モデル ⇒ 表示 • PhotoCaptureFrameから変換行列が取得できるので変換は簡単 • 詳細は @rakusan さんのQiita記事などを参考にすると良いです • https://qiita.com/rakusan/items/6af7d35dc7b0222952fa • https://docs.microsoft.com/ja-jp/windows/mixed-reality/locatable-camera 10 [撮影] PhotoCapture [推論] モデル [表示] ワールド座標系 (0, 0) (0, 0) (224, 224)
  • 11.
    まとめ/所感 • ONNX 生成からHoloLens での動作・表示までの流れを紹介した • ONNX のバージョンとバグに注意 • 座標変換に注意 • 推論に2秒くらいかかる • HoloLens 2 でどれだけ早くなるか(≒精度の高いモデルを使えるか) 楽しみです! • ソースコードを公開しました • https://github.com/miso3/HoloFastDepth 11

Editor's Notes

  • #11 PhotoCaptureで取得したカメラ画像をクロップしてモデルに入力、モデルの推論結果を基にメッシュを作って表示する PhotoCaptureからモデルの座標系への変換は簡単 PhotoCaptureのデータ 原点: 左下 X: 右に+ Y: 上に+ モデルの入力データ 原点: 左上 X: 右に+ Y: 下に+ 推論結果から表示(ワールド座標系)への変換 モデルの