Ein neuronales Netz, das in Gesichtsbildern Emotionen erkennt, kann auch im Browser laufen. Mit einem Trainingsdatensatz aus dem Internet, Keras und OpenCV ist der Weg zur Emotionserkennung per Selfie nicht weit.
„Wie geht es dir?“ ist vermutlich die meistgestellte Frage in der Geschichte der Menschheit, nicht nur, weil sie fester Bestandteil von Begrüßungen ist. Denn wir möchten wissen, wie es unseren Mitmenschen geht. Emotionserkennung ist komplex, aber Menschen besitzen jahrelange Erfahrung und sind gut darin.
Sie spielt übrigens auch in der medizinischen Diagnose eine wichtige Rolle und kann beispielsweise dabei helfen, psychische Störungen wie Depressionen oder Angststörungen festzustellen. Algorithmen der Emotionserkennung können sogar in Kombination mit Gehirnscans eingesetzt werden, um neurologische Erkrankungen wie Schlaganfälle oder Tumore zu identifizieren.
Neben der Sprache sind Gesichtsausdrücke eine wesentliche Quelle, um Emotionen zu erkennen. Algorithmen, die häufig aus dem Bereich des Deep Learning stammen, nutzen diese Gesichtsausdrücke in Form von Bildern, um Emotionen zu erkennen. Wie man das selbst programmieren kann, soll folgender kleiner Anwendungsfall demonstrieren: Eine Webapplikation nimmt mit der Frontkamera ein Selfie auf und anschließend klassifiziert ein Algorithmus die darauf dargestellte Emotion.
Ein bei Google Colab gehostetes Jupyter-Notebook ergänzt diesen Artikel mit dem zugehörigen, ausführlich dokumentierten Code für Keras/TensorFlow, der sich ausprobieren und anpassen lässt (siehe ix.de/z7ns).
Ein Mensch sammelt Erfahrung, indem er Dinge erlebt und daraus lernt. Ähnlich ist es bei einem auf Deep Learning basierenden Algorithmus. Je mehr Gesichtsausdrücke dieser zu einer bestimmten Emotion sieht, desto höher ist die Wahrscheinlichkeit, ein grundlegendes Konzept hinter der Zuordnung von Gesichtsausdrücken und Emotionen zu entdecken.
Bilder von Gesichtsausdrücken zu sammeln und zusätzlich mit einem Label der dargestellten Emotion zu versehen, ist sehr aufwendig. Glücklicherweise gibt es Datensätze, die diese Anforderung schon erfüllen. Der öffentlich zugängliche Datensatz FER-2013 (siehe ix.de/z7ns), bestehend aus über 30 000 Graustufenbildern, zeigt Gesichter mit sieben Emotionen: Wut (Angry), Ekel (Disgust), Angst (Fear), Freude (Happy), Traurigkeit (Sad), Überraschung (Surprise) und Neutralität (Neutral).
Erstellt wurde der Datensatz, um die Entwicklung von Algorithmen zur Emotionserkennung zu fördern. Obwohl er mittlerweile etwa zehn Jahre alt ist, wird er immer noch regelmäßig zur Validierung neuer Algorithmen verwendet. Um den hier behandelten Anwendungsfall etwas zu erleichtern, fehlen im Beispiel die Emotionen Ekel und Angst: Ekel wegen der geringen Anzahl an Daten (siehe Abbildung 1) und Angst aufgrund einer potenziellen Verwechslung mit Überraschung.
90 Prozent des gesamten Datensatzes sollen Trainingsdaten sein, 10 Prozent Testdaten. Die Trainingsdaten dienen dazu, Zusammenhänge zwischen den Gesichtern und der jeweiligen Emotion zu erlernen. Das Modell nutzt diese Zusammenhänge, um Vorhersagen auf neuen Daten zu treffen. Die Testdaten werden verwendet, um das Modell nach dem Training zu bewerten und sicherzustellen, dass es in der Lage ist, auf unbekannten Daten richtige Vorhersagen zu treffen. Weitere Anpassungen am Datensatz waren nicht notwendig, da alle Bilder in der gleichen Größe vorliegen und der Fokus bereits auf dem Gesicht liegt (siehe Abbildung 2).
Bilder enthalten viel Information und ein hohes Maß an Details und Variation. Und woran genau wir ein Objekt oder einen Sachverhalt in einem Bild erkennen, ist nur schwer in Worte zu fassen. Wir haben einfach schon viele Hunde gesehen und wissen auf einer nonverbalen Ebene, wie so ein Tier aussieht. Das heißt, wir haben durch viele Beispiele gelernt, was einen Hund ausmacht, und können daher auch auf bisher nicht gesehene Hunde und sogar auf bisher unbekannte Hunderassen generalisieren.
Das hat Folgen für ein sinnvolles Vorgehen bei der Objekterkennung. Klassische Ansätze extrahieren bestimmte Eigenschaften (Features), anhand derer sie die Bilder klassifizieren. Das kann erfolgreich sein, wenn die Bilder wenig Variationen enthalten, aus geometrischen Formen bestehen oder in einer kontrollierten Umgebung aufgenommen werden. Bei Selfies ist das nicht der Fall, der klassische Ansatz fällt damit weg.
Stattdessen kommt mit dem Deep Learning eher eine Form des Machine Learning infrage, das neuronale Netzwerke mit vielen hintereinandergeschalteten Schichten (Layers) nutzt, häufig mit unterschiedlichen Aufgaben. Die Bilder werden in Paaren zusammen mit den passenden Emotionen zum überwachten Training (Supervised Machine Learning) des Deep-Learning-Modells verwendet. Dazu kommt der seit Langem bekannte und etablierte Backpropagation-Algorithmus zum Einsatz.
Seit fast zehn Jahren dominieren in diesem Bereich die Convolutional Neural Networks (CNNs). Die wichtigsten Schichten sind dabei die Convolutional Layers. Sie erlernen eine Reihe von Filteroperationen, um passende Features zu extrahieren und diese dann in abstrakter Form in einen nachgeschalteten Classifier zu füttern.
Ein CNN ist somit für die Aufgabe der Emotionserkennung sinnvoll, aber sein konkreter Aufbau ist offen. Dafür gibt es grundsätzlich zwei Optionen. Eine Möglichkeit besteht darin, es explizit aus Schichten zusammenzusetzen. Dafür bildet oft eine einfache und lineare Standardarchitektur die Grundlage (siehe Abbildung 3). Sie besteht aus einer Reihe von Blöcken aus den erwähnten Convolutional Layers und Pooling Layers, die die gefilterten Bilder herunterskalieren. Am Ende stehen der Classifier aus den für Deep Learning typischen Dense Layers und ein finaler Layer für die Aktivierung der wahrscheinlichsten Kategorie.
Eine solche Architektur gehört zur Familie der VGG-Netzwerke, benannt nach einem einflussreichen Forschungsartikel der Oxforder Visual Geometry Group (VGG; siehe ix.de/z7ns). Sie hat den Vorteil, einfach und in einem gewissen Maß sogar analysierbar zu sein.
Eine solche Architektur hat aber auch Nachteile. Aus dem letzten Layer kommen viele unterschiedliche Versionen des gefilterten Bilds heraus und jeder Bildpunkt jedes Bildes muss mit einem Parameter mit jedem Neuron des Classifiers verbunden werden. So kann der Classifier schnell aus ein paar Millionen Neuronen bestehen. Deshalb verzichten moderne Architekturen auf einen solchen expliziten Classifier. Ebenso weichen diese Ansätze von der linearen Struktur ab, das heißt, es gibt mehr als einen Pfad von der Eingabe zur Klassifikation. Dazu kommen viele weitere Tricks, die die Rechenleistung oder die Anzahl der Parameter verringern. Diese Architekturen baut man nicht selbst, sondern nimmt sie von der Stange (siehe ix.de/z7ns), da sie eher in den Forschungslabors entstehen.
Modernere Architekturen enthalten oft etwas exotischere Arten von Schichten und können daher bei der Produktivsetzung Schwierigkeiten machen. Denn: Auch auf der Produktionsumgebung muss eine Implementierung des Modells vorliegen. Und diese Produktionsumgebung ist in diesem Fall ein Webbrowser. Daher fällt hier die Entscheidung für eine einfache VGG-Architektur (siehe Listing 1). Der Code verwendet die typischen Techniken zur besseren Generalisierung. Dropout trainiert bei jedem Batch nur einen gewissen Teil von Neuronen und macht das Netz intuitiv gesprochen zu einem Ensemble. BatchNormalization normalisiert diese Batches und dient ebenso dazu, das Netz robuster und damit generalisierbarer zu machen. Die Relu-Aktivierung als nicht lineares Element führt zu schnellerem Training.
Nachdem nun sowohl der FER-2013-Datensatz als auch eine CNN-Architektur vorhanden ist, kann das Training beginnen, sofern der Input-Layer auf die Bildgröße des Datensatzes angepasst ist und der Output-Layer fünf Neuronen für die verbleibenden Emotionen besitzt. Allerdings kann das Training aufgrund mangelnder Rechenleistung zeitaufwendig sein, insbesondere ohne Grafikkarte auf dem eigenen Rechner. In solchen Fällen ist es ratsam, auf Alternativen aus der Cloud wie Google Colab zurückzugreifen.
Um zu beurteilen, wie gut ein Machine-Learning-Modell ist, sind eine oder mehrere Kennzahlen, also eine Metrik, hilfreich. Im Fall dieses Beispiels genügt eine einfache Genauigkeit (Accuracy). Sie gibt an, welcher Anteil von Bildern richtig klassifiziert wurde.
Die Accuracy liefert während des Trainings wichtige Informationen darüber, wie gut das Modell funktioniert und ob es Fortschritte macht, stagniert oder sogar Rückschritte macht. Der Vergleich zwischen Trainings- und Testdaten zeigt, ob das Modell anfällig für Overfitting ist, das heißt, ob es sich zu sehr auf die Trainingsdaten konzentriert und nicht gut auf neue Daten generalisiert.
In diesem Fall ist die Metrik Accuracy für die Trainingsdaten 68 Prozent und für die Testdaten 65 Prozent. Das drückt ein leichtes Overfitting aus. Noch mehr ins Detail geht die Aufschlüsselung in die einzelnen Kategorien mit einer Confusion Matrix, wie sie Abbildung 5 für die Testdaten und Abbildung 6 für die Trainingsdaten zeigt (zur Confusion Matrix siehe auch Artikel „Warum KI oft unfair ist und was dagegen hilft?“ ab Seite 34).
Ob diese Genauigkeit ausreichend ist, hängt vom Anwendungsfall ab. Oft ist es notwendig, den Anwendungsfall zu schärfen, nachdem feststeht, wie genau das Modell ist. Vielleicht muss man ihn sogar ganz fallen lassen. Selbst eine Genauigkeit von 99,9 Prozent oder mehr ist nicht immer ausreichend. Ein Beispiel ist die Erkennung von Fußgängern in selbstfahrenden Autos. Jeden tausendsten Fußgänger zu übersehen, ist sicher keine Option. Und so ist es auch hier schwer zu sagen, ob die erreichten 65 Prozent ausreichend. Dafür sind weitere Untersuchungen notwendig.
2013-Daten genutzt. Jetzt ist es jedoch an der Zeit, es mit realen Selfies zu konfrontieren. Ohne Vorverarbeitung ist das jedoch nicht möglich, da die Auflösung, der Farbraum und der Bildausschnitt typischer Selfies von den Trainingsdaten abweichen (siehe Abbildung 7). Für diese Aufbereitung bietet sich die bewährte Bildverarbeitungsbibliothek OpenCV an (siehe ix.de/z7ns).
Nachdem das Selfie vom RGB-Farbraum in ein Graustufenbild umgewandelt wurde, muss der Bildausschnitt so gewählt werden, dass lediglich das Gesicht zu erkennen ist. OpenCV verwendet hierfür einen Haar-Cascade-Klassifikator, um Gesichter anhand von Helligkeitsunterschieden in zahlreichen kleinen Ausschnitten zu erkennen. Die Anwendung dieses Klassifikators bietet zwei Vorteile. Zum einen ist sein Eingabeformat ein Graustufenbild, das bereits der vorherige Verarbeitungsschritt erzeugt hat. Zum anderen gibt es Bindings für eine JavaScript-Version von OpenCV, die es ermöglichen, die Gesichtserkennung direkt im Webbrowser auszuführen. Dazu passender Code ist in Listing 2 zu sehen.
Abschließend muss die Auflösung des erkannten Gesichts an die Auflösung der FER-2013-Daten angepasst werden. Um sicherzustellen, dass keine Verzerrungen auftreten, wird der Gesichtsausschnitt gegebenenfalls quadratisch erweitert und die Auflösung des Gesichts auf 48 × 48 Pixel skaliert. Es ist möglich, zusätzliche Verarbeitungsschritte durchzuführen, um die Selfies weiter an die Trainingsdaten anzupassen. Hierzu gehören die Anwendung von Filtern oder eine Kontrastkorrektur mittels Histogrammangleichung (siehe ix.de/z7ns).
Typische weitere Analysen untersuchen Unterklassen der Validierungsdaten. Welche Unterklassen analysiert werden, hängt vom Anwendungsfall und der Intuition der Experimentatoren ab. Wenn zum Beispiel der Verdacht besteht, dass Bilder mit schlechtem Kontrast Probleme bereiten, würden sie sich als Unterklasse anbieten. Am offensichtlichsten ist jedoch die Unterklasse der falsch klassifizierten Emotionen (siehe Abbildung 8). Sie dient den Experimentatoren als Hinweis auf etwaige Gemeinsamkeiten in den Bildern und bildet die Grundlage zum Verfeinern des Trainings.
Aus diesen Analysen geht dann hervor, welche Art von weiteren Daten zur Verbesserung des Modells notwendig ist. Es ist auch möglich, die Vorhersagesicherheit des Modells mit einzusetzen. Vielleicht gibt es keine Ausgabe, wenn sie zu gering ist. Beispiele besonders unsicherer Vorhersagen zeigt Abbildung 9.
Das trainierte und evaluierte Modell lässt sich nun, verpackt in einer Webapplikation, für den Betrieb zugänglich machen. Für den hier vorgestellten Fall dient Vue.js als Framework für die Bereitstellung. Dependencies für OpenCV.js und TensorFlow.js ermöglichen die notwendige Vorverarbeitung und Einbindung des Modells (siehe ix.de/z7ns). Um das in Python trainierte Modell mit TensorFlow.js zu nutzen, muss man es im passenden Format exportieren. Dafür enthält die Python-Bibliothek einen Converter. Da der hier vorgestellte Ansatz ausschließlich im Client läuft, ist das Deployment mit der Bereitstellung statischer Seiten bereits erledigt. Hier bieten sich GitHub Pages an.
Eine kleine Anwendung als Universitätsprojekt oder in einem Kaggle-Wettbewerb ist eine Sache. Etwas anderes ist es, eine komplette Anwendung in Produktion und vor den Benutzer zu bekommen. Machine Learning muss dabei in einem größeren Kontext gedacht werden, in dem insbesondere die Laufzeitumgebung und die im Betrieb gemachten Bilder im Vordergrund stehen. Selten passt eine gedachte Anwendung exakt zu den mehr oder weniger zufällig vorhandenen Standarddatensätzen.
Die Datensätze selbst zu erstellen, birgt eine Vielzahl von Hürden. Neben einer Gleichverteilung der Labels müssen andere Merkmale wie Alter, Geschlecht und Ethnie gleichermaßen vertreten sein, um ein bestmögliches Ergebnis zu erzielen. Hier hilft Feintuning. Dabei trainiert das Modell initial mit einem Datensatz, der dem Anwendungsfall nahekommt, und anschließend geht das Training mit einem kleineren, speziell auf den Anwendungsfall zugeschnittenen Datensatz weiter. (ulw@ix.de)
Quellen
Colab-Notebook zur Entwicklung des Beispiels inklusive der hier gezeigten Abbildungen, Links zu Quellen für Klassifizierungsmodelle, eingesetzten Werkzeuge und Methoden unter ix.de/z7ns
Der Artikel ist Teil des iX Special 2023 – Künstliche Intelligenz, S. 116-121
Das vollständige Magazin ist hier zu finden.
„Wie geht es dir?“ ist vermutlich die meistgestellte Frage in der Geschichte der Menschheit, nicht nur, weil sie fester Bestandteil von Begrüßungen ist. Denn wir möchten wissen, wie es unseren Mitmenschen geht. Emotionserkennung ist komplex, aber Menschen besitzen jahrelange Erfahrung und sind gut darin.
Sie spielt übrigens auch in der medizinischen Diagnose eine wichtige Rolle und kann beispielsweise dabei helfen, psychische Störungen wie Depressionen oder Angststörungen festzustellen. Algorithmen der Emotionserkennung können sogar in Kombination mit Gehirnscans eingesetzt werden, um neurologische Erkrankungen wie Schlaganfälle oder Tumore zu identifizieren.
Neben der Sprache sind Gesichtsausdrücke eine wesentliche Quelle, um Emotionen zu erkennen. Algorithmen, die häufig aus dem Bereich des Deep Learning stammen, nutzen diese Gesichtsausdrücke in Form von Bildern, um Emotionen zu erkennen. Wie man das selbst programmieren kann, soll folgender kleiner Anwendungsfall demonstrieren: Eine Webapplikation nimmt mit der Frontkamera ein Selfie auf und anschließend klassifiziert ein Algorithmus die darauf dargestellte Emotion.
Ein bei Google Colab gehostetes Jupyter-Notebook ergänzt diesen Artikel mit dem zugehörigen, ausführlich dokumentierten Code für Keras/TensorFlow, der sich ausprobieren und anpassen lässt (siehe ix.de/z7ns).
Ein Mensch sammelt Erfahrung, indem er Dinge erlebt und daraus lernt. Ähnlich ist es bei einem auf Deep Learning basierenden Algorithmus. Je mehr Gesichtsausdrücke dieser zu einer bestimmten Emotion sieht, desto höher ist die Wahrscheinlichkeit, ein grundlegendes Konzept hinter der Zuordnung von Gesichtsausdrücken und Emotionen zu entdecken.
Bilder von Gesichtsausdrücken zu sammeln und zusätzlich mit einem Label der dargestellten Emotion zu versehen, ist sehr aufwendig. Glücklicherweise gibt es Datensätze, die diese Anforderung schon erfüllen. Der öffentlich zugängliche Datensatz FER-2013 (siehe ix.de/z7ns), bestehend aus über 30 000 Graustufenbildern, zeigt Gesichter mit sieben Emotionen: Wut (Angry), Ekel (Disgust), Angst (Fear), Freude (Happy), Traurigkeit (Sad), Überraschung (Surprise) und Neutralität (Neutral).
Erstellt wurde der Datensatz, um die Entwicklung von Algorithmen zur Emotionserkennung zu fördern. Obwohl er mittlerweile etwa zehn Jahre alt ist, wird er immer noch regelmäßig zur Validierung neuer Algorithmen verwendet. Um den hier behandelten Anwendungsfall etwas zu erleichtern, fehlen im Beispiel die Emotionen Ekel und Angst: Ekel wegen der geringen Anzahl an Daten (siehe Abbildung 1) und Angst aufgrund einer potenziellen Verwechslung mit Überraschung.
90 Prozent des gesamten Datensatzes sollen Trainingsdaten sein, 10 Prozent Testdaten. Die Trainingsdaten dienen dazu, Zusammenhänge zwischen den Gesichtern und der jeweiligen Emotion zu erlernen. Das Modell nutzt diese Zusammenhänge, um Vorhersagen auf neuen Daten zu treffen. Die Testdaten werden verwendet, um das Modell nach dem Training zu bewerten und sicherzustellen, dass es in der Lage ist, auf unbekannten Daten richtige Vorhersagen zu treffen. Weitere Anpassungen am Datensatz waren nicht notwendig, da alle Bilder in der gleichen Größe vorliegen und der Fokus bereits auf dem Gesicht liegt (siehe Abbildung 2).
Bilder enthalten viel Information und ein hohes Maß an Details und Variation. Und woran genau wir ein Objekt oder einen Sachverhalt in einem Bild erkennen, ist nur schwer in Worte zu fassen. Wir haben einfach schon viele Hunde gesehen und wissen auf einer nonverbalen Ebene, wie so ein Tier aussieht. Das heißt, wir haben durch viele Beispiele gelernt, was einen Hund ausmacht, und können daher auch auf bisher nicht gesehene Hunde und sogar auf bisher unbekannte Hunderassen generalisieren.
Das hat Folgen für ein sinnvolles Vorgehen bei der Objekterkennung. Klassische Ansätze extrahieren bestimmte Eigenschaften (Features), anhand derer sie die Bilder klassifizieren. Das kann erfolgreich sein, wenn die Bilder wenig Variationen enthalten, aus geometrischen Formen bestehen oder in einer kontrollierten Umgebung aufgenommen werden. Bei Selfies ist das nicht der Fall, der klassische Ansatz fällt damit weg.
Stattdessen kommt mit dem Deep Learning eher eine Form des Machine Learning infrage, das neuronale Netzwerke mit vielen hintereinandergeschalteten Schichten (Layers) nutzt, häufig mit unterschiedlichen Aufgaben. Die Bilder werden in Paaren zusammen mit den passenden Emotionen zum überwachten Training (Supervised Machine Learning) des Deep-Learning-Modells verwendet. Dazu kommt der seit Langem bekannte und etablierte Backpropagation-Algorithmus zum Einsatz.
Seit fast zehn Jahren dominieren in diesem Bereich die Convolutional Neural Networks (CNNs). Die wichtigsten Schichten sind dabei die Convolutional Layers. Sie erlernen eine Reihe von Filteroperationen, um passende Features zu extrahieren und diese dann in abstrakter Form in einen nachgeschalteten Classifier zu füttern.
Ein CNN ist somit für die Aufgabe der Emotionserkennung sinnvoll, aber sein konkreter Aufbau ist offen. Dafür gibt es grundsätzlich zwei Optionen. Eine Möglichkeit besteht darin, es explizit aus Schichten zusammenzusetzen. Dafür bildet oft eine einfache und lineare Standardarchitektur die Grundlage (siehe Abbildung 3). Sie besteht aus einer Reihe von Blöcken aus den erwähnten Convolutional Layers und Pooling Layers, die die gefilterten Bilder herunterskalieren. Am Ende stehen der Classifier aus den für Deep Learning typischen Dense Layers und ein finaler Layer für die Aktivierung der wahrscheinlichsten Kategorie.
Eine solche Architektur gehört zur Familie der VGG-Netzwerke, benannt nach einem einflussreichen Forschungsartikel der Oxforder Visual Geometry Group (VGG; siehe ix.de/z7ns). Sie hat den Vorteil, einfach und in einem gewissen Maß sogar analysierbar zu sein.
Eine solche Architektur hat aber auch Nachteile. Aus dem letzten Layer kommen viele unterschiedliche Versionen des gefilterten Bilds heraus und jeder Bildpunkt jedes Bildes muss mit einem Parameter mit jedem Neuron des Classifiers verbunden werden. So kann der Classifier schnell aus ein paar Millionen Neuronen bestehen. Deshalb verzichten moderne Architekturen auf einen solchen expliziten Classifier. Ebenso weichen diese Ansätze von der linearen Struktur ab, das heißt, es gibt mehr als einen Pfad von der Eingabe zur Klassifikation. Dazu kommen viele weitere Tricks, die die Rechenleistung oder die Anzahl der Parameter verringern. Diese Architekturen baut man nicht selbst, sondern nimmt sie von der Stange (siehe ix.de/z7ns), da sie eher in den Forschungslabors entstehen.
Modernere Architekturen enthalten oft etwas exotischere Arten von Schichten und können daher bei der Produktivsetzung Schwierigkeiten machen. Denn: Auch auf der Produktionsumgebung muss eine Implementierung des Modells vorliegen. Und diese Produktionsumgebung ist in diesem Fall ein Webbrowser. Daher fällt hier die Entscheidung für eine einfache VGG-Architektur (siehe Listing 1). Der Code verwendet die typischen Techniken zur besseren Generalisierung. Dropout trainiert bei jedem Batch nur einen gewissen Teil von Neuronen und macht das Netz intuitiv gesprochen zu einem Ensemble. BatchNormalization normalisiert diese Batches und dient ebenso dazu, das Netz robuster und damit generalisierbarer zu machen. Die Relu-Aktivierung als nicht lineares Element führt zu schnellerem Training.
Nachdem nun sowohl der FER-2013-Datensatz als auch eine CNN-Architektur vorhanden ist, kann das Training beginnen, sofern der Input-Layer auf die Bildgröße des Datensatzes angepasst ist und der Output-Layer fünf Neuronen für die verbleibenden Emotionen besitzt. Allerdings kann das Training aufgrund mangelnder Rechenleistung zeitaufwendig sein, insbesondere ohne Grafikkarte auf dem eigenen Rechner. In solchen Fällen ist es ratsam, auf Alternativen aus der Cloud wie Google Colab zurückzugreifen.
Um zu beurteilen, wie gut ein Machine-Learning-Modell ist, sind eine oder mehrere Kennzahlen, also eine Metrik, hilfreich. Im Fall dieses Beispiels genügt eine einfache Genauigkeit (Accuracy). Sie gibt an, welcher Anteil von Bildern richtig klassifiziert wurde.
Die Accuracy liefert während des Trainings wichtige Informationen darüber, wie gut das Modell funktioniert und ob es Fortschritte macht, stagniert oder sogar Rückschritte macht. Der Vergleich zwischen Trainings- und Testdaten zeigt, ob das Modell anfällig für Overfitting ist, das heißt, ob es sich zu sehr auf die Trainingsdaten konzentriert und nicht gut auf neue Daten generalisiert.
In diesem Fall ist die Metrik Accuracy für die Trainingsdaten 68 Prozent und für die Testdaten 65 Prozent. Das drückt ein leichtes Overfitting aus. Noch mehr ins Detail geht die Aufschlüsselung in die einzelnen Kategorien mit einer Confusion Matrix, wie sie Abbildung 5 für die Testdaten und Abbildung 6 für die Trainingsdaten zeigt (zur Confusion Matrix siehe auch Artikel „Warum KI oft unfair ist und was dagegen hilft?“ ab Seite 34).
Ob diese Genauigkeit ausreichend ist, hängt vom Anwendungsfall ab. Oft ist es notwendig, den Anwendungsfall zu schärfen, nachdem feststeht, wie genau das Modell ist. Vielleicht muss man ihn sogar ganz fallen lassen. Selbst eine Genauigkeit von 99,9 Prozent oder mehr ist nicht immer ausreichend. Ein Beispiel ist die Erkennung von Fußgängern in selbstfahrenden Autos. Jeden tausendsten Fußgänger zu übersehen, ist sicher keine Option. Und so ist es auch hier schwer zu sagen, ob die erreichten 65 Prozent ausreichend. Dafür sind weitere Untersuchungen notwendig.
2013-Daten genutzt. Jetzt ist es jedoch an der Zeit, es mit realen Selfies zu konfrontieren. Ohne Vorverarbeitung ist das jedoch nicht möglich, da die Auflösung, der Farbraum und der Bildausschnitt typischer Selfies von den Trainingsdaten abweichen (siehe Abbildung 7). Für diese Aufbereitung bietet sich die bewährte Bildverarbeitungsbibliothek OpenCV an (siehe ix.de/z7ns).
Nachdem das Selfie vom RGB-Farbraum in ein Graustufenbild umgewandelt wurde, muss der Bildausschnitt so gewählt werden, dass lediglich das Gesicht zu erkennen ist. OpenCV verwendet hierfür einen Haar-Cascade-Klassifikator, um Gesichter anhand von Helligkeitsunterschieden in zahlreichen kleinen Ausschnitten zu erkennen. Die Anwendung dieses Klassifikators bietet zwei Vorteile. Zum einen ist sein Eingabeformat ein Graustufenbild, das bereits der vorherige Verarbeitungsschritt erzeugt hat. Zum anderen gibt es Bindings für eine JavaScript-Version von OpenCV, die es ermöglichen, die Gesichtserkennung direkt im Webbrowser auszuführen. Dazu passender Code ist in Listing 2 zu sehen.
Abschließend muss die Auflösung des erkannten Gesichts an die Auflösung der FER-2013-Daten angepasst werden. Um sicherzustellen, dass keine Verzerrungen auftreten, wird der Gesichtsausschnitt gegebenenfalls quadratisch erweitert und die Auflösung des Gesichts auf 48 × 48 Pixel skaliert. Es ist möglich, zusätzliche Verarbeitungsschritte durchzuführen, um die Selfies weiter an die Trainingsdaten anzupassen. Hierzu gehören die Anwendung von Filtern oder eine Kontrastkorrektur mittels Histogrammangleichung (siehe ix.de/z7ns).
Typische weitere Analysen untersuchen Unterklassen der Validierungsdaten. Welche Unterklassen analysiert werden, hängt vom Anwendungsfall und der Intuition der Experimentatoren ab. Wenn zum Beispiel der Verdacht besteht, dass Bilder mit schlechtem Kontrast Probleme bereiten, würden sie sich als Unterklasse anbieten. Am offensichtlichsten ist jedoch die Unterklasse der falsch klassifizierten Emotionen (siehe Abbildung 8). Sie dient den Experimentatoren als Hinweis auf etwaige Gemeinsamkeiten in den Bildern und bildet die Grundlage zum Verfeinern des Trainings.
Aus diesen Analysen geht dann hervor, welche Art von weiteren Daten zur Verbesserung des Modells notwendig ist. Es ist auch möglich, die Vorhersagesicherheit des Modells mit einzusetzen. Vielleicht gibt es keine Ausgabe, wenn sie zu gering ist. Beispiele besonders unsicherer Vorhersagen zeigt Abbildung 9.
Das trainierte und evaluierte Modell lässt sich nun, verpackt in einer Webapplikation, für den Betrieb zugänglich machen. Für den hier vorgestellten Fall dient Vue.js als Framework für die Bereitstellung. Dependencies für OpenCV.js und TensorFlow.js ermöglichen die notwendige Vorverarbeitung und Einbindung des Modells (siehe ix.de/z7ns). Um das in Python trainierte Modell mit TensorFlow.js zu nutzen, muss man es im passenden Format exportieren. Dafür enthält die Python-Bibliothek einen Converter. Da der hier vorgestellte Ansatz ausschließlich im Client läuft, ist das Deployment mit der Bereitstellung statischer Seiten bereits erledigt. Hier bieten sich GitHub Pages an.
Eine kleine Anwendung als Universitätsprojekt oder in einem Kaggle-Wettbewerb ist eine Sache. Etwas anderes ist es, eine komplette Anwendung in Produktion und vor den Benutzer zu bekommen. Machine Learning muss dabei in einem größeren Kontext gedacht werden, in dem insbesondere die Laufzeitumgebung und die im Betrieb gemachten Bilder im Vordergrund stehen. Selten passt eine gedachte Anwendung exakt zu den mehr oder weniger zufällig vorhandenen Standarddatensätzen.
Die Datensätze selbst zu erstellen, birgt eine Vielzahl von Hürden. Neben einer Gleichverteilung der Labels müssen andere Merkmale wie Alter, Geschlecht und Ethnie gleichermaßen vertreten sein, um ein bestmögliches Ergebnis zu erzielen. Hier hilft Feintuning. Dabei trainiert das Modell initial mit einem Datensatz, der dem Anwendungsfall nahekommt, und anschließend geht das Training mit einem kleineren, speziell auf den Anwendungsfall zugeschnittenen Datensatz weiter. (ulw@ix.de)
Quellen
Colab-Notebook zur Entwicklung des Beispiels inklusive der hier gezeigten Abbildungen, Links zu Quellen für Klassifizierungsmodelle, eingesetzten Werkzeuge und Methoden unter ix.de/z7ns
Der Artikel ist Teil des iX Special 2023 – Künstliche Intelligenz, S. 116-121
Das vollständige Magazin ist hier zu finden.