HoloLens (第 1 代) 和 Azure 307:機器學習服務
注意
混合實境學院教學課程的設計是以 HoloLens (第 1 代) 和混合實境沉浸式頭戴裝置為準。 因此,對於仍在尋找這些裝置開發指引的開發人員而言,我們覺得這些教學課程很重要。 這些教學課程不會使用用於 HoloLens 2 的最新工具組或互動進行更新。 系統會保留這些資訊,以繼續在支援的裝置上運作。 未來將會張貼一系列新的教學課程,示範如何針對 HoloLens 2 進行開發。 此通知會在張貼時更新這些教學課程的連結。
在此課程中,您將瞭解如何使用 Azure Machine Learning Studio 將 Machine Learning (ML) 功能新增至混合實境應用程式, (傳統) 。
Azure Machine Learning Studio (傳統) 是 Microsoft 服務,可為開發人員提供大量的機器學習演算法,可協助數據輸入、輸出、準備和視覺效果。 接著,您可以從這些元件開發預測性分析實驗、逐一查看,並使用它來定型模型。 在定型之後,您可以讓模型在 Azure 雲端內運作,以便為新數據評分。 如需詳細資訊,請流覽 Azure Machine Learning Studio (傳統) 頁面。
完成本課程之後,您將擁有混合實境沉浸式頭戴裝置應用程式,並瞭解如何執行下列動作:
- 提供 Azure Machine Learning Studio (傳統) 入口網站的銷售數據表,並設計演算法來預測熱門專案的未來銷售量。
- 建立 Unity 專案,可從 ML 服務接收和解譯預測數據。
- 透過在架上提供最受歡迎的銷售專案,以可視化方式在 Unity 專案中顯示預先定義數據。
在您的應用程式中,您必須先瞭解如何將結果與您的設計整合。 本課程旨在教導您如何整合 Azure 服務與您的 Unity 專案。 您的工作是使用此課程取得的知識來增強混合實境應用程式。
本課程是獨立的教學課程,不會直接涉及任何其他 Mixed Reality Labs。
裝置支援
課程 | HoloLens | 沉浸式頭戴裝置 |
---|---|---|
MR 和 Azure 307:機器學習 | ✔️ | ✔️ |
注意
雖然本課程主要著重於 Windows Mixed Reality 沉浸式 (VR) 頭戴式裝置,但您也可以將此課程中學到的內容套用至 Microsoft HoloLens。 當您遵循本課程時,您會看到可能需要採用以支援 HoloLens 的任何變更注意事項。 使用 HoloLens 時,您可能會在語音擷取期間注意到一些回應。
必要條件
注意
本教學課程專為具備 Unity 和 C# 基本體驗的開發人員所設計。 另請注意,本檔中的必要條件和書面指示代表在撰寫 (2018 年 5 月) 時已測試及驗證的內容。 您可以隨意使用最新的軟體,如 安裝工具一文中所列,但不應該假設本課程中的資訊會完全符合您在較新軟體中找到的內容,而不是下面所列的內容。
針對本課程,我們建議使用下列硬體和軟體:
- 開發計算機,與適用於沉浸式 (VR) 頭戴式裝置開發的 Windows Mixed Reality 相容
- 已啟用開發人員模式的 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 翻譯工具 API,您必須設定可供您的應用程式使用的服務實例。
登入 Azure 入口網站。
注意
如果您還沒有 Azure 帳戶,則必須建立一個帳戶。 如果您在教室或實驗室案例中遵循本教學課程,請詢問講師或其中一個專業人員,以協助設定新的帳戶。
登入之後,按兩下左側功能表中的 [ 記憶體帳戶 ]。
注意
New 一詞可能已取代為在較新的入口網站中建立資源。
在 [ 記憶體帳戶] 索引標籤 上,按兩下 [ 新增]。
在 [ 建立記憶體帳戶] 面板中:
插入帳戶 的 [名稱 ],請注意此欄位只接受數位和小寫字母。
針對 [部署模型], 選取 [資源管理員]。
針對 [帳戶種類],選取 [ 記憶體 (一般用途 v1) 。
針對 [效能],請選取 [標準]。
針對 [複 寫] 選取 [ 讀取存取異地備援記憶體 (RA-GRS) 。
將 [安全傳輸] 保留為 [已停用]。
選取 [訂用帳戶] 。
選擇 資源群組 或建立新的群組。 資源群組提供一種方式來監視、控制存取、布建和管理 Azure 資產集合的計費。 建議您保留與單一專案相關聯的所有 Azure 服務 (例如,這些實驗室) 在通用資源群組底下) 。
如果您想要深入瞭解 Azure 資源群組,請 瀏覽資源群組一文。
如果您要建立新的資源群組) ,請判斷資源群組的位置 (。 在理想情況下,位置會位於應用程式執行所在的區域中。 某些 Azure 資產僅適用於特定區域。
您也必須確認您已瞭解套用至此服務的條款及條件。
按兩下 [ 建立] 之後,您必須等候服務建立,這可能需要一分鐘的時間。
建立服務實例之後,入口網站中會出現通知。
第 2 章 - Azure Machine Learning Studio (傳統)
若要使用 Azure Machine Learning,您必須將 Machine Learning 服務的實例設定為可供您的應用程式使用。
在 Azure 入口網站中,按兩下左上角的 [ 新增 ],然後搜尋 Machine Learning Studio 工作區,然後按 Enter 鍵。
新頁面將提供 Machine Learning Studio 工作區 服務的描述。 在此提示的左下方,按兩下 [ 建立 ] 按鈕,以建立與此服務的關聯。
單擊 [ 建立] 之後,會出現一個面板,您需要提供新 Machine Learning Studio 服務的一些詳細數據:
插入此服務實例所需的 工作區名稱 。
選取 [訂用帳戶] 。
選擇 資源群組 或建立新的群組。 資源群組提供一種方式來監視、控制存取、布建和管理 Azure 資產集合的計費。 建議您保留與單一專案相關聯的所有 Azure 服務 (例如,這些實驗室) 在通用資源群組底下) 。
如果您想要深入瞭解 Azure 資源群組,請 瀏覽資源群組一文。
如果您要建立新的資源群組) ,請判斷資源群組的位置 (。 在理想情況下,位置會位於應用程式執行所在的區域中。 某些 Azure 資產僅適用於特定區域。 您應該使用您在上一章中用來建立 Azure 記憶體的相同資源群組。
針對 [ 記憶體帳戶] 區段,單擊 [使用現有],然後按下拉功能表,然後從該處單擊您在上一章中建立的 記憶體帳戶 。
從下拉功能表中選取適當的 工作區定價層 。
在 [Web 服務方案] 區段中,按兩下 [新建],然後在文字欄位中插入名稱。
從 [Web 服務方案定價層 ] 區段,選取您選擇的價格區間。 名為 DEVTEST Standard 的開發測試層應該免費提供給您。
您也必須確認您已瞭解套用至此服務的條款及條件。
按一下 [建立]。
按兩下 [ 建立] 之後,您必須等候服務建立,這可能需要一分鐘的時間。
建立服務實例之後,入口網站中會出現通知。
按兩下通知以探索新的服務實例。
按兩下通知中的 [ 移至資源] 按鈕,以探索新的服務實例。
在顯示的頁面中,按兩下 [ 其他連結 ] 區段下的 [啟動Machine Learning Studio],將瀏覽器導向 Machine Learning Studio 入口網站。
使用右上角或中央的 [ 登入 ] 按鈕,以登入 Machine Learning Studio (傳統) 。
第 3 章 - Machine Learning Studio (傳統) :數據集設定
Machine Learning 演演算法的運作方式之一是分析現有的數據,然後嘗試根據現有的數據集預測未來結果。 這通常表示您擁有的更多現有數據,演算法在預測未來結果時越好。
本課程提供範例數據表,稱為 ProductsTableCSV,可在這裡下載。
重要
上述 .zip 檔案同時包含 ProductsTableCSV 和 .unitypackage,您在 第 6 章中將需要。 此套件也會在該章節中提供,但與 csv 檔案分開。
此範例數據集包含 2017 年每一天每小時最佳銷售對象的記錄。
例如,在 2017 年 1 月 1 日下午 1 點 (13) ,最佳銷售專案是 salt 和 pepper。
此範例數據表包含9998個專案。
返回 Machine Learning Studio (傳統) 入口網站,並將此數據表新增為 ML 的 數據集 。 按兩下畫面左下角的 [+ 新增 ] 按鈕,即可執行此動作。
區段會從底部向上,而該區段位於左側的導覽面板內。 按兩下 [資料集],然後在右側的 [ 從本機檔案]。
依照下列步驟上傳新的 數據集 :
上傳視窗隨即出現,您可以在其中 瀏覽 新數據集的硬碟。
選取之後,再回到上傳視窗中,將複選框保持取消標記。
在下方的文字欄位中,輸入 ProductsTableCSV.csv 作為數據集的名稱 (,不過應該會自動新增) 。
使用 [類型] 的下拉功能表,選取 具有標頭的 [一般 CSV 檔案] (.csv) 。
按上傳視窗右下角的刻度,並上傳您的 數據集 。
第 4 章 - Machine Learning Studio (傳統) :實驗
您必須先建置實驗,才能建置機器學習系統,以驗證您數據的理論。 透過結果,您將知道是否需要更多數據,或者數據與可能的結果之間是否有相互關聯。
若要開始建立實驗:
再次按下頁面左下方的 [+ 新增 ] 按鈕,然後按兩下 [ 實驗>空白實驗]。
新的頁面會顯示空白實驗:
從左側面板展開 [ 已儲存的數據集>我的數據集 ],然後將 ProductsTableCSV 拖曳至 實驗畫布。
在左側的面板中,展開 [數據轉換>範例] 和 [分割]。 然後將 [ 分割數據] 專案拖曳至 [實驗畫布]。 分割數據項會將數據集分割成兩個部分。 您將使用其中一個部分來定型機器學習演算法。 第二個部分將用來評估產生的演算法精確度。
在右側面板中 (選取畫布上的 [分割數據] 專案時) ,將 第一個輸出數據集中的數據列分數 編輯為 0.7。 這會將數據分割成兩個部分,第一個部分會是 70% 的數據,而第二個部分將是其餘的 30%。 為了確保數據會隨機分割,請確定 [ 隨機分割 ] 複選框會保持核取狀態。
將連線從畫布上的 ProductsTableCSV 專案基底拖曳到分割數據項頂端。 這會將項目連線到 ProductsTableCSV 數據集輸出, (數據) 到分割數據輸入。
在左側的 [ 實驗 ] 面板中,展開 [機器學習>訓練]。 將 [定型模型] 專案拖曳至 [實驗] 畫布。 您的畫布看起來應該與下面相同。
從 [分割數據] 專案的左下角,將連接拖曳到 [定型模型] 專案的右上方。 訓練模型將使用數據集的前 70% 分割來定型演算法。
選取畫布上的 [ 定型模型] 專案,然後在瀏覽器視窗右側的 [ 屬性 ] 面板中 (,) 按兩下 [ 啟動數據行選取器 ] 按鈕。
在文本框中輸入 產品 ,然後按 Enter 鍵, 產品 將會設定為數據行來定型預測。 在此之後,按下角的 刻度 以關閉選取對話框。
您將訓練 多類別羅 吉斯回歸演算法,根據當天和日期的小時來預測最銷售 的產品 。 本檔的範圍超出說明 Azure Machine Learning 工作室 提供之不同演算法的詳細數據,不過您可以從機器學習演算法小查表深入瞭解
從左側的實驗項目面板中,展開 [機器學習>初始化模型>分類],然後將 [ 多類別羅 吉斯回歸] 專案拖曳至實驗畫布。
將輸出從 多類別羅吉斯回歸的底部連接到 訓練模型 專案的左上方輸入。
在左側面板的實驗項目清單中,展開 [機器學習>分數],然後將 [ 評分模型 ] 專案拖曳至畫布。
將輸出從 定型模型底部連接到 評分模型的左上方輸入。
將右下角輸出從 分割數據連接到 評分模型 專案的右上方輸入。
在左側面板的 [實驗 專案] 清單中,展開 [機器學習>評估],然後將 [ 評估模型 ] 專案拖曳至畫布上。
將 評分模型的 輸出連接到 評估模型的左上方輸入。
您已建置第一個 Machine Learning 實驗。 您現在可以儲存並執行實驗。 在頁面底部的功能表中,單擊 [ 儲存 ] 按鈕以儲存實驗,然後按兩下 [ 執行 ] 以開始實驗。
您可以在畫布右上方看到實驗 的狀態 。 請稍候一些時間,讓實驗完成。
如果您有大型 (真實世界) 數據集,實驗可能需要數小時才能執行。
以滑鼠右鍵按兩下畫布中的 [ 評估模型 ] 項目,然後從操作功能表將滑鼠停留在 [評估結果] 上方,然後選取 [ 可視化]。
評估結果會顯示預測結果與實際結果。 這會使用先前分割的原始數據集 30% 來評估模型。 在理想情況下,您可以看到結果並不理想,在理想情況下,每個數據列中的最高數位都是數據行中的醒目提示專案。
關閉 [結果]。
若要使用新定型的機器學習模型,您需要將其公開為 Web服務。 若要這樣做,請按兩下頁面底部功能表中的 [ 設定 Web 服務 ] 選單項,然後按兩下 [預測性 Web 服務]。
將會建立新的索引標籤,並合併定型模型以建立新的 Web 服務。
在頁面底部的功能表中,單擊 [ 儲存],然後按兩下[ 執行]。 您會在實驗畫布右上角看到更新的狀態。
完成執行之後,頁面底部會出現 [部署Web服務 ] 按鈕。 您已準備好部署 Web 服務。 單擊頁面底部功能表中的 [部署Web服務 (傳統) 。
如果部署頁面未 顯示,瀏覽器可能會提示您允許彈出視窗,但您可能需要再次按 [部署Web服務 ]。
建立實驗之後,系統會將您重新導向至 儀錶板頁面, 其中會顯示 API 金鑰 。 立即將它複製到記事本中,您很快就會在程式代碼中用到它。 在您記錄 API 金鑰之後,請按下 [金鑰] 下方 [預設端點] 區段中的 [要求/回應] 按鈕。
注意
如果您按下此頁面中的 [測試],您將能夠輸入輸入資料並檢視輸出。 輸入 日 和 小時。 將 產品 專案保留空白。 然後按下 [ 確認] 按鈕。 頁面底部的輸出會顯示 JSON,代表每個產品成為選擇的可能性。
新的網頁隨即開啟,其中顯示Machine Learning Studio (傳統) 所需要求結構的指示和一些範例。 將此頁面中顯示的 要求 URI 複製到您的記事本。
您現在已建置機器學習系統,根據歷史購買數據提供最可能要銷售的產品,並與一年中的日期和時間相互關聯。
若要呼叫 Web 服務,您需要服務端點的 URL 和服務 API 金鑰。 點擊頂端選單中的 [ 取用 ] 索引標籤。
[ 取用 資訊] 頁面會顯示從程式代碼呼叫 Web 服務所需的資訊。 取得 主鍵 和 要求-回應 URL 的複本。 在下一章中,您將需要這些專案。
第 5 章 - 設定 Unity 專案
設定及測試您的 Mixed Reality沉浸式頭戴式裝置。
注意
您 不需要 此課程的動作控制器。 如果您需要設定沈浸式頭戴式裝置的支援,請按兩下 [這裡]。
開啟 Unity 並建立名為 MR_MachineLearning 的新 Unity 專案 。 請確定專案類型已設定為 3D。
開啟 Unity 時,值得檢查預設 的腳本編輯器 已設定為 Visual Studio。 移至 [編輯>喜好設定 ],然後從新視窗中流覽至 [外部工具]。 將 外部腳本編輯器 變更為 Visual Studio 2017。 關閉 [喜好設定] 視窗。
接下來,移至 [檔案>建置設定],然後按兩下 [切換平臺] 按鈕,將平臺切換為 通用 Windows 平台。
也請確定:
[目標裝置 ] 設定為 [任何裝置]。
針對 Microsoft HoloLens,將 [目標裝置] 設定為 HoloLens。
組建類型 設定為 D3D。
SDK 設定為 [最新安裝]。
Visual Studio 版本 會設定為 [最新安裝]。
[建置並執行 ] 設定為 [本機計算機]。
別擔心現在設定 場景 ,因為稍後會提供這些場景。
其餘設定現在應該保留為預設值。
在 [ 建置設定 ] 視窗中,按兩下 [ 播放機設定 ] 按鈕,這會在 Inspector 所在的空間中開啟相關的面板。
在此面板中,需要驗證一些設定:
在 [ 其他設定] 索引 標籤中:
腳本運行時間版本 應該是 實驗 性 (.NET 4.6 對等)
腳本後端 應該是 .NET
API 相容性層級 應該是 .NET 4.6
在 [ 發佈設定] 索引標籤的 [ 功能] 底下,檢查:
InternetClient
在面板的下方,在 [XR 設定] (中找到 [發佈設定]) ,勾選 [支援的虛擬實境],確定已新增 Windows Mixed Reality SDK
回到 組建設定Unity C# 專案不再呈現灰色;勾選此旁邊的複選框。
關閉 [建置設定] 視窗。
儲存專案 (檔案 > 儲存專案) 。
第 6 章 - 匯入 MLProducts Unity 套件
在此課程中,您必須下載名為 Azure-MR-307.unitypackage 的 Unity 資產套件。 此套件隨附場景,其中包含該預建中的所有物件,因此您可以專注於讓它運作正常。 提供 ShelfKeeper 腳本,但只保留公用變數,以用於場景設定結構。 您必須執行所有其他區段。
若要匯入此套件:
在 Unity 儀錶板前面,單擊畫面頂端功能表中的 [ 資產 ],然後按兩下 [ 匯入套件]、[自定義套件]。
使用檔案選擇器選取 Azure-MR-307.unitypackage 套件,然後按兩下 [ 開啟]。
此資產的元件清單將會顯示給您。 按兩下 [ 匯入] 以確認匯入。
匯入完成後,您會發現 Unity 專案面板中已出現一些新資料夾。 這些是 3D 模型,以及屬於您將處理之預先建立場景的個別材質。 您將在此課程中撰寫大部分的程式代碼。
在 [專案面板 ] 資料夾中,按兩下 [ 場景 ] 資料夾,然後按兩下 (內稱為 MR_MachineLearningScene) 的場景。 場景會開啟 (請參閱下圖) 。 如果遺漏紅色菱形,只要按兩下遊戲面板右上方的 Gizmos 按鈕即可。
第 7 章 - 檢查 Unity 中的 DLL
若要利用 JSON 連結庫的使用, (用於串行化和還原串行化) ,已使用您帶入的套件來實作 Newtonsoft DLL。 連結庫應該具有正確的組態,但值得檢查 (,特別是當您遇到程式代碼無法運作的問題) 時。
若要這樣做:
以滑鼠右鍵按兩下 Plugins 資料夾內的 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 中,再返回 Unity。
回到 Unity 編輯器中,檢查 ShelfKeeper 類別看起來如下:
重要
如果您的腳本沒有參考目標 (,也就是 日期 (文字網格) ) ,只要將對應的物件從 階層面板拖曳到目標字段即可。 如需說明,請參閱以下說明:
以滑鼠左鍵開啟 ShelfKeeper 元件腳本內的 Spawn Point 陣列。 子區段會顯示為 Size,表示陣列的大小。 在 [大小] 旁的文字框中輸入 3,然後按 Enter 鍵,並在下方建立三個位置。
在 [階層 ] 中,以滑鼠左鍵按兩下) 旁邊的箭號,展開 [時間顯示 ] 物件 (。 接著,按兩下階層內的主要相機,讓偵測器顯示其資訊。
在階層面板中選取主要相機。 將 [日期和時間] 物件從 [階層] 面板拖曳至 [BotKeeper] 元件中主要相機的偵測器內的 [日期文字] 和 [時間文字] 位置。
將 [繁衍點] 從 [階層面板] (拖曳至 [架子] 物件下方) 的 3個元素參考目標,如影像所示。
第 9 章 - 建立 ProductPrediction 類別
您要建立的下一個類別是 ProductPrediction 類別。
此類別負責:
查詢 Machine Learning 服務 實例,並提供目前的日期和時間。
將 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 類別內,插入下列兩個由數個巢狀類別組成的物件。 這些類別可用來串行化和還原串行化 Machine Learning 服務的 JSON。
/// <summary> /// This object represents the Prediction request /// It host the day of the year and hour of the day /// The product must be left blank when serialising /// </summary> public class RootObject { public Inputs Inputs { get; set; } } public class Inputs { public Input1 input1 { get; set; } } public class Input1 { public List<string> ColumnNames { get; set; } public List<List<string>> Values { get; set; } }
/// <summary> /// This object containing the deserialised Prediction result /// It host the list of the products /// and the likelihood of them being sold at current date and time /// </summary> public class Prediction { public Results Results { get; set; } } public class Results { public Output1 output1; } public class Output1 { public string type; public Value value; } public class Value { public List<string> ColumnNames { get; set; } public List<List<string>> Values { get; set; } }
然後在先前的程式代碼上方新增下列變數 (,讓 JSON 相關程式代碼位於腳本底部、所有其他程式碼下方,以及) :
/// <summary> /// The 'Primary Key' from your Machine Learning Portal /// </summary> private string authKey = "-- Insert your service authentication key here --"; /// <summary> /// The 'Request-Response' Service Endpoint from your Machine Learning Portal /// </summary> private string serviceEndpoint = "-- Insert your service endpoint here --"; /// <summary> /// The Hour as set in Windows /// </summary> private string thisHour; /// <summary> /// The Day, as set in Windows /// </summary> private string thisDay; /// <summary> /// The Month, as set in Windows /// </summary> private string thisMonth; /// <summary> /// The Numeric Day from current Date Conversion /// </summary> private string dayOfTheYear; /// <summary> /// Dictionary for holding the first (or default) provided prediction /// from the Machine Learning Experiment /// </summary> private Dictionary<string, string> predictionDictionary; /// <summary> /// List for holding product prediction with name and scores /// </summary> private List<KeyValuePair<string, double>> keyValueList;
重要
請務必從Machine Learning入口網站將 主鍵 和 要求回應端點插入此處的變數。 下圖顯示您已從何處取得金鑰和端點。
在 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 () 方法,因為這個類別不會使用它。
新增下列方法,以將目前的日期和時間傳達給Machine Learning端點,並以JSON格式接收回應。
private IEnumerator GetPrediction(string timeOfDay, string dayOfYear) { // Populate the request object // Using current day of the year and hour of the day RootObject ro = new RootObject { Inputs = new Inputs { input1 = new Input1 { ColumnNames = new List<string> { "day", "hour", "product" }, Values = new List<List<string>>() } } }; List<string> l = new List<string> { dayOfYear, timeOfDay, "" }; ro.Inputs.input1.Values.Add(l); Debug.LogFormat("Score request built"); // Serialize the request string json = JsonConvert.SerializeObject(ro); using (UnityWebRequest www = UnityWebRequest.Post(serviceEndpoint, "POST")) { byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(json); www.uploadHandler = new UploadHandlerRaw(jsonToSend); www.downloadHandler = new DownloadHandlerBuffer(); www.SetRequestHeader("Authorization", "Bearer " + authKey); www.SetRequestHeader("Content-Type", "application/json"); www.SetRequestHeader("Accept", "application/json"); yield return www.SendWebRequest(); string response = www.downloadHandler.text; // Deserialize the response DataContractSerializer serializer; serializer = new DataContractSerializer(typeof(string)); DeserialiseJsonResponse(response); } }
新增下列方法,負責還原串行化 JSON 回應,並將還原串行化的結果傳達至 ShelfKeeper 類別。 此結果會是預測在目前日期和時間銷售最多三個項目的名稱。 將下列程式代碼插入 ProductPrediction 類別的上一個方法下方。
/// <summary> /// Deserialize the response received from the Machine Learning portal /// </summary> public void DeserialiseJsonResponse(string jsonResponse) { // Deserialize JSON Prediction prediction = JsonConvert.DeserializeObject<Prediction>(jsonResponse); predictionDictionary = new Dictionary<string, string>(); for (int i = 0; i < prediction.Results.output1.value.ColumnNames.Count; i++) { if (prediction.Results.output1.value.Values[0][i] != null) { predictionDictionary.Add(prediction.Results.output1.value.ColumnNames[i], prediction.Results.output1.value.Values[0][i]); } } keyValueList = new List<KeyValuePair<string, double>>(); // Strip all non-results, by adding only items of interest to the scoreList for (int i = 0; i < predictionDictionary.Count; i++) { KeyValuePair<string, string> pair = predictionDictionary.ElementAt(i); if (pair.Key.StartsWith("Scored Probabilities")) { // Parse string as double then simplify the string key so to only have the item name double scorefloat = 0f; double.TryParse(pair.Value, out scorefloat); string simplifiedName = pair.Key.Replace("\"", "").Replace("Scored Probabilities for Class", "").Trim(); keyValueList.Add(new KeyValuePair<string, double>(simplifiedName, scorefloat)); } } // Sort Predictions (results will be lowest to highest) keyValueList.Sort((x, y) => y.Value.CompareTo(x.Value)); // Spawn the top three items, from the keyValueList, which we have sorted for (int i = 0; i < 3; i++) { ShelfKeeper.instance.SpawnProduct(keyValueList[i].Key, i); } // Clear lists in case of reuse keyValueList.Clear(); predictionDictionary.Clear(); }
儲存 Visual Studio 並返回 Unity。
將 ProductPrediction 類別腳本從 Script 資料夾拖曳到 Main Camera 物件。
儲存場景和專案 檔>儲存場景/檔案>儲存專案。
第 10 章 - 建置 UWP 解決方案
現在是時候建置您的專案做為UWP解決方案,讓它可以以獨立應用程式的形式執行。
若要建置:
按兩下 [ 檔案>儲存場景] 來儲存目前的場景。
移至 檔案>組建設定
核取名為 Unity C# 專案的 方塊 (這很重要,因為它可讓您在建置完成後編輯類別) 。
按兩下 [ 新增開啟場景]
按一下 [建置]。
系統會提示您選取您要建置解決方案的資料夾。
建立 BUILDS 資料夾,並在該資料夾中建立另一個具有所選適當名稱的資料夾。
按兩下您的新資料夾,然後按兩下 [ 選取資料夾],開始在該位置建置。
一旦 Unity 完成建置 (可能需要一些時間) ,它會在組建的位置開啟 檔案總管 視窗, (檢查您的任務欄,因為它不一定會出現在您的視窗上方,但會通知您新增視窗) 。
第 11 章 - 部署您的應用程式
若要部署您的應用程式:
流覽至新的 Unity 組建, (應用程式 資料夾) ,並使用 Visual Studio 開啟方案檔。
開啟 Visual Studio 時,您必須還原 NuGet 套件,以滑鼠右鍵按兩下MachineLearningLab_Build解決方案,從 Visual Studio) 右側找到的 方案總管 (,然後按兩下 [還原 NuGet 套件]:
在 [方案組態] 中,選取 [ 偵錯]。
在 [解決方案平臺] 中,選取 [x86]、[ 本機計算機]。
針對 Microsoft HoloLens,您可能會發現將它設定為遠端電腦更容易,因此您不會連線到您的電腦。 不過,您也必須執行下列動作:
- 瞭解 HoloLens 的 IP 位址 ,您可以在 [ 設定 > 網络] & [因特網 > ] Wi-Fi > [進階選項] 中找到;IPv4 是您應該使用的位址。
- 確定開發人員模式為開啟;在 [設定更新] & 開發人員的安全性>中找到>。
移至 [ 建置] 功能表 ,然後按下 [ 部署方案 ] 以側載應用程式到您的電腦。
您的應用程式現在應該會出現在已安裝的應用程式清單中,準備好啟動。
當您執行 Mixed Reality 應用程式時,您會看到已在 Unity 場景中設定的 bench,並從初始化中擷取您在 Azure 內設定的數據。 數據將會在您的應用程式內還原串行化,而目前日期和時間的三個最上層結果將會以可視化方式提供,如同臺上的三個模型一樣。
您已完成的 Machine Learning 應用程式
恭喜,您已建置混合實境應用程式,利用 Azure Machine Learning 進行數據預測,並在您的場景中顯示。
練習
練習 1
使用應用程式的排序順序進行實驗,並讓三個底部的預測出現在架子上,因為此數據可能也很有用。
練習 2
使用 Azure 資料表 會以天氣資訊填入新的數據表,並使用數據建立新的實驗。