Übung: Schreiben einer Funktions-App in Azure Functions zum Analysieren von Fotos
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.
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.
Erstellen einer neuen Funktions-App in Azure
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.
Konfigurieren der grundlegenden Einstellungen für eine neue Funktions-App
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.
Konfigurieren der Hostingeinstellungen für eine neue Funktions-App
Warten Sie, bis die Überprüfung abgeschlossen ist, und wählen Sie dann Erstellen aus.
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.
Hinzufügen einer Funktion
Gehen Sie unter Funktion hinzufügen folgendermaßen vor:
- Wählen Sie für Entwicklungsumgebung die Option Im Portal entwickeln aus.
- Wählen Sie unter Vorlage die Option Azure Blob Storage-Trigger aus.
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.)
Gehen Sie unter Vorlagendetails folgendermaßen vor:
Geben Sie für Neue Funktion die Angabe BlobTrigger ein.
Geben Sie als Pfadphotos/{Name} ein, sodass die Funktions-App ausgelöst wird, wenn Blobs in den Container
photos
hochgeladen werden.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.
Wählen Sie unter Neue Speicherkontoverbindung das zuvor erstellte Speicherkonto aus, und klicken Sie dann auf OK.
Konfigurieren der Vorlage zum Erstellen einer durch ein Blob ausgelösten Funktion
Wählen Sie Hinzufügen. Die Portalansicht wird geändert, um die neue App anzuzeigen.
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.
Öffnen der Datei „index.js“ für die Triggerfunktion
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.
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 FunktionBlobTrigger
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.
Öffnen Sie im Azure-Portal eine Konsole.
- Wählen Sie auf der Übersichtsseite der Funktions-App im Ressourcenmenü unter Entwicklungstools die Option Konsole aus.
Öffnen einer Funktions-App-Konsole
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.
Warten Sie, bis die Installationsbefehle abgeschlossen wurden. Dann fügen Sie der Funktions-App zwei Anwendungseinstellungen hinzu.
- Wählen Sie im Ressourcenmenü unter Einstellungen die Option Konfiguration aus.
- Wählen Sie unter Anwendungseinstellungen die Option Neue Anwendungseinstellung aus.
- 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.
- 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.
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.
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:Öffnen der BlobTrigger-Funktions-App
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.
Öffnen des Ausgabeprotokolls der Funktion
Lassen Sie den Bereich Protokolle geöffnet, weil wir ihn in einem späteren Schritt verwenden.
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 Containerphotos
aus.Öffnen des Containers „photos“ für Ihr Blob Storage-Konto
Laden Sie nun ein Bild in den Container „photos“ hoch, um Ihre Funktions-App zu testen.
- Wählen Sie im Bereich des Containers
photos
die Option Hochladen aus. - Wählen Sie in Blob hochladen unter Dateien das Ordnersymbol aus.
- Navigieren Sie in Windows-Explorer zum Ordner photos in Ihrem Projektverzeichnis.
- Wählen Sie die Datei image_12.jpg aus, und wählen Sie dann Öffnen aus.
- 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.
Hochladen eines Fotos in den Container
image_12. jpg sieht wie folgt aus:
Image 12 in Blob Storage
- Wählen Sie im Bereich des Containers
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.
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.
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
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 Containerphotos
hochgeladene Foto einen Eisbären enthält.Es gibt hier Eisbären!
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.