Tutorial: Durchführen von Bildklassifizierungen im Edge-Bereich mit dem Custom Vision ServiceTutorial: Perform image classification at the edge with Custom Vision Service

Azure IoT Edge kann Workloads aus der Cloud an den Edge-Bereich verlagern und so die Effizienz Ihrer IoT-Lösung steigern.Azure IoT Edge can make your IoT solution more efficient by moving workloads out of the cloud and to the edge. Diese Funktion eignet sich besonders für Dienste, die große Datenmengen verarbeiten – also beispielsweise für Modelle für maschinelles Sehen.This capability lends itself well to services that process a lot of data, like computer vision models. Mit dem Custom Vision Service können Sie benutzerdefinierte Bildklassifizierungen erstellen und auf Geräten als Container bereitstellen.The Custom Vision Service lets you build custom image classifiers and deploy them to devices as containers. Die Kombination dieser beiden Dienste ermöglicht es Ihnen, Erkenntnisse aus Bildern oder Videostreams zu gewinnen, ohne zuvor sämtliche Daten an einen externen Ort zu übertragen.Together, these two services enable you to find insights from images or video streams without having to transfer all of the data off site first. Custom Vision bietet eine Klassifizierung, die ein Bild mit einem trainierten Modell vergleicht, um Erkenntnisse zu generieren.Custom Vision provides a classifier that compares an image against a trained model to generate insights.

So kann mit Custom Vision auf einem IoT Edge-Gerät beispielsweise ermittelt werden, ob das Verkehrsaufkommen auf einer Autobahn höher ist als normal oder ob in einem Parkhaus noch Parkplätze in einer Reihe frei sind.For example, Custom Vision on an IoT Edge device could determine whether a highway is experiencing higher or lower traffic than normal, or whether a parking garage has available parking spots in a row. Diese Erkenntnisse können an einen anderen Dienst weitergegeben werden, um Aktionen auszuführen.These insights can be shared with another service to take action.

In diesem Tutorial lernen Sie Folgendes:In this tutorial, you learn how to:

  • Erstellen einer Bildklassifizierung mit Custom VisionBuild an image classifier with Custom Vision.
  • Entwickeln eines IoT Edge-Moduls, das den Custom Vision-Webserver auf Ihrem Gerät abfragtDevelop an IoT Edge module that queries the Custom Vision web server on your device.
  • Senden der Ergebnisse der Bildklassifizierung an IoT HubSend the results of the image classifier to IoT Hub.

Architekturdiagramm des Tutorials: Staging und Bereitstellung der Klassifizierung

![Diagram - Tutorial architecture, stage and deploy classifier](./media/tutorial-deploy-custom-vision/custom-vision-architecture.png)

Wenn Sie kein Azure-Abonnement besitzen, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.If you don't have an Azure subscription, create a free account before you begin.

VoraussetzungenPrerequisites

Bevor Sie mit diesem Tutorial beginnen, sollten Sie das vorhergehende Tutorial durchgearbeitet haben, um Ihre Entwicklungsumgebung für die Entwicklung von Linux-Containern einzurichten: Entwickeln von IoT Edge-Modulen für Linux-Geräte.Before beginning this tutorial, you should have gone through the previous tutorial to set up your development environment for Linux container development: Develop IoT Edge modules for Linux devices. Nach Abschluss dieses Tutorials sollten Sie die folgenden Voraussetzungen eingerichtet haben:By completing that tutorial, you should have the following prerequisites in place:

Um ein IoT Edge-Modul mit dem Custom Vision-Dienst zu entwickeln, installieren Sie die folgenden zusätzlichen Voraussetzungen auf Ihrem Entwicklungscomputer:To develop an IoT Edge module with the Custom Vision service, install the following additional prerequisites on your development machine:

Erstellen einer Bildklassifizierung mit Custom VisionBuild an image classifier with Custom Vision

Um eine Bildklassifizierung zu erstellen, müssen Sie ein Custom Vision-Projekt erstellen und Trainingsbilder bereitstellen.To build an image classifier, you need to create a Custom Vision project and provide training images. Weitere Informationen zu den Schritten in diesem Abschnitt finden Sie unter Erstellen einer Klassifizierung mit Custom Vision.For more information about the steps that you take in this section, see How to build a classifier with Custom Vision.

Nachdem Sie Ihre Bildklassifizierung erstellt und trainiert haben, können Sie sie als Docker-Container exportieren und auf einem IoT Edge-Gerät bereitstellen.Once your image classifier is built and trained, you can export it as a Docker container and deploy it to an IoT Edge device.

Erstellen eines neuen ProjektsCreate a new project

  1. Navigieren Sie im Webbrowser zur Custom Vision-Webseite.In your web browser, navigate to the Custom Vision web page.

  2. Wählen Sie Anmelden aus, und melden Sie sich mit dem Konto an, mit dem Sie auch auf Azure-Ressourcen zugreifen.Select Sign in and sign in with the same account that you use to access Azure resources.

  3. Wählen Sie Neues Projekt aus.Select New project.

  4. Erstellen Sie Ihr Projekt mit den folgenden Werten:Create your project with the following values:

    FeldField WertValue
    NAMEName Geben Sie einen Namen für Ihr Projekt an (beispielsweise EdgeTreeClassifier).Provide a name for your project, like EdgeTreeClassifier.
    BESCHREIBUNGDescription Eine optionale Projektbeschreibung.Optional project description.
    RessourcengruppeResource Group Übernehmen Sie den Standardwert Eingeschränkte Testversion.Accept the default Limited trial.
    ProjekttypenProject Types KlassifizierungClassification
    KlassifizierungstypenClassification Types Multiclass (single tag per image) (Multiklasse (einzelnes Tag pro Bild))Multiclass (single tag per image)
    DomänenDomains General (compact) (Allgemein (kompakt))General (compact)
  5. Wählen Sie Projekt erstellen aus.Select Create project.

