次の方法で共有


HoloLens (第 1 世代) と Azure 307: 機械学習


注:

Mixed Reality Academy のチュートリアルは、HoloLens (第 1 世代) と Mixed Realityイマーシブ ヘッドセットを念頭に置いて設計されました。 そのため、これらのデバイスの開発に関するガイダンスをまだ探している開発者には、これらのチュートリアルを配置しておくことが重要であると考えます。 これらのチュートリアルは、HoloLens 2に使用されている最新のツールセットや相互作用では更新されません。 これらは、サポートされているデバイスでの作業を継続するために維持されます。 今後、HoloLens 2向けに開発する方法を示す新しい一連のチュートリアルが掲載されます。 この通知は、投稿時にこれらのチュートリアルへのリンクで更新されます。


最終製品 -start

このコースでは、Azure Machine Learning Studio (クラシック) を使用して、Mixed Reality アプリケーションに Machine Learning (ML) 機能を追加する方法について説明します。

Azure Machine Learning Studio (クラシック) は、データ入力、出力、準備、視覚化に役立つ多数の機械学習アルゴリズムを開発者に提供する Microsoft サービスです。 これらのコンポーネントから、予測分析実験を開発し、反復し、それを使用してモデルをトレーニングできます。 トレーニングの後、Azure クラウド内でモデルを運用できるようにして、新しいデータをスコア付けできます。 詳細については、 Azure Machine Learning Studio (クラシック) ページを参照してください。

このコースを完了すると、Mixed Reality イマーシブ ヘッドセット アプリケーションが用意され、次の方法が学習されます。

  1. Azure Machine Learning Studio (クラシック) ポータルに売上データのテーブルを提供し、人気のあるアイテムの将来の売上を予測するアルゴリズムを設計します。
  2. ML サービスから予測データを受信および解釈できるUnity プロジェクトを作成します。
  3. 棚に最も人気のある販売アイテムを提供することで、Unity プロジェクト内で予測データを視覚的に表示します。

アプリケーションでは、結果を設計と統合する方法はユーザー次第です。 このコースは、Azure サービスを Unity プロジェクトと統合する方法を説明するように設計されています。 このコースから得た知識を使用して、Mixed Reality アプリケーションを強化するのがあなたの仕事です。

このコースは自己完結型のチュートリアルであり、他のMixed Reality Labs には直接関係しません。

デバイスのサポート

コース HoloLens イマーシブ ヘッドセット
MR と Azure 307: 機械学習 ✔️ ✔️

注:

このコースでは主に、Windows Mixed Realityイマーシブ (VR) ヘッドセットに焦点を当てていますが、このコースで学習した内容をMicrosoft HoloLensに適用することもできます。 コースに従うと、HoloLens をサポートするために採用する必要がある変更に関するメモが表示されます。 HoloLens を使用すると、音声キャプチャ中にエコーが発生することがあります。

前提条件

注:

このチュートリアルは、Unityと C# に関する基本的な経験を持つ開発者向けに設計されています。 また、このドキュメント内の前提条件と書面による指示は、執筆時点 (2018 年 5 月) にテストおよび検証された内容を表していることにも注意してください。 ツールのインストールに関する記事に記載されている最新のソフトウェアは自由に使用できますが、このコースの情報は、以下に示すソフトウェアよりも新しいソフトウェアで見つかるものと完全に一致するとは想定しないでください。

このコースでは、次のハードウェアとソフトウェアをお勧めします。

始める前に

このプロジェクトのビルドで問題が発生しないように、このチュートリアルで説明するプロジェクトをルート フォルダーまたはほぼルート フォルダーに作成することを強くお勧めします (長いフォルダー パスがビルド時に問題を引き起こす可能性があります)。

第 1 章 - Azure Storage アカウントのセットアップ

Azure Translator API を使用するには、アプリケーションで使用できるようにサービスのインスタンスを構成する必要があります。

  1. Azure Portal にログインします。

    注:

    Azure アカウントがまだない場合は、アカウントを作成する必要があります。 教室やラボの状況でこのチュートリアルに従っている場合は、講師またはプロクターの 1 人に新しいアカウントの設定に関するヘルプを依頼してください。

  2. ログインしたら、左側のメニューで [ ストレージ アカウント ] をクリックします。

    Microsoft Azure ウィンドウのスクリーンショット。左側のナビゲーション メニューに [ストレージ アカウント] 項目が表示されています。

    注:

    新しいポータルでは、New という単語がリソースの作成に置き換えられた可能性があります。

  3. [ ストレージ アカウント ] タブで、[ 追加] をクリックします。

    [ストレージ アカウント] 画面と強調表示された [追加] ボタンを示す Microsoft Azure ウィンドウのスクリーンショット。

  4. [ ストレージ アカウントの作成] パネルで、次の操作を行います。

    1. アカウントの [名前] を挿入します。このフィールドは数字と小文字のみを受け入れることに注意してください。

    2. [デプロイ モデル] で、[リソース マネージャー] を選択します。

    3. [ アカウントの種類] で、[ ストレージ (汎用 v1)] を選択します。

    4. [パフォーマンス] で、[Standard] を選択します。

    5. [ レプリケーション ] で、 読み取りアクセス geo 冗長ストレージ (RA-GRS) を選択します

    6. [ 安全な転送が必要][無効] のままにします

    7. サブスクリプションを選択 します

    8. リソース グループを選択するか、新しい リソース グループ を作成します。 リソース グループを使用すると、Azure 資産のコレクションの監視、アクセスの制御、課金のプロビジョニングと管理を行うことができます。 1 つのプロジェクト (これらのラボなど) に関連付けられているすべての Azure サービスを共通リソース グループの下に保持することをお勧めします。

      Azure リソース グループの詳細については、 リソース グループに関する記事を参照してください。

    9. リソース グループの 場所 を決定します (新しいリソース グループを作成する場合)。 この場所は、アプリケーションが実行されるリージョンに理想的です。 一部の Azure 資産は、特定のリージョンでのみ使用できます。

  5. また、本サービスに適用される使用条件を理解していることも確認する必要があります。

    ユーザーが必要なテキスト フィールドに入力した情報を示す [ストレージ アカウントの作成] ダイアログのスクリーンショット。

  6. [ 作成] をクリックすると、サービスが作成されるまで待つ必要があります。これには 1 分かかる場合があります。

  7. Service インスタンスが作成されると、ポータルに通知が表示されます。

    リソース グループへのデプロイが成功したことをユーザーに通知する [デプロイに成功しました] 通知のスクリーンショット。

