教學課程:搭配IoT裝置使用 自訂視覺來報告視覺狀態
此範例應用程式說明如何使用 自訂視覺 來訓練具有相機的裝置,以偵測視覺狀態。 您可以使用導出的 ONNX 模型,在 IoT 裝置上執行此偵測案例。
視覺狀態描述影像的內容:空房間或具有人員的房間、空車道或具有卡車的車道等。 在下圖中,您可以看到應用程式偵測到香蕉或蘋果放在相機前。
本教學課程將會示範如何:
- 設定範例應用程式以使用您自己的 自訂視覺和 IoT 中樞 資源。
- 使用應用程式來訓練您的 自訂視覺 專案。
- 使用應用程式即時為新影像評分,並將結果傳送至 Azure。
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
必要條件
- 若要使用 自訂視覺 服務,您必須在 Azure 中建立 自訂視覺 定型和預測資源。 若要在 Azure 入口網站 中這樣做,請在 [建立 自訂視覺] 頁面上填寫對話框視窗,以建立定型和預測資源。
重要
此項目必須是 Compact 影像分類專案,因為我們稍後會將模型導出至 ONNX。
- 您也需要在 Azure 上建立 IoT 中樞 資源。
- Visual Studio 2015 或更新版本
- 或者,執行 Windows 10 IoT 核心版 17763 版或更高版本的 IoT 裝置。 您也可以直接從您的電腦執行應用程式。
- 針對Raspberry Pi 2和 3,您可以直接從IoT儀錶板應用程式設定 Windows 10。 對於DrangonBoard等其他裝置,您必須使用 eMMC 方法進行刷新。 如果您需要設定新裝置的協助,請參閱 Windows IoT 檔中的設定您的裝置 。
關於視覺警示應用程式
IoT 視覺警示應用程式會在連續迴圈中執行,並視需要切換四個不同的狀態:
- 無模型:無作業狀態。 應用程式會持續睡眠一秒,並檢查相機。
- 擷取訓練影像:在此狀態下,應用程式會擷取圖片,並將其上傳為定型影像至目標 自訂視覺 專案。 然後應用程式會睡眠 500 毫秒,並重複作業,直到擷取已設定的目標影像數目為止。 然後,它會觸發 自訂視覺 模型的定型。
- 等候定型模型:在此狀態下,應用程式會每秒呼叫 自訂視覺 API,以檢查目標專案是否包含定型的反覆專案。 當找到一個模型時,它會將對應的 ONNX 模型下載到本機檔案,並切換至 評分 狀態。
- 評分:在此狀態下,應用程式會使用 Windows ML,根據本機 ONNX 模型評估相機中的單一畫面。 產生的影像分類會顯示在畫面上,並以訊息傳送至 IoT 中樞。 然後,應用程式會睡眠一秒,再評分新的影像。
檢查程式代碼結構
下列檔案會處理應用程式的主要功能。
檔案 | 說明 |
---|---|
「MainPage.xaml」 | 此檔案會定義 XAML 使用者介面。 它會裝載 Web 相機控制件,並包含用於狀態更新的標籤。 |
MainPage.xaml.cs | 此程式代碼會控制 XAML UI 的行為。 它包含狀態機器處理程序代碼。 |
CustomVision\CustomVisionServiceWrapper.cs | 這個類別是處理與 自訂視覺 Service 整合的包裝函式。 |
CustomVision\CustomVisionONNXModel.cs | 這個類別是一種包裝函式,可處理與 Windows ML 的整合,以載入 ONNX 模型並針對它評分影像。 |
IoTHub\IotHubWrapper.cs | 這個類別是一種包裝函式,可處理將評分結果上傳至 Azure 的 IoT 中樞 整合。 |
設定視覺警示應用程式
請遵循下列步驟,取得在您的電腦或IoT裝置上執行的IoT視覺警示應用程式。
- 複製或下載 GitHub 上的 IoTVisualAlerts 範例 。
- 在 Visual Studio 中開啟解決方案IoTVisualAlerts.sln
- 整合您的 自訂視覺 專案:
- 在 CustomVision\CustomVisionServiceWrapper.cs 腳本中,使用您的定型
ApiKey
密鑰更新變數。 - 然後使用與金鑰相關聯的端點 URL 來更新
Endpoint
變數。 - 使用
targetCVSProjectGuid
您想要使用之 自訂視覺 項目的對應標識碼來更新變數。
- 在 CustomVision\CustomVisionServiceWrapper.cs 腳本中,使用您的定型
- 設定 IoT 中樞 資源:
- 在IoTHub\IotHubWrapper.cs 腳本中,使用裝置的適當 連接字串 來更新
s_connectionString
變數。 - 在 Azure 入口網站上,載入您的 IoT 中樞執行個體,選取 [總管] 底下的 [IoT 裝置],選取您的目標裝置 (或是需要建立一個),然後在 [主要連接字串] 底下尋找連接字串。 字串會包含您的 IoT 中樞 名稱、裝置識別碼和共用存取密鑰;其格式如下:
{your iot hub name}.azure-devices.net;DeviceId={your device id};SharedAccessKey={your access key}
。
- 在IoTHub\IotHubWrapper.cs 腳本中,使用裝置的適當 連接字串 來更新
執行應用程式
如果您要在計算機上執行應用程式,請在 Visual Studio 中選取目標裝置的 [本機計算機],然後針對目標平臺選取 [x64] 或 [x86]。 然後按 F5 執行程式。 應用程式應該從相機啟動並顯示即時摘要和狀態消息。
如果您要部署至具有 ARM 處理器的 IoT 裝置,您必須選取 ARM 作為目標平臺,並將 遠端電腦 選取為目標裝置。 出現提示時,請提供裝置的IP位址(它必須與您的電腦位於相同的網路上)。 一旦您開機裝置並將其連線到網路,您就可以從 Windows IoT 預設應用程式取得 IP 位址。 按 F5 執行程式。
當您第一次執行應用程式時,它不會有任何視覺狀態的知識。 它會顯示沒有可用的模型狀態消息。
擷取訓練影像
若要設定模型,您必須將應用程式 置於擷取訓練影像 狀態。 採取下列其中一個步驟:
- 如果您在電腦上執行應用程式,請使用UI右上角的按鈕。
- 如果您在IoT裝置上執行應用程式,請透過 IoT 中樞呼叫
EnterLearningMode
裝置上的方法。 您可以透過 Azure 入口網站 的 [IoT 中樞] 功能表中的裝置專案呼叫它,或使用 IoT 中樞 Device Explorer 之類的工具呼叫它。
當應用程式進入擷 取訓練影像 狀態時,它會每秒擷取大約兩個影像,直到達到目標影像數目為止。 根據預設,目標為 30 個影像,但您可以將所需的數字當做自變數傳遞至 EnterLearningMode
IoT 中樞 方法來設定此參數。
當應用程式正在擷取影像時,您必須將相機公開到您想要偵測的視覺狀態類型(例如,空房間、有人員的房間、一張空桌子、一張帶玩具卡車的辦公桌等等)。
將 自訂視覺 模型定型
應用程式完成擷取影像之後,它會上傳影像,然後切換至 等候定型模型 狀態。 此時,您必須移至 自訂視覺 網站,並根據新的定型影像建置模型。 下列動畫顯示此程式的範例。
若要使用您自己的案例重複此程式:
- 登入 自訂視覺 網站。
- 尋找您的目標專案,現在應該會包含應用程式上傳的所有定型影像。
- 針對您想要識別的每個視覺狀態,選取適當的影像並手動套用標記。
- 例如,如果您的目標是區分空白房間和有人員的房間,建議您將五個以上的影像標記為新的類別、人員,以及標記五個以上的影像,而沒有人員做為負標記。 這有助於模型區分這兩種狀態。
- 另一個範例是,如果您的目標是大致瞭解架子的滿滿程度,您可以使用 EmptyShelf、PartiallyFullShelf 和 FullShelf 等卷標。
- 當您完成時,請選取 [ 訓練] 按鈕。
- 定型完成後,應用程式會偵測到已定型的反覆專案可供使用。 它會開始將定型模型導出至 ONNX 並下載至裝置的程式。
使用定型模型
一旦應用程式下載定型的模型,它會切換至 評分 狀態,並在連續迴圈中開始從相機評分影像。
針對每個擷取的影像,應用程式會在畫面上顯示頂端標籤。 如果它無法辨識視覺狀態,則會顯示 [無相符專案]。 應用程式也會將這些訊息傳送至 IoT 中樞,如果偵測到類別,訊息會包含標籤、信賴分數,以及名為detectedClassAlert
的屬性,這可供 IoT 中樞 有興趣根據屬性執行快速訊息路由的用戶端使用。
此外,此範例會使用 Sense HAT 連結庫 來偵測它何時使用 Sense HAT 單元在 Raspberry Pi 上執行,因此只要偵測到類別,並在它未偵測到任何專案時將所有顯示燈設定為紅色,就可以使用它作為輸出顯示。
重複使用應用程式
如果您想要將應用程式重設為其原始狀態,您可以按下 UI 右上角的按鈕,或透過 IoT 中樞 叫用 方法DeleteCurrentModel
來執行此動作。
您可以隨時按下右上方 UI 按鈕或再次呼叫 EnterLearningMode
方法,以重複上傳定型影像的步驟。
如果您在裝置上執行應用程式,而且需要再次擷取IP位址(例如,若要透過Windows IoT遠端用戶端建立遠端連線),您可以透過 IoT 中樞呼叫 GetIpAddress
方法。
清除資源
如果您不想再加以維護,請刪除您的 自訂視覺 專案。 在 自訂視覺 網站上,流覽至 [專案],然後選取新專案底下的垃圾桶圖示。
下一步
在本教學課程中,您會設定並執行應用程式,以偵測IoT裝置上的視覺狀態資訊,並將結果傳送至 IoT 中樞。 接下來,進一步探索原始程式碼,或進行下列其中一項建議的修改。