Hochladen von Bildern und Trainieren Ihrer KlassifizierungUpload images and train your classifier

Für die Erstellung einer Bildklassifizierung benötigen Sie eine Gruppe von Trainingsbildern sowie Testbilder.Creating an image classifier requires a set of training images, as well as test images.

  1. Klonen Sie Beispielbilder aus dem Repository Cognitive-CustomVision-Windows auf Ihrem lokalen Entwicklungscomputer, oder laden Sie sie herunter.Clone or download sample images from the Cognitive-CustomVision-Windows repo onto your local development machine.

    git clone https://github.com/Microsoft/Cognitive-CustomVision-Windows.git
    
  2. Kehren Sie zu Ihrem Custom Vision-Projekt zurück, und wählen Sie Bilder hinzufügen aus.Return to your Custom Vision project and select Add images.

  3. Navigieren Sie in dem lokal geklonten Git-Repository zum ersten Bildordner: Cognitive-CustomVision-Windows/Samples/Images/Hemlock.Browse to the git repo that you cloned locally, and navigate to the first image folder, Cognitive-CustomVision-Windows / Samples / Images / Hemlock. Wählen Sie in dem Ordner alle zehn Bilder und anschließend Öffnen aus.Select all 10 images in the folder and then Open.

  4. Fügen Sie dieser Gruppe von Bildern das Tag hemlock hinzu, und drücken Sie dieEINGABETASTE, um das Tag anzuwenden.Add the tag hemlock to this group of images and press enter to apply the tag.

  5. Wählen Sie 10 Dateien hochladen aus.Select Upload 10 files.

    Hochladen von Dateien mit dem Tag „hemlock“ in Custom Vision

  6. Klicken Sie nach dem erfolgreichen Hochladen der Bilder auf Fertig.When the images are uploaded successfully, select Done.

  7. Wählen Sie erneut Bilder hinzufügen aus.Select Add images again.

  8. Navigieren Sie zum zweiten Bildordner: Cognitive-CustomVision-Windows/Samples/Images/Japanese Cherry.Browse to the second image folder, Cognitive-CustomVision-Windows / Samples / Images / Japanese Cherry. Wählen Sie in dem Ordner alle zehn Bilder und anschließend Öffnen aus.Select all 10 images in the folder and then Open.

  9. Fügen Sie dieser Gruppe von Bildern das Tag japanese cherry hinzu, und drücken Sie dieEINGABETASTE, um das Tag anzuwenden.Add the tag japanese cherry to this group of images and press enter to apply the tag.

  10. Wählen Sie 10 Dateien hochladen aus.Select Upload 10 files. Klicken Sie nach dem erfolgreichen Hochladen der Bilder auf Fertig.When the images are uploaded successfully, select Done.

  11. Wenn beide Gruppen von Bildern mit Tags versehen und hochgeladen wurden, wählen Sie Trainieren aus, um die Klassifizierung zu trainieren.When both sets of images are tagged and uploaded, select Train to train the classifier.

Exportieren Ihrer KlassifizierungExport your classifier

  1. Wählen Sie nach dem Trainieren Ihrer Klassifizierung auf der Leistungsseite der Klassifizierung die Option Exportieren aus.After training your classifier, select Export on the Performance page of the classifier.

    Exportieren Ihrer trainierten Bildklassifizierung

  2. Wählen Sie für die Plattform die Option DockerFile aus.Select DockerFile for the platform.

  3. Wählen Sie für die Version die Option Linux aus.Select Linux for the version.

  4. Wählen Sie Exportieren aus.Select Export.

    Exportieren als DockerFile mit Linux-Containern

  5. Wählen Sie nach Abschluss des Exportvorgangs Herunterladen aus, und speichern Sie das ZIP-Paket lokal auf Ihrem Computer.When the export is complete, select Download and save the .zip package locally on your computer. Extrahieren Sie alle Dateien aus dem Paket.Extract all files from the package. Diese Dateien werden verwendet, um ein IoT Edge-Modul zu erstellen, das den Bildklassifizierungsserver enthält.You'll use these files to create an IoT Edge module that contains the image classification server.

Sie haben Ihr Custom Vision-Projekt nun erstellt und trainiert.When you reach this point, you've finished creating and training your Custom Vision project. Die exportierten Dateien werden im nächsten Abschnitt verwendet. Die Arbeit an der Custom Vision-Webseite ist jedoch abgeschlossen.You'll use the exported files in the next section, but you're done with the Custom Vision web page.

Erstellen einer IoT Edge-ProjektmappeCreate an IoT Edge solution

Die Dateien für eine Containerversion Ihrer Bildklassifizierung befinden sich nun auf Ihrem Entwicklungscomputer.Now you have the files for a container version of your image classifier on your development machine. In diesem Abschnitt konfigurieren Sie den Bildklassifizierungscontainer für die Ausführung als IoT Edge-Modul.In this section, you configure the image classifier container to run as an IoT Edge module. Darüber hinaus erstellen Sie ein zweites Modul, das zusammen mit der Bildklassifizierung bereitgestellt wird.You also create a second module that will be deployed alongside the image classifier. Das zweite Modul richtet Anforderungen an die Klassifizierung und sendet die Ergebnisse als Nachrichten an IoT Hub.The second module posts requests to the classifier and sends the results as messages to IoT Hub.

