Übung: Schreiben einer Funktions-App in Azure Functions zum Analysieren von Fotos

Abgeschlossen

In dieser Lerneinheit verwenden Sie Azure Functions, um eine App zu schreiben, die jedes Mal ausgelöst wird, wenn ein Bild in den Container photos in Ihrem Speicherkonto hochgeladen wird. Die Funktions-App verwendet das Custom Vision-Modell, um zu bestimmen, ob das Foto einen Eisbären zeigt.

Erstellen einer Funktions-App in Azure

Sie können eine Funktions-App in Azure Functions im Azure-Portal oder extern schreiben, indem Sie Tools wie Visual Studio verwenden. In dieser Übung schreiben Sie eine Funktions-App im Portal. Sie verwenden JavaScript, um die Funktions-App zu schreiben, und Sie führen die Funktions-App mit der Node.js-Runtime von Azure Functions aus. Die Funktions-App wird jedes Mal ausgelöst, wenn ein Bild in den Container photos hochgeladen wird, den Sie in Blob Storage erstellt haben. Anschließend übergibt die Funktions-App jedes Blob, das hochgeladen wird, an Custom Vision, um zu analysieren, ob Eisbären enthalten sind.

  1. Kehren Sie in Ihrem Browser zum Azure-Portal zurück. Wählen Sie unter Azure-Dienste die Option Ressource erstellen aus. Wählen Sie im Ressourcenmenü Compute und dann Funktions-App aus.

    Screenshot that shows numbered elements in the Azure portal that you select to create a new function app resource.

    Erstellen einer neuen Funktions-App in Azure

  2. Geben Sie unter Funktions-App erstellen auf der Registerkarte Grundlagen die folgenden Werte ein, oder wählen Sie sie aus:

    • Abonnement: Wählen Sie das zu verwendende Abonnement aus.
    • Ressourcengruppe: Wählen Sie polar-bear-rg aus.
    • Name der Funktions-App: Geben Sie einen Namen ein, der in Azure für Ihre neue App eindeutig ist.
    • Veröffentlichen: Lassen Sie Code ausgewählt.
    • Runtime-Stapel: Wählen Sie Node.js aus.
    • Region: Wählen Sie USA, Süden-Mitte aus.
    • Betriebssystem: Wählen Sie Ihr System aus.
    • Plantyp: Wählen Sie Verbrauch (serverlos) aus.
    • Wählen Sie Weiter: Hosting aus.

    Screenshot that shows the basic settings to select or enter for a new function app.

    Konfigurieren der grundlegenden Einstellungen für eine neue Funktions-App

  3. Wählen Sie auf der Registerkarte Hosting das Speicherkonto aus, das Sie zum Hochladen von Wildtierfotos erstellt haben. Wählen Sie dann Überprüfen + erstellen aus.

    Screenshot that shows the hosting tab settings for a new function app.

    Konfigurieren der Hostingeinstellungen für eine neue Funktions-App

  4. Warten Sie, bis die Überprüfung abgeschlossen ist, und wählen Sie dann Erstellen aus.

  5. Warten Sie, bis die Funktions-App bereitgestellt wurde, und öffnen Sie die App dann im Azure-Portal. Wählen Sie im Ressourcenmenü unter Functions die Option Funktionen aus, und wählen Sie dann Erstellen aus.

    Screenshot that highlights the elements to select to add a function in the Azure portal.

    Hinzufügen einer Funktion

  6. Gehen Sie unter Funktion hinzufügen folgendermaßen vor:

    1. Wählen Sie für Entwicklungsumgebung die Option Im Portal entwickeln aus.
    2. Wählen Sie unter Vorlage die Option Azure Blob Storage-Trigger aus.

    Screenshot that highlights the elements to select for a new function.

    Konfigurieren der Einstellungen und Auswählen einer Vorlage für eine Funktion

    Hinweis

    Wenn Sie aufgefordert werden, die Microsoft.Azure.WebJobs.Extensions.Storage-Erweiterung zu installieren, wählen Sie Installieren aus.

    Warten Sie, bis die Installation abgeschlossen ist, und wählen Sie dann Fortsetzen aus.

    (Wenn Sie nicht aufgefordert werden, die Erweiterung zu installieren, müssen Sie möglicherweise einige Minuten warten, bevor Sie mit dem nächsten Schritt fortfahren können.)

  7. Gehen Sie unter Vorlagendetails folgendermaßen vor:

    1. Geben Sie für Neue Funktion die Angabe BlobTrigger ein.

    2. Geben Sie als Pfadphotos/{Name} ein, sodass die Funktions-App ausgelöst wird, wenn Blobs in den Container photos hochgeladen werden.

    3. Wählen Sie unter Speicherkontoverbindung die Option Neu aus.

      Hinweis

      Kopieren und speichern Sie den Wert, der in Speicherkontoverbindung angezeigt wird. Der Wert wird in einem späteren Schritt verwendet.

    4. Wählen Sie unter Neue Speicherkontoverbindung das zuvor erstellte Speicherkonto aus, und klicken Sie dann auf OK.

    Screenshot that shows settings to use to set up the template to create a blob-triggered function.

    Konfigurieren der Vorlage zum Erstellen einer durch ein Blob ausgelösten Funktion

  8. Wählen Sie Hinzufügen. Die Portalansicht wird geändert, um die neue App anzuzeigen.

  9. Wählen Sie auf der Übersichtsseite für die neue Triggerfunktion unter Developer die Option Programmieren und testen aus. Die Datei index.js für den Trigger wird im Portal geöffnet.

    Screenshot that highlights the portal elements to select to open the index dot J S file for the blob-triggered function.

    Öffnen der Datei „index.js“ für die Triggerfunktion

  10. Kopieren Sie den folgenden Code, und ersetzen Sie den Code der Funktions-App im Azure-Portal durch den folgenden Code:

    module.exports = function (context, myBlob) {
        var predictionUrl = process.env.PREDICTION_URL;
        var predictionKey = process.env.PREDICTION_KEY;
        var storageConnectionString = process.env.<CONNECTION_STRING_NAME>;
    
        var storage = require('azure-storage');
        var blobService = storage.createBlobService(storageConnectionString);
        var blobName = context.bindingData.name;
        var blobUri = context.bindingData.uri;
    
        // Read the blob's metadata
        blobService.getBlobMetadata('photos', blobName, (err, result, response) => {
            if (!err) {
                var latitude = result.metadata.latitude;
                var longitude = result.metadata.longitude;
                var id = result.metadata.id;
    
                // Generate a shared access signature for the Custom Vision service
                var now = new Date();
                var expiry = new Date(now).setMinutes(now.getMinutes() + 3);
    
                var policy = {
                    AccessPolicy: {
                        Permissions: storage.BlobUtilities.SharedAccessPermissions.READ,
                        Start: now,
                        Expiry: expiry
                    },
                };
    
                var sas = blobService.generateSharedAccessSignature('photos', blobName, policy);
    
                // Pass the blob URL to the Custom Vision service
                var request = require('request');
    
                var options = {
                    url: predictionUrl,
                    method: 'POST',
                    headers: {
                        'Prediction-Key': predictionKey
                    },
                    body: {
                        'Url': blobUri + '?' + sas
                    },
                    json: true
                };
    
                request(options, (err, result, body) => {
                    if (!err) {
                        var probability =  body.predictions.find(p => p.tagName.toLowerCase() === 'polar-bear').probability;
                        var isPolarBear = probability > 0.8; // 80% threshold
                         if (isPolarBear) {
                            context.log('POLAR BEAR detected by ' + id + ' at ' + latitude + ', ' + longitude);
                        }
                        else {
                            context.log('Other wildlife detected by ' + id + ' at ' + latitude + ', ' + longitude);
                        }
    
                        context.done();
                    }
                    else {
                        context.log(err);
                        context.done();
                    }
                });
            }
            else {
                context.log(err);
                context.done();
            }
        });
    };
    

    Die geänderte Funktions-App verwendet das request-Modul von npm, um Custom Vision Service aufzurufen, wobei die URL des zu analysierenden Bilds übergeben wird. Die App analysiert die JSON-Ergebnisse und ruft den Wert für die Wahrscheinlichkeit ab, dass das Bild einen Eisbären enthält. Anschließend werden die Ergebnisse in das Ausgabeprotokoll geschrieben. Der Schwellenwert für die Bestimmung, ob ein Bild einen Eisbären enthält, liegt bei 80 Prozent:

    var isPolarBear = probability > 0.8; // 80% threshold
    

    Ein weiterer wesentlicher Aspekt dieses Codes ist die Verwendung einer Shared Access Signature SAS.

    Der von Ihnen erstellte Container photos ist privat. Um auf die dort gespeicherten Blobs zugreifen zu können, müssen Sie über Zugriff auf das Speicherkonto oder den Zugriffsschlüssel des Speicherkontos verfügen. Eine Shared Access Signature ermöglicht es anderen Benutzern und Diensten, auf einzelne Blobs zuzugreifen, jedoch nur für eine bestimmte Zeitspanne und optional nur mit Lesezugriff.

    Der Code, den Sie im Portal eingefügt haben, verwendet das Azure Storage SDK für Node.js (azure-storage), um eine schreibgeschützte Shared Access Signature für das Blob zu generieren, das der an Custom Vision übergebenen URL zugeordnet ist. Der Code fügt die Shared Access Signature als Abfragezeichenfolge an die Blob-URL an. Die Shared Access Signature ist 3 Minuten lang gültig und ermöglicht nur Lesezugriff. Ihr Code kann private Blobs zur Analyse an Custom Vision übermitteln, ohne die Blobs in einem öffentlichen Container zu speichern, aus dem sie jeder beliebige Benutzer herunterladen könnte.

  11. Ersetzen Sie <CONNECTION_STRING_NAME> in Zeile 4 durch die Speicherkonto-Verbindungszeichenfolge, die Sie zuvor gespeichert haben (z. B. polarbearstorage_STORAGE). Diese Verbindungszeichenfolge wurde den Anwendungseinstellungen hinzugefügt, als Sie der Funktions-App die Funktion BlobTrigger hinzugefügt haben. Ihr Name leitet sich vom Namen des Speicherkonto ab. Wenn erforderlich, können Sie die Verbindungszeichenfolge für das Speicherkonto in den Anwendungseinstellungen der Funktions-App nachschlagen.

    Nachdem Sie die Speicherkonto-Verbindungszeichenfolge hinzugefügt haben, wählen Sie Speichern aus, um die Änderungen an der Datei index.js abzuschließen. Wenn die Datei gespeichert wird, wird das Ausgabeprotokoll der Funktion am unteren Rand der Seite geöffnet.

  12. Öffnen Sie im Azure-Portal eine Konsole.

    • Wählen Sie auf der Übersichtsseite der Funktions-App im Ressourcenmenü unter Entwicklungstools die Option Konsole aus.

    Screenshot that shows how to open a console for a function app.

    Öffnen einer Funktions-App-Konsole

  13. Führen Sie in der-Konsole die folgenden Befehle aus, um das request-Paket von npm und das Azure Storage SDK für Node.js zu installieren, damit ihre Funktions-App diese Ressourcen verwenden kann.

    npm install request
    npm install azure-storage
    

    Hinweis

    Ignorieren Sie alle angezeigten Warnmeldungen. Der Einfachheit halber verwenden wir eine ältere Version einer JavaScript-Bibliothek.

  14. Warten Sie, bis die Installationsbefehle abgeschlossen wurden. Dann fügen Sie der Funktions-App zwei Anwendungseinstellungen hinzu.

    1. Wählen Sie im Ressourcenmenü unter Einstellungen die Option Konfiguration aus.
    2. Wählen Sie unter Anwendungseinstellungen die Option Neue Anwendungseinstellung aus.
    3. Fügen Sie unter Anwendungseinstellungs hinzufügen/bearbeiten eine Einstellung namens PREDICTION_URL hinzu. Legen Sie den Wert auf die Custom Vision-Vorhersage-URL fest, die Sie in der vorherigen Lerneinheit gespeichert haben. Lassen Sie die Einstellung Bereitstellungsslot deaktiviert. Klicken Sie auf OK.
    4. Wiederholen Sie den vorherigen Schritt, um eine Einstellung namens PREDICTION_KEY hinzuzufügen. Legen Sie den Wert auf den Custom Vision-Vorhersageschlüssel fest, den Sie in der vorherigen Lerneinheit gespeichert haben. Lassen Sie die Einstellung Bereitstellungsslot deaktiviert. Klicken Sie auf OK.

    Screenshot that shows selections to make in the Azure portal for application settings for a function app.

    Konfigurieren der Anwendungseinstellungen für die Funktions-App

    Klicken Sie zum Abschluss auf Speichern. Wenn Sie dazu aufgefordert werden, wählen Sie Fortsetzen aus, um die Speicheraktion abzuschließen.

    Hinweis

    Anstatt für die Custom Vision-URL und den Authentifizierungsschlüssel im Code der Funktions-App Hartcodierung zu verwenden, speichern Sie die Werte in den Anwendungseinstellungen der Funktions-App. Die Werte sind sicherer, wenn sie in den Anwendungseinstellungen gespeichert werden.

  15. Um zu Ihrer BlobTrigger-Funktions-App zurückzukehren, wählen Sie im Ressourcenmenü unter Funktionen die Option Funktionen aus, und wählen Sie dann BlobTrigger aus:

    Screenshot that shows selections to make in the Azure portal to view the blob trigger function app.

    Öffnen der BlobTrigger-Funktions-App

  16. Wählen Sie im Ressourcenmenü unter Entwickler die Option Programmieren und testen aus. Wählen Sie unter dem angezeigten Code den Pfeil nach oben für Protokolle aus. Der Bereich für die Protokollausgabe wird geöffnet.

    Screenshot that shows how to open the output log for a function.

    Öffnen des Ausgabeprotokolls der Funktion

    Lassen Sie den Bereich Protokolle geöffnet, weil wir ihn in einem späteren Schritt verwenden.

  17. Um den Blob Storage-Container photos zu öffnen, wählen Sie im Ressourcenmenü unter Datenspeicher die Option Container aus. Wählen Sie in der Liste der Container den Container photos aus.

    Screenshot that highlights the items you select in the Azure portal to open the photos container.

    Öffnen des Containers „photos“ für Ihr Blob Storage-Konto

  18. Laden Sie nun ein Bild in den Container „photos“ hoch, um Ihre Funktions-App zu testen.

    1. Wählen Sie im Bereich des Containers photos die Option Hochladen aus.
    2. Wählen Sie in Blob hochladen unter Dateien das Ordnersymbol aus.
    3. Navigieren Sie in Windows-Explorer zum Ordner photos in Ihrem Projektverzeichnis.
    4. Wählen Sie die Datei image_12.jpg aus, und wählen Sie dann Öffnen aus.
    5. Wählen Sie unter Blob hochladen die Option Hochladen aus. Wenn der Upload abgeschlossen ist, wählen Sie X aus, um den Bereich zu schließen.

    Screenshot that shows how to upload a photo to a container.

    Hochladen eines Fotos in den Container

    image_12. jpg sieht wie folgt aus:

    Image 12 dot j p g, which shows a polar bear.

    Image 12 in Blob Storage

  19. Kehren Sie in Ihrem Browser zum Protokoll der Funktions-App zurück. Vergewissern Sie sich, dass die Funktions-App ausgeführt wurde und dass Custom Vision angibt, dass image_12.jpg einen Eisbären enthält.

    Screenshot that shows the output log details for uploading and analyzing image 12 dot j p g.

    Anzeigen der Details des Ausgabeprotokolls Details zum Hochladen und Analysieren von Image_12

