トレーニング
モジュール
Azure Cloud Services を HoloLens 2 の Unity プロジェクトに統合する - Training
Mixed Reality アプリケーション用に、Azure Storage、Azure Custom Vision、Azure Spatial Anchors などの Azure Cloud Services を 追加します。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
注意
Mixed Reality Academy のチュートリアルは、HoloLens (第 1 世代) と Mixed Realityイマーシブ ヘッドセットを念頭に置いて設計されました。 そのため、これらのデバイスの開発に関するガイダンスをまだ探している開発者には、これらのチュートリアルを配置しておくことが重要であると考えます。 これらのチュートリアルは、HoloLens 2に使用されている最新のツールセットや相互作用では更新されません。 これらは、サポートされているデバイスでの作業を継続するために維持されます。 今後、HoloLens 2向けに開発する方法を示す新しい一連のチュートリアルが掲載されます。 この通知は、投稿時にこれらのチュートリアルへのリンクで更新されます。
このコースでは、Azure Machine Learning Studio (クラシック) を使用して、Mixed Reality アプリケーションに Machine Learning (ML) 機能を追加する方法について説明します。
Azure Machine Learning Studio (クラシック) は、データ入力、出力、準備、視覚化に役立つ多数の機械学習アルゴリズムを開発者に提供する Microsoft サービスです。 これらのコンポーネントから、予測分析実験を開発し、反復し、それを使用してモデルをトレーニングできます。 トレーニングの後、Azure クラウド内でモデルを運用できるようにして、新しいデータをスコア付けできます。 詳細については、 Azure Machine Learning Studio (クラシック) ページを参照してください。
このコースを完了すると、Mixed Reality イマーシブ ヘッドセット アプリケーションが用意され、次の方法が学習されます。
アプリケーションでは、結果を設計と統合する方法はユーザー次第です。 このコースは、Azure サービスを Unity プロジェクトと統合する方法を説明するように設計されています。 このコースから得た知識を使用して、Mixed Reality アプリケーションを強化するのがあなたの仕事です。
このコースは自己完結型のチュートリアルであり、他のMixed Reality Labs には直接関係しません。
コース | HoloLens | イマーシブ ヘッドセット |
---|---|---|
MR と Azure 307: 機械学習 | ✔️ | ✔️ |
注意
このコースでは主に、Windows Mixed Realityイマーシブ (VR) ヘッドセットに焦点を当てていますが、このコースで学習した内容をMicrosoft HoloLensに適用することもできます。 コースに従うと、HoloLens をサポートするために採用する必要がある変更に関するメモが表示されます。 HoloLens を使用すると、音声キャプチャ中にエコーが発生することがあります。
注意
このチュートリアルは、Unityと C# に関する基本的な経験を持つ開発者向けに設計されています。 また、このドキュメント内の前提条件と書面による指示は、執筆時点 (2018 年 5 月) にテストおよび検証された内容を表していることにも注意してください。 ツールのインストールに関する記事に記載されている最新のソフトウェアは自由に使用できますが、このコースの情報は、以下に示すソフトウェアよりも新しいソフトウェアで見つかるものと完全に一致するとは想定しないでください。
このコースでは、次のハードウェアとソフトウェアをお勧めします。
このプロジェクトのビルドで問題が発生しないように、このチュートリアルで説明するプロジェクトをルート フォルダーまたはほぼルート フォルダーに作成することを強くお勧めします (長いフォルダー パスがビルド時に問題を引き起こす可能性があります)。
Azure Translator API を使用するには、アプリケーションで使用できるようにサービスのインスタンスを構成する必要があります。
Azure Portal にログインします。
注意
Azure アカウントがまだない場合は、アカウントを作成する必要があります。 教室やラボの状況でこのチュートリアルに従っている場合は、講師またはプロクターの 1 人に新しいアカウントの設定に関するヘルプを依頼してください。
ログインしたら、左側のメニューで [ ストレージ アカウント ] をクリックします。
注意
新しいポータルでは、New という単語がリソースの作成に置き換えられた可能性があります。
[ ストレージ アカウント ] タブで、[ 追加] をクリックします。
[ ストレージ アカウントの作成] パネルで、次の操作を行います。
アカウントの [名前] を挿入します。このフィールドは数字と小文字のみを受け入れることに注意してください。
[デプロイ モデル] で、[リソース マネージャー] を選択します。
[ アカウントの種類] で、[ ストレージ (汎用 v1)] を選択します。
[パフォーマンス] で、[Standard] を選択します。
[ レプリケーション ] で、 読み取りアクセス geo 冗長ストレージ (RA-GRS) を選択します。
[ 安全な転送が必要] は [無効] のままにします。
サブスクリプションを選択 します。
リソース グループを選択するか、新しい リソース グループ を作成します。 リソース グループを使用すると、Azure 資産のコレクションの監視、アクセスの制御、課金のプロビジョニングと管理を行うことができます。 1 つのプロジェクト (これらのラボなど) に関連付けられているすべての Azure サービスを共通リソース グループの下に保持することをお勧めします。
Azure リソース グループの詳細については、 リソース グループに関する記事を参照してください。
リソース グループの 場所 を決定します (新しいリソース グループを作成する場合)。 この場所は、アプリケーションが実行されるリージョンに理想的です。 一部の Azure 資産は、特定のリージョンでのみ使用できます。
また、本サービスに適用される使用条件を理解していることも確認する必要があります。
[ 作成] をクリックすると、サービスが作成されるまで待つ必要があります。これには 1 分かかる場合があります。
Service インスタンスが作成されると、ポータルに通知が表示されます。
Azure Machine Learning を使用するには、アプリケーションで使用できるように Machine Learning サービスのインスタンスを構成する必要があります。
Azure Portal で、左上隅にある [ 新規 ] をクリックし、 Machine Learning Studio ワークスペースを検索して Enter キーを押 します。
新しいページには、 Machine Learning Studio ワークスペース サービスの説明が表示されます。 このプロンプトの左下にある [ 作成 ] ボタンをクリックして、このサービスとの関連付けを作成します。
[作成] をクリックすると、新しい Machine Learning Studio サービスに関する詳細を指定する必要があるパネルが表示されます。
このサービス インスタンスの目的の ワークスペース名 を挿入します。
サブスクリプションを選択 します。
リソース グループを選択するか、新しい リソース グループ を作成します。 リソース グループを使用すると、Azure 資産のコレクションの監視、アクセスの制御、課金のプロビジョニングと管理を行うことができます。 1 つのプロジェクト (これらのラボなど) に関連付けられているすべての Azure サービスを共通リソース グループの下に保持することをお勧めします。
Azure リソース グループの詳細については、 リソース グループに関する記事を参照してください。
リソース グループの 場所 を決定します (新しいリソース グループを作成する場合)。 この場所は、アプリケーションが実行されるリージョンに理想的です。 一部の Azure 資産は、特定のリージョンでのみ使用できます。 前の章で Azure Storage の作成に使用したのと同じリソース グループを使用する必要があります。
[ ストレージ アカウント ] セクションで、[ 既存のものを使用] をクリックし、ドロップダウン メニューをクリックし、そこから最後の章で作成した ストレージ アカウント をクリックします。
ドロップダウン メニューから適切な ワークスペース価格レベル を選択します。
[Web サービス プラン] セクションで、[新規作成] をクリックし、テキスト フィールドに名前を挿入します。
[ Web サービス プランの価格レベル ] セクションで、任意の価格レベルを選択します。 DEVTEST Standardという開発テスト レベルを無料で利用できる必要があります。
また、本サービスに適用される使用条件を理解していることも確認する必要があります。
[作成] をクリックします。
[ 作成] をクリックすると、サービスが作成されるまで待つ必要があります。これには 1 分かかる場合があります。
Service インスタンスが作成されると、ポータルに通知が表示されます。
通知をクリックして、新しいサービス インスタンスを確認します。
通知の [ リソースに移動 ] ボタンをクリックして、新しいサービス インスタンスを探索します。
表示されたページの [ 追加リンク ] セクションで、[ Machine Learning Studio の起動] をクリックします。これにより、ブラウザーが Machine Learning Studio ポータルに移動します。
右上または中央の [サインイン ] ボタンを使用して、Machine Learning Studio (クラシック) にログインします。
Machine Learning アルゴリズムが機能する方法の 1 つは、既存のデータを分析してから、既存のデータ セットに基づいて将来の結果を予測することです。 これは一般に、既存のデータが多いほど、アルゴリズムが将来の結果を予測する際に優れていることを意味します。
このコースでは ProductsTableCSV と呼ばれるサンプル テーブルが提供 されており、ここからダウンロードできます。
重要
上記の .zip ファイルには ProductsTableCSV と .unitypackage の両方が含まれています。このパッケージは 、第 6 章で必要になります。 このパッケージは、csv ファイルとは別に、その Chapter 内にも提供されます。
このサンプル データ セットには、2017 年の各日の 1 時間ごとに、最も売れているオブジェクトのレコードが含まれています。
たとえば、2017 年の 1 日目の午後 1 時 (13 時) に、最も売れたアイテムは塩とコショウでした。
このサンプル テーブルには、9998 個のエントリが含まれています。
Machine Learning Studio (クラシック) ポータルに戻り、このテーブルを ML のデータセットとして追加します。 これを行うには、画面の左下隅にある [+ 新規 ] ボタンをクリックします。
セクションが下から上がり、その中に左側にナビゲーション パネルがあります。 [ データセット] をクリックし、その右側にある [ ローカル ファイルから] をクリックします。
次の手順に従って、新しい データセット をアップロードします。
アップロード ウィンドウが表示されます。ここで、新しいデータセットのハード ドライブを 参照 できます。
選択した後、アップロード ウィンドウに戻り、チェック ボックスをオフのままにします。
次のテキスト フィールドに、データセットの名前として 「ProductsTableCSV.csv 」と入力します (ただし、自動的に追加されます)。
[種類] のドロップダウン メニューを使用して、[ヘッダーを含む汎用 CSV ファイル ] (.csv) を選択します。
アップロード ウィンドウの右下にあるチェック ボックスを押すと、 データセット がアップロードされます。
機械学習システムを構築する前に、データに関する理論を検証するために実験を構築する必要があります。 結果により、より多くのデータが必要かどうか、またはデータと可能な結果の間に相関関係がないかどうかを確認できます。
実験の作成を開始するには:
ページの左下にある [+ 新規] ボタンをもう一度クリックし、[実験]>、[Blank 実験] の順にクリックします。
新しいページが空の実験と共に表示されます。
左側のパネルから [保存されたデータセット] を展開し>My Datasets を展開し、ProductsTableCSV を [実験キャンバス] にドラッグします。
左側のパネルで、[データ変換]、[>サンプル]、[分割] の順に展開します。 次に、 の [データの分割 ] 項目を [実験キャンバス] にドラッグします。 [データの分割] 項目は、データ セットを 2 つの部分に分割します。 機械学習アルゴリズムのトレーニングに使用する 1 つの部分。 2 番目の部分は、生成されたアルゴリズムの精度を評価するために使用されます。
右側のパネル (キャンバスの [データの分割] 項目が選択されている間) で、最初の出力データセットの行の割合を0.7 に編集します。 これにより、データが 2 つの部分に分割され、最初の部分はデータの 70% になり、2 番目の部分は残りの 30% になります。 データがランダムに分割されるようにするには、[ ランダム 分割] チェック ボックスがオンのままになります。
キャンバス上の ProductsTableCSV 項目のベースからデータの分割項目の上部に接続をドラッグします。 これにより、項目が接続され、 ProductsTableCSV データセットの出力 (データ) が Split Data 入力に送信されます。
左側の [ 実験 ] パネルで、[ Machine Learning>Train] を展開します。 [ モデルのトレーニング ] 項目を [実験] キャンバスにドラッグします。 キャンバスは次と同じように表示されます。
[データの分割] 項目の左下から、接続を [モデルのトレーニング] 項目の右上にドラッグします。 データセットからの最初の 70% の分割は、モデルのトレーニングによってアルゴリズムをトレーニングするために使用されます。
キャンバスで [モデルのトレーニング ] 項目を選択し、[ プロパティ ] パネル (ブラウザー ウィンドウの右側) で [ 列の起動] セレクター ボタンをクリックします。
テキスト ボックスに「 product 」と入力し、 Enter キーを押すと、予測をトレーニングするための列として 製品 が設定されます。 その後、右下隅にある ティック をクリックして、選択ダイアログを閉じます。
多クラスロジスティック回帰アルゴリズムをトレーニングして、1 日の時間と日付に基づいて最も販売された製品を予測します。 ただし、Azure Machine Learning スタジオによって提供されるさまざまなアルゴリズムの詳細については、このドキュメントの範囲を超えています。ただし、Machine Learning アルゴリズムチート シートから詳細を確認できます
左側の [実験項目] パネルで、[ Machine Learning>Initialize Model>Classification] を展開し、 上の [多クラスロジスティック回帰 ] 項目を実験キャンバスにドラッグします。
多クラスロジスティック回帰の下部にある出力を、[モデルのトレーニング] 項目の左上の入力に接続します。
左側のパネルの実験項目の一覧で、[ Machine Learning>Score] を展開し、[ モデルのスコア付 け] 項目をキャンバスにドラッグします。
モデルのトレーニングの下部にある出力を、 モデルの スコア付けの左上の入力に接続します。
[ データの分割] の右下の出力を、[ モデルのスコア付け ] 項目の右上の入力に接続します。
左側のパネルの 実験 項目の一覧で、[ Machine Learning>Evaluate] を展開し、[ モデルの評価 ] 項目をキャンバスにドラッグします。
モデルのスコア付けからの出力を、モデルの評価の左上の入力に接続します。
初めての Machine Learning 実験を構築しました。 実験を保存して実行できるようになりました。 ページの下部にあるメニューで、[ 保存 ] ボタンをクリックして実験を保存し、[ 実行 ] をクリックして実験を開始します。
キャンバスの右上に実験の 状態 が表示されます。 実験が完了するまでしばらく待ちます。
大きな (実際の) データセットがある場合は、実験の実行に数時間かかる可能性があります。
キャンバスで [ モデルの評価 ] 項目を右クリックし、コンテキスト メニューから [ 評価結果] の上にマウス ポインターを置き、[ 視覚化] を選択します。
評価結果は、予測された結果と実際の結果を示して表示されます。 これにより、モデルを評価するために、以前に分割された元のデータセットの 30% が使用されます。 結果が良くないことがわかります。理想的には、各行の最も多い数値が列の強調表示された項目になります。
結果を閉じます。
新しくトレーニングされた Machine Learning モデルを使用するには、 それを Web サービスとして公開する必要があります。 これを行うには、ページの下部にあるメニューの [ Web サービスのセットアップ ] メニュー項目をクリックし、[ 予測 Web サービス] をクリックします。
新しいタブが作成され、トレーニング モデルがマージされて新しい Web サービスが作成されます。
ページの下部にあるメニューで [ 保存] をクリックし、[ 実行] をクリックします。 実験キャンバスの右上隅に状態が更新されます。
実行が完了すると、ページの下部に [ Web サービスのデプロイ ] ボタンが表示されます。 Web サービスをデプロイする準備ができました。 ページの下部にあるメニューの [ Web サービスのデプロイ (クラシック)] をクリックします。
ブラウザーでポップアップの許可を求めるメッセージが表示されることがあります が、デプロイ ページが表示されない場合は、もう一度 [Web サービスの展開 ] を押す必要があります。
実験が作成されると、API キーが表示されるダッシュボード ページにリダイレクトされます。 今のところメモ帳にコピーしてください。すぐにコードに必要になります。 API キーをメモしたら、[キー] の下にある [既定のエンドポイント] セクションの [要求/応答] ボタンをクリックします。
注意
このページで [テスト] をクリックすると、入力データを入力して出力を表示できます。 日と時間を入力します。 製品エントリは空白のままにします。 次に、[ 確認 ] ボタンをクリックします。 ページの下部にある出力には、各製品が選択される可能性を表す JSON が表示されます。
新しい Web ページが開き、Machine Learning Studio (クラシック) で必要な要求構造に関する手順といくつかの例が表示されます。 このページに表示されている 要求 URI を メモ帳にコピーします。
これで、過去の購入データに基づいて販売される可能性が最も高い製品を提供する機械学習システムが構築されました。これは、1 日と 1 日の時刻と関連付けられます。
Web サービスを呼び出すには、サービス エンドポイントの URL とサービスの API キーが必要です。 上部のメニューから [ 消費 ] タブをクリックします。
[ 従量課金 情報] ページには、コードから Web サービスを呼び出すために必要な情報が表示されます。 主キーと要求応答 URL のコピーを取得します。 これらは次の章で必要になります。
Mixed Realityイマーシブ ヘッドセットを設定してテストします。
注意
このコースではモーション コントローラーは必要 ありません 。 イマーシブ ヘッドセットの設定のサポートが必要な場合は、 ここをクリックしてください。
Unityを開き、MR_MachineLearningという名前の新しいUnity プロジェクトを作成します。プロジェクトの種類が 3D に設定されていることを確認します。
Unity開いている場合は、既定の [スクリプト] エディターが Visual Studio に設定されていることを確認する価値があります。 [編集>Preferences] に移動し、新しいウィンドウから [外部ツール] に移動します。 [外部スクリプト] エディターを Visual Studio 2017 に変更します。 [基本設定] ウィンドウを閉じます。
次に、[ファイル>Build 設定] に移動し、[プラットフォームの切り替え] ボタンをクリックして、プラットフォームをユニバーサル Windows プラットフォームに切り替えます。
また、次の点も確認してください。
[ターゲット デバイス] が [ 任意のデバイス] に設定されています。
Microsoft HoloLensの場合は、[ターゲット デバイス] を HoloLens に設定します。
ビルドの種類 が D3D に設定されています。
SDK が [インストール済みの最新] に設定されています。
Visual Studio のバージョン が [最新インストール済み] に設定されています。
[ビルドと実行] が [ローカル コンピューター] に設定されています。
シーンは後で提供されるため、今すぐシーン を 設定する心配はありません。
残りの設定は、現時点では既定値のままにする必要があります。
[ ビルド設定] ウィンドウで、[ プレイヤーの設定] ボタンをクリックすると、 インスペクター が配置されている領域に関連するパネルが開きます。
このパネルでは、いくつかの設定を確認する必要があります。
[その他の設定] タブで、次 の手順を実行 します。
スクリプト ランタイムバージョン は 試験的 である必要があります (.NET 4.6 同等)
スクリプト バックエンドは .NET にする必要があります
API 互換性レベルは .NET 4.6 にする必要があります
[発行設定] タブの [機能] で、次をチェックします。
InternetClient
パネルの下の [XR 設定] ([発行設定] の下にあります) で、[Virtual Reality Supported]\(サポートされている Virtual Reality\) をオンにして、WINDOWS MIXED REALITY SDK が追加されていることを確認します
[ビルド設定] に戻りますUnity C# プロジェクトは灰色表示されなくなりました。この横にあるチェック ボックスをオンにします。
[ビルド設定] ウィンドウを閉じます。
プロジェクトを保存します (ファイル > プロジェクトの保存)。
このコースでは、Azure-MR-307.unitypackage というUnityアセット パッケージをダウンロードする必要があります。 このパッケージにはシーンが付属し、その事前構築済みのすべてのオブジェクトが含まれているため、すべて動作することに集中できます。 ShelfKeeper スクリプトは、シーンのセットアップ構造を目的として、パブリック変数のみを保持します。 他のすべてのセクションを実行する必要があります。
このパッケージをインポートするには:
Unityダッシュボードが目の前にある状態で、画面上部のメニューで [アセット] をクリックし、[パッケージのインポート] をクリックします。カスタム パッケージ。
ファイル ピッカーを使用して Azure-MR-307.unitypackage パッケージを選択し、[ 開く] をクリックします。
このアセットのコンポーネントの一覧が表示されます。 [インポート] をクリックして インポートを確認します。
インポートが完了すると、Unity プロジェクト パネルにいくつかの新しいフォルダーが表示されていることがわかります。 これらは、3D モデルと、作業する事前に作成されたシーンの一部であるそれぞれの素材です。 このコースでは、ほとんどのコードを記述します。
[プロジェクト パネル] フォルダー内の [シーン] フォルダーをクリックし、内部のシーン (MR_MachineLearningScene と呼ばれます) をダブルクリックします。 シーンが開きます (下の画像を参照)。 赤いひし形が見つからない場合は、ゲーム パネルの右上にある [ギズモ] ボタンをクリックします。
JSON ライブラリ (シリアル化と逆シリアル化に使用) を利用するために、持ち込んだパッケージで Newtonsoft DLL が実装されています。 ライブラリには正しい構成が必要ですが、確認する価値があります (特に、コードが機能しない問題が発生している場合)。
そのために、次の操作を実行します。
Plugins フォルダー内の Newtonsoft ファイルを左クリックし、[ インスペクター] パネルを見ます。 [ 任意のプラットフォーム] がオンになっていることを確認します。 [UWP] タブに移動し、[プロセスを行わない] がオンになっていることを確認します。
ShelfKeeper クラスは、シーン内で生成された UI と製品を制御するメソッドをホストします。
インポートされたパッケージの一部として、このクラスが与えられましたが、これは不完全です。 次に、そのクラスを完了します。
Scripts フォルダー内の ShelfKeeper スクリプトをダブルクリックして、Visual Studio 2017 で開きます。
スクリプトに存在するすべてのコードを次のコードに置き換えます。これは、時刻と日付を設定し、製品を表示するメソッドを持っています。
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);
}
}
Unityに戻る前に、変更を Visual Studio に保存してください。
Unity エディターに戻り、ShelfKeeper クラスが次のようになりますチェック。
重要
スクリプトに参照ターゲットがない場合 ( つまり、Date (Text Mesh))、対応するオブジェクトを 階層パネルからターゲット フィールドにドラッグするだけです。 必要に応じて、以下の説明を参照してください。
ShelfKeeper コンポーネント スクリプト内の Spawn Point 配列を左クリックして開きます。 サブセクションは Size と呼ばれ、配列のサイズを示します。 [サイズ] の横のテキスト ボックスに「3」と入力し、Enter キーを押すと、下に 3 つのスロットが作成されます。
Hierarchy 内で Time Display オブジェクトを展開します (横にある矢印を左クリックします)。 次に、階層内からメイン カメラをクリックして、インスペクターにその情報を表示します。
階層パネルでメイン カメラを選択します。 Date and Time オブジェクトを階層パネルから、ShelfKeeper コンポーネントのメイン カメラのインスペクター内の日付テキストと時刻テキスト スロットにドラッグします。
イメージに示すように、階層パネル (Shelf オブジェクトの下) から Spawn Point 配列の下にある 3要素参照ターゲットにスポーン ポイントをドラッグします。
次に作成するクラスは ProductPrediction クラスです。
このクラスは、次の役割を担います。
現在の日付と時刻を指定して、 Machine Learning Service インスタンスのクエリを実行する。
JSON 応答を使用可能なデータに逆シリアル化する。
データの解釈、3 つの推奨製品の取得。
ShelfKeeper クラス メソッドを呼び出して、シーンにデータを表示します。
このクラスを作成するには:
[プロジェクト] パネルの [スクリプト] フォルダーに移動します。
[ Create>C# Script] フォルダー内を右クリックします。 ProductPrediction スクリプトを呼び出します。
新しい ProductPrediction スクリプトをダブルクリックして 、Visual Studio 2017 で開きます。
[ ファイルの変更が検出されました ] ダイアログが表示されたら、[*ソリューションの再読み込み] をクリックします。
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;
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; }
}
次に、前のコードの上に次の変数を追加します (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 の 主キー と 要求応答エンドポイントを、ここでの変数に挿入してください。 次の画像は、キーとエンドポイントの取得元を示しています。
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));
}
次のメソッドは、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();
}
このクラスでは使用されないため、Update() メソッドを削除できます。
現在の日付と時刻を 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);
}
}
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();
}
Visual Studio を保存し、Unityに戻ります。
ProductPrediction クラス スクリプトを Script フォルダーから Main Camera オブジェクトにドラッグします。
シーンとプロジェクトファイルを保存>シーン/ファイルの保存>プロジェクトを保存します。
次に、プロジェクトを UWP ソリューションとしてビルドし、スタンドアロン アプリケーションとして実行できるようにします。
ビルドするには:
[ファイル>シーンの保存] をクリックして、現在のシーンを保存します。
[ファイル>Build の設定] に移動します
[Unity C# プロジェクト] というボックスをオンにします (これは、ビルドが完了した後にクラスを編集できるため重要です)。
[ 開いているシーンの追加] をクリックします。
[ ビルド] をクリックします。
ソリューションをビルドするフォルダーを選択するように求められます。
ビルド フォルダーを作成し、そのフォルダー内に、任意の適切な名前の別のフォルダーを作成します。
新しいフォルダーをクリックし、[ フォルダーの選択] をクリックして、その場所でビルドを開始します。
ビルドUnity完了すると (時間がかかる場合があります)、ビルドの場所にエクスプローラー ウィンドウが開きます (タスク バーチェック、常にウィンドウの上に表示されるとは限りませんが、新しいウィンドウが追加されたことを通知します)。
アプリケーションをデプロイするには:
新しいUnity ビルド (App フォルダー) に移動し、Visual Studio でソリューション ファイルを開きます。
Visual Studio を開いた状態で NuGet パッケージを復元する必要があります。これを行うには、MachineLearningLab_Build ソリューションをソリューション エクスプローラー (Visual Studio の右側にある) から右クリックし、[NuGet パッケージの復元] をクリックします。
[ソリューション構成] で [デバッグ] を選択 します。
ソリューション プラットフォームで、 x86、 ローカル コンピューターを選択します。
Microsoft HoloLensでは、コンピューターにテザリングされないように、これをリモート コンピューターに設定する方が簡単な場合があります。 ただし、次の操作も行う必要があります。
- HoloLens の IP アドレス は、[ 設定] > [ネットワーク] & [インターネット > Wi-Fi > 詳細オプション] で確認できます。IPv4 は使用する必要があるアドレスです。
- [開発者モード] が [オン] になっていることを確認します。[設定] > [Update & Security > 開発者向け] にあります。
[ ビルド] メニュー に移動し、[ ソリューションの展開 ] をクリックして、アプリケーションを PC にサイドロードします。
これで、インストールされているアプリの一覧にアプリが表示され、起動する準備が整いました。
Mixed Reality アプリケーションを実行すると、Unity シーンに設定されたベンチが表示され、初期化から Azure 内で設定したデータがフェッチされます。 データはアプリケーション内で逆シリアル化され、現在の日付と時刻の 3 つの上位の結果がベンチ上の 3 つのモデルとして視覚的に提供されます。
これで、Azure Machine Learning を利用してデータ予測を行い、シーンに表示する Mixed Reality アプリを構築しました。
演習 1
アプリケーションの並べ替え順序を試し、棚に 3 つの下位予測が表示されるようにします。このデータも役に立つ可能性があります。
演習 2
Azure Tables を使用すると、新しいテーブルに気象情報が設定され、データを使用して新しい実験が作成されます。
トレーニング
モジュール
Azure Cloud Services を HoloLens 2 の Unity プロジェクトに統合する - Training
Mixed Reality アプリケーション用に、Azure Storage、Azure Custom Vision、Azure Spatial Anchors などの Azure Cloud Services を 追加します。