共用方式為


教學課程:使用自訂視覺服務在邊緣執行影像分類

適用於:IoT Edge 1.5 核取記號 Azure IoT Edge 1.5

重要事項

IoT Edge 1.5 LTS 是支援的版本。 自 2024 年 11 月 12 日起,IoT Edge 1.4 LTS 已結束生命週期。 如果您採用舊版,請參閱更新 IoT Edge

Azure IoT Edge 透過將工作負載從雲端移至邊緣,讓 IoT 解決方案更有效率。 這項功能非常適合用於會處理大量資料的服務,例如電腦視覺模型。 Azure AI 自訂視覺可讓您建置自訂影像分類器,並部署至裝置作為容器。 這兩項服務可讓使用者從影像或視訊串流中尋找見解,而不需要先傳輸所有數據。 自定義視覺提供分類器,可比較影像與定型模型以產生見解。

例如,IoT Edge 裝置上的自定義視覺可能會判斷高速公路的交通是否高於或低於正常水平,或停車場是否有一排可用的停車位。 這些深入解析可與其他服務共用以便採取動作。

在本教學課程中,您會了解如何:

  • 使用電腦視覺建置影像分類器。
  • 開發IoT Edge模組,以查詢裝置上的自定義視覺網頁伺服器。
  • 將影像分類器結果傳送至IoT中樞。

圖表 - 教學課程架構、階段和部署分類器

如果您沒有 Azure 帳戶,請在開始之前建立 免費帳戶

先決條件

秘訣

此教學課程是 Raspberry Pi 3 上的自訂視覺和 Azure IoT Edge \(英文\) 範例專案的簡化版本。 它會在雲端 VM 上執行,並使用靜態映像來定型和測試影像分類器,這有助於 IoT Edge 上的自定義視覺新手。 範例專案會使用實體硬體,並設定即時攝影機影像來訓練和測試影像分類器,這對探討更詳細、更真實的案例很有幫助。

使用電腦視覺建置影像分類器

若要建置影像分類器,請建立自定義視覺專案並提供訓練影像。 如需您在本節所採取步驟的詳細資訊,請參閱如何使用自訂視覺建置分類器

建置並定型映射分類器之後,將其導出為 Docker 容器,並將其部署至 IoT Edge 裝置。

建立新專案

  1. 在網頁瀏覽器中,瀏覽到自訂視覺網頁 \(英文\)。

  2. 選取 [登入],然後使用存取 Azure 資源時所用的同一個帳戶來登入。

  3. 選取 [新增專案]

  4. 使用下列值建立專案:

    欄位
    名稱 提供專案名稱,例如 EdgeTreeClassifier
    描述 選擇性的專案描述。
    資源 選取包含自訂視覺服務資源的其中一個 Azure 資源群組,或如果您尚未新增,請建立新項目
    專案類型 分類
    分類類型 多類別 (每個影像一個標記)
    網域 一般 (精簡)
    匯出功能 基本平台 (TensorFlow、CoreML、ONNX...)
  5. 選取 [建立專案]

上傳影像並訓練分類器

建立影像分類器需要用到一組訓練影像以及測試影像。

  1. Cognitive-CustomVision-Windows 存放庫將影像範例複製或下載到本機開發機器。

    git clone https://github.com/Microsoft/Cognitive-CustomVision-Windows.git
    
  2. 返回自訂視覺專案,並選取 [新增影像]

  3. 瀏覽至您複製到本機的 git 存放庫,然後瀏覽至第一個影像資料夾 Cognitive-CustomVision-Windows / Samples / Images / Hemlock。 選取資料夾中的所有 10 個影像,然後選取 [ 開啟]。

  4. 將標籤 hemlock 新增至此影像群組,然後按 Enter 以套用標記。

  5. 選取 [上傳 10 個檔案]

    將 hemlock 標記檔案上傳到自訂視覺

  6. 當影像上傳成功時,選取 [完成]

  7. 再次選取 [新增影像]

  8. 瀏覽至第二個影像資料夾 Cognitive-CustomVision-Windows / Samples / Images / Japanese Cherry。 將資料夾中的 10 個影像全都選取,然後 [開啟]

  9. 對這一組影像新增日本櫻標記,然後按 ENTER 鍵來套用標記。

  10. 選取 [上傳 10 個檔案]。 當影像上傳成功時,選取 [完成]

  11. 標記並上傳這兩組影像之後,選取 [Train] 以訓練分類器。