Erstellen einer neuen LösungCreate a new solution

Eine Projektmappe ist eine logische Methode, um mehrerer Module für eine einzelne IoT Edge-Bereitstellung zu entwickeln und zu strukturieren.A solution is a logical way of developing and organizing multiple modules for a single IoT Edge deployment. Sie enthält Code für mindestens ein Modul sowie das Bereitstellungsmanifest, das die Konfiguration der Module auf einem IoT Edge-Gerät deklariert.A solution contains code for one or more modules as well as the deployment manifest that declares how to configure them on an IoT Edge device.

  1. Wählen Sie in Visual Studio Code Ansicht > Terminal aus, um das in Visual Studio Code integrierte Terminal zu öffnen.In Visual Studio Code, select View > Terminal to open the VS Code integrated terminal.

  2. Geben Sie im integrierten Terminal den folgenden Befehl ein, um Cookiecutter zu installieren (oder zu aktualisieren). Cookiecutter wird zum Erstellen der IoT Edge-Python-Modulvorlage in VS Code verwendet:In the integrated terminal, enter the following command to install (or update) cookiecutter, which you use to create the IoT Edge python module template in VS Code:

    pip install --upgrade --user cookiecutter
    

    Hinweis

    Vergewissern Sie sich, dass sich das Verzeichnis, in dem Cookiecutter installiert wird, im Path Ihrer Umgebung befindet, damit das Programm über eine Eingabeaufforderung aufgerufen werden kann.Ensure the directory where cookiecutter will be installed is in your environment’s Path in order to make it possible to invoke it from a command prompt.

  3. Klicken Sie auf Ansicht > Befehlspalette, um die VS Code-Befehlspalette zu öffnen.Select View > Command Palette to open the VS Code command palette.

  4. Geben Sie in der Befehlspalette den Befehl Azure IoT Edge: New IoT Edge Solution (Azure IoT Edge: Neue IoT Edge-Projektmappe) ein, und führen Sie ihn aus.In the command palette, enter and run the command Azure IoT Edge: New IoT Edge solution. Geben Sie in der Befehlspalette die folgenden Informationen an, um die Projektmappe zu erstellen:In the command palette, provide the following information to create your solution:

    FeldField WertValue
    Ordner auswählenSelect folder Wählen Sie den Speicherort auf Ihrem Entwicklungscomputer aus, an dem Visual Studio Code die Projektmappendateien erstellen soll.Choose the location on your development machine for VS Code to create the solution files.
    Provide a solution name (Projektmappennamen angeben)Provide a solution name Geben Sie für Ihre Projektmappe einen aussagekräftigen Namen ein (beispielsweise CustomVisionSolution), oder übernehmen Sie den Standardnamen.Enter a descriptive name for your solution, like CustomVisionSolution, or accept the default.
    Select module template (Modulvorlage auswählen)Select module template Wählen Sie Python-Modul aus.Choose Python Module.
    Provide a module name (Modulname angeben)Provide a module name Nennen Sie das Modul classifier.Name your module classifier.

    Wichtig: Der Name des Moduls muss in Kleinbuchstaben angegeben werden.It's important that this module name be lowercase. Bei Modulverweisen von IoT Edge wird die Groß-/Kleinschreibung berücksichtigt, und in dieser Projektmappe wird eine Bibliothek verwendet, die alle Anforderungen in Kleinbuchstaben formatiert.IoT Edge is case-sensitive when referring to modules, and this solution uses a library that formats all requests in lowercase.
    Provide Docker image repository for the module (Docker-Imagerepository für das Modul angeben)Provide Docker image repository for the module Ein Imagerepository enthält den Namen Ihrer Containerregistrierung und den Namen Ihres Containerimages.An image repository includes the name of your container registry and the name of your container image. Ihr Containerimage wird aus dem vorherigen Schritt übernommen.Your container image is prepopulated from the last step. Ersetzen Sie localhost:5000 durch den Anmeldeserverwert aus Ihrer Azure-Containerregistrierung.Replace localhost:5000 with the login server value from your Azure container registry. Den Anmeldeserver können Sie im Azure-Portal auf der Übersichtsseite Ihrer Containerregistrierung ermitteln.You can retrieve the login server from the Overview page of your container registry in the Azure portal. Die endgültige Zeichenfolge sieht wie folgt aus: <Registrierungsname>.azurecr.io/classifier.The final string looks like <registry name>.azurecr.io/classifier.

    Bereitstellen eines Docker-Imagerepositorys

Das Visual Studio Code-Fenster lädt den Arbeitsbereich für Ihre IoT Edge-Projektmappe.The Visual Studio Code window loads your IoT Edge solution workspace.

Hinzufügen von RegistrierungsanmeldeinformationenAdd your registry credentials

Die Umgebungsdatei speichert die Anmeldeinformationen für Ihre Containerregistrierung und gibt sie an die IoT Edge-Runtime weiter.The environment file stores the credentials for your container registry and shares them with the IoT Edge runtime. Die Runtime benötigt diese Anmeldeinformationen, um Ihre privaten Images per Pull auf das IoT Edge-Gerät zu übertragen.The runtime needs these credentials to pull your private images onto the IoT Edge device.

  1. Öffnen Sie im VS Code-Explorer die ENV-Datei.In the VS Code explorer, open the .env file.
  2. Aktualisieren Sie die Felder mit den Werten für Benutzername und Kennwort, die Sie aus der Azure-Containerregistrierung kopiert haben.Update the fields with the username and password values that you copied from your Azure container registry.
  3. Speichern Sie diese Datei.Save this file.