Der Text undefined at undefined, undefined (nicht definiert bei nicht definiert, nicht definiert) in der Protokollausgabe wird angezeigt, weil die Funktion versucht hat, den Breitengrad, den Längengrad und die Kamera-ID aus den Blobmetadaten auszulesen und in die Ausgabe aufzunehmen. Diese Metadatenwerte sind nicht vorhanden, weil Sie das Blob manuell hochgeladen haben. Diese Bedingung wird sich ändern, wenn Ihre virtuellen Kameras Fotos in Blob Storage hochladen.

Ausführen des Kameraarrays

Nun führen Sie das simulierte Kameraarray aus, das Sie zuvor erstellt haben. Anschließend überprüfen Sie die Protokollausgabe der Funktion, um sicherzustellen, dass die Bilder in Blob Storage hochgeladen und auf Eisbären analysiert werden.

  1. Kehren Sie in einem Eingabeaufforderungs- oder Terminalfenster zum Projektverzeichnis zurück. Führen Sie folgenden Code aus, um run.js auszuführen:

    node run.js
    
  2. Kehren Sie zur Funktion BlobTrigger im Azure-Portal zurück, und beobachten Sie das Ausgabeprotokoll ein oder zwei Minuten lang. Bestätigen Sie, dass die Funktion ausgelöst wird und dass sie Custom Vision aufruft, um festzustellen, ob jedes in den Container photos hochgeladene Foto einen Eisbären enthält.

    Screenshot that shows logs in a terminal, with the log entry Polar Bear detected for one of the cameras and the camera's latitude and longitude.

    Es gibt hier Eisbären!

  3. Kehren Sie zur Eingabeaufforderung oder zum Terminalfenster zurück, in dem run.js ausgeführt wird, und wählen Sie STRG+C aus.

Herzlichen Glückwunsch! Sie haben ein System erstellt, das Wildtierfotos in Blob Storage überträgt und mithilfe eines Azure KI Custom Vision-Modells ermittelt, auf welchem der Fotos ein Eisbär zu sehen ist. Der nächste Schritt besteht darin, die Ausgabe visueller zu gestalten, und beginnt mit dem Erstellen einer SQL-Datenbank mit Azure SQL-Datenbank.