Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

HoloLens等 RS5(17763)で Windows MLを使う

264 views

Published on

HoloLensを含めたWindows 10 October Update(1809)でWindows MLを使った物体検知アプリの作り方を説明。
作成したサンプルコードは以下のGitHubに公開。
https://github.com/TakahiroMiyaura/HoloLensOnnxTinyYoLo

Published in: Technology
  • Be the first to comment

  • Be the first to like this

HoloLens等 RS5(17763)で Windows MLを使う

  1. 1. HoloLens等 RS5(17763)で Windows MLを使う Miyaura – 大阪駆動開発 2018/11/21
  2. 2. こんな人が話します Miyaura Takahiro(@takabrz1) ◦ 某会社でシステムエンジニアしています。 ◦ コミュニティ: 大阪駆動開発 ◦HoloLens含むXR技術は趣味! ◦Microsoft MVP for Windows Development(2018-2019) ◦https://qiita.com/miyauraでMixed Reality開発Tips公開中!
  3. 3. 今日のテーマ 「新しいOSアップデートでWindows MLを使う」 世の中のサンプルは 春のアップデート使ってるので 少し使い方が変わる
  4. 4. 今回の成果 HoloLensの日本語版を最新のInsider Review版RS5(17763)にアップデートし、 Windows MLを使ったオフラインでの物体検知のサンプルを構築
  5. 5. OSバージョン1809の今のWindows MLはいくつかのバグがある。 学習済みモデルとのデータの入出力で上手くいかないパターンがある。 現在使えるのは OS バージョン1803(April 2018 Update)のWindows MLだが 今度のアップデート(OSバージョン1809)で互換性がなくなっている。 ※基本的な流れは変わらないがそのままでは上手くいかない。 今度のOSアップデート後 Windows ML使う注意点 ①現状の大半のWindows MLに関する情報は役に立たないかも ②Windows ML API自体がまだできて期間が浅いので色々問題が出そう
  6. 6. 参考:OSバージョンでの違い OSバージョン(1803) 2018 April Update OSバージョン(1809) 2018 October Update WindowsML APIの違い Windows.AI.MachineLearning.Preview Windows.AI.MachineLearning ONNX バージョン ONNX 1.2 ~ONNX 1.0 ~ ONNXとの入出力用に 専用の型が追加 UWPで標準である クラスを入出力用の型として使用 ということでほぼ別物です。今日は1809版での解説!
  7. 7. Windows ML APIを使うための環境 実行環境 開発環境 • Windows 10:バージョン1809 • Windows 10 • Windows SDK 17763以降 • Visual Studio 2017 開発環境は必ずしもOSバージョン1809でなくても開発は可能。 実行時には1809でないとだめ。
  8. 8. Windows ML APIで物体検知を行う手順 1. Tiny Yolo V2用のONNXを取得 2. Visual StudioでUWPアプリケーションを作成 3. ONNXをプロジェクトに追加 4. 自動生成されるラッパークラスを修正 5. 画像を取り込むための実装 6. ONNXを使って取得した画像を推論にかける 7. 推論結果を分析
  9. 9. 1.Tiny Yolo V2用のONNXを取得 Azure AI Galleryから取得 https://gallery.azure.ai/Model/Tiny-YOLOv2 Download先からONNXファイルを ダウンロードする。 ONNXはバージョン1.2
  10. 10. 2.Visual StudioでUWPアプリケーションを作成 • Visua Studio 2017を起動して空のUWPアプリケーションを作成 <Grid> <Grid.RowDefinitions> <RowDefinition Height="8.5*" /> <RowDefinition Height="1.5*" /> </Grid.RowDefinitions> <Viewbox Name="Box1" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"> <Image Name="ImageData" /> </Viewbox> <Viewbox Grid.Row="0"> <Canvas Name="Canvas1" HorizontalAlignment="Center" VerticalAlignment="Center" /> </Viewbox> <ScrollViewer Grid.Row="1"> <TextBlock Name="Ready" FontSize="12" TextAlignment="left">false</TextBlock> </ScrollViewer> </Grid> <Page.BottomAppBar> <CommandBar> <AppBarButton Label="LoadFile" Name="LoadFile" Icon="Page2" Click="LoadFile_OnClick" /> <AppBarButton Label="CapturePhotoAsync" Name="Capture" Icon="Camera" Click="Capture_OnClick" /> </CommandBar> </Page.BottomAppBar> ステータス表示 画像データ表示 物体検知した対象の枠 を描くエリア
  11. 11. 3.ONNXをプロジェクトに追加 ダウンロードしたONNXファイルをUWPプロジェクトの適当な場所に コピーして「プロジェクトに含める」 自動的にONNXファイル名と同名のラッパークラスが生成される。
  12. 12. 4.自動生成されるラッパークラスを修正 public sealed class TinyYoloV1_2Input{ public TensorFloat image; // shape(-1,3,416,416) } public sealed class TinyYoloV1_2Output{ public TensorFloat grid; // shape(-1,125,13,13) } 生成直後(抜粋) ここはVideoFrame or ImageFeatureValueに変更! public sealed class TinyYoloV1_2Input{ public VideoFrame image; // shape(-1,3,416,416) } public sealed class TinyYoloV1_2Output{ public TensorFloat grid; // shape(-1,125,13,13) } 修正後(抜粋) 入力が画像データの場合は中身を確認して書換えを実施
  13. 13. 5.画像を取り込むための実装 UWPのMediaCaptureクラスを用いてカメラ画像をキャプチャ キャプチャの際の画像フォーマットは「BGRA8」 var devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); var device = devices[0]; _capture = new MediaCapture(); var settings = new MediaCaptureInitializationSettings { VideoDeviceId = device.Id }; await _capture.InitializeAsync(settings); _lowLagPhotoCapture = await _capture.PrepareLowLagPhotoCaptureAsync( ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8)); _capture.VideoDeviceController.Focus.TrySetAuto(true); asyncOperation = await _lowLagPhotoCapture.CaptureAsync(); 実装例(抜粋)
  14. 14. 6.ONNXを使って取得した画像を推論にかける ラッパークラスを利用して推論処理を実行する var input = new TinyYoloV1_2Input(); input.image = VideoFrame.CreateWithSoftwareBitmap(SoftwareBitmap.Convert( softwareBitmap, BitmapPixelFormat.Bgra8)); var tinyYoloV10ModelOutput = await _model.EvaluateAsync(input); 実装例(抜粋)
  15. 15. 7.推論結果を分析 推論結果は「Yolo9000」という論文に・・・ 画像を13X13ブロックに分割し、1ブロックあたり125パラメータ が・・・みたいなとても複雑なものを解析しないといけないです。 なんとParserを作ってくれてる人がいたのでありがたく使わせて いただきました! 「#WinML – Updated demo using Tiny YOLO V2 1.2, Windows 10 and YOLOV2 for Object Detection Series」 https://elbruno.com/2018/08/07/winml-updated-demo-using-tiny-yolo-v2-1-2-windows-10-and-yolov2-for- object-detection-series/
  16. 16. すると! こんなことができます。 こう少しHoloLensらしく作れば、物体検知した部分に直接枠を出すことも可能
  17. 17. 詳細は後日Qiitaに解説載せます。 サンプルは以下のGithubで公開中。 https://github.com/TakahiroMiyaura/HoloLensOnnxTinyYoLo
  18. 18. 大阪駆動開発 関西を中心に、IT系のおもしろそうなことを楽しんでやるコミュニティ

×