Auswählen Ihrer ZielarchitekturSelect your target architecture

Mit Visual Studio Code können derzeit Module für Linux AMD64- und Linux ARM32v7-Geräte entwickelt werden.Currently, Visual Studio Code can develop modules for Linux AMD64 and Linux ARM32v7 devices. Sie müssen bei jeder Projektmappe auswählen, welche Architektur Sie als Ziel verwenden möchten, weil der Container für jeden Architekturtyp unterschiedlich erstellt und ausgeführt wird.You need to select which architecture you're targeting with each solution, because the container is built and run differently for each architecture type. Der Standardwert ist „Linux AMD64“.The default is Linux AMD64.

  1. Öffnen Sie die Befehlspalette, und suchen Sie nach Azure IoT Edge: Set Default Target Platform for Edge Solution (Standardzielplattform für Edge-Projektmappe festlegen), oder wählen Sie das Verknüpfungssymbol in der Seitenleiste unten im Fenster aus.Open the command palette and search for Azure IoT Edge: Set Default Target Platform for Edge Solution, or select the shortcut icon in the side bar at the bottom of the window.

  2. Wählen Sie in der Befehlspalette die Zielarchitektur aus der Liste mit Optionen aus.In the command palette, select the target architecture from the list of options. Weil in diesem Tutorial ein virtueller Ubuntu-Computer als IoT Edge-Gerät verwendet wird, behalten wir den Standardwert amd64 bei.For this tutorial, we're using an Ubuntu virtual machine as the IoT Edge device, so will keep the default amd64.

Hinzufügen Ihrer BildklassifizierungAdd your image classifier

Die Python-Modulvorlage in Visual Studio Code enthält Beispielcode, den Sie zum Testen von IoT Edge ausführen können.The Python module template in Visual Studio code contains some sample code that you can run to test IoT Edge. Dieser Code wird allerdings in diesem Szenario nicht verwendet.You won't use that code in this scenario. Gehen Sie stattdessen wie in diesem Abschnitt beschrieben vor, um den Beispielcode durch den Bildklassifizierungscontainer zu ersetzen, den Sie zuvor exportiert haben.Instead, use the steps in this section to replace the sample code with the image classifier container that you exported previously.

  1. Navigieren Sie in Ihrem Datei-Explorer zu dem Custom Vision-Paket, das Sie heruntergeladen und extrahiert haben.In your file explorer, browse to the Custom Vision package that you downloaded and extracted. Kopieren Sie den gesamten Inhalt aus dem extrahierten Paket.Copy all the contents from the extracted package. Dieser sollte zwei Ordner (app und azureml) sowie zwei Dateien (Dockerfile und README) umfassen.It should be two folders, app and azureml, and two files, Dockerfile and README.

  2. Navigieren Sie in Ihrem Datei-Explorer zu dem Verzeichnis, das Sie Visual Studio Code gegenüber als Zielverzeichnis für die Erstellung Ihrer IoT Edge-Projektmappe angegeben haben.In your file explorer, browse to the directory where you told Visual Studio Code to create your IoT Edge solution.

  3. Öffnen Sie den Ordner des Klassifizierungsmoduls.Open the classifier module folder. Sofern Sie im vorherigen Abschnitt die vorgeschlagenen Namen verwendet haben, sieht die Ordnerstruktur wie folgt aus: CustomVisionSolution/modules/classifier.If you used the suggested names in the previous section, the folder structure looks like CustomVisionSolution / modules / classifier.

  4. Fügen Sie die Dateien in den Ordner classifier ein.Paste the files into the classifier folder.

  5. Wechseln Sie wieder zum Visual Studio Code-Fenster.Return to the Visual Studio Code window. Im Arbeitsbereich Ihrer Projektmappe sollten nun im Modulordner die Bildklassifizierungsdateien angezeigt werden.Your solution workspace should now show the image classifier files in the module folder.

    Arbeitsbereich der Projektmappe mit Bildklassifizierungsdateien

  6. Öffnen Sie im Ordner „classifier“ die Datei module.json.Open the module.json file in the classifier folder.

  7. Aktualisieren Sie den Parameter platforms, sodass er auf das neue Dockerfile verweist, das Sie hinzugefügt haben. Entfernen Sie außerdem die ARM32-Architektur und die AMD64.debug-Optionen. Diese werden derzeit für das Custom Vision-Modul nicht unterstützt.Update the platforms parameter to point to the new Dockerfile that you added, and remove the ARM32 architecture and AMD64.debug options, which currently aren't supported for the Custom Vision module.

    "platforms": {
        "amd64": "./Dockerfile"
    }
    
  8. Speichern Sie die Änderungen.Save your changes.

Erstellen eines simulierten KameramodulsCreate a simulated camera module

Bei einer echten Custom Vision-Bereitstellung wäre eine Kamera vorhanden, die Livebilder oder Videostreams bereitstellt.In a real Custom Vision deployment, you would have a camera providing live images or video streams. In diesem Szenario simulieren Sie die Kamera, indem Sie ein Modul erstellen, das ein Testbild an die Bildklassifizierung sendet.For this scenario, you simulate the camera by building a module that sends a test image to the image classifier.

Hinzufügen und Konfigurieren eines neuen ModulsAdd and configure a new module