第 2 章 - Azure Machine Learning Studio (クラシック)

Azure Machine Learning を使用するには、アプリケーションで使用できるように Machine Learning サービスのインスタンスを構成する必要があります。

  1. Azure Portal で、左上隅にある [ 新規 ] をクリックし、 Machine Learning Studio ワークスペースを検索して Enter キーを押 します

    コンテンツ ウィンドウに Machine Learning Studio ワークスペースを示す Microsoft Azure ウィンドウのスクリーンショット。

  2. 新しいページには、 Machine Learning Studio ワークスペース サービスの説明が表示されます。 このプロンプトの左下にある [ 作成 ] ボタンをクリックして、このサービスとの関連付けを作成します。

  3. [作成] をクリックすると、新しい Machine Learning Studio サービスに関する詳細を指定する必要があるパネルが表示されます。

    1. このサービス インスタンスの目的の ワークスペース名 を挿入します。

    2. サブスクリプションを選択 します

    3. リソース グループを選択するか、新しい リソース グループ を作成します。 リソース グループを使用すると、Azure 資産のコレクションの監視、アクセスの制御、課金のプロビジョニングと管理を行うことができます。 1 つのプロジェクト (これらのラボなど) に関連付けられているすべての Azure サービスを共通リソース グループの下に保持することをお勧めします。

      Azure リソース グループの詳細については、 リソース グループに関する記事を参照してください。

    4. リソース グループの 場所 を決定します (新しいリソース グループを作成する場合)。 この場所は、アプリケーションが実行されるリージョンに理想的です。 一部の Azure 資産は、特定のリージョンでのみ使用できます。 前の章で Azure Storage の作成に使用したのと同じリソース グループを使用する必要があります。

    5. [ ストレージ アカウント ] セクションで、[ 既存のものを使用] をクリックし、ドロップダウン メニューをクリックし、そこから最後の章で作成した ストレージ アカウント をクリックします。

    6. ドロップダウン メニューから適切な ワークスペース価格レベル を選択します。

    7. [Web サービス プラン] セクションで、[新規作成] をクリックしテキスト フィールドに名前を挿入します。

    8. [ Web サービス プランの価格レベル ] セクションで、任意の価格レベルを選択します。 DEVTEST Standardという開発テスト レベルを無料で利用できる必要があります。

    9. また、本サービスに適用される使用条件を理解していることも確認する必要があります。

    10. [作成] をクリックします。

      ユーザーがテキスト フィールドに入力した情報を示す Azure Machine Learning Studio ダイアログのスクリーンショット。

  4. [ 作成] をクリックすると、サービスが作成されるまで待つ必要があります。これには 1 分かかる場合があります。

  5. Service インスタンスが作成されると、ポータルに通知が表示されます。

    ナビゲーション メニューに未読の通知が表示されている Microsoft Azure ウィンドウのスクリーンショット。

  6. 通知をクリックして、新しいサービス インスタンスを確認します。

    リソース グループへのワークスペースのデプロイが成功したことをユーザーに通知する [デプロイに成功しました] 通知のスクリーンショット。

  7. 通知の [ リソースに移動 ] ボタンをクリックして、新しいサービス インスタンスを探索します。

  8. 表示されたページの [ 追加リンク ] セクションで、[ Machine Learning Studio の起動] をクリックします。これにより、ブラウザーが Machine Learning Studio ポータルに移動します。

    コンテンツ ウィンドウで強調表示されている [Machine Learning Studio の起動] リンクを示す Microsoft Azure ウィンドウのスクリーンショット。

  9. 右上または中央の [サインイン ] ボタンを使用して、Machine Learning Studio (クラシック) にログインします。

    強調表示された [サインイン] ボタンを示す Machine Learning Studio ウィンドウのスクリーンショット。

第 3 章 - Machine Learning Studio (クラシック): データセットの設定

Machine Learning アルゴリズムが機能する方法の 1 つは、既存のデータを分析してから、既存のデータ セットに基づいて将来の結果を予測することです。 これは一般に、既存のデータが多いほど、アルゴリズムが将来の結果を予測する際に優れていることを意味します。

このコースでは ProductsTableCSV と呼ばれるサンプル テーブルが提供 されており、ここからダウンロードできます

重要

上記の .zip ファイルには ProductsTableCSV.unitypackage の両方が含まれています。このパッケージは 、第 6 章で必要になります。 このパッケージは、csv ファイルとは別に、その Chapter 内にも提供されます。

このサンプル データ セットには、2017 年の各日の 1 時間ごとに、最も売れているオブジェクトのレコードが含まれています。

Microsoft Excel ウィンドウのスクリーンショット。2017 年の各日の 1 時間ごとに、ベストセラーオブジェクトのサンプル データ セットを示します。

たとえば、2017 年の 1 日目の午後 1 時 (13 時) に、最も売れたアイテムは塩とコショウでした。

