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: 機械学習 | ✔️ | ✔️ |
Note
このコースは主に 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 サービス プラン セクションで、 Create new をクリックし テキスト フィールドに名前を挿入します。
[Web サービス プラン価格帯] セクションから、目的の価格帯を選択します。 DEVTEST Standard という開発テスト層が無料で利用できるはずです。
またお客様は、本サービスに適用されるご契約条件を理解していることを確認する必要があります。
Create をクリックしてください。
[作成] をクリックしたら、サービスが作成されるのを待つ必要があります。これには 1 分ほどかかることがあります。
サービス インスタンスが作成されると、ポータルに通知が表示されます。
通知をクリックして、新しいサービス インスタンスを確認します。
通知の[リソースに移動]ボタンをクリックして、新しいサービスインスタンスを探します。
表示されたページの [追加リンク] セクションで、[機械学習スタジオを起動する] をクリックします。ブラウザーが 機械学習スタジオ ポータルに移動します。
右上または中央にある [サインイン] ボタンを使用して、Machine Learning スタジオ (クラシック) にログインします。
第 3 章 - Machine Learning スタジオ (クラシック): データセットのセットアップ
機械学習アルゴリズムが機能する方法の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 つ目は、生成されたアルゴリズムの精度を評価するために使用されます。
右側のパネル (キャンバス上の [Split Data]\(データの分割\) 項目は選択状態にしておいてください) で、[最初の出力データセット内の行の割合] を 0.7 に設定します。 これにより、データが 2 つにスプリットされ、最初の部分がデータの 70% になり、2 番目の部分が残りの 30% になります。 データをランダムに分割するために、[ランダム化スプリット] チェック ボックスがオンのままになっていることを確認してください。
キャンバス上の [ProductsTableCSV] 項目の底部をドラッグして [データのスプリット] 項目の上部に接続をドラッグします。 これによって項目が接続され、[ProductsTableCSV] データセットの出力 (データ) が [データのスプリット] の入力として送信されます。
左側の [実験] パネルで、[機械学習]>[トレーニング] を展開します。 [モデルのトレーニング] 項目を実験キャンバスにドラッグします。 キャンバスは次のようになります。
[Split Data]\(データの分割\) 項目の "左下" をドラッグして、[モデルのトレーニング] 項目の右上に接続します。 データセットからの最初の 70% のスプリットは、アルゴリズムをトレーニングするためにモデルのトレーニングによって使用されます。
キャンバスで [モデルのトレーニング] 項目を選択し、(ブラウザー ウィンドウの右側にある) [プロパティ] パネル で [列セレクターの起動] ボタンをクリックします。
テキスト ボックスに「product」と入力し、Enter キーを押すと、product が予測をトレーニングするための列として設定されます。 その後、右下隅にあるチェックマークをクリックして、選択ダイアログを閉じます。
多クラス ロジスティック回帰アルゴリズムをトレーニングして、その日の時間と日付に基づいて最も売れた製品を予測します。 Azure Machine Learning スタジオが提供するさまざまなアルゴリズムの詳細を説明することはこのドキュメントの範囲を超えていますが、機械学習アルゴリズム チート シートから詳細を確認できます。
左側の実験項目パネルから [機械学習]>[モデルの初期化]>[分類] を展開し、[多クラスのロジスティック回帰] 項目を実験キャンバスにドラッグします。
[多クラスのロジスティック回帰] の下部にある出力を、[モデルのトレーニング] 項目の左上の入力に接続します。
左側のパネルにある実験項目の一覧で、[機械学習]>[スコア] を展開し、[Score Model] 項目をキャンバスにドラッグします。
[モデルのトレーニング] の下部からの出力を、[Score Model] 項目の左上の入力に接続します。
[データのスプリット] の右下の出力を、[Score Model] 項目の右上の入力に接続します。
左側のパネルにある実験項目の一覧で、[Machine Learning]>[評価] を展開し、[モデルの評価] 項目をキャンバスにドラッグします。
[Score Model]\(モデルのスコア付け\) の出力を、[モデルの評価] の左上の入力に接続します。
1 つ目の Machine Learning 実験が完成しました。 これで、実験を保存して実行できます。 ページ下部のメニューで、[保存] ボタンをクリックして実験を保存し、[実行] をクリックすると実験が開始されます。
キャンバスの右上に、実験の状態が表示されます。 実験が終了するまでしばらく待ちます。
実際の現場で使用されるような大きなデータセットでは、実験を実行するのに数時間かかることもあります。
キャンバスで [モデルの評価] 項目を右クリックし、コンテキストメニューから [評価結果] の上にマウスを置き、 [視覚化] を選択します。
予測された結果と実際の結果を示す評価結果が表示されます。 これは、モデルを評価するために、以前に分割された元のデータセットの 30% を使用します。 結果があまり良くないことがわかります。理想的には、各列でハイライト表示されている項目が各行の最大数になるようにします。
[結果] を閉じます。
新しくトレーニングした機械学習モデルを使用するには、Web サービスとして公開する必要があります。 これを行うには、ページの下部にあるメニューの [Web サービスとして設定] メニュー項目をクリックし、[予測 Web サービス] をクリックします。
新しいタブが作成され、[モデルのトレーニング] がマージされて、新しい Web サービスが作成されます。
ページ下部のメニューで、[保存]をクリックし、[実行]をクリックします。 更新された状態が実験キャンバスの右上隅に表示されます。
実行が完了すると、ページ下部に [Web サービスのデプロイ] ボタンが表示されます。 これで、Webサービスをデプロイする準備が整いました。 ページ下部のメニューで [Deploy Web Service]\(Web サービスのデプロイ\) (クラシック) をクリックします。
ポップアップを許可するよう求めるメッセージがブラウザーから表示される場合があります。ポップアップは許可してください。ただし、デプロイ ページが表示されない場合は、[Web サービスのデプロイ] をもう一度押す必要があります。
実験が作成されると、API キーが表示されるダッシュボードページにリダイレクトされます。 これをメモ帳にコピーしておいてください。すぐ後にコード内で必要になります。 API キーをメモしたら、キーの下の [既定のエンドポイント] セクションにある [要求/応答] ボタンをクリックします。
Note
このページで [テスト] をクリックすると、入力データを入力して出力を表示できます。 [日] と [時間] を入力します。 [商品] エントリは空白のままにします。 その後、[確定] ボタンをクリックします。 ページ下部の出力には、各製品が選択される可能性を表す JSON が表示されます。
新しい Web ページが開き、機械学習スタジオ (クラシック) で必要な要求の構造について、手順といくつかの例が表示されます。 このページに表示された要求 URI をメモ帳にコピーします。
年初から数えた通日とその日の時間帯に関連付けられた購入データ履歴に基づいて、最も売れる可能性が高い商品を導き出す機械学習システムを構築しました。
ウェブサービスを呼び出すには、サービスエンドポイントのURLとサービスのAPIキーが必要です。 トップメニューから消費タブをクリックします。
消費情報ページには、コードからウェブサービスを呼び出すために必要な情報が表示されます。 プライマリキーと要求―応答URLをコピーします。 これらは次の章で必要です。
第5章―Unityプロジェクトのセットアップ
Mixed Realityイマーシブヘッドセットをセットアップしてテストします。
Note
このコースでは、モーションコントローラーを必要としません。 イマーシブヘッドセットのセットアップについてサポートが必要な場合、こちらをクリックしてください。
ユニティを開いて、MR_MachineLearningという新しいユニティプロジェクトを作成し、プロジェクトタイプが 3Dに設定されていることを確認します。
Unity を開いた状態で、既定のスクリプト エディターが Visual Studio に設定されているかどうか確認することをお勧めします。 お気に入り編集>に移り、新しいウィンドウから外部ツールにナビゲートします。 [外部スクリプト エディター] を [Visual Studio 2017] に変更します。 [環境設定] ウィンドウを閉じます。
次に、ファイル>ビルド設定に移り、プラットフォーム切り替えボタンをクリックすることで、プラットフォームをユニバーサルWindowsプラットフォームに切り替えます。
次のことも確認します。
ターゲットデバイスをいずれかのデバイスに設定します。
Microsoft HoloLens の場合は、[ターゲット デバイス] を [HoloLens] に設定します。
ビルドの種類をD3Dに設定します。
SDKを最新のインストールに設定します。
Visual Studioのバージョンを最新のインストールに設定します。
ビルドと実行をローカルマシンに設定します。
シーンは後で提供されるため、今すぐセットアップする必要はありません。
ここでは、残りの設定は既定値のままにしておきます。
Build Settings (ビルド設定) ウィンドウで、[プレーヤー設定] ボタンをクリックすると、"インスペクター" が配置されているスペースに関連パネルが表示されます。
このパネルでは、いくつかの設定を確認する必要があります。
[Other Settings] (その他の設定) タブで、次の内容を確認します。
Scripting Runtime Version は Experimental にする必要があります (.NET 4.6 同等)
[Scripting Backend] (スクリプト バックエンド) が [.NET] である
[API Compatibility Level]\(API 互換性レベル\) が [.NET 4.6] である。
[Publishing Settings]\(公開設定\) タブ内の [Capabilities]\(機能\) で、次の内容を確認します。
InternetClient
さらに、パネルの下にある [XR Settings]\(XR 設定\) ([Publish Settings]\(公開設定\) の下) で、[Virtual Reality Supported]\(Virtual Reality サポート\) をオンにし、Windows Mixed Reality SDK が追加されていることを確認します。
Build の設定に戻ります Unity C# Projects はグレー表示されなくなりました。この横にあるチェックボックスをオンにします。
[ビルド設定] ウィンドウを閉じます。
プロジェクトを保存します(ファイル>保存プロジェクト)。
第6章―MLProductsユニティパッケージのインポート
このコースでは、Azure-MR-307.unitypackageというユニティアセットパッケージをダウンロードする必要があります。 このパッケージには、すべてのオブジェクトが予めビルドされたシーンが付属しているため、すべてを機能させることに集中できます。 ShelfKeeperスクリプトが提供されますが、シーンセットアップ構造の目的で、パブリック変数のみを保持します。 他のすべてのセクションを実行する必要があります。
このパッケージをインポートするには、
Unity のダッシュボードを最前面に表示して、画面上部のメニューの [Assets]\(アセット\) をクリックし、[Import Package]\(パッケージのインポート\)、[Custom Package]\(カスタム パッケージ\) の順にクリックします。
ファイルピッカーを使用してAzure-MR-307.unitypackageパッケージを選択し、開くをクリックします。
このアセットのコンポーネントリストを表示します。 [Import]\(インポート\) をクリックしてインポートを確認します。
インポートが完了すると、Unity の [Project]\(プロジェクト\) パネルに新しいフォルダーがいくつか表示されます。 これらは、作業する予め作成されたシーンの一部である3Dモデルとそれぞれのマテリアルです。 コードの大部分は、皆さんがこのコースの中で記述します。
[Project]\(プロジェクト\) パネルの Scenes フォルダーをクリックし、その中の 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); } }
Unity に戻る前に、必ず Visual Studio で変更を保存してください。
Unity エディターに戻り、ShelfKeeper クラスが次のようになっていることを確認します。
重要
スクリプトに参照ターゲット(すなわち日付(テキストメッシュ))が存在しない場合、対応するオブジェクトを階層パネルからターゲットフィールドにドラッグだけです。 必要に応じて、以下の説明をご覧ください。
ShelfKeeperコンポーネントスクリプト内のスパウンポイント配列を左クリックして開きます。 サイズというサブセクションが現れ、それは配列のサイズを示します。 サイズの横のテキストボックスに3を入力し、Enterキーを押すと、その下に3つのスロットが作成されます。
階層内で時間表示オブジェクトを(その下の矢印を左クリックして)展開します。 次に、階層内からメインカメラをクリックすることで、その情報をインスペクターに表示します。
階層パネル内でメインカメラを選択します。 ShelfKeeperコンポーネント内のメインカメラのインスペクター内にある日付テキストスロット 時刻テキストスロットに、階層パネルから日付オブジェクトと時間オブジェクトをドラッグします。
図に示すように、 Spawn Points を Hierarchy Panel ( Shelf オブジェクトの下) から 3 Element 参照ターゲットの下にある Spawn Point 配列の下にドラッグします。
第9章―ProductPredictionクラスの作成
次に作成されるクラスは、ProductPredictionクラスです。
このクラスでは次のことを行います。
機械学習サービスインスタンスをクエリして、現在の日付と時刻を提供します。
JSON応答を使用可能なデータに逆シリアル化します。
データを解釈して、3つの推奨製品を取得します。
ShelfKeeperクラス方法を呼び出して、シーンにデータを表示します。
このクラスを作成するには、次の手順を実行します。
プロジェクトパネル内にあるスクリプトフォルダーに移ります。
フォルダー内を右クリックし、[Create]\(作成\)>[C# Script]\(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 フォルダーを作成し、そのフォルダー内にお好みの適切な名前で別のフォルダーを作成します。
新しいフォルダーをクリックし、[Select Folder]\(フォルダーの選択\) をクリックすると、その場所でビルドが開始されます。
Unity によるビルドが完了すると (多少時間がかかる場合があります)、[エクスプローラー] ウィンドウが開いて、ビルドの場所が表示されます (必ずしも最前面に表示されるとは限らないため、タスク バーを確認してください。新しいウィンドウが追加されたことがわかります)。
第11章―アプリケーションのデプロイ
アプリケーションをデプロイするには、以下の手順を実行します。
新しいユニティビルド(アプリフォルダー)にナビゲートし、Visual Studioでソリューションファイルを開きます。
Visual Studioを開いた状態で、NuGetパッケージを復元する必要があり、これは、ソリューションエクスプローラー(Visual Studioの右側にある)からMachineLearningLab_Buildソリューションを右クリックし、NuGetパッケージの復元をクリックして実行できます。
[ソリューション構成] で、[デバッグ] を選択します。
ソリューションプラットフォームで、x86、ローカルマシンを選択します。
Microsoft HoloLens の場合は、これを [リモート コンピューター] に設定した方が便利かもしれません。そうすると、お使いのコンピューターに縛られずに済みます。 ただし、次のことも行う必要があります。
- HoloLens の IP アドレス を把握します。これは、 Settings > ネットワークとインターネット > Wi-Fi > 詳細オプション内にあります。IPv4 は使用する必要があるアドレスです。
- Developer Mode が On; であることを確認します。これは、開発者向け Settings > Update および Security > にあります。
[ビルド] メニューに移動して、[ソリューションの配置] をクリックし、お使いの PC にアプリケーションをサイドロードします。
ここで、インストールされたアプリのリストにアプリが現れ、起動できる状態になります。
Mixed Realityアプリケーションを実行するとき、ユニティシーンにセットアップされたベンチを表示し、Azure内でセットアップされたデータを初期化処理からフェッチします。 そのデータをアプリケーション内で逆シリアル化し、現在の日時に関して上位3つの結果を、ベンチ上に3つのモデルとして視覚的に提供します。
機械学習アプリケーションを完成しました。
おつかれさまでした。Azure Machine Learning を活用して、データ予測とシーンへの表示を行う Mixed Reality アプリが完成しました。
演習
演習 1
アプリケーションの並べ替え順序を試して、このデータも役立つ可能性があるため、3つの底部予測をシェルフに表示します。
演習 2
Azureテーブルを使用して新しいテーブルに気象情報を組み込み、そのデータを使用して新しい実験を作成します。