匯出分類器

  1. 分類器完成訓練後,選取分類器 [效能] 頁面上的 [匯出]

    匯出定型的影像分類器

  2. 選取 [DockerFile] 平台。

  3. 選取 [Linux] 版本。

  4. 選取 [匯出]

  5. 匯出完成後,選取 [ 下載 ],然後將 .zip 套件儲存在本機計算機上。 從套件解壓縮所有檔案。 使用這些檔案來建立包含影像分類伺服器的IoT Edge模組。

當您進行到這邊時,便已完成自訂視覺專案的建立和訓練程序。 您會在下一節使用匯出的檔案,但 [自訂視覺] 網頁已結束。

建立 IoT Edge 解決方案

您現在已在開發電腦上擁有映像分類器的容器版本檔案。 在本節中,您會將映射分類器容器設定為以IoT Edge模組的形式執行。 您也會建立第二個模組,將要求張貼至分類器,並將結果當做訊息傳送至IoT中樞。

建立新解決方案

解決方案可讓您以邏輯方式來開發及組織單一 IoT Edge 部署的多個模組。 解決方案會包含一或多個模組的程式碼,以及用來宣告要如何在 IoT Edge 裝置上設定這些模組的部署資訊清單。 使用 Azure IoT Edge 開發工具 命令行 (CLI) 開發工具建立解決方案。 使用此工具最簡單的方式是 使用 Docker 執行 IoT Edge 開發容器

  1. 建立名為classifier的目錄,並切換到該目錄。

    mkdir CustomVisionSolution
    cd CustomVisionSolution
    
  2. 執行 iotedgedev 工具 init 命令 來建立新的 IoT Edge 解決方案。 在 IoT Edge Dev Docker 容器中,輸入下列命令:

    iotedgedev solution init --template python --module classifier
    

    iotedgedev 解決方案 init 指令碼會提示您完成數個步驟,包含:

    • 向 Azure 驗證
    • 選擇 Azure 訂用帳戶
    • 選擇或建立資源群組
    • 選擇或建立 Azure IoT 中樞
    • 選擇或建立 Azure IoT Edge 裝置

    此命令會建立新的IoT Edge解決方案,並在目前的工作目錄中建立名為 分類器的 模組。

  3. 在 Visual Studio Code 中開啟方案。

新增影像分類器

Visual Studio Code 中的 Python 模組範本包含一些程式碼範例,可供您執行來測試 IoT Edge。 在此案例中,您不會使用該程式碼。 相反地,請使用本節中的步驟,將程式碼範例取代為您先前匯出的影像分類器容器。

  1. 在檔案總管中,瀏覽至所下載並解壓縮的自訂視覺套件。 從解壓縮的套件中複製所有內容。 其中應該有兩個資料夾 appazureml,以及兩個檔案 DockerfileREADME

  2. 在檔案總管中,瀏覽至您對 Visual Studio Code 指示作為 IoT Edge 解決方案建立位置的目錄。

  3. 開啟 classifier 模組資料夾。 如果您在上一節使用了建議名稱,則資料夾結構的樣貌會是 CustomVisionSolution / modules / classifier

  4. 將其中的檔案貼到 classifier 資料夾。

  5. 返回 Visual Studio Code 視窗。 解決方案工作區現在應該會在模組資料夾中顯示影像分類器檔案。

  6. 刪除原始的 Dockerfile.amd64 並將 Dockerfile 改名為 Dockerfile.amd64,以便使用自定義視覺套件中的Dockerfile取代原來的 Dockerfile.amd64 檔案。

  7. 儲存您的變更。

建立模擬觀景窗模組

在實際的自定義視覺部署中,相機會提供即時影像或視訊串流。 在此案例中,您會藉由建置模組來將測試影像傳送給影像分類器,以模擬觀景窗。

