Microsoft Cognitive Services Emotion API Teil 4
Neben der Face-API habe ich kürzlich die Emotion API der Microsoft Cognitive Services ausprobiert. Beide Services basieren auf Machine Learning und interpretieren Gesichter aus Fotos (bzw. auch aus Videos). Während die Face API Basisinformationen über ein Gesicht liefern, versucht die Emotion API den Gesichtsausdruck von erkannten Gesichtern in Zahlen zu fassen. Die Emotion API beurteilt einen Ausdruck in verschiedenen Kategorien und liefert Wahrscheinlichkeiten retour. Das Ganze sieht dann so aus…
Der Startpunkt für die Emotion API ist https://www.microsoft.com/cognitive-services/en-us/emotion-api und die Documentation.
Auch hierfür gibt es ein Tutorial Get Started with Emotion API in C#, auf GitHub steht das Microsoft/Cognitive-Emotion-Windows Projekt zum Download bereit. Die Repo enthält die Windows Client Library und ein Beispiel mit einer Windows-App.
Build…
Allerdings ist für Windows SDK for the Microsoft Emotion API etwas Handarbeit nötig, um das Projekt zum Laufen zu bekommen. Das Projekt SampleUserControlLibrary muss extra geladen und in die Solution eingebunden werden. Dann lädt man noch in der NuGet Console das Paket Install-Package Microsoft.ProjectOxford.Emotion und fügt die Reference zum SampleUserControlLibrary in das EmotionAPI-WPF_Samples Project hinzu. Dann klappts auch mit dem Compile.
Ausprobieren
Nachdem diese technischen Voraussetzungen erfüllt sind, und die Solution ge-build-et werden kann, kann der Start der WPF App erfolgen. Das Demo startet mit der erforderlichen Key-Aufforderung.
Hier wird also zunächst der eigene “Emotion-Preview” Key benötigt. Diesen erhält man von https://www.microsoft.com/cognitive-services/en-us/subscriptions. Der kostenfrei Key kann für 30,000 transactions per month und 20-mal pro Minute verwendet werden. Diesen kopiert man und trägt in hier in das Subscription Key Feld ein und klickt auf Save Key. Damit wird der eigene Key auf die eigene Festplatte gespeichert und steht für die Zukunft in dieser App bereit.
Detect emotion using a stream
Beim Fortsetzen kann nun ein Bild oder ein Video ausgewählt werden. Ich habe diesmal ein Bild von mir verwendet, das nicht so neutral wie jenes von der Face API ist, sondern wo ich mir ein Lächeln abgerungen habe. Hinweis: In den Nutzungsbedingungen steht auch klar, dass Personen im Bild damit einverstanden sein müssen, dass das Bild hier verwendet wird… Gut, ich bin einverstanden.
Das Ergebnis sieht hier, mit der Emotion API, wie folgt aus:
Die Ergebnisse im Detail:
[17:17:44.959642]: EmotionServiceClient is created [17:17:44.985143]: Calling EmotionServiceClient.RecognizeAsync()... [17:17:46.279940]: Detection Result: [17:17:46.282933]: Emotion[0] [17:17:46.285444]: .FaceRectangle = left: 122, top: 49, width: 53, height: 53 [17:17:46.287934]: Anger : 0.0003246186 [17:17:46.289450]: Contempt : 0.002541366 [17:17:46.290972]: Disgust : 0.003764645 [17:17:46.297973]: Fear : 8.104636E-07 [17:17:46.299971]: Happiness: 0.7857869 [17:17:46.302971]: Neutral : 0.2070151 [17:17:46.304972]: Sadness : 7.317301E-05 [17:17:46.307971]: Surprise : 0.0004933038
Man sieht hier also die erkannte Wahrscheinlichkeiten in verschiedenen Kategorien (Anger, Contempt, Disgust, Fear, Happiness, Neutral, Sadness, Surprise). Die Kategorien mit der höchsten Wahrscheinlichkeit werden neben dem Foto zusammengefasst. In meinem Beispiel sind das Happiness mit 78%, gefolgt von Neutral mit 20% und Disgust mit 0,3%. Witzig, 0,3% “Abscheu” hätte ich nicht interpretiert, allerdings ist das in diesem Beispiel auch völlig vernachlässigbar. Alle anderen Faktoren (wie Geringschätzung, Angst, Traurigkeit) werden von der Emotion API mit einer noch geringeren Wahrscheinlichkeit bewertet.
Technisch gesehen erfolgt das Ermitteln der Emotionen wie folgt.
…hier folgt dann die UploadAndDetectEmotions Methode mit dem Client (SDK) in DetectEmotionUsingStreamPage.xaml.cs. Diese erzeugt den Client mit dem Subscription Key und lädt das Bild in das Service.
…und die Ausgabe dieses Szenarios aus dem Beispiel durch Durchlaufen der emotionResult-Collection.
Weitere Szenarien funktionieren nach demselben Prinzip.
Detect emotion using a URL
Die zweite Option “Detect emotion using a URL” macht dasselbe, nur dass eben ein Bild-URL verwendet werden kann.
Wenn das Bild nicht entspricht (wie in meinem Fall), zeigt die API mögliche Ursachen an:
No emotion is detected. This might be due to:
- image is too small to detect faces
- no faces are in the images
- faces poses make it difficult to detect emotions
- or other factors
Mein Versuchsbild von der URL ist nur 150 Pixel breit und viel zu pixelig, um für brauchbare Ergebnisse verwendet zu werden. Verständlich, wenn sich die API dann beschwert.
Detect emotion using a video
Hierbei muss das Videofile als .mp4, .mov oder .wmv File auf der Festplatte vorliegen. Dieses wird nach der Auswahl zur Analyse an die Emotion API upgeloadet. Das Ergebnis wird in EmotionDetectionUsingVideoPage.xaml.cs von der async-Methode emotionServiceClient.GetOperationResultAsync(videoOperation) geliefert.
Ein Video wird in verschiedene Sequenzen zerlegt und analysiert. Das dauert natürlich je nach Video einige Zeit… mein Beispielvideo war zwar nur etwa 14 Sekunden lang, der Upload und die Analyse dauerte rund 3 Minuten.
Das Ergebnis der Videoanalyse zeigt die “Top 3 Emotions”. In diesem Video habe ich viele unterschiedliche Gesichtsausdrücke ausprobiert, von happy, über erstaunt bis neutral. Mein Ergebnis sah dann so aus:
Die Top 3 Kategorien meines Kurzvideos waren Neutral (51%), Erfreut (46%) und Verärgert (0,5%).
Mein Ausdruck für “überrascht” scheint wohl in Happiness aufgegangen zu sein.
Hier der JSON-Output des ersten Gesichtsausdrucks (offensichtlich der Ausdruck “Happy”, visualisiert mit jsonvisualizer.com):
Aus dem Array werden dann die Top 3 Ausdrücke ausgegeben. So kann dann durch die Ergebnisse gelaufen werden und diese weiterverwendet werden.
Fazit
Die Emotion API stellt neben der Face API ein weiteres, cooles Cloud Service aus den Microsoft Cognitive Services dar. Bei Bildern funktionierte die Erkennung in meinem Beispielen ziemlich gut. Bei Videos ist das schwerer zu beurteilen und nachzuvollziehen. Auf jeden Fall sind beide Services für mich sehr beeindruckend. In zukünftiger Software (auch abseits von Spaß-Apps) wird es bestimmt Anwendungsfälle geben - mir fallen hier neben Überwachungsaspekten vor allem Beispiele in Bezug auf Menschen mit Behinderungen ein -, wo der Einsatz und die Bewertung der Gesichtserkennung Sinn macht.
Somit meine Empfehlung: Eine coole Sache. Am besten einmal die Beispiele selbst ausprobieren und damit experimentieren!
Quicklinks zu den vorigen Teilen dieser Serie über Cognitive Services:
- Microsoft Cognitive Services Face API Teil 1
- Microsoft Cognitive Services Face API Teil 2
- Microsoft Cognitive Services Teil 3
- Microsoft Cognitive Services Emotion API Teil 4