教學課程:搭配IoT裝置使用 自訂視覺來報告視覺狀態

此範例應用程式說明如何使用 自訂視覺 來訓練具有相機的裝置,以偵測視覺狀態。 您可以使用導出的 ONNX 模型,在 IoT 裝置上執行此偵測案例。

視覺狀態描述影像的內容:空房間或具有人員的房間、空車道或具有卡車的車道等。 在下圖中,您可以看到應用程式偵測到香蕉或蘋果放在相機前。

Animation of a UI labeling fruit in front of the camera

本教學課程將會示範如何:

  • 設定範例應用程式以使用您自己的 自訂視覺和 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視覺警示應用程式。

  1. 複製或下載 GitHub 上的 IoTVisualAlerts 範例
  2. 在 Visual Studio 中開啟解決方案IoTVisualAlerts.sln
  3. 整合您的 自訂視覺 專案:
    1. CustomVision\CustomVisionServiceWrapper.cs 腳本中,使用您的定型 ApiKey 密鑰更新變數。
    2. 然後使用與金鑰相關聯的端點 URL 來更新 Endpoint 變數。
    3. 使用targetCVSProjectGuid您想要使用之 自訂視覺 項目的對應標識碼來更新變數。
  4. 設定 IoT 中樞 資源:
    1. 在IoTHub\IotHubWrapper.cs 腳本中,使用裝置的適當 連接字串 來更新s_connectionString變數。
    2. 在 Azure 入口網站上,載入您的 IoT 中樞執行個體,選取 [總管] 底下的 [IoT 裝置],選取您的目標裝置 (或是需要建立一個),然後在 [主要連接字串] 底下尋找連接字串。 字串會包含您的 IoT 中樞 名稱、裝置識別碼和共用存取密鑰;其格式如下:{your iot hub name}.azure-devices.net;DeviceId={your device id};SharedAccessKey={your access key}

執行應用程式

如果您要在計算機上執行應用程式,請在 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 中樞 方法來設定此參數。

當應用程式正在擷取影像時,您必須將相機公開到您想要偵測的視覺狀態類型(例如,空房間、有人員的房間、一張空桌子、一張帶玩具卡車的辦公桌等等)。

將 自訂視覺 模型定型

應用程式完成擷取影像之後,它會上傳影像,然後切換至 等候定型模型 狀態。 此時,您必須移至 自訂視覺 網站,並根據新的定型影像建置模型。 下列動畫顯示此程式的範例。

Animation: tagging multiple images of bananas

若要使用您自己的案例重複此程式:

  1. 登入 自訂視覺 網站
  2. 尋找您的目標專案,現在應該會包含應用程式上傳的所有定型影像。
  3. 針對您想要識別的每個視覺狀態,選取適當的影像並手動套用標記。
    • 例如,如果您的目標是區分空白房間和有人員的房間,建議您將五個以上的影像標記為新的類別、人員,以及標記五個以上的影像,而沒有人員做為標記。 這有助於模型區分這兩種狀態。
    • 另一個範例是,如果您的目標是大致瞭解架子的滿滿程度,您可以使用 EmptyShelf、PartiallyFullShelfFullShelf標。
  4. 當您完成時,請選取 [ 訓練] 按鈕。
  5. 定型完成後,應用程式會偵測到已定型的反覆專案可供使用。 它會開始將定型模型導出至 ONNX 並下載至裝置的程式。

使用定型模型

一旦應用程式下載定型的模型,它會切換至 評分 狀態,並在連續迴圈中開始從相機評分影像。

針對每個擷取的影像,應用程式會在畫面上顯示頂端標籤。 如果它無法辨識視覺狀態,則會顯示 [無相符專案]。 應用程式也會將這些訊息傳送至 IoT 中樞,如果偵測到類別,訊息會包含標籤、信賴分數,以及名為detectedClassAlert的屬性,這可供 IoT 中樞 有興趣根據屬性執行快速訊息路由的用戶端使用。

此外,此範例會使用 Sense HAT 連結庫 來偵測它何時使用 Sense HAT 單元在 Raspberry Pi 上執行,因此只要偵測到類別,並在它未偵測到任何專案時將所有顯示燈設定為紅色,就可以使用它作為輸出顯示。

重複使用應用程式

如果您想要將應用程式重設為其原始狀態,您可以按下 UI 右上角的按鈕,或透過 IoT 中樞 叫用 方法DeleteCurrentModel來執行此動作。

您可以隨時按下右上方 UI 按鈕或再次呼叫 EnterLearningMode 方法,以重複上傳定型影像的步驟。

如果您在裝置上執行應用程式,而且需要再次擷取IP位址(例如,若要透過Windows IoT遠端用戶端建立遠端連線),您可以透過 IoT 中樞呼叫 GetIpAddress 方法。

清除資源

如果您不想再加以維護,請刪除您的 自訂視覺 專案。 在 自訂視覺 網站上,流覽至 [專案],然後選取新專案底下的垃圾桶圖示。

Screenshot of a panel labeled My New Project with a trash can icon

下一步

在本教學課程中,您會設定並執行應用程式,以偵測IoT裝置上的視覺狀態資訊,並將結果傳送至 IoT 中樞。 接下來,進一步探索原始程式碼,或進行下列其中一項建議的修改。

  • 新增 IoT 中樞 方法,將應用程式直接切換至等候定型的模型狀態。 如此一來,您就可以使用裝置本身未擷取的影像來定型模型,然後在命令上將新模型推送至裝置。
  • 請遵循可視化即時感測器數據教學課程來建立Power BI儀錶板,以可視化範例所傳送的 IoT 中樞 警示。
  • 遵循IoT遠端監視教學課程,建立邏輯應用程式,以回應偵測到視覺狀態時 IoT 中樞 警示。