このサンプル テーブルには、9998 個のエントリが含まれています。

  1. Machine Learning Studio (クラシック) ポータルに戻り、このテーブルを ML のデータセットとして追加します。 これを行うには、画面の左下隅にある [+ 新規 ] ボタンをクリックします。

    Microsoft Azure Machine Learning Studio クラシック ポータルのスクリーンショット。メニューの [新規] ボタンが強調表示されています。

  2. セクションが下から上がり、その中に左側にナビゲーション パネルがあります。 [ データセット] をクリックし、その右側にある [ ローカル ファイルから] をクリックします。

    強調表示されている [データセット] メニュー項目と [ローカル ファイルから] メニュー項目を示す [新しい] ダイアログのスクリーンショット。

  3. 次の手順に従って、新しい データセット をアップロードします。

    1. アップロード ウィンドウが表示されます。ここで、新しいデータセットのハード ドライブを 参照 できます。

      [新しいデータセットのアップロード] ダイアログのスクリーンショット。これは、ユーザーがアップロードするデータを検索して選択するための [参照] ボタンを示しています。

    2. 選択した後、アップロード ウィンドウに戻り、チェック ボックスをオフのままにします。

    3. 次のテキスト フィールドに、データセットの名前として 「ProductsTableCSV.csv 」と入力します (ただし、自動的に追加されます)。

    4. [種類] のドロップダウン メニューを使用して、[ヘッダーを含む汎用 CSV ファイル ] (.csv) を選択します。

    5. アップロード ウィンドウの右下にあるチェック ボックスを押すと、 データセット がアップロードされます。

第 4 章 - Machine Learning Studio (クラシック): 実験

機械学習システムを構築する前に、データに関する理論を検証するために実験を構築する必要があります。 結果により、より多くのデータが必要かどうか、またはデータと可能な結果の間に相関関係がないかどうかを確認できます。