In diesem Abschnitt fügen Sie der gleichen Custom Vision-Projektmappe (CustomVisionSolution) ein neues Modul hinzu und stellen Code bereit, um die simulierte Kamera zu erstellen.In this section, you add a new module to the same CustomVisionSolution and provide code to create the simulated camera.

  1. Führen Sie im gleichen Visual Studio Code-Fenster über die Befehlspalette den Befehl Azure IoT Edge: Add IoT Edge Module (Azure IoT Edge: IoT Edge-Modul hinzufügen) aus.In the same Visual Studio Code window, use the command palette to run Azure IoT Edge: Add IoT Edge Module. Geben Sie in der Befehlspalette die folgenden Informationen für Ihr neues Modul an:In the command palette, provide the following information for your new module:

    PromptPrompt WertValue
    Select deployment template file (Bereitstellungsvorlagendatei auswählen)Select deployment template file Wählen Sie die Datei „deployment.template.json“ aus dem Ordner „CustomVisionSolution“ aus.Select the deployment.template.json file in the CustomVisionSolution folder.
    Select module template (Modulvorlage auswählen)Select module template Wählen Sie Python-Modul aus.Select Python Module
    Provide a module name (Modulname angeben)Provide a module name Nennen Sie Ihr Modul cameraCapture.Name your module cameraCapture
    Provide Docker image repository for the module (Docker-Imagerepository für das Modul angeben)Provide Docker image repository for the module Ersetzen Sie localhost:5000 durch den Anmeldeserverwert für Ihre Azure-Containerregistrierung.Replace localhost:5000 with the login server value for your Azure container registry. Die endgültige Zeichenfolge sieht wie folgt aus: <Registrierungsname>.azurecr.io/cameracapture.The final string looks like <registryname>.azurecr.io/cameracapture.

    Das VS Code-Fenster lädt Ihr neues Modul in den Arbeitsbereich der Projektmappe und aktualisiert die Datei „deployment.template.json“.The VS Code window loads your new module in the solution workspace, and updates the deployment.template.json file. Nun sollten zwei Modulordner angezeigt werden: „classifier“ und „cameraCapture“.Now you should see two module folders: classifier and cameraCapture.

  2. Öffnen Sie die Datei main.py im Ordner modules / cameraCapture.Open the main.py file in the modules / cameraCapture folder.

  3. Ersetzen Sie die gesamte Datei durch den folgenden Code.Replace the entire file with the following code. Dieser Beispielcode sendet POST-Anforderungen an den im Klassifizierungsmodul ausgeführten Bildverarbeitungsdienst.This sample code sends POST requests to the image-processing service running in the classifier module. Für diesen Modulcontainer stellen wir ein Beispielbild bereit, das in den Anforderungen verwendet werden kann.We provide this module container with a sample image to use in the requests. Anschließend wird die Antwort als IoT Hub-Nachricht verpackt und an eine Ausgabewarteschlange gesendet.It then packages the response as an IoT Hub message and sends it to an output queue.

    # 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
    
    import iothub_client
    # pylint: disable=E0611
    from iothub_client import IoTHubModuleClient, IoTHubClientError, IoTHubTransportProvider
    from iothub_client import IoTHubMessage, IoTHubMessageDispositionResult, IoTHubError
    # pylint: disable=E0401
    
    # messageTimeout - the maximum time in milliseconds until a message times out.
    # The timeout period starts at IoTHubModuleClient.send_event_async.
    MESSAGE_TIMEOUT = 10000
    
    # Choose HTTP, AMQP or MQTT as transport protocol.  
    PROTOCOL = IoTHubTransportProvider.MQTT
    
    # global counters
    SEND_CALLBACKS = 0
    
    # Send a message to IoT Hub
    # Route output1 to $upstream in deployment.template.json
    def send_to_hub(strMessage):
        message = IoTHubMessage(bytearray(strMessage, 'utf8'))
        hubManager.send_event_to_output("output1", message, 0)
    
    # Callback received when the message that we send to IoT Hub is processed.
    def send_confirmation_callback(message, result, user_context):
        global SEND_CALLBACKS
        SEND_CALLBACKS += 1
        print ( "Confirmation received for message with result = %s" % result )
        print ( "   Total calls confirmed: %d \n" % SEND_CALLBACKS )
    
    # 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("Response from classification service: (" + str(response.status_code))
    
        return json.dumps(response.json())
    
    class HubManager(object):
        def __init__(self, protocol, message_timeout):
            self.client_protocol = protocol
            self.client = IoTHubModuleClient()
            self.client.create_from_environment(protocol)
            # set the time until a message times out
            self.client.set_option("messageTimeout", message_timeout)
    
        # Sends a message to an output queue, to be routed by IoT Edge hub. 
        def send_event_to_output(self, outputQueueName, event, send_context):
            self.client.send_event_async(
                outputQueueName, event, send_confirmation_callback, send_context)
    
    def main(imagePath, imageProcessingEndpoint):
        try:
            print ( "Simulated camera module for Azure IoT Edge. Press Ctrl-C to exit." )
    
            try:
                global hubManager 
                hubManager = HubManager(PROTOCOL, MESSAGE_TIMEOUT)
            except IoTHubError as iothub_error:
                print ( "Unexpected error %s from IoTHub" % iothub_error )
                return
    
            print ( "The sample is now sending images for processing and will indefinitely.")
    
            while True:
                classification = sendFrameForProcessing(imagePath, imageProcessingEndpoint)
                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. Speichern Sie die Datei main.py.Save the main.py file.

  5. Öffnen Sie die Datei requirements.txt.Open the requrements.txt file.

  6. Fügen Sie eine neue Zeile für eine Bibliothek hinzu, die in den Container aufgenommen werden soll.Add a new line for a library to include in the container.

    requests
    
  7. Speichern Sie die Datei requirements.txt .Save the requirements.txt file.

Hinzufügen eines Testbilds zu dem ContainerAdd a test image to the container

