HoloLens (第 1 世代) と Azure 307: 機械学習
Note
Mixed Reality Academy のチュートリアルは、HoloLens (第 1 世代) と Mixed Reality イマーシブ ヘッドセットを念頭に置いて編成されています。 そのため、それらのデバイスの開発に関するガイダンスを引き続き探している開発者のために、これらのチュートリアルをそのまま残しておくことが重要だと考えています。 これらのチュートリアルが、HoloLens 2 に使用されている最新のツールセットや操作に更新されることは "ありません"。 これらは、サポートされているデバイス上で継続して動作するように、保守されます。 今後、HoloLens 2 向けに開発する方法を示す新しいチュートリアル シリーズが投稿される予定です。 この通知は、それらのチュートリアルが投稿されたときにリンクと共に更新されます。
このコースでは、Azure Machine Learning スタジオ (クラシック) を使用して、Mixed Reality アプリケーションに Machine Learning (ML) 機能を追加する方法について紹介します。
Azure Machine Learning スタジオ (クラシック) は、データの入力、出力、準備、可視化に役立つ多数の機械学習アルゴリズムを開発者に提供する Microsoft サービスです。 これらのコンポーネントから、予測分析実験を開発し、実験を繰り返し、それを使用してモデルのトレーニングすることができます。 トレーニングに続いて、モデルを Azure クラウド内で操作可能にして、新しいデータをスコアリングできるようにすることができます。 詳細については、Azure Machine Learning スタジオ (クラシック) のページを参照してください。
このコースを修了すると、Mixed Reality イマーシブ ヘッドセット アプリケーションの作成を通じて、次のことを行うために必要な知識が身に付きます。
- Azure Machine Learning スタジオ (クラシック) ポータルに売上データのテーブルを入力し、人気商品の将来の売上を予測するアルゴリズムを設計します。
- ML サービスから予測データを受信して解釈できる Unity プロジェクトを作成します。
- 最も人気のある販売アイテムを棚に提供することで、予測データを UnityProject 内に視覚的に表示します。
アプリケーションでは、結果を設計にどのように統合するかはあなた次第です。 このコースは、Azure のサービスを Unity プロジェクトに統合する方法を学べるよう設計されています。 このコースで得られた知識を使用して、ご自分の Mixed Reality アプリケーションを強化しましょう。
このコースは自己完結型のチュートリアルであり、他の Mixed Reality ラボに直接は関与しません。
デバイス サポート
コース | HoloLens | イマーシブ ヘッドセット |
---|---|---|
MR と Azure 307:機械学習 | ✔️ | ✔️ |
注意
このコースでは Windows Mixed Reality イマーシブ (VR) ヘッドセットを中心に取り上げていますが、このコースで習得したことは、Microsoft HoloLens にも応用できます。 このコースに取り組む過程で、HoloLens をサポートするために別途行う必要のある変更があれば、注意事項として記載しています。 HoloLens を使用すると、音声キャプチャ中に反響音が生じることがあります。
前提条件
Note
このチュートリアルは、Unity と C# の基本的な使用経験がある開発者を対象としています。 また、このドキュメント内の前提条件や文章による説明は、執筆時 (2018 年 5 月) にテストおよび検証された内容であることをご了承ください。 ツールのインストールの記事に記載されているように、お客様は最新のソフトウェアを自由に使用できます。ただし、このコースの情報は、以下に記載されているものよりも新しいソフトウェアで見つかったものと完全に一致するとは限りません。
このコースでは、次のハードウェアとソフトウェアをお勧めします。
- イマーシブ (VR) ヘッドセットの開発に必要な Windows Mixed Reality と互換性のある開発用 PC
- 開発者モードが有効になっている Windows 10 Fall Creators Update (またはそれ以降)
- 最新の Windows 10 SDK
- Unity 2017.4
- Visual Studio 2017
- 開発者モードが有効になっているWindows Mixed Reality イマーシブ (VR) ヘッドセットまたは Microsoft HoloLens
- Azure のセットアップと ML データ取得のためのインターネット アクセス
開始する前に
このプロジェクトのビルドで問題が発生しないように、このチュートリアルで説明したプロジェクトをルートフォルダーまたはルートに近いフォルダーに作成することを強くお勧めします (フォルダー パスが長いと、ビルド時に問題が発生する可能性があります)。
第 1 章 - Azure ストレージ アカウントのセットアップ
Azure Translator API を使用するには、サービスのインスタンスをアプリケーションで利用できるように設定する必要があります。
Azure Portal にログインします。
Note
まだ Azure アカウントをお持ちでない方は、作成する必要があります。 このチュートリアルを教室やラボで受講している場合は、インストラクターや監督者に新しいアカウントの設定についてサポートを依頼してください。
ログインしたら、左メニューの [ストレージ アカウント] をクリックします。
Note
新しいポータルでは、[新規作成] という文字列が [リソースの作成] に置き換えられることがあります。
[ストレージ アカウント] タブで [追加] をクリックします。
[ストレージ アカウントの作成] パネルで、
アカウントに [名前] を挿入します。このフィールドには数字と小文字のみ入力できます。
[デプロイ モデル] には、[リソース マネージャー] を選択します。
[アカウントの種類] では [ストレージ (汎用 v1)] を選択します。
[パフォーマンス] には [Standard] を選択します
[レプリケーション] には、[読み取りアクセス geo 冗長ストレージ (RA-GRS)] を選択します。
[安全な転送が必須] は [無効] のままにしておきます。
サブスクリプションを選択します。
[リソース グループ] を選択するか、新規に作成します。 リソース グループは、Azure アセットのコレクションの監視、アクセス制御、プロビジョニング、課金管理を行う方法を提供します。 1 つのプロジェクト (これらのラボなど) に関連するすべての Azure サービスを共通のリソース グループの下に置くことをお勧めします。
Azure リソース グループの詳細については、リソース グループに関する記事を参照してください。
リソース グループの [場所] を決定します (新しいリソース グループを作成する場合)。 この場所は、アプリケーションが実行されるリージョン内が理想的です。 一部の Azure アセットは、特定のリージョンでしか利用できません。
また、本サービスに適用される利用規約を理解していることを確認する必要があります。
[作成] をクリックしたら、サービスが作成されるのを待つ必要があります。これには 1 分ほどかかります。
サービスのインスタンスが作成されると、ポータルに通知が表示されます。
第 2 章 - Azure Machine Learning スタジオ (クラシック)
Azure Machine Learning を使用するには、Machine Learning service サービスのインスタンスを構成する必要があります。
Azure portal で、左上隅にある [新規作成] をクリックし、「Machine Learning Studio Workspace」を検索して、Enter を押します。
新しいページに、Machine Learning スタジオ ワークスペース サービスの説明が表示されます。 このプロンプトの左下にある [作成] ボタンをクリックすると、このサービスとの関連付けを作成します。
[作成] をクリックすると、新しい Machine Learning スタジオ サービスに関する詳細を入力する必要があるパネルが表示されます。
このサービス インスタンスに必要な [ワークスペース名] を挿入します。
サブスクリプションを選択します。
[リソース グループ] を選択するか、新規に作成します。 リソース グループは、Azure アセットのコレクションの監視、アクセス制御、プロビジョニング、課金管理を行う方法を提供します。 1 つのプロジェクト (これらのラボなど) に関連するすべての Azure サービスを共通のリソース グループの下に置くことをお勧めします。
Azure リソース グループの詳細については、リソース グループに関する記事を参照してください。
リソース グループの [場所] を決定します (新しいリソース グループを作成する場合)。 この場所は、アプリケーションが実行されるリージョン内が理想的です。 一部の Azure 資産は、特定の地域でしか利用できません。 前の章で Azure ストレージの作成に使用した同じリソース グループを使用する必要があります。
[ストレージ アカウント] セクションで [既存のものを使用] をクリックし、ドロップダウン メニューをクリックしてそのボックスの一覧から、前の章で作成した[ストレージ アカウント]をクリックします。
適切なワークスペース価格レベルをドロップダウン メニューから選択します。
[Web サービス プラン] セクションの [新規作成] をクリックし、テキストフィールドに名前を挿入します。
[Web サービス プラン価格帯] セクションから、目的の価格帯を選択します。 DEVTEST Standard という開発テスト層が無料で利用できるはずです。
また、本サービスに適用される利用規約を理解していることを確認する必要があります。
Create をクリックしてください。
[作成] をクリックしたら、サービスが作成されるのを待つ必要があります。これには 1 分ほどかかります。
サービスのインスタンスが作成されると、ポータルに通知が表示されます。
通知をクリックして、新しいサービス インスタンスを確認します。
通知の[リソースに移動]ボタンをクリックして、新しいサービスインスタンスを探します。
表示されたページの [追加リンク] セクションで、[機械学習スタジオを起動する] をクリックします。ブラウザーが 機械学習スタジオ ポータルに移動します。
右上または中央にある [サインイン] ボタンを使用して、機械学習スタジオ (クラシック) にログインします。
第 3 章 - 機械学習スタジオ (クラシック): データセットのセットアップ
機械学習アルゴリズムが機能する方法の1つは、既存のデータを分析し、既存のデータセットに基づいて将来の結果を予測しようとすることです。 つまり、一般的には、既にあるデータが多いほど、将来の結果を予測するアルゴリズムの性能が高くなるということです。
このコースでは、 ProductsTableCSVというサンプルテーブルが提供されており、ここからダウンロードできます。
重要
上記の.zipファイルには、 ProductsTableCSV と.unitypackage の両方が含まれています。これらは、第 6 章で必要になります。 このパッケージは、CSV ファイルとは別に、その章でも提供されています。
このサンプル データ セットには、2017年の各日の各時間におけるベストセラー オブジェクトのレコードが含まれています。
たとえば、2017 年の第 1 日、午後 1 時 (13 時) に最も売れた商品は塩こしょうでした。
このサンプルテーブルには、9998エントリが含まれています。
Machine Learning スタジオ (クラシック) ポータルに戻り、このテーブルを ML のデータセットとして追加します。 これを行うには、画面の左下隅にある [+ 新規] ボタンをクリックして行います。
下からセクションが表示され、その中に左側にナビゲーション パネルが表示されます。 [データセット] をクリックし、その右側にある [ローカル ファイルから] をクリックします。
次の手順に従って、新しいデータセットをアップロードします。
アップロードウィンドウが表示され、ハードドライブで新しいデータセットを参照で選択できます。
選択したら、アップロードウィンドウに戻り、チェックボックスをオフのままにします。
下のテキスト フィールドに、データセットの名前として「ProductsTableCSV.csv」を入力します (自動的に追加されます)。
種類のドロップダウンメニューを使用して、ヘッダー付きの汎用CSVファイル(.csv)を選択します。
アップロード ウィンドウの右下にあるチェックマークを押すと、データセットがアップロードされます。
第 4 章 - 機械学習スタジオ (クラシック): 実験
機械学習システムを構築する前に、データに関する理論を検証するための実験を構築する必要があります。 その結果を使用すると、より多くのデータが必要かどうか、またはデータと考えられる結果の間に相関関係がないかどうかがわかります。
実験の作成を開始するには:
ページの左下にある[+新規]ボタンをもう一度クリックしてから、実験>[空白の実験]をクリックします。
新しいページが空白の実験で表示されます。
左側のパネルから [保存されたデータセット]>[マイデータセット] を展開し、ProductsTableCSV を実験キャンバスにドラッグします。
左側のパネルで、[データ変換]>[サンプルとスプリット] を展開します。 [データのスプリット] 項目を実験キャンバスにドラッグします。 [データのスプリット]項目によって、データ セットが 2 つに分割されます。 1 つ目は、機械学習アルゴリズムのトレーニングに使用するパーツ。 2 つ目は、生成されたアルゴリズムの精度を評価するために使用されます。
右側のパネル (キャンバス上の [データのスプリット]項目は選択状態にしておいてください) で、[最初の出力データセット内の行の割合] を 0.7 に設定します。 これにより、データが 2 つにスプリットされ、最初の部分がデータの 70% になり、2 番目の部分が残りの 30% になります。 データをランダムに分割するために、[ランダム化スプリット] チェック ボックスがオンのままになっていることを確認してください。
キャンバス上の [ProductsTableCSV] 項目の底部をドラッグして [データのスプリット] 項目の上部に接続をドラッグします。 これによって項目が接続され、[ProductsTableCSV] データセットの出力 (データ) が [データのスプリット] の入力として送信されます。
左側の [実験] パネルで、[機械学習]>[トレーニング] を展開します。 [モデルのトレーニング] 項目を実験キャンバスにドラッグします。 キャンバスは次のようになります。
[データの分割] 項目の左下から、 [モデルのトレーニング] 項目の右上に接続をドラッグします。 データセットからの最初の 70% のスプリットは、アルゴリズムをトレーニングするためにモデルのトレーニングによって使用されます。
キャンバスで [モデルのトレーニング] 項目を選択し、 (ブラウザウィンドウの右側にある) [プロパティ] パネルで [起動カラムセレクタ] ボタンをクリックします。
テキスト ボックスに「product」と入力し、Enter キーを押すと、product が予測をトレーニングするための列として設定されます。 その後、右下隅にあるチェックマークをクリックして、選択ダイアログを閉じます。
多クラス ロジスティック回帰アルゴリズムをトレーニングして、その日の時間と日付に基づいて最も売れた製品を予測します。 Azure Machine Learning スタジオが提供するさまざまなアルゴリズムの詳細を説明することはこのドキュメントの範囲を超えていますが、機械学習アルゴリズム チート シートから詳細を確認できます。
左側の実験項目パネルから [機械学習]>[モデルの初期化]>[分類] を展開し、[多クラスのロジスティック回帰] 項目を実験キャンバスにドラッグします。
[多クラスのロジスティック回帰] の下部にある出力を、[モデルのトレーニング] 項目の左上の入力に接続します。
左側のパネルにある実験項目の一覧で、[機械学習]>[スコア] を展開し、[Score Model] 項目をキャンバスにドラッグします。
[モデルのトレーニング] の下部からの出力を、[Score Model] 項目の左上の入力に接続します。
[データのスプリット] の右下の出力を、[Score Model] 項目の右上の入力に接続します。
左側のパネルにある実験項目の一覧で、[機械学習]>[評価] を展開し、[モデルの評価] 項目をキャンバスにドラッグします。
[Score Model] の出力を、[モデルの評価] の左上の入力に接続します。
これで、最初の機械学習実験が構築されました。 これで、実験を保存して実行できます。 ページ下部のメニューで、[保存] ボタンをクリックして実験を保存し、[実行] をクリックして実験を開始します。
キャンバスの右上に、実験の状態が表示されます。 実験が終了するまでしばらく待ちます。
実際の現場で使用されるような大きなデータセットである場合、実験の実行には数時間かかることがあります。
キャンバスで [モデルの評価] 項目を右クリックし、コンテキストメニューから [評価結果] の上にマウスを置き、 [視覚化] を選択します。
評価結果が表示され、予測された結果と実際の結果が表示されます。 これは、モデルを評価するために、以前に分割された元のデータセットの 30% を使用します。 結果があまり良くないことがわかります。理想的には、各列でハイライト表示されている項目が各行の最大数になるようにします。
[結果] を閉じます。
新しくトレーニングした機械学習モデルを使用するには、Web サービスとして公開する必要があります。 これを行うには、ページの下部にあるメニューの [Web サービスとして設定] メニュー項目をクリックし、[予測 Web サービス] をクリックします。
新しいタブが作成され、[モデルのトレーニング] がマージされて、新しい Web サービスが作成されます。
ページ下部のメニューで、[保存]をクリックし、[実行]をクリックします。 更新された状態が実験キャンバスの右上隅に表示されます。
実行が完了すると、ページ下部に [Web サービスのデプロイ] ボタンが表示されます。 これで、Webサービスをデプロイする準備が整いました。 ページ下部のメニューで [Web サービスのデプロイ] (クラシック) をクリックします。
ポップアップを許可するよう求めるメッセージがブラウザーから表示される場合があります。ポップアップは許可してください。ただし、デプロイ ページが表示されない場合は、[Web サービスのデプロイ] をもう一度押す必要があります。
実験が作成されると、API キーが表示されるダッシュボードページにリダイレクトされます。 これをメモ帳にコピーしておいてください。すぐ後にコード内で必要になります。 API キーをメモしたら、キーの下の [既定のエンドポイント] セクションにある [要求/応答] ボタンをクリックします。
Note
このページで [テスト] をクリックすると、入力データを入力して出力を表示できます。 [日] と [時間] を入力します。 [商品] エントリは空白のままにします。 その後、[確定] ボタンをクリックします。 ページ下部の出力には、各製品が選択される可能性を表す JSON が表示されます。
新しい Web ページが開き、機械学習スタジオ (クラシック) で必要な要求の構造について、手順といくつかの例が表示されます。 このページに表示された要求 URI をメモ帳にコピーします。
ここで、時間帯と曜日に関連付けられた履歴購入データに基づいて販売される可能性が最も高い製品を提供する機械学習システムが構築されました。
ウェブサービスを呼び出すには、サービスエンドポイントのURLとサービスのAPIキーが必要です。 トップメニューから消費タブをクリックします。
消費情報ページには、コードからウェブサービスを呼び出すために必要な情報が表示されます。 プライマリキーと要求―応答URLをコピーします。 これらは次の章で必要です。
第5章―Unityプロジェクトのセットアップ
Mixed Realityイマーシブヘッドセットをセットアップしてテストします。
Note
このコースでは、モーションコントローラーを必要としません。 イマーシブヘッドセットのセットアップについてサポートが必要な場合、こちらをクリックしてください。
ユニティを開いて、MR_MachineLearningという新しいユニティプロジェクトを作成し、プロジェクトタイプが 3Dに設定されていることを確認します。
ユニティを開いた状態で、既定のスクリプトエディターがVisual Studioに設定されていることをチェックする価値があります。 [Edit] (編集)>[Preferences] (環境設定) に移動し、新しいウィンドウで [External Tools] (外部ツール) に移動します。 [外部スクリプト エディター] を [Visual Studio 2017] に変更します。 [環境設定] ウィンドウを閉じます。
次に、ファイル>ビルド設定に移り、プラットフォーム切り替えボタンをクリックすることで、プラットフォームをユニバーサルWindowsプラットフォームに切り替えます。
次のことも確認します。
ターゲットデバイスをいずれかのデバイスに設定します。
Microsoft HoloLensの場合、ターゲットデバイスをHoloLensに設定します。
ビルドの種類をD3Dに設定します。
SDKを最新のインストールに設定します。
Visual Studioのバージョンを最新のインストールに設定します。
ビルドと実行をローカルマシンに設定します。
シーンは後で提供されるため、今すぐセットアップする必要はありません。
ここでは、残りの設定は既定値のままにしておきます。
[ビルド設定] ウィンドウで、[プレーヤー設定] ボタンをクリックすると、[インスペクター] が配置されているスペースに関連パネルが表示されます。
このパネルでは、いくつかの設定を確認する必要があります。
その他の設定タブでは、
スクリプトランタイムバージョンは実験的なものである必要があります(.NET 4.6と同等)。
スクリプトバックエンドは.NETである必要があります。
[API Compatibility Level] (API 互換性レベル) が [.NET 4.6] である
[公開設定] タブ内の [機能] で、次の内容を確認します。
InternetClient
さらに、パネルの下にある [XR Settings] (XR 設定) ([Publish Settings] (公開設定) の下) で、[Virtual Reality Supported] (Virtual Reality サポート) をオンにし、Windows Mixed Reality SDK が追加されていることを確認します。
ビルド設定に戻ると、ユニティC#プロジェクトを灰色で表示しなくなり、その横にあるチェックボックスをティックします。
[ビルド設定] ウィンドウを閉じます。
プロジェクトを保存します(ファイル>保存プロジェクト)。
第6章―MLProductsユニティパッケージのインポート
このコースでは、Azure-MR-307.unitypackageというユニティアセットパッケージをダウンロードする必要があります。 このパッケージには、すべてのオブジェクトが予めビルドされたシーンが付属しているため、すべてを機能させることに集中できます。 ShelfKeeperスクリプトが提供されますが、シーンセットアップ構造の目的で、パブリック変数のみを保持します。 他のすべてのセクションを実行する必要があります。
このパッケージをインポートするには、
ユニティダッシュボードを目の前にし、画面上部のメニューにあるアセットをクリックしてから、パッケージインポート、カスタムパッケージをクリックします。
ファイルピッカーを使用してAzure-MR-307.unitypackageパッケージを選択し、開くをクリックします。
このアセットのコンポーネントリストを表示します。 インポート をクリックしてインポートを確認します。
インポートが完了すると、ユニティのプロジェクトパネルにいくつかの新しいフォルダーが現れました。 これらは、作業する予め作成されたシーンの一部である3Dモデルとそれぞれのマテリアルです。 コードの大部分は、このコースで記述されます。
プロジェクトパネルフォルダー内で、シーンフォルダーをクリックし、内部のシーン(MR_MachineLearningScene)をダブルクリックします。 シーンを開きます(以下の画像を参照)。 赤色のダイヤモンドがない場合、ゲームパネルの右上にあるGizmosボタンをクリックするだけです。
第7章―ユニティにおけるDLLのチェック
JSONライブラリ(シリアル化と逆シリアル化に使用)を活用するために、Newtonsoft DLLは持ち込まれたパッケージに実装されます。 ライブラリは正しい構成になっている必要がありますが、チェックする価値があります(特に、コードが機能しないという問題がある場合)。
そのためには次を行います。
プラグインフォルダー内のNewtonsoftファイルを左クリックして、インスペクターパネルを確認します。 任意のプラットフォームがティックされていることを確認します。 UWPタブに移り、また処理しないがティックされていることも確認します。
第8章―ShelfKeeperクラスの作成
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); } }
ユニティに戻る前に、必ずVisual Studioで変更を保存します。
ユニティエディターに戻り、ShelfKeeperクラスが次のようになっていることを確認します。
重要
スクリプトに参照ターゲット(すなわち日付(テキストメッシュ))が存在しない場合、対応するオブジェクトを階層パネルからターゲットフィールドにドラッグだけです。 必要に応じて、以下の説明をご覧ください。
ShelfKeeperコンポーネントスクリプト内のスパウンポイント配列を左クリックして開きます。 サイズというサブセクションが現れ、それは配列のサイズを示します。 サイズの横のテキストボックスに3を入力し、Enterキーを押すと、その下に3つのスロットが作成されます。
階層内で時間表示オブジェクトを(その下の矢印を左クリックして)展開します。 次に、階層内からメインカメラをクリックすることで、その情報をインスペクターに表示します。
階層パネル内でメインカメラを選択します。 ShelfKeeperコンポーネント内のメインカメラのインスペクター内にある日付テキストスロット 時刻テキストスロットに、階層パネルから日付オブジェクトと時間オブジェクトをドラッグします。
画像に示すように、階層パネル(シェルフオブジェクトの下にある)からスパウンポイントを、スパウンポインティング配列下の3つの要素参照ターゲットにドラッグします。
第9章―ProductPredictionクラスの作成
次に作成されるクラスは、ProductPredictionクラスです。
このクラスは次の役割を果たします。
機械学習サービスインスタンスをクエリして、現在の日付と時刻を提供します。
JSON応答を使用可能なデータに逆シリアル化します。
データを解釈して、3つの推奨製品を取得します。
ShelfKeeperクラス方法を呼び出して、シーンにデータを表示します。
このクラスを作成するには、
プロジェクトパネル内にあるスクリプトフォルダーに移ります。
フォルダー内で右クリックし、>C#スクリプトを作成します。 スクリプト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つのオブジェクトを挿入します。 これらのクラスを使用して、機械学習サービスの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;
重要
機械学習ポータルから、プライマリキーと要求/応答エンドポイントをここの変数に挿入することを確認します。 以下の画像は、キーとエンドポイントをどこから取得したかを示します。
このコードを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から日時を収集し、機械学習実験がテーブルに記憶されたデータと比較するために使用できる形式に変換します。
/// <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()方法を削除できます。
次の方法を追加し、この方法は、現在の日時を機械学習エンドポイントに転送し、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を保存し、ユニティに戻ります。
スクリプトフォルダーからProductPredictionクラススクリプトをメインカメラオブジェクトにドラッグします。
ファイル>保存シーン/ファイル>保存プロジェクトとして、シーンとプロジェクトを保存します。
第10章―UWPソリューションのビルド
ここで、プロジェクトをUWPソリューションとしてビルドすることで、スタンドアロンアプリケーションとして実行できるようにします。
ビルドするには、
ファイル>保存シーン をクリックすることで現在のシーンを保存します。
ファイル>ビルド設定に移ります。
Unity C#プロジェクトというボックスをチェックします(ビルドが完了した後にクラスを編集できるようになるため、これは重要です)。
開くシーンの追加をクリックします。
[ビルド] をクリックします。
ソリューションをビルドするフォルダーを選択するよう求めるプロンプトが表示されます。
BUILDSフォルダーを作成し、そのフォルダー内に選択した適切な名前で別のフォルダーを作成します。
新しいフォルダーをクリックし、その後フォルダー選択をクリックすると、その位置でビルドを開始します。
ユニティの構築が完了すると(時間がかかる場合がある)、ビルドの位置にファイルエクスプローラーウィンドウを開きます(タスクバーが常にウィンドウの上に現れるとは限らないため、タスクバーをチェックしますが、新しいウィンドウを追加したことを通知します)。
第11章―アプリケーションのデプロイ
アプリケーションをデプロイするには、
新しいユニティビルド(アプリフォルダー)にナビゲートし、Visual Studioでソリューションファイルを開きます。
Visual Studioを開いた状態で、NuGetパッケージを復元する必要があり、これは、ソリューションエクスプローラー(Visual Studioの右側にある)からMachineLearningLab_Buildソリューションを右クリックし、NuGetパッケージの復元をクリックして実行できます。
ソリューション構成において、デバッグを選択します。
ソリューションプラットフォームで、x86、ローカルマシンを選択します。
Microsoft HoloLensの場合、これをリモートマシンに設定すると、コンピューターに接続されないようにする方が簡単な場合があります。 ただし、次のことも行う必要があります。
- HoloLens の IP アドレス を把握します。これは 、[設定 > ] [ネットワーク] & [インターネット > ] Wi-Fi > [詳細オプション] にあります。IPv4 は、使用する必要があるアドレスです。
- 開発者モードがオンになっていることを確認します。「Settings > Update & Security > For developers」で確認できます。
ビルドメニューに移り、ソリューションデプロイをクリックし、PCにアプリケーションをサイドロードします。
ここで、インストールされたアプリのリストにアプリが現れ、起動できる状態になります。
Mixed Realityアプリケーションを実行するとき、ユニティシーンにセットアップされたベンチを表示し、Azure内でセットアップされたデータを初期化処理からフェッチします。 そのデータをアプリケーション内で逆シリアル化し、現在の日時に関して上位3つの結果を、ベンチ上に3つのモデルとして視覚的に提供します。
機械学習アプリケーションを完成しました。
ここまで、Azure機械学習を活用してデータを予測し、それをシーンに表示するMixed Realityアプリをビルドすることに成功しました。
演習
演習 1
アプリケーションの並べ替え順序を試して、このデータも役立つ可能性があるため、3つの底部予測をシェルフに表示します。
演習 2
Azureテーブルを使用して新しいテーブルに気象情報を組み込み、そのデータを使用して新しい実験を作成します。