実験の作成を開始するには:

  1. ページの左下にある [+ 新規] ボタンをもう一度クリックし、[実験]>、[Blank 実験] の順にクリックします。

    [実験] メニュー項目が選択されていることを示す Microsoft Azure Machine Learning Studio ウィンドウのスクリーンショット。

  2. 新しいページが空の実験と共に表示されます。

  3. 左側のパネルから [保存されたデータセット] を展開し>My Datasets を展開し、ProductsTableCSV[実験キャンバス] にドラッグします。

    メニューに展開された [マイ データセット] フォルダーと実験キャンバスの [Products Table C S V] を示す [実験] ウィンドウのスクリーンショット。

  4. 左側のパネルで、[データ変換]、[>サンプル]、[分割] の順に展開します。 次に、 の [データの分割 ] 項目を [実験キャンバス] にドラッグします。 [データの分割] 項目は、データ セットを 2 つの部分に分割します。 機械学習アルゴリズムのトレーニングに使用する 1 つの部分。 2 番目の部分は、生成されたアルゴリズムの精度を評価するために使用されます。

    [実験] ウィンドウのスクリーンショット。メニューの [データの分割] 項目と [サンプル] 項目と [データの分割] 項目がキャンバスに適用されています。

  5. 右側のパネル (キャンバスの [データの分割] 項目が選択されている間) で、最初の出力データセットの行の割合を0.7 に編集します。 これにより、データが 2 つの部分に分割され、最初の部分はデータの 70% になり、2 番目の部分は残りの 30% になります。 データがランダムに分割されるようにするには、[ ランダム 分割] チェック ボックスがオンのままになります。

    [プロパティ] パネルのスクリーンショット。塗りつぶされた [ランダム化された分割] チェック ボックスと [行の割合] フィールドが 0 ポイント 7 に設定されています。

  6. キャンバス上の ProductsTableCSV 項目のベースからデータの分割項目の上部に接続をドラッグします。 これにより、項目が接続され、 ProductsTableCSV データセットの出力 (データ) が Split Data 入力に送信されます。

    Products Table C S V dot c s v と Split Data の間に描画された接続を示す実験キャンバスのスクリーンショット。

  7. 左側の [ 実験 ] パネルで、[ Machine Learning>Train] を展開します。 [ モデルのトレーニング ] 項目を [実験] キャンバスにドラッグします。 キャンバスは次と同じように表示されます。

    実験キャンバスのスクリーンショット。下のモデルのトレーニングを使用して、Products Table C S V dot c s v と Split Data の間に描画された接続を示します。

  8. [データの分割] 項目の左下から、接続を [モデルのトレーニング] 項目の右上にドラッグします。 データセットからの最初の 70% の分割は、モデルのトレーニングによってアルゴリズムをトレーニングするために使用されます。

    Products Table C S V dot c s v、Split Data、Train Model の間に描画された接続を示す実験キャンバスのスクリーンショット。

  9. キャンバスで [モデルのトレーニング ] 項目を選択し、[ プロパティ ] パネル (ブラウザー ウィンドウの右側) で [ 列の起動] セレクター ボタンをクリックします。

  10. テキスト ボックスに「 product 」と入力し、 Enter キーを押すと、予測をトレーニングするための列として 製品 が設定されます。 その後、右下隅にある ティック をクリックして、選択ダイアログを閉じます。

    [単一列の選択] ダイアログのスクリーンショット。列メニューに強調表示された製品列が表示されています。

  11. 多クラスロジスティック回帰アルゴリズムをトレーニングして、1 日の時間と日付に基づいて最も販売された製品を予測します。 ただし、Azure Machine Learning スタジオによって提供されるさまざまなアルゴリズムの詳細については、このドキュメントの範囲を超えています。ただし、Machine Learning アルゴリズムチート シートから詳細を確認できます

  12. 左側の [実験項目] パネルで、[ Machine Learning>Initialize Model>Classification] を展開し、 上の [多クラスロジスティック回帰 ] 項目を実験キャンバスにドラッグします。

  13. 多クラスロジスティック回帰の下部にある出力を、[モデルのトレーニング] 項目の左上の入力に接続します。

    多クラスロジスティック回帰と分割データに接続されたモデルのトレーニングを示す実験キャンバスのスクリーンショット。

  14. 左側のパネルの実験項目の一覧で、[ Machine Learning>Score] を展開し、[ モデルのスコア付 け] 項目をキャンバスにドラッグします。

  15. モデルのトレーニングの下部にある出力を、 モデルスコア付けの左上の入力に接続します。

  16. [ データの分割] の右下の出力を、[ モデルのスコア付け ] 項目の右上の入力に接続します。

    モデルのトレーニングとデータの分割に接続されているモデルのスコア付けを示す実験キャンバスのスクリーンショット。

  17. 左側のパネルの 実験 項目の一覧で、[ Machine Learning>Evaluate] を展開し、[ モデルの評価 ] 項目をキャンバスにドラッグします。

  18. モデルのスコア付けからの出力を、モデルの評価の左上の入力に接続します

    モデルのスコア付けに接続されているモデルの評価を示す実験キャンバスのスクリーンショット。

  19. 初めての Machine Learning 実験を構築しました。 実験を保存して実行できるようになりました。 ページの下部にあるメニューで、[ 保存 ] ボタンをクリックして実験を保存し、[ 実行 ] をクリックして実験を開始します。

    強調表示されている [保存] ボタンと [実行] ボタンを示す [実験キャンバス] メニューのスクリーンショット。

  20. キャンバスの右上に実験の 状態 が表示されます。 実験が完了するまでしばらく待ちます。

    大きな (実際の) データセットがある場合は、実験の実行に数時間かかる可能性があります。

    右上隅に実験の状態を示す [実験キャンバス] ウィンドウのスクリーンショット。

  21. キャンバスで [ モデルの評価 ] 項目を右クリックし、コンテキスト メニューから [ 評価結果] の上にマウス ポインターを置き、[ 視覚化] を選択します。

    [モデルの評価] 項目の右クリック メニューのスクリーンショット。強調表示されている [評価結果] と [視覚化] メニュー項目が示されています。

  22. 評価結果は、予測された結果と実際の結果を示して表示されます。 これにより、モデルを評価するために、以前に分割された元のデータセットの 30% が使用されます。 結果が良くないことがわかります。理想的には、各行の最も多い数値が列の強調表示された項目になります。

    パーセンテージのボックスのグラフに実験の結果を示す結果グラフのスクリーンショット。

  23. 結果を閉じます。

  24. 新しくトレーニングされた Machine Learning モデルを使用するには、 それを Web サービスとして公開する必要があります。 これを行うには、ページの下部にあるメニューの [ Web サービスのセットアップ ] メニュー項目をクリックし、[ 予測 Web サービス] をクリックします。

    強調表示されている [Web サービスのセットアップ] メニュー項目を示す [実験] メニューのスクリーンショット。

  25. 新しいタブが作成され、トレーニング モデルがマージされて新しい Web サービスが作成されます。

  26. ページの下部にあるメニューで [ 保存] をクリックし、[ 実行] をクリックします。 実験キャンバスの右上隅に状態が更新されます。

    強調表示されている [実行] メニュー ボタンと [実行] メニュー項目を示す [実験] メニューのスクリーンショット。

  27. 実行が完了すると、ページの下部に [ Web サービスのデプロイ ] ボタンが表示されます。 Web サービスをデプロイする準備ができました。 ページの下部にあるメニューの [ Web サービスのデプロイ (クラシック)] をクリックします。

    [Web サービスのデプロイ] メニュー ボタンの [Web サービス クラシックのデプロイ] メニュー項目が強調表示されている [実験] メニューのスクリーンショット。

    ブラウザーでポップアップの許可を求めるメッセージが表示されることがあります が、デプロイ ページが表示されない場合は、もう一度 [Web サービスの展開 ] を押す必要があります。

  28. 実験が作成されると、API キーが表示されるダッシュボード ページにリダイレクトされます。 今のところメモ帳にコピーしてください。すぐにコードに必要になります。 API キーをメモしたら、[キー] の下にある [既定のエンドポイント] セクションの [要求/応答] ボタンをクリックします。

    [Microsoft Azure Machine Learning Studio] ウィンドウのスクリーンショット。A P I キーと強調表示されている [要求スラッシュ応答] リンクが示されています。

    注:

    このページで [テスト] をクリックすると、入力データを入力して出力を表示できます。 時間を入力します。 製品エントリは空白のままにします。 次に、[ 確認 ] ボタンをクリックします。 ページの下部にある出力には、各製品が選択される可能性を表す JSON が表示されます。

  29. 新しい Web ページが開き、Machine Learning Studio (クラシック) で必要な要求構造に関する手順といくつかの例が表示されます。 このページに表示されている 要求 URI を メモ帳にコピーします。

    強調表示されている要求 U R I を示す [要求応答 A P I ドキュメント] ページのスクリーンショット。

これで、過去の購入データに基づいて販売される可能性が最も高い製品を提供する機械学習システムが構築されました。これは、1 日と 1 日の時刻と関連付けられます。

Web サービスを呼び出すには、サービス エンドポイントの URL とサービスの API キーが必要です。 上部のメニューから [ 消費 ] タブをクリックします。

[ 従量課金 情報] ページには、コードから Web サービスを呼び出すために必要な情報が表示されます。 主キー要求応答 URL のコピーを取得します。 これらは次の章で必要になります。

第 5 章 - Unity プロジェクトの設定

Mixed Realityイマーシブ ヘッドセットを設定してテストします。

注:

このコースではモーション コントローラーは必要 ありません 。 イマーシブ ヘッドセットの設定のサポートが必要な場合は、 ここをクリックしてください。

  1. Unityを開き、MR_MachineLearningという名前の新しいUnity プロジェクトを作成します。プロジェクトの種類が 3D に設定されていることを確認します。

  2. Unity開いている場合は、既定の [スクリプト] エディターVisual Studio に設定されていることを確認する価値があります。 [編集>Preferences] に移動し、新しいウィンドウから [外部ツール] に移動します。 [外部スクリプト] エディターVisual Studio 2017 に変更します。 [基本設定] ウィンドウを閉じます。

  3. 次に、[ファイル>Build 設定] に移動し、[プラットフォームの切り替え] ボタンをクリックして、プラットフォームをユニバーサル Windows プラットフォーム切り替えます

  4. また、次の点も確認してください。

    1. [ターゲット デバイス] が [ 任意のデバイス] に設定されています。

      Microsoft HoloLensの場合は、[ターゲット デバイス]HoloLens に設定します。

    2. ビルドの種類D3D に設定されています。

    3. SDK[インストール済みの最新] に設定されています。

    4. Visual Studio のバージョン[最新インストール済み] に設定されています。

    5. [ビルドと実行][ローカル コンピューター] に設定されています。

    6. シーンは後で提供されるため、今すぐシーン 設定する心配はありません。

    7. 残りの設定は、現時点では既定値のままにする必要があります。

      [ビルド設定] ダイアログのスクリーンショット。メニュー項目が選択されているユニバーサル Windows プラットフォームを示します。

  5. [ ビルド設定] ウィンドウで、[ プレイヤーの設定] ボタンをクリックすると、 インスペクター が配置されている領域に関連するパネルが開きます。

  6. このパネルでは、いくつかの設定を確認する必要があります。

    1. [その他の設定] タブで、次 の手順を実行 します。

      1. スクリプト ランタイムバージョン試験的 である必要があります (.NET 4.6 同等)

      2. スクリプト バックエンド.NET にする必要があります

      3. API 互換性レベル.NET 4.6 にする必要があります

        概要を示す手順に従って有効になっている設定を示す [その他の設定] タブのスクリーンショット。

    2. [発行設定] タブの [機能] で、次チェックします。

      • InternetClient

        [発行設定] タブのスクリーンショット。インターネット クライアント機能が [機能] の下で有効になっていることを示しています。

    3. パネルの下の [XR 設定] ([発行設定] の下にあります) で、[Virtual Reality Supported]\(サポートされている Virtual Reality\) をオンにして、WINDOWS MIXED REALITY SDK が追加されていることを確認します

      [X R 設定] タブのスクリーンショット。Virtual Reality S D K s の下の Windows Mixed Reality S D K が有効になっていることを示しています。

  7. [ビルド設定] に戻りますUnity C# プロジェクトは灰色表示されなくなりました。この横にあるチェック ボックスをオンにします。

  8. [ビルド設定] ウィンドウを閉じます。

  9. プロジェクトを保存します (ファイル > プロジェクトの保存)。

第 6 章 - MLProducts Unity パッケージのインポート

このコースでは、Azure-MR-307.unitypackage というUnityアセット パッケージをダウンロードする必要があります。 このパッケージにはシーンが付属し、その事前構築済みのすべてのオブジェクトが含まれているため、すべて動作することに集中できます。 ShelfKeeper スクリプトは、シーンのセットアップ構造を目的として、パブリック変数のみを保持します。 他のすべてのセクションを実行する必要があります。

このパッケージをインポートするには:

  1. Unityダッシュボードが目の前にある状態で、画面上部のメニューで [アセット] をクリックし、[パッケージのインポート] をクリックします。カスタム パッケージ

    Unity ダッシュボードのスクリーンショット。強調表示されている [パッケージのインポート] メニュー項目と [カスタム パッケージ] メニュー項目が示されています。

  2. ファイル ピッカーを使用して Azure-MR-307.unitypackage パッケージを選択し、[ 開く] をクリックします。

  3. このアセットのコンポーネントの一覧が表示されます。 [インポート] をクリックして インポートを確認します。

    Azure Machine Learning パッケージがインポートされていることを示す [Unity パッケージのインポート] ダイアログのスクリーンショット。

  4. インポートが完了すると、Unity プロジェクト パネルにいくつかの新しいフォルダーが表示されていることがわかります。 これらは、3D モデルと、作業する事前に作成されたシーンの一部であるそれぞれの素材です。 このコースでは、ほとんどのコードを記述します。

    [Unity プロジェクト パネル] のスクリーンショット。新しくインポートされたフォルダーが Assets フォルダーに表示されています。

  5. [プロジェクト パネル] フォルダー内の [シーン] フォルダーをクリックし、内部のシーン (MR_MachineLearningScene と呼ばれます) をダブルクリックします。 シーンが開きます (下の画像を参照)。 赤いひし形が見つからない場合は、ゲーム パネルの右上にある [ギズモ] ボタンをクリックします。

    上部のナビゲーションで強調表示されている Gizmos メニュー項目を示す [シーンのUnity] ウィンドウのスクリーンショット。

第 7 章 - Unityでの DLL の確認

JSON ライブラリ (シリアル化と逆シリアル化に使用) を利用するために、持ち込んだパッケージで Newtonsoft DLL が実装されています。 ライブラリには正しい構成が必要ですが、確認する価値があります (特に、コードが機能しない問題が発生している場合)。

そのために、次の操作を実行します。

  • Plugins フォルダー内の Newtonsoft ファイルを左クリックし、[ インスペクター] パネルを見ます。 [ 任意のプラットフォーム] がオンになっていることを確認します。 [UWP] タブに移動し、[プロセスを行わない] がオンになっていることを確認します。

    Unityでの DLL のインポート

第 8 章 - ShelfKeeper クラスを作成する

ShelfKeeper クラスは、シーン内で生成された UI と製品を制御するメソッドをホストします。