在本節中,您會在相同的 CustomVisionSolution 中新增模組,並提供程式碼以建立模擬觀景窗。

  1. 使用 iotedgedev 工具將新模組新增至解決方案。 命令會在解決方案的modules資料夾中建立名為 cameracapture 的新資料夾。

    iotedgedev solution add --template python cameracapture
    
  2. 開啟 modules / 資料夾中的 main.py 檔案。

  3. 將整個檔案取代為下列程式碼。 此程式碼範例會將 POST 要求傳送至 classifier 模組中所執行的影像處理服務。 我們會在此模組容器中提供影像範例以供要求使用。 然後,它會將回應封裝為 IoT 中樞訊息並傳送至輸出佇列。

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license. See LICENSE file in the project root for
    # full license information.
    
    import time
    import sys
    import os
    import requests
    import json
    from azure.iot.device import IoTHubModuleClient, Message
    
    # global counters
    SENT_IMAGES = 0
    
    # global client
    CLIENT = None
    
    # Send a message to IoT Hub
    # Route output1 to $upstream in deployment.template.json
    def send_to_hub(strMessage):
        message = Message(bytearray(strMessage, 'utf8'))
        CLIENT.send_message_to_output(message, "output1")
        global SENT_IMAGES
        SENT_IMAGES += 1
        print( "Total images sent: {}".format(SENT_IMAGES) )
    
    # Send an image to the image classifying server
    # Return the JSON response from the server with the prediction result
    def sendFrameForProcessing(imagePath, imageProcessingEndpoint):
        headers = {'Content-Type': 'application/octet-stream'}
    
        with open(imagePath, mode="rb") as test_image:
            try:
                response = requests.post(imageProcessingEndpoint, headers = headers, data = test_image)
                print("Response from classification service: (" + str(response.status_code) + ") " + json.dumps(response.json()) + "\n")
            except Exception as e:
                print(e)
                print("No response from classification service")
                return None
    
        return json.dumps(response.json())
    
    def main(imagePath, imageProcessingEndpoint):
        try:
            print ( "Simulated camera module for Azure IoT Edge. Press Ctrl-C to exit." )
    
            try:
                global CLIENT
                CLIENT = IoTHubModuleClient.create_from_edge_environment()
            except Exception as iothub_error:
                print ( "Unexpected error {} from IoTHub".format(iothub_error) )
                return
    
            print ( "The sample is now sending images for processing and will indefinitely.")
    
            while True:
                classification = sendFrameForProcessing(imagePath, imageProcessingEndpoint)
                if classification:
                    send_to_hub(classification)
                time.sleep(10)
    
        except KeyboardInterrupt:
            print ( "IoT Edge module sample stopped" )
    
    if __name__ == '__main__':
        try:
            # Retrieve the image location and image classifying server endpoint from container environment
            IMAGE_PATH = os.getenv('IMAGE_PATH', "")
            IMAGE_PROCESSING_ENDPOINT = os.getenv('IMAGE_PROCESSING_ENDPOINT', "")
        except ValueError as error:
            print ( error )
            sys.exit(1)
    
        if ((IMAGE_PATH and IMAGE_PROCESSING_ENDPOINT) != ""):
            main(IMAGE_PATH, IMAGE_PROCESSING_ENDPOINT)
        else: 
            print ( "Error: Image path or image-processing endpoint missing" )
    
  4. 儲存 main.py 檔案。

  5. 開啟 requirements.txt 檔案。

  6. 為程式庫新增一行以便納入容器中。

    requests
    
  7. 儲存 requirements.txt 檔案。

在容器中新增測試影像

我們將會使用單一測試影像,而不會使用實際的觀景窗來為此案例提供影像饋送。 您稍早在本教學課程中為了獲得訓練影像而下載的 GitHub 存放庫中會有測試影像。

  1. 瀏覽至測試影像,其位置是 Cognitive-CustomVision-Windows / Samples / Images / Test

  2. 複製 test_image.jpg

  3. 流覽至您的IoT Edge解決方案目錄,並將測試影像貼到 modules / cameracapture 資料夾中。 影像所在的資料夾,應該會和您在上一節所編輯的 main.py 檔案相同。

  4. 在 Visual Studio Code 中,開啟 cameracapture 模組的 Dockerfile.amd64 檔案。

  5. 在建立工作目錄 WORKDIR /app 的程式行後面,新增下列程式碼:

    ADD ./test_image.jpg .
    
  6. 儲存 Dockerfile。

