Ein interessantes Beispiel für die Vielfältigkeit der Azure-AI-Dienste ist der Image-Analyse-Dienst Azure AI Vision. Ich habe Ihnen bereits gezeigt, wie Sie die einzelnen Features und Fähigkeiten des Vision-Dienstes im Azure AI Vision Studio ausprobieren können. In diesem Beitrag geht es nun darum, diese Fähigkeiten exemplarisch mit Hilfe des SDKs für .Net in Ihren eigenen Programmcode einzubetten. 

Azure AI Vision ist ein Azure-Dienst, mit dessen Hilfe Softwaresysteme visuelle Eingaben durch Analyse von Bildern interpretieren können. Der Azure AI-Dienst bietet vorgefertigte Modelle für gängige Computer-Vision-Aufgaben, einschließlich der Analyse von Bildern, um Bildunterschriften und Tags vorzuschlagen, und der Erkennung gängiger Objekte und Personen. Sie können den Azure AI Vision-Dienst auch verwenden, um zum Beispiel den Hintergrund eines Bildes zu entfernen (Freistellen). Weitere interessante Anwendungsbeispiele für Azure AI Vision vermittelt übrigens mein Azure AI Workshop.

Umgebung vorbereiten

Im Folgenden werde ich demonstrieren, wie Sie den Dienst im Kontext Ihrer eigenen Anwendung ausprobieren können. Ich möchte allerdings für diesen Beitrag keinen eigenen Code entwickeln, sondern evaluieren, wie Sie eine von Microsoft bereitgestellte Beispielanwendung in der Umgebung Ihrer Wahl mit Hilfe der Analyze-Image-API testen können. Die Code-Beispiele, auf denen dieser Beitrag basiert, stellt Microsoft auf diesem https://github.com/MicrosoftLearning/mslearn-ai-vision Git Hub -Repository zur Verfügung. 

