共用方式為


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


注意

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


最終產品 -start

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

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

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

  1. 將銷售數據數據表提供給 Azure 機器學習 Studio(傳統版)入口網站,並設計演算法來預測熱門專案的未來銷售。
  2. 建立 Unity 專案,可從 ML 服務接收和解譯預測數據。
  3. 透過在貨架上提供最受歡迎的銷售專案,以可視化方式 在 Unity 專案中顯示述詞數據。

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

本課程是獨立的教學課程,不會直接涉及任何其他混合實境實驗室。

裝置支援

課程 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. 登入之後,按兩下左側功能表中的 [ 記憶體帳戶 ]。

    Microsoft Azure 視窗的螢幕快照,其中顯示左側導覽功能表中的 [記憶體帳戶] 專案。

    注意

    [新增] 一詞可能已取代為在較新的入口網站中建立資源

  3. 在 [ 記憶體帳戶] 索引標籤上,按兩下 [ 新增]。

    Microsoft Azure 視窗的螢幕快照,其中顯示 [儲存體帳戶] 畫面和醒目提示的 [新增] 按鈕。

  4. 在 [ 建立記憶體帳戶] 面板中:

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

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

    3. 針對 [帳戶種類],選取 [記憶體][一般用途 v1]。

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

    5. 針對 [復寫],選取 [讀取存取- 異地備援記憶體 ][RA-GRS]。

    6. 將 [安全傳輸] 保留[已停用]。

    7. 選取 [訂用帳戶]

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

      如果您想要深入瞭解 Azure 資源群組,請 瀏覽資源群組文章

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

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

    [建立記憶體帳戶] 對話框的螢幕快照,其中顯示使用者填入必要文字字段的資訊。

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

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

    部署成功通知的螢幕快照,通知使用者將部署至資源群組成功。

第 2 章 - Azure 機器學習 Studio(傳統版)

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

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

    Microsoft Azure 視窗的螢幕快照,其中顯示內容窗格中的 [機器學習 Studio 工作區]。

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

  3. 單擊 [建立] 之後,會出現一個面板,您需要提供新 機器學習 Studio 服務的一些詳細數據

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

    2. 選取 [訂用帳戶]

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

      如果您想要深入瞭解 Azure 資源群組,請 瀏覽資源群組文章

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

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

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

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

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

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

    10. 按一下 [建立]。

      Azure 機器學習 Studio 對話框的螢幕快照,其中顯示使用者已輸入文字欄位的資訊。

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

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

    Microsoft Azure 視窗的螢幕快照,其中顯示導覽功能表中未讀取的通知。

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

    部署成功通知的螢幕快照,通知使用者工作區部署至資源群組是否成功。

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

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

    Microsoft Azure 視窗的螢幕快照,其中顯示內容窗格中醒目提示的 [啟動 機器學習 Studio] 連結。

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

    機器學習 Studio 視窗的螢幕快照,其中顯示醒目提示的 [登入] 按鈕。

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

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

此課程會提供範例數據表,稱為 ProductsTableCSV,您可以在這裡下載。

重要

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

此範例數據集包含 2017 年每天每小時最暢銷對象的記錄。

[Microsoft Excel] 視窗的螢幕快照,其中顯示 2017 年每天每小時最暢銷物件的範例數據集。

例如,在 2017 年第 1 天,下午 1 點(13 小時),最暢銷的專案是鹽和胡椒。

此範例數據表包含9998個專案。

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

    Microsoft Azure 機器學習 Studio 傳統入口網站的螢幕快照,其中顯示功能表中醒目提示的 [新增] 按鈕。

  2. 區段會從底部出現,並在其中左側有瀏覽面板。 按兩下 [數據集],然後按下其右側的 [本機檔案]。

    [新增] 對話框的螢幕快照,其中顯示醒目提示的 [數據集] 和 [從本機檔案] 功能表項。

  3. 依照下列步驟上傳新的 數據集

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

      [上傳新數據集] 對話框的螢幕快照,其中顯示使用者的 [流覽] 按鈕,以尋找並選取要上傳的數據。

    2. 選取后,回到上傳視窗中,將複選框保持取消勾選。

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

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

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

第 4 章 - 機器學習 Studio (經典):實驗

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

