HoloLens (第 1 代) 和 Azure 307:機器學習


注意

混合實境學院教學課程的設計是以 HoloLens (第 1 代) 和混合實境沉浸式頭戴裝置為準。 因此,對於仍在尋找這些裝置開發指引的開發人員而言,我們覺得這些教學課程很重要。 這些教學課程不會使用用於 HoloLens 2 的最新工具組或互動進行更新。 系統會保留這些資訊,以繼續在支援的裝置上運作。 未來將會張貼一系列新的教學課程,以示範如何開發HoloLens 2。 發佈這些教學課程時,將會更新此通知的連結。


final product -start

在此課程中,您將瞭解如何使用 Azure Machine Learning Studio (傳統) ,將機器學習 (ML) 功能新增至混合實境應用程式。

Azure Machine Learning Studio (傳統) 是 Microsoft 服務,可為開發人員提供大量的機器學習演算法,可協助資料輸入、輸出、準備和視覺效果。 然後,您可以從這些元件開發預測性分析實驗、逐一查看,並使用它來定型模型。 在定型之後,您可以讓模型在 Azure 雲端內運作,以便為新資料評分。 如需詳細資訊,請流覽Azure Machine Learning Studio (傳統) 頁面

完成本課程之後,您將擁有混合實境沉浸式頭戴裝置應用程式,並已瞭解如何執行下列作業:

  1. 提供銷售資料的資料表給Azure Machine Learning Studio (傳統) 入口網站,並設計演算法來預測熱門專案的未來銷售量。
  2. 建立Unity Project,可從ML服務接收和解譯預測資料。
  3. 透過在架上提供最熱門的銷售專案,以視覺化方式在Unity Project內顯示預先定義資料。

在您的應用程式中,您可以瞭解如何將結果與設計整合。 本課程旨在教導您如何將 Azure 服務與您的 Unity Project整合。 您的工作是使用您從本課程獲得的知識來增強混合實境應用程式。

本課程是獨立的教學課程,不會直接涉及任何其他Mixed Reality Labs。

裝置支援

課程 HoloLens 沉浸式頭戴裝置
MR 和 Azure 307:機器學習 ✔️ ✔️

注意

雖然本課程主要著重于Windows Mixed Reality沉浸式 (VR) 頭戴式裝置,但您也可以將此課程中學到的內容套用至Microsoft HoloLens。 當您跟著課程進行時,您會看到可能需要採用的任何變更附注,以支援HoloLens。 使用HoloLens時,您可能會在語音擷取期間發現一些回應。

必要條件

注意

本教學課程專為具備 Unity 和 C# 基本經驗的開發人員所設計。 另請注意,本檔中的必要條件和書面指示代表在 2018 年 5 月撰寫 () 時已經過測試及驗證的內容。 您可以使用最新的軟體,如 安裝工具一文中所列,但不應假設本課程中的資訊會完全符合您在較新軟體中找到的內容,而不是下面所列的內容。

針對本課程,我們建議使用下列硬體和軟體:

在您開始使用 Intune 之前

為了避免建置此專案時發生問題,強烈建議您在根資料夾或近根資料夾中建立本教學課程中所提及的專案, (長資料夾路徑可能會導致建置時間) 的問題。

第 1 章 - Azure 儲存體帳戶設定