インポートされたパッケージの一部として、このクラスが与えられましたが、これは不完全です。 次に、そのクラスを完了します。

  1. Scripts フォルダー内の ShelfKeeper スクリプトをダブルクリックして、Visual Studio 2017 で開きます。

  2. スクリプトに存在するすべてのコードを次のコードに置き換えます。これは、時刻と日付を設定し、製品を表示するメソッドを持っています。

    using UnityEngine;
    
    public class ShelfKeeper : MonoBehaviour
    {
        /// <summary>
        /// Provides this class Singleton-like behavior
        /// </summary>
        public static ShelfKeeper instance;
    
        /// <summary>
        /// Unity Inspector accessible Reference to the Text Mesh object needed for data
        /// </summary>
        public TextMesh dateText;
    
        /// <summary>
        /// Unity Inspector accessible Reference to the Text Mesh object needed for time
        /// </summary>
        public TextMesh timeText;
    
        /// <summary>
        /// Provides references to the spawn locations for the products prefabs
        /// </summary>
        public Transform[] spawnPoint;
    
        private void Awake()
        {
            instance = this;
        }
    
        /// <summary>
        /// Set the text of the date in the scene
        /// </summary>
        public void SetDate(string day, string month)
        {
            dateText.text = day + " " + month;
        }
    
        /// <summary>
        /// Set the text of the time in the scene
        /// </summary>
        public void SetTime(string hour)
        {
            timeText.text = hour + ":00";
        }
    
        /// <summary>
        /// Spawn a product on the shelf by providing the name and selling grade
        /// </summary>
        /// <param name="name"></param>
        /// <param name="sellingGrade">0 being the best seller</param>
        public void SpawnProduct(string name, int sellingGrade)
        {
            Instantiate(Resources.Load(name),
                spawnPoint[sellingGrade].transform.position, spawnPoint[sellingGrade].transform.rotation);
        }
    }
    
  3. Unityに戻る前に、変更を Visual Studio に保存してください。

  4. Unity エディターに戻り、ShelfKeeper クラスが次のようになりますチェック。

    参照先が日付テキスト メッシュとタイム テキスト メッシュに設定されていることを示す Shelf Keeper クラスのスクリーンショット。

    重要

    スクリプトに参照ターゲットがない場合 ( つまり、Date (Text Mesh))、対応するオブジェクトを 階層パネルからターゲット フィールドにドラッグするだけです。 必要に応じて、以下の説明を参照してください。

    1. ShelfKeeper コンポーネント スクリプト内の Spawn Point 配列を左クリックして開きます。 サブセクションは Size と呼ばれ、配列のサイズを示します。 [サイズ] の横のテキスト ボックスに「3」と入力し、Enter キーを押すと、下に 3 つのスロットが作成されます。

    2. Hierarchy 内で Time Display オブジェクトを展開します (横にある矢印を左クリックします)。 次に、階層内からメイン カメラをクリックして、インスペクターにその情報を表示します。

    3. 階層パネルメイン カメラを選択します。 Date and Time オブジェクトを階層パネルから、ShelfKeeper コンポーネントのメイン カメラインスペクター内の日付テキスト時刻テキスト スロットにドラッグします。

    4. イメージに示すように、階層パネル (Shelf オブジェクトの下) から Spawn Point 配列の下にある 3要素参照ターゲットにスポーン ポイントをドラッグします。

      階層パネルのスクリーンショット。日付、時刻、および 3 つの Spawn Point メニュー項目が Shelf Keeper クラスにあることを示しています。

第 9 章 - ProductPrediction クラスを作成する

次に作成するクラスは ProductPrediction クラスです。

このクラスは、次の役割を担います。

  • 現在の日付と時刻を指定して、 Machine Learning Service インスタンスのクエリを実行する。

  • JSON 応答を使用可能なデータに逆シリアル化する。

  • データの解釈、3 つの推奨製品の取得。

  • ShelfKeeper クラス メソッドを呼び出して、シーンにデータを表示します。