準備部署資訊清單

在本教學課程中,您已將自定義視覺模型定型,以將樹狀結構影像分類,並將該模型封裝為IoT Edge模組。 然後,您已建立第二個模組來查詢影像分類伺服器,並將其結果報告至IoT中樞。 現在,您已準備好建立部署指令清單,告知 IoT Edge 裝置如何一起啟動並執行這兩個模組。

Visual Studio Code 的 IoT Edge 擴充功能會在每個 IoT Edge 解決方案中提供範本,以協助您建立部署資訊清單。

  1. 開啟解決方案資料夾中的 deployment.template.json 檔案。

  2. 設定部署指令清單中模組的登錄認證。

    "registryCredentials": {
        "<registryName>": {
            "username": "<AcrUsername>",
            "password": "<AcrPassword>",
            "address": "<registryName>.azurecr.io"
        }
    }
    

    以您的 Azure 容器登錄名稱取代 <registryName> ,並以登錄的使用者名稱和密碼取代 <AcrUsername><AcrPassword> 。 您可以在 Azure 入口網站中 Azure 容器登錄的 [ 存取金鑰 ] 區段中找到這些值。

  3. 尋找 modules 區段,其中包含三個模組:您建立的兩個模組、 分類器和cameracapture,以及 預設包含tempSensor的第三個模組。

  4. 刪除 tempSensor 模組及其所有參數。 此課程模組提供測試案例的範例數據,但在此部署中並不需要。

  5. 如果您未將影像分類模組命名為 classifier,則請立即檢查名稱,並確認其名稱中全為小寫字母。 cameracapture 模組會使用要求連結庫呼叫分類器模組,以小寫格式化所有要求,而 IoT Edge 會區分大小寫。

  6. 針對每個系統模組 edgeAgentedgeHub,將 createOptions 值變更為字串化版本。 例如:

    "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    
  7. 針對每個系統模組 edgeAgentedgeHub,將映射版本變更為最新版本 1.5。 例如:

    "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
    "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
    
  8. 分類器模組的 createOptions 參數更新為字串化版本。 例如:

    "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    
  9. 使用下列 JSON 更新 cameracapture 模組的 createOptions 參數。 這項資訊會在 main.py 程序所擷取的模組容器中建立環境變數。 在部署指令清單中包含這項資訊可讓您變更映像或端點,而不需重建模組映像。

    "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
    

    如果您未將自訂視覺模組命名為 classifier,請更新影像處理端點值以便相符。

    例如,分類器和相機擷取組態應該類似:

    "modules": {
        "classifier": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
                "image": "${MODULES.classifier}",
                "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
        },
        "cameracapture": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
                "image": "${MODULES.cameracapture}",
                "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
            }
        }
    }
    
  10. 儲存 deployment.template.json 檔案。

建置和推送 IoT Edge 解決方案

建立模組並設定部署指令清單範本之後,請建置容器映像,並將其推送至您的容器登錄。

映像進入登錄後,便可將解決方案部署到 IoT Edge 裝置。 您可以透過IoT中樞在裝置上設定模組。 在本節中,您會設定IoT中樞的存取權,然後使用 Azure CLI 將解決方案部署至 IoT Edge 裝置。

首先,建置解決方案並將其推送至容器登錄。

  1. 選取 [檢視]>[終端機],以開啟 Visual Studio Code 整合式終端機。

  2. 使用 Azure 容器登錄的使用者名稱、密碼和登入伺服器,在終端機中輸入下列命令來登入 Docker。 您可以在 Azure 入口網站中,從登錄的 [存取金鑰] 區段擷取這些值。

    docker login -u <AcrUsername> -p <AcrPassword> <AcrLoginServer>
    

    您可能會收到安全性警告,建議您使用 --password-stdin。 雖然建議生產案例使用該最佳做法,但是不在本教學課程的討論範圍內。 如需詳細資訊,請參閱 docker login 參考。

  3. 使用模組的 Dockerfile 來建置和標記模組 Docker 映像。

    docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 
    

    例如,若要組建本機登錄或 Azure 容器登錄的映像,請使用下列命令:

    
    # Build and tag the image for an Azure Container Registry. Replace <AcrRegistryName> with your own registry name.
    
    docker build --rm -f "./modules/classifier/Dockerfile.amd64" -t <AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64 "./modules/classifier"
    docker build --rm -f "./modules/cameracapture/Dockerfile.amd64" -t <AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64 "./modules/cameracapture"
    