若要開始建立實驗:

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

    Microsoft Azure 機器學習 Studio 視窗的螢幕快照,其中顯示已選取 [實驗] 功能表項。

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

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

    [實驗] 視窗的螢幕快照,其中顯示 [實驗畫布] 中功能表和 [產品數據表 C S V] 中展開的 [我的數據集] 資料夾。

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

    [實驗] 視窗的螢幕快照,其中顯示功能表中的 [分割數據] 和 [範例] 和 [分割數據] 專案,並套用至畫布的數據。

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

    [屬性] 面板的螢幕快照,其中顯示已填入的 [隨機分割] 複選框,且 [數據列分數] 字段已設定為 0 點 7。

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

    實驗畫布的螢幕快照,其中顯示產品數據表 C S V 點 c v 與分割數據之間的連線。

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

    實驗畫布的螢幕快照,其中顯示產品數據表 C S V 點 c v 與分割數據之間繪製的連線,如下所示的定型模型。

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

    實驗畫布的螢幕快照,其中顯示產品數據表 C S V 點 c v、分割數據和定型模型之間的連線。

  9. 選取畫布上的 [ 定型模型] 項目,然後在 [屬性 ] 面板(瀏覽器視窗右側)按兩下 [啟動數據行選取器 ] 按鈕。

  10. 在文本框中輸入 product ,然後按 Enter 鍵, 產品 將會設定為用來定型預測的數據行。 在此之後,按下 角的刻度 以關閉選取對話框。

    [選取單一數據行] 對話框的螢幕快照,其中顯示數據行功能表中醒目提示的產品數據行。

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

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

  13. 將輸出從多類別羅吉斯回歸底部連接到定型模型專案的左上方輸入

    實驗畫布的螢幕快照,其中顯示連線至多類別羅吉斯回歸和分割數據的定型模型。

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

  15. 將輸出從定型模型底部連接到評分模型的左上方輸入

  16. 將右下角輸出從分割數據連接到評分模型專案的右上方輸入

    實驗畫布的螢幕快照,其中顯示已連線到定型模型和分割數據的評分模型。

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

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

    實驗畫布的螢幕快照,其中顯示連線至評分模型的評估模型。

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

    [實驗畫布] 功能表的螢幕快照,其中顯示醒目提示的 [儲存] 和 [執行] 按鈕。

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

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

    [實驗畫布] 視窗的螢幕快照,其中顯示右上角實驗的狀態。

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

    評估模型專案的右鍵功能表螢幕快照,其中顯示醒目提示的 [評估結果] 和 [可視化] 功能表項。

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

    [結果] 圖表的螢幕快照,其中顯示具有百分比之方塊圖表中實驗的結果。

  23. 關閉 [結果]。

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

    [實驗] 功能表的螢幕快照,其中顯示醒目提示的 [設定 Web 服務] 功能表項。

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

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

    [實驗] 功能表的螢幕快照,其中顯示醒目提示的 [執行] 功能表按鈕和 [執行] 功能表項。

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

    [實驗] 功能表的螢幕快照,其中顯示 [部署 Web 服務傳統] 功能表按鈕中醒目提示的 [部署 Web 服務傳統] 功能表項。

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

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

    Microsoft Azure 機器學習 Studio 視窗的螢幕快照,其中顯示 A P I 鍵和醒目提示的要求斜線回應連結。

    注意

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

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

    [要求回應 A P I 檔] 頁面的螢幕快照,其中顯示醒目提示的要求 U R I。

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

若要呼叫 Web 服務,您需要服務端點的 URL,以及服務的 API 金鑰。 點擊頂端選單中的 [取用 ] 索引標籤。

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

第 5 章 - 設定 Unity 專案

設定及測試混合實境沉浸式頭戴式裝置。

注意

本課程不需要運動控制器。 如果您需要設定沈浸式頭戴式裝置的支援,請按兩下 這裡

  1. 開啟 Unity 並建立名為 MR_MachineLearning 的新 Unity 專案。 請確定專案類型已設定為 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. 其餘的設定現在應該保留為預設值。

      [建置設定] 對話框的螢幕快照,其中顯示已選取 通用 Windows 平台 功能選單項。

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

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

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

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

      2. 腳本後端 應該是 .NET

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

        [其他設定] 索引標籤的螢幕快照,其中顯示根據概述的步驟啟用的設定。

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

      • InternetClient

        [發佈設定] 索引標籤的螢幕快照,其中顯示 [功能] 下方已啟用 [因特網用戶端] 功能。

    3. 在面板的進一步下,在 [XR 設定] 中,勾選 [支援虛擬實境] 中的 [XR 設定],確定已新增 Windows Mixed Reality SDK

      [X R 設定] 索引標籤的螢幕快照,其中顯示已啟用 [虛擬實境 S D K] 下方的 Windows Mixed Reality S D K。

  7. 回到 [組建設定] Unity C# 專案不再呈現灰色;勾選此旁邊的複選框。

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

  9. 儲存您的專案(FILE > SAVE PROJECT)。

第 6 章 - 匯入 MLProducts Unity 套件

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

