Cognitive Services: Alter einer Person ermitteln

Unter dem Begriff Cognitive Services stellt Microsoft verschiedene Dienste zur Verfügung, welche es einem ermöglichen ohne großen Aufwand Algorithmen der künstlichen Intelligenz in seinen eigenen Apps zu verwenden. Microsoft hat bereits vor einiger Zeit die Webseite how-old.net veröffentlicht, wo man Fotos hochladen kann und auf diesen Fotos zunächst Gesichter erkannt werden und dann auch noch das Alter der jeweiligen Person ermittelt wird. Ich möchte nun in diesem Beitrag zeigen, wie wir mit der Hilfe der Cognitive Services eine Xamarin.Forms Apps erstellen können, welche ebenfalls das Alter einer Person auf einem Foto ermitteln kann.

Ich werden nicht jeden einzelnen Schritt erläutern, sondern nur auf die wesentlichen Aspekte der Gesichtserkennung und der Bestimmung des Alters eingehen, aber ihr findet die gesamte Beispiel-Anwendung auf GitHub und könnte diese dann selbst ausprobieren. Um die Anwendung zu Testen, werden neben einem Endpunkt auch ein Subscription-Key benötigt, welcher über Azure beantragt werden kann.

In einem früheren Beitrag habe ich bereits gezeigt, wie man in einer Xamarin.Forms Bilder aus der Foto-Galerie auswählen oder auch in Foto mit der Kamera aufnehmen kann. Dies verwenden wir auch in der Beispiel-App, damit wir ein Bild zur Analyse auswählen können. Zusätzlich benötigen wir ein NuGet-Package, welches aktuell nur in einer Preview-Version vorliegt, so dass der Haken bei Include prerelease gesetzt sein muss. Das notwendige Package lautet Microsoft.Azure.CognitiveServices.Vision.Face.

Um nun das Alter einer Person auf einem Foto zu analysieren, wird eine Instanz vom FaceClient benötigt. Dieser muss mit der Hilfe eines Endpoints und eines Subscription-Keys initialiaisiert werden. Diese Informationen bekommet man über das Azure Portal, wenn man dem folgenden Link aufruft: https://portal.azure.com/#create/Microsoft.CognitiveServicesFace. Ebenso muss angegeben werden, welche Eigenschaften wir für das Gesicht zurückbekommen wollen. Hier steht eine Vielzahl von Optionen, wie die aktuelle Emotion, ob die Person eine Brille trägt oder auch das analysierte Alter. Nun müssen wir das Bild einfach über den FaceClient an Azure senden und bekommen, sofern ein Gesicht erkannt wurde, auch ein entsprechendes Alter zurück. Der folgende Code-Ausschnitt zeigt die gesamte Methode, welche für das Bestimmen des Alters verwendet wird.

public async Task<double?> AnalyzePictureAsync(byte[] imagesBytes)
{
    try
    {
        // create faceclient
        var faceClient = new FaceClient(
            new ApiKeyServiceClientCredentials(Statics.SubscriptionKey)) 
                { Endpoint = Statics.Endpoint };

        // detect face and analyze age
        var imageStream = new MemoryStream(imagesBytes);
        var faceAttributes = new List<FaceAttributeType> 
            { FaceAttributeType.Age };
        var detectedFaces = await faceClient.Face.DetectWithStreamAsync(imageStream, 
            returnFaceAttributes: faceAttributes);

        if (detectedFaces == null || detectedFaces.Count == 0)
            return null;

        return detectedFaces.First().FaceAttributes.Age;
    }
    catch(Exception ex)
    {
        Debug.WriteLine($"{GetType().Name} | {nameof(AnalyzePictureAsync)} | {ex}");
    }

    return null;
}

Die folgenden Screenshots zeigen die Android-Version in Aktion. Der Nutzer nimmt entweder ein Foto mit der Kamera auf oder kann ein Foto aus der Galerie öffnen. Anschließend wird der Analyze-Button aktiv und das Foto kann analysiert werden. Sollte ein Gesicht erkannt worden sein, so wird das Alter entsprechend ausgegeben.

Durch das NuGet Package ist die Verwendung der Face-API von Microsoft sehr einfach und mit wenigen Zeilen lässt sich das Alter einer Person auf einem Foto bestimmen. Es stehen darüber hinaus noch viele weitere Services in diesem Umfeld zur Verfügung.

NuGet: Xamarin Community Toolkit AppCenter.Analytics: Einblick in die Nutzung eurer App Anzeigen von Dateien auf einem Device mit dem Device File Explorer