若要使用 Azure 翻譯工具 API,您必須將服務的實例設定為可供您的應用程式使用。

  1. 登入 Azure 入口網站

    注意

    如果您還沒有 Azure 帳戶,則必須建立一個帳戶。 如果您在教室或實驗室情況中遵循本教學課程,請詢問講師或其中一個專業課程,以協助設定您的新帳戶。

  2. 登入之後,按一下左側功能表中的 [儲存體帳戶]。

    Screenshot of the Microsoft Azure window, which shows the Storage Accounts item in the left navigation menu.

    注意

    在較新的入口網站中, [新增 ] 這個字可能已取代為 建立資源

  3. [儲存體帳戶] 索引標籤上,按一下 [新增]。

    Screenshot of the Microsoft Azure window, which shows the Storage accounts screen and the highlighted Add button.

  4. 在 [建立儲存體帳戶] 面板中:

    1. 插入您帳戶 的 [名稱 ],請注意此欄位只接受數位和小寫字母。

    2. 針對 [部署模型], 選取 [資源管理員]。

    3. 針對[帳戶種類],選取[儲存體 (一般用途 v1)

    4. 針對 [效能],請選取 [標準]。

    5. 針對 [複 寫] 選取 [ 讀取存取-異地備援儲存體 (RA-GRS)

    6. [需要安全傳輸 ] 保留為 [已停用]。

    7. 選取 [訂用帳戶] 。

    8. 選擇 資源群組 或建立新的群組。 資源群組提供一種方式來監視、控制存取、布建和管理 Azure 資產集合的計費。 建議將所有與單一專案相關聯的 Azure 服務保留 (例如,這些實驗室) 在通用資源群組) 下。

      如果您想要深入瞭解 Azure 資源群組,請 造訪資源群組一文

    9. 如果您要建立新的資源群組) ,請判斷資源群組的位置 (。 在理想情況下,位置會位於應用程式執行所在的區域中。 某些 Azure 資產僅適用于特定區域。

  5. 您也必須確認您已瞭解此服務適用的條款及條件。

    Screenshot of the Create storage account dialog, which shows the information that the user filled into the required text fields.

  6. 按一下 [ 建立] 之後,您必須等候服務建立,這可能需要一分鐘的時間。

  7. 建立服務實例之後,入口網站中會出現通知。

    Screenshot of the Deployment succeeded notification, which informs the user that the deployment to the resource group was successful.

第 2 章 - Azure Machine Learning Studio (傳統)

若要使用Azure Machine Learning,您必須將機器學習服務的實例設定為可供您的應用程式使用。

  1. 在 Azure 入口網站中,按一下左上角的 [新增],然後搜尋機器學習 Studio 工作區,然後按Enter

    Screenshot of the Microsoft Azure window, which shows the Machine Learning Studio Workspace in the content pane.

  2. 新頁面將提供機器學習 Studio 工作區服務的描述。 在此提示的左下角,按一下 [ 建立 ] 按鈕,以建立與此服務的關聯。

  3. 按一下 [建立] 之後,會出現一個面板,您需要提供新機器學習 Studio 服務的一些詳細資料:

    1. 插入此服務實例所需的 工作區名稱

    2. 選取 [訂用帳戶] 。

    3. 選擇 資源群組 或建立新的群組。 資源群組提供一種方式來監視、控制存取、布建和管理 Azure 資產集合的計費。 建議將所有與單一專案相關聯的 Azure 服務保留 (例如,這些實驗室) 在通用資源群組) 下。

      如果您想要深入瞭解 Azure 資源群組,請 造訪資源群組一文

    4. 如果您要建立新的資源群組) ,請判斷資源群組的位置 (。 在理想情況下,位置會位於應用程式執行所在的區域中。 某些 Azure 資產僅適用于特定區域。 您應該使用您在上一章中用來建立Azure 儲存體的相同資源群組。

    5. 針對[儲存體帳戶] 區段,按一下 [使用現有的],然後按一下下拉式功能表,然後從該處按一下您在上一章中建立的 儲存體 帳戶

    6. 從下拉式功能表中,為您選取適當的 工作區定價層

    7. [Web 服務方案] 區段中,按一下 [ 新建], 然後在文字欄位中插入名稱。

    8. [Web 服務方案定價層 ] 區段中,選取您選擇的價格層。 名為 DEVTEST Standard 的開發測試層應該免費提供給您。

    9. 您也必須確認您已瞭解此服務適用的條款及條件。

    10. 按一下 [建立]。

      Screenshot of the Azure Machine Learning Studio dialog, which shows the information the user has entered into the text fields.

  4. 按一下 [ 建立] 之後,您必須等候服務建立,這可能需要一分鐘的時間。

  5. 建立服務實例之後,入口網站中會出現通知。

    Screenshot of the Microsoft Azure window, which shows an unread notification in the navigation menu.

  6. 按一下通知以探索新的服務實例。

    Screenshot of the Deployment succeeded notification, which informs the user that the workspace deployment to the resource group was successful.

  7. 按一下通知中的 [ 移至資源 ] 按鈕,以探索新的服務實例。

  8. 在顯示的頁面中,按一下 [其他連結] 區段下的[啟動機器學習 Studio],將瀏覽器導向至 機器學習 Studio入口網站。

    Screenshot of the Microsoft Azure window, which shows the highlighted Launch Machine Learning Studio link in the content pane.

  9. 使用右上方或中央的 [登入]按鈕,登入您的 機器學習 Studio (傳統) 。

    Screenshot of the Machine Learning Studio window, which shows the highlighted Sign In button.

第 3 章 - 機器學習 Studio (傳統) :資料集設定

機器學習演算法的運作方式之一是分析現有的資料,然後嘗試根據現有的資料集預測未來的結果。 這通常表示您擁有的現有資料越多,演算法在預測未來結果時越好。

此課程提供範例資料表,稱為 ProductsTableCSV,可在這裡下載

重要

上述.zip檔案同時包含 ProductsTableCSV.unitypackage,您在 第 6 章中將需要此檔案。 此套件也會在該章節中提供,但與 csv 檔案分開。

此範例資料集包含 2017 年每一天每小時最佳銷售物件的記錄。

Screenshot of the Microsoft Excel window, which shows a sample data set of best selling objects at every hour of each day in the year 2017.

例如,在 2017 年的第 1 天,下午 1 點 (13) ,最佳銷售專案是 salt 和) 。