Wir verwenden in diesem Szenario keinen Bildfeed von einer echten Kamera, sondern ein einzelnes Testbild.Instead of using a real camera to provide an image feed for this scenario, we're going to use a single test image. Ein Testbild ist in dem GitHub-Repository enthalten, das Sie weiter oben in diesem Tutorial für die Trainingsbilder heruntergeladen haben.A test image is included in the GitHub repo that you downloaded for the training images earlier in this tutorial.

  1. Navigieren Sie zu dem Testbild. Es befindet sich unter Cognitive-CustomVision-Windows / Samples / Images / Test.Navigate to the test image, located at Cognitive-CustomVision-Windows / Samples / Images / Test.

  2. Kopieren Sie test_image.jpg.Copy test_image.jpg

  3. Navigieren Sie zum Verzeichnis Ihrer IoT Edge-Projektmappe, und fügen Sie das Testbild in den Ordner modules / cameraCapture ein.Browse to your IoT Edge solution directory and paste the test image in the modules / cameraCapture folder. Das Bild muss sich im gleichen Ordner befinden wie die Datei „main.py“, die Sie im vorherigen Abschnitt bearbeitet haben.The image should be in the same folder as the main.py file that you edited in the previous section.

  4. Öffnen Sie in Visual Studio Code die Datei Dockerfile.amd64 für das cameraCapture-Modul.In Visual Studio Code, open the Dockerfile.amd64 file for the cameraCapture module. (ARM32 wird vom Custom Vision-Modul derzeit nicht unterstützt.)(ARM32 is not currently supported by the Custom Vision module).

  5. Fügen Sie nach der Zeile, die das Arbeitsverzeichnis (WORKDIR /app) festlegt, die folgende Codezeile hinzu:After the line that establishes the working directory, WORKDIR /app, add the following line of code:

    ADD ./test_image.jpg .
    
  6. Speichern Sie das Dockerfile.Save the Dockerfile.

Vorbereiten eines BereitstellungsmanifestsPrepare a deployment manifest

Sie haben in diesem Tutorial ein Custom Vision-Modell trainiert, um Bilder von Bäumen zu klassifizieren, und dieses Modell als IoT Edge-Modul verpackt.So far in this tutorial you've trained a Custom Vision model to classify images of trees, and packaged that model up as an IoT Edge module. Anschließend haben Sie ein zweites Modul erstellt, das den Bildklassifizierungsserver abfragen und die Ergebnisse an IoT Hub zurückgeben kann.Then, you created a second module that can query the image classification server and report its results back to IoT Hub. Als Nächstes können Sie das Bereitstellungsmanifest erstellen, das gegenüber einem IoT Edge-Gerät angibt, wie diese beiden Module gestartet und gemeinsam ausgeführt werden.Now, you're ready to create the deployment manifest that will tell an IoT Edge device how to start and run these two modules together.

Die IoT Edge-Erweiterung für Visual Studio Code stellt in jeder IoT Edge-Projektmappe eine Vorlage bereit, die Sie beim Erstellen eines Bereitstellungsmanifests unterstützt.The IoT Edge extension for Visual Studio Code provides a template in each IoT Edge solution to help you create a deployment manifest.

  1. Öffnen Sie die Datei deployment.template.json aus dem Projektmappenordner.Open the deployment.template.json file in the solution folder.

  2. Navigieren Sie zum Abschnitt modules. Er sollte drei Module enthalten: die beiden, die Sie erstellt haben (also „classifier“ und „cameraCapture“), und ein drittes (tempSensor), das standardmäßig vorhanden ist.Find the modules section, which should contain three modules: the two that you created, classifier and cameraCapture, and a third that's included by default, tempSensor.

  3. Löschen Sie das Modul tempSensor zusammen mit allen dazugehörigen Parametern.Delete the tempSensor module with all of its parameters. Dieses Modul dient zur Bereitstellung von Beispieldaten für Testszenarien und wird in dieser Bereitstellung nicht benötigt.This module is included to provide sample data for test scenarios, but we don't need it in this deployment.

  4. Sollten Sie das Bildklassifizierungsmodul nicht classifier genannt haben, überprüfen Sie nun den Namen, und vergewissern Sie sich, dass er vollständig in Kleinbuchstaben angegeben ist.If you named the image classification module something other than classifier, check the name now and ensure that it's all lowercase. Das Modul „cameraCapture“ ruft das Modul „classifier“ unter Verwendung einer Anforderungsbibliothek auf, die alle Anforderungen in Kleinbuchstaben formatiert, und von IoT Edge wird die Groß-/Kleinschreibung berücksichtigt.The cameraCapture module calls the classifier module using a requests library that formats all requests in lowercase, and IoT Edge is case-sensitive.

  5. Aktualisieren Sie den Parameter createOptions für das Modul „cameraCapture“ mit dem folgenden JSON-Code.Update the createOptions parameter for the cameraCapture module with the following JSON. Diese Informationen erstellen Umgebungsvariablen im Modulcontainer, die im Prozess „main.py“ abgerufen werden.This information creates environment variables in the module container that are retrieved in the main.py process. Durch Einbeziehung dieser Informationen in das Bereitstellungsmanifest können Sie das Image oder den Endpunkt ändern, ohne das Modulimage neu zu erstellen.By including this information in the deployment manifest, you can change the image or endpoint without having to rebuild the module image.

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

    Falls Sie Ihr Custom Vision-Modul nicht classifier genannt haben, aktualisieren Sie den Wert des Bildverarbeitungsendpunkts entsprechend.If you named your Custom Vision module something other than classifier, update the image-processing endpoint value to match.

  6. Aktualisieren Sie am Ende der Datei den Parameter routes für das Modul „$edgeHub“.At the bottom of the file, update the routes parameter for the $edgeHub module. Die Vorhersageergebnisse sollen von „cameraCapture“ an IoT Hub weitergeleitet werden.You want to route the prediction results from cameraCapture to IoT Hub.

        "routes": {
          "CameraCaptureToIoTHub": "FROM /messages/modules/cameraCapture/outputs/* INTO $upstream"
        },
    

    Falls Sie Ihr zweites Modul nicht cameraCapture genannt haben, aktualisieren Sie den Routenwert entsprechend.If you named your second module something other than cameraCapture, update the route value to match.

  7. Speichern Sie die Datei deployment.template.json.Save the deployment.template.json file.