若要匯入此套件:

  1. 使用您前面的 Unity 儀錶板,單擊 畫面頂端功能表中的 [資產 ],然後按兩下 [ 匯入套件]、[自定義套件]。

    Unity 儀錶板的螢幕快照,其中顯示醒目提示的 [匯入套件] 和 [自定義套件] 功能表項。

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

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

    [匯入 Unity 套件] 對話框的螢幕快照,其中顯示正在匯入 Azure 機器學習 套件。

  4. 匯入完成後,您會發現 Unity 專案面板中會出現一些新資料夾。 這些是 3D 模型,以及您將處理之預先製作場景的個別材質。 您將在此課程中撰寫大部分的程式代碼。

    Unity 專案面板的螢幕快照,其中顯示 Assets 資料夾中新匯入的資料夾。

  5. 在 [項目面板] 資料夾中,按兩下 [場景] 資料夾,然後按兩下內部場景(稱為 [MR_MachineLearningScene]。 場景隨即開啟(見下圖)。 如果遺漏紅色鑽石,只要按兩下遊戲面板右上方的 [Gizmos] 按鈕即可。

    Unity 場景視窗的螢幕快照,其中顯示頂端導覽中醒目提示的 Gizmos 功能表項。

第 7 章 - 檢查 Unity 中的 DLL

若要利用 JSON 連結庫的使用(用於串行化和還原串行化),已使用您引進的套件實作 Newtonsoft DLL。 連結庫應該具有正確的組態,但值得檢查(特別是如果您遇到程式碼無法運作的問題)。

若要這麼做︰

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

    在 Unity 中匯入 DLL

第 8 章 - 建立 ShelfKeeper 類別

ShelfKeeper 類別會裝載控制場景中產生的UI和產品的方法。

在匯入的套件中,您將會獲得這個類別,雖然它不完整。 現在是時候完成該類別:

  1. 按兩下 [Scripts] 資料夾中的 [ShelfKeeper] 腳本,以使用 Visual Studio 2017 開啟它。

  2. 以下列程式代碼取代文本中現有的所有程式代碼,以設定時間和日期,並具有顯示產品的方法。

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

  4. 回到 Unity 編輯器中,檢查 ShelfKeeper 類別看起來如下:

    Shelf Keeper 類別的螢幕快照,其中顯示參考目標已設定為 [日期文字網格] 和 [時間文字網格]。

    重要

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

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

    2. 在 [ 階層 ] 中 ,展開 [時間顯示 ] 物件(按鼠左鍵旁邊的箭號)。 接著,從階層內單擊主要相機,讓偵測器顯示其資訊。

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

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

      階層面板的螢幕快照,其中顯示 [日期]、[時間] 和三個 [繁衍點] 功能表項位於 [架子存放區] 類別中。

第 9 章 - 建立 ProductPrediction 類別

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

此類別負責:

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

  • 將 JSON 回應還原串行化為可用數據。

  • 解譯數據,擷取 3 個建議的產品。

  • 呼叫 ShelfKeeper 類別方法,以顯示場景中的數據。

若要建立此類別:

  1. 移至 [項目面板] 中的 [腳稿] 資料夾。

  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;
    

    重要

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

    Microsoft Azure 機器學習 Studio 的螢幕快照,其中顯示 [P I 說明頁面] 底下的 [要求斜線回應] 連結。

    [要求回應 A P I 檔] 頁面的螢幕快照,其中顯示醒目提示的 POST 要求 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 Camera 物件。

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

第 10 章 - 建置 UWP 解決方案

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

若要建置:

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

  2. 移至檔案>建置設定

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

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

  5. 按兩下 [ 建置]。

    [建置設定] 對話框的螢幕快照,其中顯示醒目提示 通用 Windows 平台 功能表項。

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

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

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

    檔案總管 視窗的螢幕快照,其中顯示醒目提示的 [組建] 資料夾。

    [檔案總管] 視窗的螢幕快照,其中顯示 [組建] 資料夾的內容,以及醒目提示的 [選取資料夾] 按鈕。

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

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

若要部署您的應用程式:

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

  2. 在 Visual Studio 開啟時,您必須從 方案總管 (位於 Visual Studio 右側找到),然後按兩下 [還原 NuGet 套件],透過以滑鼠右鍵按兩下MachineLearningLab_Build解決方案來完成此作業:

    Visual Studio 視窗的螢幕快照,其中顯示醒目提示的 [還原 Nu Get Packages] 功能表項。

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

  4. 在 [解決方案平臺] 中,選取 [x86] [ 本機計算機]。

    針對 Microsoft HoloLens,您可能會發現將它設定為 遠端電腦會比較容易,因此您不會繫結到您的電腦。 不過,您也必須執行下列動作:

    • 瞭解 HoloLens 的 IP 位址,您可以在 [設定>網络與因特網 > Wi-Fi > 進階選項] 中找到;IPv4 是您應該使用的位址。
    • 確定開發人員模式開啟;請參閱適用於開發人員設定>更新與安全性>。

    Visual Studio 功能表Microsoft螢幕快照,其中顯示 [解決方案平臺] 中已選取 [本機計算機]。

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

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

當您執行混合實境應用程式時,您會看到在 Unity 場景中設定的板凳,並從初始化開始,將會擷取您在 Azure 內設定的數據。 數據會在您的應用程式內還原串行化,而您目前日期和時間的三個最上層結果會以可視化方式提供,如替補席上的三個模型一樣。

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

恭喜,您建置了混合實境應用程式,利用 Azure 機器學習 進行數據預測,並將其顯示在您的場景中。

Microsoft Visual Studio 視窗的螢幕快照,其中顯示具有三個物件的架子,以及 2 月 23 日 2 月 23 日文字為 15 點的卡片。

練習

練習 1

實驗應用程式的排序順序,並讓三個底部預測出現在貨架上,因為此數據可能也會很有用。

練習 2

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