此範例資料表包含 9998 個專案。

  1. 返回機器學習 Studio (傳統) 入口網站,並將此資料表新增為ML的資料集。 按一下畫面左下角的 [+ 新增 ] 按鈕來執行此動作。

    Screenshot of the Microsoft Azure Machine Learning Studio classic portal, which shows the highlighted New button in the menu.

  2. 區段會從底部向上,並在其中左側有流覽面板。 按一下 [資料集],然後在右側按一下 [ 從本機檔案]。

    Screenshot of the New dialog, which shows the highlighted Dataset and From Local File menu items.

  3. 依照下列步驟Upload新的資料集

    1. 上傳視窗隨即出現,您可以在其中 流覽 新資料集的硬碟。

      Screenshot of the Upload a new dataset dialog, which shows the Browse button for the user to find and select the data to upload.

    2. 選取後,再回到上傳視窗中,將核取方塊保持無記號。

    3. 在下方的文字欄位中,輸入 ProductsTableCSV.csv 作為資料集 (的名稱,不過應該自動新增) 。

    4. 使用 [類型] 的下拉式功能表,選取 具有標頭的一般 CSV 檔案 (.csv)

    5. 按下上傳視窗右下角的刻度,並上傳 您的資料集

第 4 章 - 機器學習 Studio (傳統) :實驗

您必須先建置實驗,才能建置機器學習系統,以驗證資料的相關理論。 有了結果,您將知道是否需要更多資料,或資料與可能的結果之間沒有相互關聯。