Erstellen und Bereitstellen Ihrer IoT Edge-ProjektmappeBuild and deploy your IoT Edge solution

Nachdem Sie die beiden Module erstellt und die Bereitstellungsmanifestvorlage konfiguriert haben, können Sie die Containerimages erstellen und an Ihre Containerregistrierung pushen.With both modules created and the deployment manifest template configured, you're ready to build the container images and push them to your container registry.

Sobald sich die Images in Ihrer Registrierung befinden, können Sie die Projektmappe auf einem IoT Edge-Gerät bereitstellen.Once the images are in your registry, you can deploy the solution to an IoT Edge device. Sie können über IoT Hub Module auf einem Gerät festlegen, können jedoch auch über Visual Studio Code auf IoT Hub und Geräte zugreifen.You can set modules on a device through the IoT Hub, but you can also access your IoT Hub and devices through Visual Studio Code. In diesem Abschnitt richten Sie den Zugriff auf Ihre IoT Hub-Instanz ein und stellen dann mithilfe von VS Code Ihre Projektmappe auf dem IoT Edge-Gerät bereit.In this section, you set up access to your IoT Hub then use VS Code to deploy your solution to your IoT Edge device.

Erstellen Sie zunächst Ihre Projektmappe, und pushen Sie sie an Ihre Containerregistrierung.First, build and push your solution to your container registry.

  1. Klicken Sie im VS Code-Explorer mit der rechten Maustaste auf die Datei deployment.template.json, und wählen Sie anschließend Build and Push IoT Edge solution (IoT Edge-Projektmappe erstellen und übertragen) aus.In the VS Code explorer, right-click the deployment.template.json file and select Build and push IoT Edge solution. Sie können den Status dieses Vorgangs im integrierten Terminal in VS Code nachverfolgen.You can watch the progress of this operation in the integrated terminal in VS Code.
  2. Beachten Sie, dass Ihrer Projektmappe der neue Ordner config hinzugefügt wurde. Erweitern Sie diesen Ordner, und öffnen Sie die darin enthaltene Datei deployment.json.Notice that a new folder was added to your solution, config. Expand this folder and open the deployment.json file inside.
  3. Überprüfen Sie die Informationen in der Datei „deployment.json“.Review the information in the deployment.json file. Die Datei „deployment.json“ wird auf der Grundlage der von Ihnen konfigurierten Bereitstellungsvorlagendatei und der Informationen aus der Projektmappe (einschließlich der ENV-Datei und der Dateien vom Typ „module.json“) automatisch erstellt bzw. aktualisiert.The deployment.json file is created (or updated) automatically based on the deployment template file that you configured and information from the solution, including the .env file and the module.json files.

Wählen Sie als Nächstes Ihr Gerät aus, und stellen Sie Ihre Projektmappe bereit.Next, select your device and deploy your solution.

  1. Erweitern Sie im VS Code-Explorer den Abschnitt Azure IoT Hub-Geräte.In the VS Code explorer, expand the Azure IoT Hub Devices section.
  2. Klicken Sie mit der rechten Maustaste auf das Gerät, das als Ziel für die Bereitstellung festgelegt werden soll, und klicken Sie auf Create deployment for single device (Bereitstellung für einzelnes Gerät erstellen).Right-click on the device that you want to target with your deployment and select Create deployment for single device.
  3. Navigieren Sie im Datei-Explorer zum Ordner config der Projektmappe, und klicken Sie auf deployment.json.In the file explorer, navigate to the config folder inside your solution and choose deployment.json. Klicken Sie auf Select Edge Deployment Manifest (Edge-Bereitstellungsmanifest auswählen).Click Select Edge deployment manifest.

War die Bereitstellung erfolgreich, wird in VS Code eine Bestätigungsnachricht ausgegeben.If the deployment is successful, a confirmation message is printed in the VS Code output. Erweitern Sie im VS Code-Explorer die Details des IoT Edge-Geräts, das Sie für diese Bereitstellung verwendet haben.In the VS Code explorer, expand the details about the IoT Edge device that you used for this deployment. Zeigen Sie mit dem Cursor auf den Header Azure IoT Hub-Geräte, um die Aktualisierungsschaltfläche zu aktivieren, falls die Module nicht sofort angezeigt werden.Hover your cursor on the Azure IoT Hub Devices header to enable the refresh button if the modules don't show up right away. Es kann etwas dauern, bis die Module gestartet wurden und mit IoT Hub kommunizieren.It may take a few moments for the modules to start and report back to IoT Hub.

Sie können auch direkt auf dem Gerät überprüfen, ob alle Module ausgeführt werden.You can also check to see that all the modules are up and running on your device itself. Führen Sie auf dem IoT Edge-Gerät den folgenden Befehl aus, um den Status der Module anzuzeigen.On your IoT Edge device, run the following command to see the status of the modules. Es kann etwas dauern, bis die Module gestartet wurden.It may take a few moments for the modules to start.