このクラスを作成するには:

  1. [プロジェクト] パネルの [スクリプト] フォルダーに移動します。

  2. [ Create>C# Script] フォルダー内を右クリックします。 ProductPrediction スクリプトを呼び出します。

  3. 新しい ProductPrediction スクリプトをダブルクリックして 、Visual Studio 2017 で開きます。

  4. [ ファイルの変更が検出されました ] ダイアログが表示されたら、[*ソリューションの再読み込み] をクリックします。

  5. ProductPrediction クラスの先頭に次の名前空間を追加します。

    using System;
    using System.Collections.Generic;
    using UnityEngine;
    using System.Linq;
    using Newtonsoft.Json;
    using UnityEngine.Networking;
    using System.Runtime.Serialization;
    using System.Collections;
    
  6. ProductPrediction クラス内には、入れ子になった多数のクラスで構成される次の 2 つのオブジェクトを挿入します。 これらのクラスは、Machine Learning Service の JSON をシリアル化および逆シリアル化するために使用されます。

        /// <summary>
        /// This object represents the Prediction request
        /// It host the day of the year and hour of the day
        /// The product must be left blank when serialising
        /// </summary>
        public class RootObject
        {
            public Inputs Inputs { get; set; }
        }
    
        public class Inputs
        {
            public Input1 input1 { get; set; }
        }
    
        public class Input1
        {
            public List<string> ColumnNames { get; set; }
            public List<List<string>> Values { get; set; }
        }
    
        /// <summary>
        /// This object containing the deserialised Prediction result
        /// It host the list of the products
        /// and the likelihood of them being sold at current date and time
        /// </summary>
        public class Prediction
        {
            public Results Results { get; set; }
        }
    
        public class Results
        {
            public Output1 output1;
        }
    
        public class Output1
        {
            public string type;
            public Value value;
        }
    
        public class Value
        {
            public List<string> ColumnNames { get; set; }
            public List<List<string>> Values { get; set; }
        }
    
  7. 次に、前のコードの上に次の変数を追加します (JSON 関連のコードがスクリプトの下部、他のすべてのコードの下、および邪魔になるようにします)。

        /// <summary>
        /// The 'Primary Key' from your Machine Learning Portal
        /// </summary>
        private string authKey = "-- Insert your service authentication key here --";
    
        /// <summary>
        /// The 'Request-Response' Service Endpoint from your Machine Learning Portal
        /// </summary>
        private string serviceEndpoint = "-- Insert your service endpoint here --";
    
        /// <summary>
        /// The Hour as set in Windows
        /// </summary>
        private string thisHour;
    
        /// <summary>
        /// The Day, as set in Windows
        /// </summary>
        private string thisDay;
    
        /// <summary>
        /// The Month, as set in Windows
        /// </summary>
        private string thisMonth;
    
        /// <summary>
        /// The Numeric Day from current Date Conversion
        /// </summary>
        private string dayOfTheYear;
    
        /// <summary>
        /// Dictionary for holding the first (or default) provided prediction 
        /// from the Machine Learning Experiment
        /// </summary>    
        private Dictionary<string, string> predictionDictionary;
    
        /// <summary>
        /// List for holding product prediction with name and scores
        /// </summary>
        private List<KeyValuePair<string, double>> keyValueList;
    

    重要

    必ず、Machine Learning Portal の 主キー要求応答エンドポイントを、ここでの変数に挿入してください。 次の画像は、キーとエンドポイントの取得元を示しています。

    Microsoft Azure Machine Learning Studio のスクリーンショット。A P I ヘルプ ページの下に [スラッシュ応答の要求] リンクが表示されています。

    強調表示されている POST 要求 U R I を示す [要求応答 A P I ドキュメント] ページのスクリーンショット。

  8. Start() メソッド内にこのコードを挿入します。 Start() メソッドは、クラスが次を初期化するときに呼び出されます。

        void Start()
        {
            // Call to get the current date and time as set in Windows
            GetTodayDateAndTime();
    
            // Call to set the HOUR in the UI
            ShelfKeeper.instance.SetTime(thisHour);
    
            // Call to set the DATE in the UI
            ShelfKeeper.instance.SetDate(thisDay, thisMonth);
    
            // Run the method to Get Predication from Azure Machine Learning
            StartCoroutine(GetPrediction(thisHour, dayOfTheYear));
        }
    
  9. 次のメソッドは、Windows から日付と時刻を収集し、それを Machine Learning Experiment がテーブルに格納されているデータと比較するために使用できる形式に変換する方法です。

        /// <summary>
        /// Get current date and hour
        /// </summary>
        private void GetTodayDateAndTime()
        {
            // Get today date and time
            DateTime todayDate = DateTime.Now;
    
            // Extrapolate the HOUR
            thisHour = todayDate.Hour.ToString();
    
            // Extrapolate the DATE
            thisDay = todayDate.Day.ToString();
            thisMonth = todayDate.ToString("MMM");
    
            // Extrapolate the day of the year
            dayOfTheYear = todayDate.DayOfYear.ToString();
        }
    
  10. このクラスでは使用されないため、Update() メソッドを削除できます。

  11. 現在の日付と時刻を Machine Learning エンドポイントに伝え、JSON 形式で応答を受け取る次のメソッドを追加します。

        private IEnumerator GetPrediction(string timeOfDay, string dayOfYear)
        {
            // Populate the request object 
            // Using current day of the year and hour of the day
            RootObject ro = new RootObject
            {
                Inputs = new Inputs
                {
                    input1 = new Input1
                    {
                        ColumnNames = new List<string>
                        {
                            "day",
                            "hour",
                        "product"
                        },
                        Values = new List<List<string>>()
                    }
                }
            };
    
            List<string> l = new List<string>
            {
                dayOfYear,
                timeOfDay,
                ""
            };
    
            ro.Inputs.input1.Values.Add(l);
    
            Debug.LogFormat("Score request built");
    
            // Serialize the request
            string json = JsonConvert.SerializeObject(ro);
    
            using (UnityWebRequest www = UnityWebRequest.Post(serviceEndpoint, "POST"))
            {
                byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(json);
                www.uploadHandler = new UploadHandlerRaw(jsonToSend);
    
                www.downloadHandler = new DownloadHandlerBuffer();
                www.SetRequestHeader("Authorization", "Bearer " + authKey);
                www.SetRequestHeader("Content-Type", "application/json");
                www.SetRequestHeader("Accept", "application/json");
    
                yield return www.SendWebRequest();
                string response = www.downloadHandler.text;
    
                // Deserialize the response
                DataContractSerializer serializer;
                serializer = new DataContractSerializer(typeof(string));
                DeserialiseJsonResponse(response);
            }
        }
    
  12. JSON 応答を逆シリアル化し、逆シリアル化の結果を ShelfKeeper クラスに通信する次のメソッドを追加します。 この結果は、現在の日付と時刻で最も売れると予測される 3 つの項目の名前になります。 次のコードを、前のメソッドの下にある ProductPrediction クラスに挿入します。

        /// <summary>
        /// Deserialize the response received from the Machine Learning portal
        /// </summary>
        public void DeserialiseJsonResponse(string jsonResponse)
        {
            // Deserialize JSON
            Prediction prediction = JsonConvert.DeserializeObject<Prediction>(jsonResponse);
            predictionDictionary = new Dictionary<string, string>();
    
            for (int i = 0; i < prediction.Results.output1.value.ColumnNames.Count; i++)
            {
                if (prediction.Results.output1.value.Values[0][i] != null)
                {
                    predictionDictionary.Add(prediction.Results.output1.value.ColumnNames[i], prediction.Results.output1.value.Values[0][i]);
                }
            }
    
            keyValueList = new List<KeyValuePair<string, double>>();
    
            // Strip all non-results, by adding only items of interest to the scoreList
            for (int i = 0; i < predictionDictionary.Count; i++)
            {
                KeyValuePair<string, string> pair = predictionDictionary.ElementAt(i);
                if (pair.Key.StartsWith("Scored Probabilities"))
                {
                    // Parse string as double then simplify the string key so to only have the item name
                    double scorefloat = 0f;
                    double.TryParse(pair.Value, out scorefloat);
                    string simplifiedName =
                        pair.Key.Replace("\"", "").Replace("Scored Probabilities for Class", "").Trim();
                    keyValueList.Add(new KeyValuePair<string, double>(simplifiedName, scorefloat));
                }
            }
    
            // Sort Predictions (results will be lowest to highest)
            keyValueList.Sort((x, y) => y.Value.CompareTo(x.Value));
    
            // Spawn the top three items, from the keyValueList, which we have sorted
            for (int i = 0; i < 3; i++)
            {
                ShelfKeeper.instance.SpawnProduct(keyValueList[i].Key, i);
            }
    
            // Clear lists in case of reuse
            keyValueList.Clear();
            predictionDictionary.Clear();
        }
    
  13. Visual Studio を保存し、Unityに戻ります。

  14. ProductPrediction クラス スクリプトを Script フォルダーから Main Camera オブジェクトにドラッグします。

  15. シーンとプロジェクトファイルを保存>シーン/ファイルの保存>プロジェクトを保存します

第 10 章 - UWP ソリューションを構築する

次に、プロジェクトを UWP ソリューションとしてビルドし、スタンドアロン アプリケーションとして実行できるようにします。

ビルドするには:

  1. [ファイル>シーンの保存] をクリックして、現在のシーンを保存します

  2. [ファイル>Build の設定] に移動します

  3. [Unity C# プロジェクト] というボックスをオンにします (これは、ビルドが完了した後にクラスを編集できるため重要です)。

  4. [ 開いているシーンの追加] をクリックします。

  5. [ ビルド] をクリックします。

    [ビルド設定] ダイアログのスクリーンショット。メニュー項目ユニバーサル Windows プラットフォーム強調表示されています。

  6. ソリューションをビルドするフォルダーを選択するように求められます。

  7. ビルド フォルダーを作成し、そのフォルダー内に、任意の適切な名前の別のフォルダーを作成します。

  8. 新しいフォルダーをクリックし、[ フォルダーの選択] をクリックして、その場所でビルドを開始します。

    強調表示されているビルド フォルダーを示すエクスプローラー ウィンドウのスクリーンショット。

    [ビルド] フォルダーの内容と強調表示されている [フォルダーの選択] ボタンを示すエクスプローラー ウィンドウのスクリーンショット。

  9. ビルドUnity完了すると (時間がかかる場合があります)、ビルドの場所にエクスプローラー ウィンドウが開きます (タスク バーチェック、常にウィンドウの上に表示されるとは限りませんが、新しいウィンドウが追加されたことを通知します)。

第 11 章 - アプリケーションのデプロイ

アプリケーションをデプロイするには:

  1. 新しいUnity ビルド (App フォルダー) に移動し、Visual Studio でソリューション ファイルを開きます。

  2. Visual Studio を開いた状態で NuGet パッケージを復元する必要があります。これを行うには、MachineLearningLab_Build ソリューションをソリューション エクスプローラー (Visual Studio の右側にある) から右クリックし、[NuGet パッケージの復元] をクリックします。

    Visual Studio ウィンドウのスクリーンショット。強調表示されている [Nu パッケージの取得] メニュー項目が示されています。

  3. [ソリューション構成] で [デバッグ] を選択 します

  4. ソリューション プラットフォームで、 x86ローカル コンピューターを選択します。

    Microsoft HoloLensでは、コンピューターにテザリングされないように、これをリモート コンピューターに設定する方が簡単な場合があります。 ただし、次の操作も行う必要があります。

    • HoloLens の IP アドレス は、[ 設定] > [ネットワーク] & [インターネット > Wi-Fi > 詳細オプション] で確認できます。IPv4 は使用する必要があるアドレスです。
    • [開発者モード] が [オン] になっていることを確認します。[設定] > [Update & Security > 開発者向け] にあります。

    ソリューション プラットフォームでローカル コンピューターが選択されていることを示す Microsoft Visual Studio メニューのスクリーンショット。

  5. [ ビルド] メニュー に移動し、[ ソリューションの展開 ] をクリックして、アプリケーションを PC にサイドロードします。

  6. これで、インストールされているアプリの一覧にアプリが表示され、起動する準備が整いました。

Mixed Reality アプリケーションを実行すると、Unity シーンに設定されたベンチが表示され、初期化から Azure 内で設定したデータがフェッチされます。 データはアプリケーション内で逆シリアル化され、現在の日付と時刻の 3 つの上位の結果がベンチ上の 3 つのモデルとして視覚的に提供されます。

完成した Machine Learning アプリケーション

これで、Azure Machine Learning を利用してデータ予測を行い、シーンに表示する Mixed Reality アプリを構築しました。

3 つのオブジェクトを含むシェルフと、2 月 23 日 23 時のテキストを含むカードを示す Microsoft Visual Studio ウィンドウのスクリーンショット。

運動

演習 1

アプリケーションの並べ替え順序を試し、棚に 3 つの下位予測が表示されるようにします。このデータも役に立つ可能性があります。

演習 2

Azure Tables を使用すると、新しいテーブルに気象情報が設定され、データを使用して新しい実験が作成されます。