發送模組 Docker 映像

對 Docker 提供容器登錄的認證,使其可以推送您的容器映像以儲存在登錄中。

  1. 使用 Azure Container Registry (ACR) 認證登入 Docker。

    docker login -u <AcrUsername> -p <AcrPassword> <AcrLoginServer>
    

    您可能會收到安全性警告,建議您使用 --password-stdin。 雖然這是適用於生產案例的建議最佳做法,但是這不在本教學課程的討論範圍內。 如需詳細資訊,請參閱 docker login 參考。

  2. 登入 Azure Container Registry。 您需要安裝 Azure CLI,才能使用 az 命令。 這個命令會要求您提供使用者名稱和密碼,您可以在 [設定]>[存取金鑰] 的容器登錄中找到這些資訊。

    az acr login -n <AcrRegistryName>
    

    秘訣

    如果您在本教學課程中的任何時間點登出,請重複 Docker 和 Azure Container Registry 的登入步驟以繼續進行。

  3. 將您的模組映像推送至本機登錄或容器登錄。

    docker push <ImageName>
    

    例如:

    # Push the Docker image to an Azure Container Registry. Replace <AcrRegistryName> with your Azure Container Registry name.
    
    az acr login --name <AcrRegistryName>
    docker push <AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64
    docker push <AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64
    

更新部署範本

使用容器登錄映像位置更新 deployment.template.json 檔案。 將映像值變更為您已推送至登錄的映像。 例如,將 <AcrRegistryName> 以分類器和 cameracapture 模組的映像值中的登錄名稱取代。

"classifier": {
    "version": "1.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "<AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    },
    "cameracapture": {
        "version": "1.0",
        "type": "docker",
        "status": "running",
        "restartPolicy": "always",
        "settings": {
            "image": "<AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64",
            "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
        }
    }
}

最終的部署指令清單看起來如下:

{
  "$schema-template": "4.0.0",
  "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "<AcrRegistryName>": {
                "username": "<AcrUserName>",
                "password": "<AcrPassword>",
                "address": "<AcrRegistryName>.azurecr.io"
              }
            }
          }
        },
        "systemModules": {
          "edgeAgent": {
            "type": "docker",
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
          },
          "edgeHub": {
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
          }
        },
        "modules": {
          "classifier": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "<AcrRegistryName>.azurecr.io/classifier:0.0.1-amd64",
              "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
            }
          },
          "cameracapture": {
            "version": "1.0",
            "type": "docker",
            "status": "running",
            "restartPolicy": "always",
            "settings": {
              "image": "<AcrRegistryName>.azurecr.io/cameracapture:0.0.1-amd64",
              "createOptions": "{\"Env\":[\"IMAGE_PATH=test_image.jpg\",\"IMAGE_PROCESSING_ENDPOINT=http://classifier/image\"]}"
            }
          }
        }
      }
    },
    "$edgeHub": {
      "properties.desired": {
        "schemaVersion": "1.2",
        "routes": {
          "sensorToclassifier": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/classifier/inputs/input1\")",
          "classifierToIoTHub": "FROM /messages/modules/classifier/outputs/* INTO $upstream",
          "cameracaptureToIoTHub": "FROM /messages/modules/cameracapture/outputs/* INTO $upstream"
        },
        "storeAndForwardConfiguration": {
          "timeToLiveSecs": 7200
        }
      }
    }
  }
}

將模組部署到裝置

確認已建置的容器映像儲存在容器登錄中。 然後,使用為案例準備的部署指令清單 deployment.template.json 將它們部署到裝置。