iotedge list

Anzeigen der KlassifizierungsergebnisseView classification results

Die Ergebnisse Ihrer Module können auf zwei Arten angezeigt werden: auf dem Gerät selbst, wenn die Nachrichten generiert und gesendet werden, oder über Visual Studio Code, wenn die Nachrichten bei IoT Hub eingehen.There are two ways to view the results of your modules, either on the device itself as the messages are generated and sent, or from Visual Studio Code as the messages arrive at IoT Hub.

Zeigen Sie auf Ihrem Gerät die Protokolle des Moduls „cameraCapture“ an, um die gesendeten Nachrichten und die Empfangsbestätigung von IoT Hub zu sehen.From your device, view the logs of the cameraCapture module to see the messages being sent and the confirmation that they were received by IoT Hub.

iotedge logs cameraCapture

Klicken Sie in Visual Studio Code mit der rechten Maustaste auf den Namen Ihres IoT Edge-Geräts, und wählen Sie Start Monitoring Built-in Event Endpoint (Überwachung des integrierten Ereignisendpunkts starten) aus.From Visual Studio Code, right-click on the name of your IoT Edge device and select Start Monitoring Built-in Event Endpoint.

Die Ergebnisse aus dem Custom Vision-Modul werden in Form von Nachrichten vom Modul „cameraCapture“ gesendet und enthalten die Angabe, mit welcher Wahrscheinlichkeit es sich bei dem Bild um ein Bild einer Hemlocktanne oder eines Kirschbaums handelt.The results from the Custom Vision module, which are sent as messages from the cameraCapture module, include the probability that the image is of either a hemlock or cherry tree. Da auf dem Bild eine Hemlocktanne zu sehen ist, sollte die Wahrscheinlichkeit bei 1.0 liegen.Since the image is hemlock, you should see the probability as 1.0.

Bereinigen von RessourcenClean up resources

Falls Sie mit dem nächsten empfohlenen Artikel fortfahren möchten, können Sie die erstellten Ressourcen und Konfigurationen beibehalten und wiederverwenden.If you plan to continue to the next recommended article, you can keep the resources and configurations that you created and reuse them. Sie können auch dasselbe IoT Edge-Gerät als Testgerät weiter nutzen.You can also keep using the same IoT Edge device as a test device.

Andernfalls können Sie die in diesem Artikel verwendeten lokalen Konfigurationen und die Azure-Ressourcen löschen, um Kosten zu vermeiden.Otherwise, you can delete the local configurations and the Azure resources that you used in this article to avoid charges.

Löschen von Azure-RessourcenDelete Azure resources

Das Löschen von Azure-Ressourcen und -Ressourcengruppen kann nicht rückgängig gemacht werden.Deleting Azure resources and resource groups is irreversible. Achten Sie daher darauf, dass Sie nicht versehentlich die falsche Ressourcengruppe oder die falschen Ressourcen löschen.Make sure that you don't accidentally delete the wrong resource group or resources. Wenn Sie die IoT Hub-Ressource in einer bereits vorhandenen Ressourcengruppe erstellt haben, die Ressourcen enthält, die Sie behalten möchten, löschen Sie nicht die Ressourcengruppe, sondern nur die IoT Hub-Ressource.If you created the IoT hub inside an existing resource group that has resources that you want to keep, delete only the IoT hub resource itself, instead of deleting the resource group.

So löschen Sie die Ressourcen:To delete the resources:

  1. Melden Sie sich beim Azure-Portal an, und klicken Sie auf Ressourcengruppen.Sign in to the Azure portal and select Resource groups.

  2. Wählen Sie den Namen der Ressourcengruppe aus, die Ihre IoT Edge-Testressourcen enthält.Select the name of the resource group that contains your IoT Edge test resources.

  3. Überprüfen Sie die Liste der Ressourcen in Ihrer Ressourcengruppe.Review the list of resources contained in your resource group. Wenn Sie alle löschen möchten, klicken Sie auf Ressourcengruppe löschen.If you want to delete all of them, you can select Delete resource group. Wenn Sie nur einige Ressourcen löschen möchten, klicken Sie auf die jeweiligen Ressourcen, um sie einzeln zu löschen.If you want to delete only some of them, you can click into each resource to delete them individually.

Nächste SchritteNext steps

In diesem Tutorial haben Sie ein Custom Vision-Modell trainiert und als Modul auf einem IoT Edge-Gerät bereitgestellt.In this tutorial, you trained a Custom Vision model and deployed it as a module onto an IoT Edge device. Anschließend haben Sie ein Modul erstellt, das den Bildklassifizierungsdienst abfragen und die Ergebnisse an IoT Hub zurückgeben kann.Then you built a module that can query the image classification service and report its results back to IoT Hub.

Eine ausführlichere Version dieses Szenarios mit einem Livekamerafeed finden Sie im GitHub-Projekt Custom Vision + Azure IoT Edge on a Raspberry Pi 3 (Custom Vision und Azure IoT Edge auf einem Raspberry Pi 3).If you want to try a more in-depth version of this scenario with a live camera feed, see the Custom Vision and Azure IoT Edge on a Raspberry Pi 3 GitHub project.

Sie können mit den nächsten Tutorials fortfahren, um andere Möglichkeiten kennenzulernen, wie Azure IoT Edge Ihnen beim Umwandeln von Daten in geschäftliche Erkenntnisse auf Edge-Ebene helfen kann.Continue on to the next tutorials to learn about other ways that Azure IoT Edge can help you turn data into business insights at the edge.