若要開始建立實驗:

  1. 再次按一下頁面左下方的[+ 新增] 按鈕,然後按一下 [實驗>空白實驗]。

    Screenshot of the Microsoft Azure Machine Learning Studio window, which shows the Experiment menu item is selected.

  2. 新的頁面會顯示空白實驗:

  3. 從左側面板展開[已儲存的>資料集我的資料集],然後將ProductsTableCSV拖曳至[實驗畫布]。

    Screenshot of the Experiment window, which shows the expanded My Datasets folder in the menu and Products Table C S V in the Experiment Canvas.

  4. 在左側面板中,展開[資料轉換>範例] 和 [分割]。 然後將 [ 分割資料] 專案拖曳至 [實驗畫布]。 分割資料項目會將資料集分割成兩個部分。 您將用來定型機器學習演算法的一個部分。 第二個部分將用來評估所產生演算法的精確度。

    Screenshot of the Experiment window, which shows the Partition and Sample and Split Data items in the menu with Split Data applied to the Canvas.

  5. 在右側面板中 (選取畫布上的 [分割資料] 專案時) ,請將 第一個輸出資料集中的資料列分數 編輯為 0.7。 這會將資料分割成兩個部分,第一個部分會是 70% 的資料,而第二個部分則會是剩餘的 30%。 若要確保資料會隨機分割,請確定 [ 隨機分割 ] 核取方塊會保持核取狀態。

    Screenshot of the Properties panel, which shows the filled Randomized split checkbox and the Fraction of rows field has been set to 0 point 7.

  6. 將連線從畫布上的 ProductsTableCSV 專案基底拖曳到 [分割資料] 專案的頂端。 這會連接專案,並將 ProductsTableCSV 資料集輸出 (資料) 傳送至分割資料輸入。

    Screenshot of the Experiment Canvas, which shows a connection drawn between Products Table C S V dot c s v and Split Data.

  7. 在左側的 [實驗] 面板中,展開[機器學習>Train]。 將 [ 定型模型] 專案拖曳至 [實驗] 畫布。 您的畫布看起來應該與下面相同。

    Screenshot of the Experiment Canvas, which shows a connection drawn between Products Table C S V dot c s v and Split Data, with Train Model below.

  8. [分割資料] 專案的左下角,將連接拖曳到[定型模型]專案的右上方。 訓練模型將使用資料集的前 70% 分割來定型演算法。

    Screenshot of the Experiment Canvas, which shows a connection drawn between Products Table C S V dot c s v, Split Data, and Train Model.

  9. 選取畫布上的 [ 定型模型] 專案,然後在瀏覽器視窗右側的 [ 屬性 ] 面板中 (,) 按一下 [啟動資料行 選取器 ] 按鈕。

  10. 在文字方塊中輸入 product ,然後按 Enter鍵, 產品 將會設定為數據行來定型預測。 遵循此動作,按一下右下角的 刻度 以關閉選取對話方塊。

    Screenshot of the Select a single column dialog, which shows the highlighted product column in the columns menu.

  11. 您將訓練 多類別羅吉斯回歸 演算法,根據當天和日期的小時來預測銷售量最高的 產品 。 本檔超出說明Azure Machine Learning 工作室提供之不同演算法的詳細資料,但您可以從機器學習演算法速查表深入瞭解

  12. 從左側的 [實驗專案] 面板中,展開[機器學習>Initialize 模型>分類],然後將[多類別羅吉斯回歸] 專案拖曳至實驗畫布。

  13. 連線多類別羅吉斯回歸底部的輸出,到訓練模型專案的左上方輸入。

    Screenshot of the Experiment Canvas, which shows Train Model connected to the Multiclass Logistic Regression and Split Data.

  14. 在左側面板的實驗專案清單中,展開[機器學習>Score],然後將 [評分模型]專案拖曳至畫布。

  15. 連線輸出,從定型模型底部到評分模型的左上方輸入。

  16. 連線從分割資料評分模型專案右上方輸入的右下角輸出。

    Screenshot of the Experiment Canvas, which shows the Score Model connected to Train Model and Split Data.

  17. 在左側面板的[實驗專案] 清單中,展開[機器學習>Evaluate],然後將 [評估模型]專案拖曳到畫布上。

  18. 連線評分模型的輸出到評估模型的左上方輸入。

    Screenshot of the Experiment Canvas, which shows the Evaluate Model connected to Score Model.

  19. 您已建置第一個機器學習實驗。 您現在可以儲存並執行實驗。 在頁面底部的功能表中,按一下 [ 儲存 ] 按鈕以儲存實驗,然後按一下 [ 執行 ] 以啟動實驗。

    Screenshot of the Experiment Canvas menu, which shows the highlighted Save and Run buttons.

  20. 您可以在畫布右上方看到實驗 的狀態 。 請稍候片刻,讓實驗完成。

    如果您有大型 (真實世界) 資料集,則實驗可能需要數小時才能執行。

    Screenshot of the Experiment Canvas window, which shows the status of the experiment in the top right corner.

  21. 以滑鼠右鍵按一下畫布中的 [評估模型] 專案,然後從操作功能表將滑鼠停留在 [評估結果] 上方,然後選取 [ 視覺化]。

    Screenshot of the Evaluate Model item's right click menu, which shows the highlighted Evaluation results and Visualize menu items.

  22. 評估結果會顯示預測結果與實際結果的比較。 這會使用先前分割的 30% 原始資料集來評估模型。 您可以在理想情況下看到結果不理想,在理想情況下,每個資料列中的最高數位會是資料行中反白顯示的專案。

    Screenshot of the Results chart, which shows the outcomes of the experiment in a graph of boxes with percentages.

  23. 關閉 [結果]。

  24. 若要使用新定型機器學習模型,您必須將其公開為Web 服務。 若要這樣做,請按一下頁面底部功能表中的 [ 設定 Web 服務 ] 功能表項目,然後按一下 [預測性 Web 服務]。

    Screenshot of the Experiment menu, which shows the highlighted Set Up Web Service menu item.

  25. 將會建立新的索引標籤,併合並定型模型以建立新的 Web 服務。

  26. 在頁面底部的功能表中,按一下 [ 儲存],然後按一下 [ 執行]。 您會在實驗畫布右上角看到更新的狀態。

    Screenshot of the Experiment menu, which shows the highlighted Run menu button and the Run menu item.

  27. 完成執行之後,頁面底部會出現 [部署 Web 服務 ] 按鈕。 您已準備好部署 Web 服務。 按一下頁面底部功能表中的 [部署 Web 服務 (傳統) 。

    Screenshot of the Experiment menu, which shows the highlighted Deploy Web Service Classic menu item from the Deploy Web Service menu button.

    如果部署頁面未 顯示,瀏覽器可能會提示您允許快顯視窗,但您可能需要再次按 [部署 Web 服務 ]。

  28. 建立實驗之後,系統會將您重新導向至 儀表板頁面, 其中會顯示 API 金鑰 。 立即將它複製到記事本中,您很快就會在程式碼中用到它。 在您記錄 API 金鑰之後,請按一下 [金鑰] 下方 [預設端點] 區段中的 [要求/回應] 按鈕。

    Screenshot of the Microsoft Azure Machine Learning Studio window, which shows the A P I key and the highlighted Request slash Response link.

    注意

    如果您按一下此頁面中的 [測試],您將能夠輸入輸入資料並檢視輸出。 輸入 小時。 將 產品 專案保留空白。 然後按一下 [ 確認] 按鈕。 頁面底部的輸出會顯示 JSON,代表每個產品成為選擇的可能性。

  29. 新的網頁隨即開啟,其中顯示機器學習 Studio (傳統) 所需之要求結構的指示和一些範例。 將此頁面中顯示的 要求 URI 複製到您的記事本。

    Screenshot of the Request Response A P I Documentation page, which shows the highlighted Request U R I.

您現在已建置機器學習系統,根據歷史購買資料提供最可能要銷售的產品,並與一年中的日期和時間相互關聯。

若要呼叫 Web 服務,您需要服務端點的 URL 和服務 API 金鑰。 按一下頂端功能表中的 [ 取用 ] 索引標籤。

[ 取用 資訊] 頁面會顯示從程式碼呼叫 Web 服務所需的資訊。 取得 主鍵要求-回應 URL 的複本。 在下一章中,您將需要這些專案。

第 5 章 - 設定 Unity Project

設定及測試您的Mixed Reality沉浸式頭戴式裝置。

注意

不需要 此課程的動作控制器。 如果您需要設定沈浸式頭戴式裝置的支援,請按一下 [這裡]。

  1. 開啟Unity並建立名為 MR_MachineLearning 的新 Unity Project。請確定專案類型已設定為3D

  2. 開啟 Unity 時,值得檢查預設的腳本編輯器已設定為Visual Studio。 移至[編輯>喜好設定],然後從新視窗中流覽至[外部工具]。 將外部腳本編輯器變更為Visual Studio 2017。 關閉 [ 喜好設定 ] 視窗。

  3. 接下來,移至 [檔案>建置] 設定,然後按一下 [切換平臺] 按鈕,將平臺切換為通用 Windows 平臺

  4. 也請確定:

    1. [目標裝置 ] 設定為 [任何裝置]。

      針對Microsoft HoloLens,將[目標裝置] 設定為[HoloLens]。

    2. 組建類型 設定為 D3D

    3. SDK 設定為 [最新安裝]。

    4. Visual Studio版本設定為[最新安裝]。

    5. [建置並執行 ] 設定為 [本機電腦]。

    6. 別擔心現在設定 場景 ,因為稍後會提供這些場景。

    7. 其餘設定現在應該保留為預設值。

      Screenshot of the Build Settings dialog, which shows the Universal Windows Platform menu item is selected.

  5. 在 [建置設定] 視窗中,按一下 [播放程式設定] 按鈕,這會在Inspector所在的空間中開啟相關的面板。

  6. 在此面板中,需要驗證一些設定:

    1. 在 [其他設定] 索引標籤中:

      1. 腳本運行時間版本 應該是 實驗 性 (.NET 4.6 對等)

      2. 腳本後端應該是.NET

      3. API 相容性層級 應該是 .NET 4.6

        Screenshot of the Other Settings tab, which shows the settings that are enabled according to the outlined steps.

    2. 在 [發佈設定] 索引標籤的 [功能] 底下,檢查:

      • InternetClient

        Screenshot of the Publishing Settings tab, which shows the Internet Client capability is enabled underneath Capabilities.

    3. 進一步在面板下方,在XR 設定 (中找到下列發佈設定) ,刻度支援虛擬實境,確定已新增Windows Mixed Reality SDK

      Screenshot of the X R Settings tab, which shows the Windows Mixed Reality S D K underneath Virtual Reality S D K s is enabled.

  7. 回到Build 設定Unity C#專案不再呈現灰色;請勾選此旁邊的核取方塊。

  8. 關閉 [建置設定] 視窗。

  9. 儲存您的Project (檔案 > 儲存專案) 。

第 6 章 - 匯入 MLProducts Unity 套件

在此課程中,您必須下載名為 Azure-MR-307.unitypackage的 Unity 資產套件。 此套件隨附場景,其中包含該預建中的所有物件,因此您可以專注于讓它運作正常。 提供 ShelfKeeper腳本,但只保留公用變數,以用於場景設定結構。 您必須執行所有其他區段。

若要匯入此套件:

  1. 在 Unity 儀表板前面,按一下畫面頂端功能表中的 [ 資產 ],然後按一下 [ 匯入套件]、[自訂套件]。

    Screenshot of the Unity Dashboard, which shows the highlighted Import Package and Custom Package menu items.

  2. 使用檔案選擇器選取 Azure-MR-307.unitypackage 套件,然後按一下 [ 開啟]。

  3. 此資產的元件清單將會顯示給您。 按一下 [ 入] 以確認匯入。

    Screenshot of the Import Unity Package dialog, which shows the Azure Machine Learning package is being imported.

  4. 匯入完成後,您會發現 Unity Project Panel中已出現一些新資料夾。 這些是 3D 模型,以及屬於您將處理之預先建立場景的個別材質。 您將在此課程中撰寫大部分的程式碼。

    Screenshot of the Unity Project Panel, which shows the newly imported folders in the Assets folder.

  5. [Project Panel] 資料夾中,按一下 [場景]資料夾,然後按兩下名為 MR_MachineLearningScene) 內 (場景。 場景會開啟 (請參閱下圖) 。 如果遺漏紅色菱形,只要按一下遊戲面板右上方的Gizmos按鈕即可。

    Screenshot of the Unity Scene window, which shows the highlighted Gizmos menu item in the top navigation.

第 7 章 - 檢查 Unity 中的 DLL

若要利用 JSON 程式庫的使用 (用於序列化和還原序列化) ,已使用您帶入的套件來實作 Newtonsoft DLL。 程式庫應該具有正確的組態,但值得檢查 (,特別是當您遇到程式碼無法運作的問題) 時。

操作方法:

  • 以滑鼠右鍵按一下 Plugins 資料夾內的 Newtonsoft 檔案,然後查看 [偵測器] 面板。 請確定已刻度 任何平臺 。 移至 [UWP ] 索引標籤,並確定 [不要處理 ] 已刻度。

    Importing the DLLs in Unity

第 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. 請務必先將變更儲存在Visual Studio中,再返回Unity

  4. 回到 Unity 編輯器,確認 ShelfKeeper 類別看起來如下:

    Screenshot of the Shelf Keeper class, which shows that the reference targets are set to Date Text Mesh and Time Text Mesh.

    重要

    如果您的腳本沒有參考目標 (,也就是Date (Text Mesh) ) ,只要將對應的物件從 [階層面板] 拖曳到目標欄位即可。 如需說明,請參閱下面的說明:

    1. 以滑鼠左鍵開啟ShelfKeeper元件腳本內的Spawn Point陣列。 子區段會出現名為 Size,表示陣列的大小。 在[大小] 旁的文字方塊中輸入3,然後按Enter鍵,然後在下方建立三個位置。

    2. [階層] 中,以滑鼠左鍵展開 [ 時間顯示 ] 物件 () 。 接著,按一下 [階層] 內的[主要相機],讓偵測器顯示其資訊。

    3. 在 [階層] 面板中選取[主要相機]。 將[日期和時間] 物件從 [階層] 面板拖曳至[ShelfKeeper] 元件中Main 相機的 [日期文字] 和 [時間文字] 位置。

    4. 從 [階層面板] (將[繁衍點]) (拖曳到[繁衍點] 陣列下方的 3個元素參考目標,如下圖所示。

      Screenshot of the Hierarchy Panel, which shows that the Date, Time, and the three Spawn Point menu items are in the Shelf Keeper class.

第 9 章 - 建立 ProductPrediction 類別

您要建立的下一個類別是 ProductPrediction 類別。

此類別負責:

  • 查詢機器學習服務實例,並提供目前的日期和時間。

  • 將 JSON 回應還原序列化為可用的資料。

  • 解譯資料,擷取 3 個建議的產品。

  • 呼叫 ShelfKeeper 類別方法,以在場景中顯示資料。

若要建立此類別:

  1. 移至Project面板中[腳本] 資料夾。

  2. 以滑鼠右鍵按一下資料夾內的[建立>C# 腳本]。 呼叫 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 類別內,插入下列兩個物件,這些物件是由數個巢狀類別所組成。 這些類別是用來序列化和還原序列化機器學習服務的 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;
    

    重要

    請務必將主鍵要求-回應端點從 機器學習 入口網站插入此處的變數。 下圖顯示您從何處取得金鑰和端點。

    Screenshot of the Microsoft Azure Machine Learning Studio, which shows the Request slash Response link underneath A P I Help Page.

    Screenshot of the Request Response A P I Documentation page, which shows the highlighted POST Request U R 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收集日期和時間的方法,並將它轉換成我們的機器學習實驗可用來與資料表中所儲存的資料進行比較的格式。

        /// <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. 新增下列方法,以將目前的日期和時間傳達至機器學習端點,並以 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 類別。 此結果將是預測在目前日期和時間銷售最多三個專案的名稱。 將下列程式碼插入 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 相機物件。

  15. 儲存場景和專案>儲存場景/檔案>儲存Project

第 10 章 - 建置 UWP 解決方案

現在是時候將專案建置為 UWP 解決方案,以便以獨立應用程式的形式執行。

若要建置:

  1. 按一下 [檔案>儲存場景] 以儲存目前的場景。

  2. 移至[檔案>建置] 設定

  3. 核取稱為 Unity C# Projects 的方塊, (這很重要,因為它可讓您在建置完成後編輯類別) 。

  4. 按一下 [ 新增開啟的場景]

  5. 按一下 [建置]

    Screenshot of the Build Settings dialog, which shows the Universal Windows Platform menu item is highlighted.

  6. 系統會提示您選取您要建置解決方案的資料夾。

  7. 建立 BUILDS 資料夾,並在該資料夾中建立另一個具有您所選適當名稱的資料夾。

  8. 按一下您的新資料夾,然後按一下 [ 選取資料夾],開始在該位置建置。

    Screenshot of the File Explorer window, which shows the highlighted Builds folder.

    Screenshot of the File Explorer window, which shows the contents of the Builds folder and the highlighted Select Folder button.

  9. 一旦 Unity 完成建置 (可能需要一些時間) ,它會在組建的位置開啟檔案總管視窗, (檢查您的工作列,因為它可能不一定會出現在您的視窗上方,但會通知您新增視窗) 。

第 11 章 - 部署您的應用程式

若要部署您的應用程式:

  1. 流覽至新的 Unity 組建, (應用程式資料夾) ,並使用Visual Studio開啟方案檔案。

  2. 開啟Visual Studio之後,您必須還原NuGet套件,這可以透過以滑鼠右鍵按一下MachineLearningLab_Build解決方案來完成,從找到Visual Studio) 右側的方案總管 (,然後按一下 [還原NuGet套件] :

    Screenshot of the Visual Studio window, which shows the highlighted Restore Nu Get Packages menu item.

  3. 在 [方案組態] 中,選取 [ 偵錯]。

  4. 在 [解決方案平臺] 中,選取 [x86]、[ 本機電腦]。

    針對Microsoft HoloLens,您可能會發現將它設定為遠端電腦會更容易,因此您不會與電腦連線。 不過,您也必須執行下列動作:

    • 瞭解HoloLens的IP 位址,可在設定 > 網路 & 網際網路 > Wi-Fi > 進階選項中找到;IPv4 是您應該使用的位址。
    • 確定開發人員模式開啟;在適用于開發人員的更新安全性 > 設定 >&中找到。

    Screenshot of the Microsoft Visual Studio menu, which shows that Local Machine is selected in the Solution Platform.

  5. 移至 [建置] 功能表 ,然後按一下 [ 部署解決方案 ] 將應用程式側載至您的電腦。

  6. 您的應用程式現在應該會出現在已安裝的應用程式清單中,並準備好啟動。

當您執行Mixed Reality應用程式時,您會看到已在 Unity 場景中設定的 Bench,並從初始化中擷取您在 Azure 內設定的資料。 資料將會在您的應用程式內還原序列化,並以視覺化方式提供您目前日期和時間的三個前三個結果,如同在 Bench 上的三個模型一樣。

您已完成機器學習應用程式

恭喜,您已建置混合實境應用程式,利用Azure Machine Learning來進行資料預測,並將其顯示在場景中。

Screenshot of the Microsoft Visual Studio window, which shows a shelf with three objects and a card with the text 15 o' clock 23 Feb.

練習

練習 1

實驗應用程式的排序次序,並讓三個底端預測出現在現成的機架上,因為此資料可能也很有用。

練習 2

使用 Azure 資料表 會以天氣資訊填入新的資料表,並使用資料建立新的實驗。