使用 IoT Edge Azure CLI set-modules 命令,將模組部署至 Azure IoT 中樞。 例如,若要將 deployment.template.json 檔案中定義的模組部署到IoT Edge裝置<DeviceName的IoT中樞>IotHubName<>,請使用下列命令。 取代 hub-namedevice-id 的值,並使用您自己的值登入 IoT 中樞連接字串。

az iot edge set-modules --hub-name <IotHubName> --device-id <DeviceName> --content ./deployment.template.json --login "HostName=my-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

秘訣

您可以在 Azure 入口網站中找到 IoT 中樞連接字串,包括共用存取金鑰。 移至 IoT 中樞 >[安全性設定]>[共用存取原則]>[iothubowner]

確定您的 IoT Edge 裝置正在執行。

請展開裝置下的模組,以查看已部署且執行中的模組清單。 選取 [重新整理] 按鈕。 您會看到新的分類器和相機擷取模組與$edgeAgent$edgeHub一起執行。

您也可以查看並確認所有模組均已在裝置本身上啟動並執行。 在 IoT Edge 裝置上執行下列命令,以查看模組的狀態。

iotedge list

模組可能需要幾分鐘才會啟動。 IoT Edge 執行階段需要接收其新的部署資訊清單、從容器執行階段提取模組映像,然後啟動每個新的模組。

檢視分類結果

在您的裝置上,檢視攝影機擷取模組的記錄,以查看發送到 IoT 中樞的訊息並確認它們已被接收。

iotedge logs cameracapture

例如,您應該會看到如以下的輸出:

admin@vm:~$ iotedge logs cameracapture
Simulated camera module for Azure IoT Edge. Press Ctrl-C to exit.
The sample is now sending images for processing and will indefinitely.
Response from classification service: (200) {"created": "2023-07-13T17:38:42.940878", "id": "", "iteration": "", "predictions": [{"boundingBox": null, "probability": 1.0, "tagId": "", "tagName": "hemlock"}], "project": ""}

Total images sent: 1
Response from classification service: (200) {"created": "2023-07-13T17:38:53.444884", "id": "", "iteration": "", "predictions": [{"boundingBox": null, "probability": 1.0, "tagId": "", "tagName": "hemlock"}], "project": ""}

附註

一開始,由於各模組部署與啟動之間存在延遲,您可能會在 cameracapture 模組的輸出中看到連線錯誤。

相機擷取模組會自動重新嘗試連線,直到連線成功為止。 成功連線之後,您會看到預期的影像分類訊息。

來自自訂視覺模組的結果 (從 cameracapture 模組以訊息形式傳送),包含影像為鐵杉還是櫻花的機率。 因為影像是鐵杉 (hemlock),因此您會將機率視為 1.0。

清除資源

如果您打算繼續閱讀下一篇文章,請保留您所建立的資源和組態,並重複使用它們。 您可以也繼續使用相同的 IoT Edge 裝置作為測試裝置。

否則,請刪除本文中使用的本機設定和 Azure 資源,以避免產生費用。

刪除 Azure 資源

刪除 Azure 資源和資源群組是無法回復的動作。 請確定您不會誤刪錯誤的資源群組或資源。 如果您在現有資源群組內建立IoT中樞,且該資源群組具有您想要保留的資源,請只刪除IoT中樞資源本身,而不是資源群組。

若要刪除資源:

  1. 登入 Azure 入口網站,然後選取 [資源群組]
  2. 選取您的 IoT Edge 測試資源所屬的資源群組名稱。
  3. 檢閱資源群組所包含的資源清單。 若要將其全部刪除,您可以選取 [刪除資源群組]。 如果只想刪除某些部分,則可以選取各個資源以將其個別刪除。

後續步驟

在本教學課程中,您已訓練自訂視覺模型,並將它以模組形式部署到 IoT Edge 裝置。 然後,您建置了模組,以便查詢影像分類伺服器,並將其結果回報給 IoT 中樞。

請繼續進行後續教學課程,以了解 Azure IoT Edge 有什麼其他方法可協助您將此資料轉換成具有優勢的商業見解。