Ich verwende für diesen Beitrag VS Code als Entwicklungsumgebung und binde dieses Repo zunächst in VS Code ein. Dazu gibt es zahlreiche Möglichkeiten. Sie kannst das Repository z. B. vorher in Ihr lokales Arbeitsverzeichnis klonen (git clone https://github.com/MicrosoftLearning/mslearn-ai-vision.git) oder Sie laden das Repo als Zip-Archiv herunter und entpacken es lokal. In beiden Fällen können Sie diesen Ordner dann in VS Code öffnen. Sie können das Repo aber auch direkt aus VS Code heraus klonen. Suche dazu in der Befehlspalette (F1) nach „Git:Clon“:

Das Klonen eines GitHub-Repository aus direkt aus VS Code.
Das Klonen eines GitHub-Repository aus direkt aus VS Code.

Azure-AI-Vision-Ressource

Als nächstes benötigen Sie eine neue Azure-AI-Vision-Ressource. Diese legen Sie wie bereits in diesem Artikel im Azure-Portal an. Suchen Sie dazu nach „Azure Ai services“ und erstellen wahlweise eine Ressource vom Typ „Maschinelles Sehen“ (Computer vision) oder „Azure AI services multi-service account“. Ich verwende für dieses Beispiel Letzteren Ressource-Typ.

Aber Achtung: Dieser Ressource-Typ (Azure AI Vision 4.0 ) ist im vollen Funktionsumfang derzeit nur in den Regionen East US, West US, France Central, Korea Central, North Europe, Southeast Asia, West Europe oder East Asia erhältlich.

Das Erstellen einer Azure-AI-Vision-Ressource.
Das Erstellen einer Azure-AI-Vision-Ressource.

Sobald der Ressource-Typ erstellt wurde, können Sie sich um das Bereitstellen des Azure AI Vision-SDKs kümmern. Öffnen Sie dazu im in VS Code den Order „…Labfiles/01-analyze-images/C-Sharp/image-analysis“ im integrierten Terminal.  Das geht am schnellsten, indem Sie den Ordner im VS-Code-Explorer markieren und dann im Kontextmenü den Eintrag „Im integrierten Terminal öffnen“ auswählen. Bei dem bei mir gewählten lokalen Arbeitsverzeichnis sieht der Pfad dann aus wie in folgender Abbildung:

Die notwendigen Vorbereitungen in VS Code.
Die notwendigen Vorbereitungen in VS Code.

Jetzt können Sie im Terminal das Azure AI Vision SDK installieren. Unter C# klappt das mit …

dotnet add package Azure.AI.Vision.ImageAnalysis -v 1.0.0-beta.3

Das Installieren der erforderlichen Client-Bibliotheken.
Das Installieren der erforderlichen Client-Bibliotheken.

Danach öffnen Sie Datei „appsettings.json“ und ergänzen die Werte für „AIServicesEndpoint“ und „AIServicesKey“. Diese finden Sie wie schon in anderen Beiträgen erläutert in der zugehörigen Azure-AI-Ressource im Menü „Schlüssel und Endpunkt“.  Vergessen Sie nicht, die Datei zu speichern.

Das Anpassen der appsettings.json-Datei zur Authentifizierung des Clients.
Das Anpassen der appsettings.json-Datei zur Authentifizierung des Clients.

Nun öffnen Sie die mitgelieferte .Net-Programmdatei „Program.cs“ in VS Code. Hier importieren Sie zunächst den Namespace „Azure.AI.Vision.ImageAnalysis“. Ergänzen Sie dazu hinter dem Kommentar „// Import namespaces“ folgendes Code-Fragment und speichere die Änderung:

// Import namespaces
using Azure.AI.Vision.ImageAnalysis;

Schauen Sie sich die Programmdatei für Ihre Client-Applikation nun näher an. In der Funktion „Main“ finden Sie zunächst den Block „ // Get config settings from AppSettings“. Hier werden AI-Services- Endpunkt und Schlüssel aus Ihrer Datei „appsettings.json“ eingelesen. Scrollen Sie dann weiter zum Kommentar „// Authenticate Azure AI Vision client“. Hier fehlt nun noch der Code, mit dem sich Ihr Azure-AI-Vision-Client-Objekt authentifizieren kann. Hier fügen Sie Folgendes ein

ImageAnalysisClient client = new ImageAnalysisClient(
    new Uri(aiSvcEndpoint)
    new AzureKeyCredential(aiSvcKey));

Ebenfalls in der Funktion „Main“ finden Sie drei weitere kommentierte Code-Bereiche. Der Code unter „//Get image“ spezifiziert den Pfad zu einer einzulesenden Bild-Datei welche dann an zwei weitere Funktionen  „AnalyzeImage“ und „BackgroundForeground“ weiterleitet wird. Sie müssen natürlich nicht die im Repository im Unterorder „images“ mitgelieferten Bilder verwenden. Sie können auch einen beliebigen anderen Pfad, relativ zum Programmverzeichnis angeben.  Die zugehörigen Funktionsaufrufe finden Sie in der Main-Funktion, zu erkennen an den kommentierten Bereichen „ // Analyze image“ und   „// Remove the background or generate a foreground matte from the image“. Allerdings sind die zugehörigen Funktionen „AnalyzeImage“ bzw. „BackgroundForeground“ in der Programm-Datei noch nicht implementiert. Das wollen wir jetzt nachholen:

Die Funktion „Main“ als Startpunkt weiterer Modifikationen.
Die Funktion „Main“ als Startpunkt weiterer Modifikationen.

Scrollen Sie daher jetzt im Programm-Code herunter zu Funktion „AnalyzeImage“. Dort ergänzen Sie beim Kommentar „// Get result with specified features to be retrieved“ Folgendes:

// Get result with specified features to be retrieved
ImageAnalysisResult result = client.Analyze(
    BinaryData.FromStream(stream),
    VisualFeatures.Caption |
    VisualFeatures.DenseCaptions |
    VisualFeatures.Objects |
    VisualFeatures.Tags |
    VisualFeatures.People);

Außerdem fügen Sie beim Kommentar „Display analysis results“ diesen Code ein:

// Display analysis results
// Get image captions
if (result.Caption.Text != null)
{
    Console.WriteLine(“ Caption:“);
    Console.WriteLine($“   \“{result.Caption.Text}\“, Confidence     
    {result.Caption.Confidence:0.00}\n“);
}

// Get image dense captions
Console.WriteLine(“ Dense Captions:“);
foreach (DenseCaption denseCaption in result.DenseCaptions.Values)
{
    Console.WriteLine($“   Caption: ‚{denseCaption.Text}‘, Confidence: {denseCaption.Confidence:0.00}“);
}

// Get image tags

// Get objects in the image

// Get people in the image

Jetzt können Sie Ihre Änderungen sichern und das Programm ausführen:

dotnet run

Schauen Sie sich nun das Ergebnis an. Die Bildanalyse liefert vorerst eine vorgeschlagene Beschriftung (caption) für Ihr Bild. Vergleichen Sie den Vorschlag mit Ihrem Bild und testen die KI ggf. mit weiterem Bildmaterial.

Die Features „caption“- und „Dense Caption“ liefern die aussagekräftige Bildunterschriften.
Die Features „caption“- und „Dense Caption“ liefern die aussagekräftige Bildunterschriften.

Das Feature “image captioning” ist Teil der analyze-image– API. In unserem Fall wird “caption” in den Abfrage-Parameter für „features“ inkludiert. Die Funktion liefert wie üblich eine umfangreiche JSON-Antwort, in der dann der String für „contents“ bei  „captionResult“ herausgefiltert wird.

result = cv_client.analyze(
    image_data=image_data,
    visual_features=[
        VisualFeatures.CAPTION,

Erkennen und Lokalisieren von Objekten

Schauen wir uns nun an, wie die die KI in Ihrem Anwendungscode Objekte in einem Bild erkennt und lokalisiert. Bei der Objekterkennung handelt es sich um eine spezifische Form der Computer Vision, bei der einzelne Objekte innerhalb eines Bildes identifiziert und ihre Position durch eine Begrenzungsbox angezeigt werden.

Das Code-Fragment, mit dem Sie Ihren Programm-Code ab dem Kommentar „// Get objects in the image“ ergänzen müssen, sieht so aus:

// Get objects in the image
if (result.Objects.Values.Count > 0)
{
    Console.WriteLine(“ Objects:“);

    // Prepare image for drawing

    stream.Close();
    System.Drawing.Image image = System.Drawing.Image.FromFile(imageFile);
    Graphics graphics = Graphics.FromImage(image);
    Pen pen = new Pen(Color.Cyan, 3);
    Font font = new Font(„Arial“, 16);
    SolidBrush brush = new SolidBrush(Color.WhiteSmoke);
    foreach (DetectedObject detectedObject in result.Objects.Values
    {
        Console.WriteLine($“   \“{detectedObject.Tags[0].Name}\““);

        // Draw object bounding box

        var r = detectedObject.BoundingBox;
        Rectangle rect = new Rectangle(r.X, r.Y, r.Width, r.Height);
        graphics.DrawRectangle(pen, rect);
        graphics.DrawString(detectedObject.Tags[0].Name,font,brush,(float)r.X, (float)r.Y);
    }

    // Save annotated image

    String output_file = „objects.jpg“;
    image.Save(output_file);
    Console.WriteLine(“  Results saved in “ + output_file + „\n“);
}

Speichern Sie erneut Ihre Änderungen und führen das Programm mit „dot run“ erneut aus, um es mit verschiedenen Bildern zu testen. Die Image-Pfade geben Sie wie beim Beispiel oben auch im Programm-Code ca. bei Zeile 30 an:

string imageFile = „images/<your image.jpg“;

Sie können wahlweise auch die drei im Quellcode-Repo mitgelieferten Beispielbilder im Unterordner „images“ dazu verwenden.

Die Objekterkennung rahmt die erkannte Objekte ein.

Die Objekterkennung rahmt die erkannten
Die Objekterkennung rahmt die erkannten Objekte ein.

Sie  finden in der Programm-Ausgabe diesmal nicht nur einen passenden Vorschlag für die Bildunterschrift, sondern auch eine neue Datei im Programm-Ordner ~\ms-learn-ai-vision\Labfiles\01-analyze-images\C-Sharp\image-analysis mit dem Namen „objects.jpg“, in welcher das Programm die Lage der erkannten Objekte im Bild mit einem grünen Rahmen markiert. Teste Sie das Programm unbedingt auch mit mehreren, möglichst unterschiedlichen Bildern.

Die Objekterkennung arbeitet ähnlich wie die Tagging-API, liefert jedoch die Begrenzungsfeldkoordinaten (in Pixel) für jedes im Bild gefundene Objekt zurück. Enthält ein Bild beispielsweise ein Reh, ein Wildschwein und eine Person, listet Funktion „detectedObject“ diese Objekte mit ihren Koordinaten im Bild auf. Sie können also beispielsweise mit dieser Funktion die Beziehungen zwischen den Objekten in einem Bild verarbeiten oder z. B. feststellen, ob sich in einem Bild mehrere Instanzen desselben Objekts befinden.

Die Objekterkennung wendet Tags auf Basis der im Bild identifizierten Objekten oder Lebewesen an, es gibt aber keine formale Beziehung zwischen der Tagging-Taxonomie und der Objekterkennungs-Taxonomie. Konzeptionell findet die Objekterkennungsfunktion ausschließlich Objekte oder Lebewesen, während die Tag-Funktion auch kontextbezogene Begriffe enthalten kann, welche sich nicht mit Begrenzungsboxen lokalisieren lassen.

foreach (DetectedObject detectedObject in result.Objects.Values)
    {
        Console.WriteLine($“   \“{detectedObject.Tags[0].Name}\““);

Erkennen und Lokalisieren von Personen

Eine weitere bestimmte und spezifische Form der Computer Vision ist die Personenerkennung. Die Funktion ermöglicht es, einzelne Personen innerhalb eines Bildes zu identifizieren und deren Standort ebenfalls mit Hilfe einer passenden Begrenzungsbox anzuzeigen.

Ergänzen Sie dazu in der Funktion „AnalyzeImage” ab dem Kommentar „Get people in the image“ folgenden Programmcode.

// Get people in the image
if (result.People.Values.Count > 0)
{
    Console.WriteLine($“ People:“);

    // Prepare image for drawing
    System.Drawing.Image image = System.Drawing.Image.FromFile(imageFile);
    Graphics graphics = Graphics.FromImage(image);
    Pen pen = new Pen(Color.Cyan, 3);
    Font font = new Font(„Arial“, 16);
    SolidBrush brush = new SolidBrush(Color.WhiteSmoke);
    foreach (DetectedPerson person in result.People.Values)
    {
        // Draw object bounding box
        var r = person.BoundingBox;
        Rectangle rect = new Rectangle(r.X, r.Y, r.Width, r.Height);
        graphics.DrawRectangle(pen, rect);

        // Return the confidence of the person detected

        //Console.WriteLine($“   Bounding box {person.BoundingBox.ToString()}, Confidence:
            {person.Confidence:F2}“);

    }

    // Save annotated image

    String output_file = „persons.jpg“;
    image.Save(output_file);
    Console.WriteLine(“  Results saved in “ + output_file + „\n“);
}

Speichern Sie erneut Ihre Änderungen und führen das Programm mittels „dotnet run“ mit geeignetem Bildmaterial aus, indem Sie die zugehörigen Pfade jeweils im Programmcode verknüpfen. Sie können das Programm vergleichsweise auch mit Bildern testen, die keine Personen enthalten. Auch hier wird wieder eine Datei im selben Ordner wie Ihre Programm-Datei generiert, um die erkannten Personen anzuzeigen. Diese heißt diesmal „persons.jpg“.

Im Falle von Personen könnten Sie sich jetzt fragen, wo der Unterschied zwischen dem Erkennen von Personen (als Objekte im Bild) und Personen als „Personen“ ist. Der folgenden Ergebnis-Screenshot illustriert das eindrucksvoll. Bei der Personen-Erkennung reagiert die KI offensichtlich präziser und erkennt auch die dritte verdeckte Person im Bild:

Der Unterschied zwischen Objekt- und Personenerkennung.
Der Unterschied zwischen Objekt- und Personenerkennung.

Microsoft hat sein Modell für die Personenerkennung durch Verbessern seines Objekterkennungsmodells in Bezug auf Szenarien zur Personenerkennung erstellt. Bei der Personenerkennung ist das Modell in der Lage, ein Gesicht von einem anderen Gesicht zu unterschieden, Gesichtsattribute vorherzusagen oder zu klassifizieren, sowie eine Gesichtsvorlage zu erstellen. Das Feature Personenerkennung ist jedoch nur in Version 4.0 der Analyze-Image-API enthalten. Man verwendet dabei die Option „People“ in der Abfrage-Parametern für „Features“.

Die wichtigsten URI-Paramater für den Aufruf der Image-Analyze-API finden Sie in der API-Dokumentation:

Freistellen von Bildern

Der Azure-AI-Vision-Dienst eignet sich übrigens auch hervorragend zum Freistellen von Bildern, also dem Entfernen und Entfernen des Hintergrund eines Bildes. Dazu ergänzen Sie in Ihrer Programm-Datei beim Kommentar „// Remove the background from the image or generate a foreground matte“ folgendes Code-Schnipsel:

// Remove the background from the image or generate a foreground matte

Console.WriteLine($“ Background removal:“);

// Define the API version and mode

string apiVersion = „2023-02-01-preview“;
string mode = „backgroundRemoval“; // Can be „foregroundMatting“ or „backgroundRemoval“
string url = $“computervision/imageanalysis:segment?api-version={apiVersion}&mode={mode}“;

// Make the REST call

using (var client = new HttpClient())
{
    var contentType = new MediaTypeWithQualityHeaderValue(„application/json“);
    client.BaseAddress = new Uri(endpoint);
    client.DefaultRequestHeaders.Accept.Add(contentType);
    client.DefaultRequestHeaders.Add(„Ocp-Apim-Subscription-Key“, key);
    var data = new
    {
        url = $https://github.com/MicrosoftLearning/mslearn-ai-vision/blob/main/Labfiles/01-
           analyze-images/Python/image-analysis/{imageFile}?raw=true
    };
    var jsonData = JsonSerializer.Serialize(data);
    var contentData = new StringContent(jsonData, Encoding.UTF8, contentType);
    var response = await client.PostAsync(url, contentData);

    if (response.IsSuccessStatusCode) {
        File.WriteAllBytes(„background.png“, response.Content.ReadAsByteArrayAsync().Result);
        Console.WriteLine(“  Results saved in background.png\n“);
    }
    else
    {
        Console.WriteLine($“API error: {response.ReasonPhrase} – Check your body url, key, and
           endpoint.“);
    }
}

Sie kennen das Spiel jetzt schon. Speichern Sie ihre Änderungen, fügen oben den Pfad für freizustellenden Bild ein und führen das Programm mit „dotnet run“ aus. Im Ergebnis finden Sie im Programm-Ordner eine weitere Datei „background.png“ von Typ „*.png“. Im folgenden Screenshot finden Sie ein Beispiel-Foto und das freigestellte Ergebnis in der Datei background.png mit Microsofts Satya Nadella.

Das KI-basierte Freistellen von Objekten in Bildern vom Hintergrund, meist bei Personen genutzt.
Das KI-basierte Freistellen von Objekten in Bildern vom Hintergrund, meist bei Personen genutzt.

Aus Datenschutzgründen konnte ich bei Personenfotos nur ein genehmigtes Bild einer bekannten Person des öffentlichen Lebens verwenden. Die Freistell-Funktion kommt hauptsächlich bei Personen und Porträts zum Einsatz.

Sie müssen die Beispiele nicht abtippen. Den Quellcode-Fragmente findest du in diesem Markdown-File:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.