Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1920:projekt_-_bericht [2020/03/27 23:56] mariaring |
ws1920:projekt_-_bericht [2020/04/02 20:45] (aktuell) justanni |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ===== Gliederung ===== | + | ====== 1. Einleitung ====== |
- | + | ||
+ | {{:ws1920:apollon_overview.png?300 |}} | ||
- | **1. Einleitung** | + | Der Name unseres Projektes, **Apollon** steht für affective, personal, online, located, laudable, overdue und network. Diese Wörter haben wir zusammen ausgewählt, weil sie unser Projekt sehr gut beschreiben. Die Anfangsbuchstaben der Wörter bilden unseren Projekt Namen **Apollon**. Dieser ist in der griechischen und römischen Mythologie der Gott des Lichts, der Heilung und der **Musik**. Die Musik spielt in unserem Projekt eine bedeutsame Rolle, weshalb wir den Namen so wählten. |
+ | Das Projekt Apollon ermöglicht durch ein trainiertes Netzwerk die Grundstimmung einer Person zu bestimmen. Das Netzwerk wurde mit TensorFlow und Keras trainiert. Die vier Grundstimmungen sind glücklich, traurig, aggressiv und entspannt. Anhand des Gesichts der abgebildeten Person, wird die Stimmung erkannt. Schließlich wird ein Spotify Link zu einem Lied aus einer der vier erstellten Playlists gesendet, das am Besten zu der Stimmung passt. Das Lied kann anschließend abgespielt werden. Somit ermöglicht Apollon Lieder zur passenden Stimmung durch nicht langes suchen zu finden. | ||
- | **2. Projektbestandteile** | + | Zusammenfassend kann man zu der Umsetzung unseres Projekts sagen, dass ein Selfie an unseren Telegram Bot gesendet werden kann, das Bild analysiert und durch Preprocessing verändert wird und schlussendlich die Stimmungen erkannt wird, ein passender Song wird zurückgesendet. |
+ | --------------------------------------------------------------------------------------------------------- | ||
- | 2.1 Neuronales Netzwerk zur Emotionserkennung (Annika) | + | ====== 2. Projektbestandteile ====== |
- | 2.2 Bild-Preprocessing (Maria) | + | Unser Projekt besteht aus den folgenden Python-Skripten bzw. Teilen: |
- | 2.3 Spotipy (Sven) | + | * Skript zum Aufsetzen + Trainieren des Neuronalen Netzwerks |
- | 2.4 Telegram Bot | + | * **Apollon-Programm** (hier sind die einzelnen Bestandteile des Projekts gelistet, als Funktionen) |
+ | * **Apollon-Bot** (quasi die Oberfläche, welcher das Apollon-Programm dann aufruft und ausführt) | ||
- | **3. Bericht über den Verlauf** | + | Im Folgenden werden zunächst die einzelnen Bestandteile des Apollon-Programms erklärt und im Anschluss der Apollon-Bot dargestellt. |
- | **4. Fazit und Ausblick** | + | ===== 2.1 Neuronales Netzwerk zur Emotionserkennung ===== |
- | **5. Literaturangabe und verwendete Software** | + | Bevor wir euch erklären, **wie** wir Machine Learning konkret bei APOLLON eingesetzt haben, gibt es erstmal eine kurze Erklärung, **warum** wir Machine Learning genutzt haben. Alle, die sich mit Machine Learning schon auskennen, können gerne den nächsten Absatz überspringen. |
- | ------------------------------------------------------------------- | ||
- | **1. Einleitung** | ||
- | Der Name Apollon steht für affective, personal, online, located, laudable, overdue und network. Diese Wörter haben wir zusammen ausgewählt, weil sie unser Projekt sehr gut beschreiben. Die Anfangsbuchstaben der Wörter bilden unseren Projekt Namen Apollon. Dieser ist in der griechischen und römischen Mythologie der Gott des Lichts, der Heilung und der __Musik__. Die Musik spielt in unserem Projekt eine bedeutsame Rolle, weshalb wir den Namen so wählten. | + | === ⇒ Exkurs: Warum braucht APOLLON Machine Learning + CNN? === |
- | Das Projekt Apollon ermöglicht durch ein trainiertes Netzwerk die Grundstimmung einer Person zu bestimmen. Das Netzwerk wurde mit TensorFlow und Keras trainiert. Die vier Grundstimmungen sind glücklich, traurig, aggressiv und entspannt. Anhand des Gesichts der abgebildeten Person, wird die Stimmung erkannt. Schließlich wird ein Spotify Link zu einem Lied aus einer der vier erstellten Playlists gesendet, das am Besten zu der Stimmung passt. Das Lied kann anschließend abgespielt werden. Somit ermöglicht Apollon Lieder zur passenden Stimmung durch nicht langes suchen zu finden. | + | Unsere Problemstellung bei APOLLON ist ja relativ komplex, schließlich soll ein Computer Emotionen von Menschen anhand ihres Gesichts erkennen. (Häufig fällt das ja schon manchen Menschen nicht so leicht, LOL) |
+ | Wir haben uns entschieden, dies anhand Fotos, die Menschen von ihrem Gesicht machen (sogenannte Selfies) zu operationalisieren. Da Nutzer*innen eigene Selfies an APOLLON schicken, muss unser Programm in der Lage sein, Emotionen auf **neuen, dem Programm unbekannten** Bilder zu erkennen und zu klassifizieren. Einfaches "auswendig" lernen reicht also nicht! Eine Generalisierung ist erforderlich. | ||
+ | Dies kann man mit Machine Learning Ansätze ermöglichen. Beim Maschine Learning füttert man einen Algorithmus mit einem (gelabelten) Trainingsdatensatzes. Ohne dass wir weitere Anweisungen geben müssen, "erkennt" der Algorithmus beim Trainings über die Zeit Muster in dem Datensatz und entwickelt und optimiert ein statistisches Modell. Wenn wir mit dem Modell zufrieden sind, können wir es speichern und dann damit neue Bilder (mit einer gewissen Wahrscheinlichkeit) klassifizieren. (Das heißt auch, dass Machine Learning genau genommen auch "nur" Statistik ist!) | ||
- | Zusammenfassend kann man zu der Umsetzung unseres Projekts sagen, dass ein Selfie an unseren Telegram Bot gesendet werden kann, das Bild analysiert und durch Preprocessing verändert wird und schlussendlich die Stimmungen erkannt wird, ein passender Song wird zurückgesendet. | + | Es gibt verschiedene Algorithmen, die für verschiedene Datenstrukturen besonders gut geeignet sind. Da wir Fotos benutzen, enthalten unsere Daten einiges an Information (48x48 Pixel, die alle einen (Grau-)Wert haben und dann auch nicht für sich betrachtet werden können, sondern in Clustern angeordnet sind etc.). |
+ | Um solche Daten mit Machine Learning möglichst gut zu Klassifizieren, eigenen sich ** Convolutional Neural Networks**. So eins haben wir auch bei Apollon genutzt, mit Keras ist die Umsetzung relativ einfach. | ||
+ | Unser Netzwerk bekommt als Input eine zwei-dimensionale Matrix (das jeweilige Foto in Graustufen). Dieses Bild wird dann durch mehrere convolutional layers, pooling layers und zum Schluss fully-connected layers geschickt (genauer Netzwerk-Aufbau siehe weiter unten). Das besondere an den convolutional Layers ist, dass sie sozusagen kleine Filterkernel über den Input legen (ähnlich wie rezeptive Felder in der Biologie), und so Features extrahieren können. In den Pooling layers werden nicht benötigte Informationen verworfen. Am Ende gibt uns unser Netz aus, mit welcher jeweiligen Wahrscheinlichkeit das neue Bild die Emotion zeigt. | ||
- | --------------------------------------------------------------------------------------------------------- | ||
- | |||
- | **2. Projektbestandteile** | ||
- | |||
- | Unser Projekt besteht grob gesagt aus zwei verschieden Skripten: | ||
- | |||
- | * Apollon-Programm (hier sind die einzelnen Bestandteile des Projekts gelistet) | ||
- | |||
- | * Apollon-Bot (quasi die Oberfläche, welcher das Apollon-Programm dann aufruft und ausführt) | ||
- | |||
- | Im Folgenden werden zunächst die einzelnen Bestandteile des Apollon-Programms erklärt und im Anschluss der Apollon-Bot dargestellt. | ||
- | __2.1 Neuronales Netzwerk zur Emotionserkennung (Annika)__ | + | === Umsetzung in APOLLON === |
- | Mithilfe von Keras und TensorFlow haben wir ganz im vorhinein ein neuronales Netzwerk aufgesetzt und trainiert. | + | Mithilfe von **Keras** und **TensorFlow** haben wir ganz im vorhinein ein neuronales Netzwerk aufgesetzt und trainiert. |
- | Dies passiert in einem separaten Skript. Als Trainingsdatensatz haben wir __fer2013 von kaggle__ benutzt. Dieser Datensatz enthält über 28.000 Bilder, 48x48 Pixel in Graustufen, welche auf 7 Emotionen hin beschriftet sind. Für unser Projekt mussten wir zunächst den Datensatz exportieren + aufbereiten. Zum Einlesen wurde die __pandas library__ benutzt. Wir haben uns entschieden, nur 4 verschiedene Emotionen zu berücksichtigen, und mussten daher den Datensatz um 3 reduzieren, das wurde wie folgt gelöst: | + | Dies passierte in einem separaten Skript. Als Trainingsdatensatz haben wir **fer2013** von der Plattform kaggle benutzt. Dieser Datensatz enthält über 28.000 Bilder, 48x48 Pixel in Graustufen, welche auf 7 Emotionen hin beschriftet sind. Für unser Projekt mussten wir zunächst den Datensatz exportieren + aufbereiten. Zum Einlesen wurde die **pandas** library benutzt. Wir haben uns entschieden, nur 4 verschiedene Emotionen zu berücksichtigen, und mussten daher den Datensatz um 3 reduzieren, das wurde wie folgt gelöst: |
<code python> | <code python> | ||
Zeile 65: | Zeile 59: | ||
</code> | </code> | ||
- | + | Für den Aufbau des neuronalen Netzwerks haben wir uns an einem ähnlichen Beispiel aus dem Buch von **Aurélian Géron** orientiert. Er beschreibt dort den Aufbau eines Netzwerks, welches Kleidungsstücke in Kategorien einordnet. Der Kleidungsstücke-Datensatz besteht genau wie fer2013 ebenfalls aus sehr kleinen Bildern in Graustufen, und da wir selber bisher keine Erfahrung mit neuronalen Netzwerken mitbringen, haben wir uns für diesen Aufbau entschieden. Das Netzwerk besteht aus 14 layers. Zunächst sind 2D convolutional layers und pooling layers verbaut, im Anschluss fully connected layers. | |
- | Für den Aufbau des neuronalen Netzwerks haben wir uns an einem ähnlichen Beispiel aus dem Buch von __Aurélian Géron__ orientiert. Er beschreibt dort den Aufbau eines Netzwerks, welches Kleidungsstücke in Kategorien einordnet. Der Kleidungsstücke-Datensatz besteht genau wie der2013 ebenfalls aus sehr kleinen Bildern in Graustufen, und da wir selber bisher keine Erfahrung mit neuronalen Netzwerken mitbringen, haben wir uns für diesen Aufbau entschieden. Das Netzwerk besteht aus 14 layers. Zunächst sind 2D convolutional layers und pooling layers verbaut, im Anschluss fully connected layers. | + | |
Die finale Netzwerk-Architektur sieht so aus: | Die finale Netzwerk-Architektur sieht so aus: | ||
Zeile 133: | Zeile 126: | ||
</code> | </code> | ||
- | __2.2 Bild-Preprocessing (Maria)__ | + | Mit der Funktion model.predict() aus Keras erhält man für ein Bild für jede der 4 möglichen Kategorien eine Wahrscheinlichkeit, die jeweils angibt, wie sicher sich unser Modell ist, dass das Bild in diese Kategorie gehört. Der Einfachheit halber haben wir uns dafür entschieden, das Maximum zu nutzen (das heißt das Bild wird in die Kategorie eingeordnet, in welcher die Wahrscheinlichkeit am höchsten ist). |
+ | |||
+ | ===== 2.2 Bild-Preprocessing ===== | ||
Das Machine Learning ist vom richtigen Preprocessing abhängig. Das Netzwerk wird unter bestimmten Bedingungen und Einstellungen trainiert und kann mit diesen bestmöglich arbeiten. | Das Machine Learning ist vom richtigen Preprocessing abhängig. Das Netzwerk wird unter bestimmten Bedingungen und Einstellungen trainiert und kann mit diesen bestmöglich arbeiten. | ||
Zeile 189: | Zeile 184: | ||
</code> | </code> | ||
- | __2.3 Spotipy(Sven)__ | + | ===== 2.3 Spotipy ===== |
Um Spotipy verwenden zu können wird zuallererst eine Nutzungsberechtigung (Token) benötigt. Diesen erhält man auf der Spotify for developers Seite. Dafür muss man einigen einfach beschriebenen Schritten folgen. Hat man das Token kann man anfangen Spotipy zu nutzen. Die Musiksuche im Anschluss funktioniert sehr einfach, da das Programm anhand von einem Zahlwert zwischen 0 und 4 entscheidet, aus welcher Liste ein Lied auswählt wird. Die ausgewählte Liste wird folgend Zeile für Zeile eingelesen und in zwei Listen eingefügt. | Um Spotipy verwenden zu können wird zuallererst eine Nutzungsberechtigung (Token) benötigt. Diesen erhält man auf der Spotify for developers Seite. Dafür muss man einigen einfach beschriebenen Schritten folgen. Hat man das Token kann man anfangen Spotipy zu nutzen. Die Musiksuche im Anschluss funktioniert sehr einfach, da das Programm anhand von einem Zahlwert zwischen 0 und 4 entscheidet, aus welcher Liste ein Lied auswählt wird. Die ausgewählte Liste wird folgend Zeile für Zeile eingelesen und in zwei Listen eingefügt. | ||
Zeile 264: | Zeile 259: | ||
</code> | </code> | ||
| | ||
- | __2.4 Telegram Bot__ | + | ===== 2.4 Telegram Bot ===== |
Als “Benutzeroberfläche” für unser Programm haben wir uns für Telegram und einen Bot entschieden. Diesen haben wir mit der library python-telegram-bot erstellt. Der Bot ruft das Apollon-Programm auf und führt nacheinander die einzelnen Bestandteile von Apollon aus. Die Bestandteile sind im Programm als Funktionen definiert. Die ganze Funktion von Apollon steckt im folgenden Code-Ausschnitt des Bots: | Als “Benutzeroberfläche” für unser Programm haben wir uns für Telegram und einen Bot entschieden. Diesen haben wir mit der library python-telegram-bot erstellt. Der Bot ruft das Apollon-Programm auf und führt nacheinander die einzelnen Bestandteile von Apollon aus. Die Bestandteile sind im Programm als Funktionen definiert. Die ganze Funktion von Apollon steckt im folgenden Code-Ausschnitt des Bots: | ||
Zeile 307: | Zeile 302: | ||
</code> | </code> | ||
- | Hier werden nacheinander die Funktionen des Apollon-Programms ausgeführt. Ansonsten ist unser Bot so programmiert, dass dieser auf jede mögliche Nachricht mit der Aufforderung:"Um eine Musikempfehlung zu erhalten, schicke mir bitte ein Selfie!"antwortet, außer die Person schickt ein Foto. | + | Hier werden nacheinander die Funktionen des Apollon-Programms ausgeführt. (Der Aufbau und die Funktionsweise der einzelnen Funktionen wurden oben bereits beschrieben) |
+ | Ansonsten ist unser Bot so programmiert, dass dieser auf jede mögliche Nachricht mit der Aufforderung:"Um eine Musikempfehlung zu erhalten, schicke mir bitte ein Selfie!" antwortet, außer die Person schickt ein Foto. | ||
+ | Alles, was Nutzer*innen von unserem Bot mitbekommen, ist die Oberfläche auf telegram. Dort sieht das dann so aus: | ||
+ | |||
+ | {{:ws1920:apollon_screenshot.png |}} | ||
**Unter dem folgenden Link können Telegram-Nutzer*innen unseren Bot finden:** | **Unter dem folgenden Link können Telegram-Nutzer*innen unseren Bot finden:** | ||
Zeile 319: | Zeile 318: | ||
------------------------------ | ------------------------------ | ||
- | **3. Bericht über den Verlauf** | + | ====== 3. Bericht über den Verlauf ====== |
- | Die erste Idee die wir hatten war es ein Programm zu schreiben welches Musik abspielt aufgrund dessen welche Stimmung eine Person hat, dazu haben wir uns in drei teilbereiche unterteilt (Stimmungserkennung, Musikwiedergabe und Wiki-Dokumentation schreiben). Unsere zweite Überlegung war dann ob die Musik die Stimmung heben soll oder ob die Musik die Stimmung wiederspiegeln soll und über welches Medium wir die Musik ausgeben lassen (Youtube, Spotify, nur eine Titel, etc.) letztendlich sind wir zu dem Schluss gekommen das sich Spotify besonders eignet, da ein Python Package zur Anbindung an Spotify existiert (Spotipy). Des Weiteren entschieden wir uns dafür, die Anwendung mit einem Telegram Bot zu verbinden sodass ein über Telegram an den Bot geschicktes Bild in das Programm eingelesen werden kann. Die nächste Zeit verbrachten wir viel damit uns zu unseren Bereichen zu informieren und die gesammelten Informationen einerseits in unserem Programm umzusetzen, aber auch damit die Info und den Fortschritt mit dem Rest des Teams zu teilen. Die Letzten Schritte unserer Arbeit waren die fertigen Programmteile zusammenzufügen und die Dokumentation und Präsentation anzufertigen. | + | Die erste Idee, die wir hatten, war es ein Programm zu schreiben, welches Musik abspielt aufgrund dessen welche Stimmung eine Person hat.Dazu haben wir uns in drei Teilbereiche unterteilt (Stimmungserkennung, Musikwiedergabe und Wiki-Dokumentation schreiben). |
+ | Relativ schnell war klar, dass die Stimmungserkennung über Fotos stattfinden soll, und zwar mit Hilfe eines neuronalen Netzwerkes, weil uns hier die Umsetzung interessierte (weitere Erläuterungen hier ⇒ //Exkurs: Warum Machine Learning + CNN?// ). | ||
+ | Unsere zweite Überlegung war dann, ob die Musik die Stimmung heben soll oder ob die Musik die Stimmung widerspiegeln soll und über welches Medium wir die Musik ausgeben lassen (Youtube, Spotify, nur eine Titel, etc.). Letztendlich sind wir zu dem Schluss gekommen, das sich Spotify besonders eignet, da ein Python Package zur Anbindung an Spotify existiert (Spotipy). | ||
+ | Des Weiteren entschieden wir uns dafür, die Anwendung mit einem Telegram Bot zu verbinden, sodass ein über Telegram an den Bot geschicktes Bild in das Programm eingelesen werden kann. | ||
- | Detaillierteres findest du unter ⇒ [[Projekt - Dokumentationen]] :) | + | |
+ | Nach diesen anfänglichen gemeinsamen Überlegungen und Planungen in den ersten Terminen, verbrachten wir die nächste Zeit damit, uns zu unseren Bereichen zu informieren und die gesammelten Informationen einerseits in unserem Programm umzusetzen, aber auch damit die Info und den Fortschritt mit dem Rest des Teams zu teilen. Die letzten Schritte unserer Arbeit waren die fertigen Programmteile zusammenzufügen und die Dokumentation und Präsentation anzufertigen. Dies erfolgte größtenteils während der Blocktage. | ||
+ | |||
+ | Detaillierteres zum Ablauf des Projekts (nämlich unsere Protokolle) findest du unter ⇒ [[Projekt - Dokumentationen]] :) | ||
-------------------------------- | -------------------------------- | ||
- | **4. Fazit und Ausblick** | + | ====== 4. Fazit und Ausblick ====== |
Insgesamt sind wir mit dem Projekt-Verlauf und dem Ergebnis sehr zufrieden, da wir alle vorher keinerlei Python-Kenntnisse hatten. Wir haben bei der Umsetzung des Projekts viel gelernt und haben gut zusammen gearbeitet. | Insgesamt sind wir mit dem Projekt-Verlauf und dem Ergebnis sehr zufrieden, da wir alle vorher keinerlei Python-Kenntnisse hatten. Wir haben bei der Umsetzung des Projekts viel gelernt und haben gut zusammen gearbeitet. | ||
Allerdings könnte man mit mehr Zeit unser Apollon-Programm erheblich verbessern, gerade ist es eher eine Art Musik-Zufalls-Generator ;-). | Allerdings könnte man mit mehr Zeit unser Apollon-Programm erheblich verbessern, gerade ist es eher eine Art Musik-Zufalls-Generator ;-). | ||
+ | |||
Um die Stimmung-Erkennung zu verbessern, müsste man das Netzwerk optimiert, sei es durch die Auswahl eines besseren Traings-Data-Sets (hier würde sich eine gelabelte Selfie-Datenbank anbieten, wenn es so etwas gibt), die Auswahl einer besseren Architektur oder die Optimierung der Trainingsparameter. Auch eine Feedback-Funktion für die Nutzer*innen (Passte der Song zu deiner Stimmung?) könnte den Bot durch die Möglichkeit zum online-lernen verbessern. Des Weiteren wäre es schön, die Musik-Datenbank zu vergrößern (aktuell enthält jede Liste nur 100 Songs) und es wäre auch schön, eine Möglichkeit zu finden, die Songs ohne Spotify zu verschicken. Was den Bot betrifft, läuft unser Programm lokal auf einem Computer - daher funktioniert es nur, wenn der Computer auch online ist. Es wäre interessant, verschiedene Hosting-Optionen auszuprobieren (zB. Raspberry Pi), um eine dauerhafte Funktion zu gewährleisten. | Um die Stimmung-Erkennung zu verbessern, müsste man das Netzwerk optimiert, sei es durch die Auswahl eines besseren Traings-Data-Sets (hier würde sich eine gelabelte Selfie-Datenbank anbieten, wenn es so etwas gibt), die Auswahl einer besseren Architektur oder die Optimierung der Trainingsparameter. Auch eine Feedback-Funktion für die Nutzer*innen (Passte der Song zu deiner Stimmung?) könnte den Bot durch die Möglichkeit zum online-lernen verbessern. Des Weiteren wäre es schön, die Musik-Datenbank zu vergrößern (aktuell enthält jede Liste nur 100 Songs) und es wäre auch schön, eine Möglichkeit zu finden, die Songs ohne Spotify zu verschicken. Was den Bot betrifft, läuft unser Programm lokal auf einem Computer - daher funktioniert es nur, wenn der Computer auch online ist. Es wäre interessant, verschiedene Hosting-Optionen auszuprobieren (zB. Raspberry Pi), um eine dauerhafte Funktion zu gewährleisten. | ||
--------------------- | --------------------- | ||
- | __5. Literaturangabe und verwendete Software__ | + | ====== 5. Literaturangabe und verwendete Software ====== |
- | Neuronales Netzwerk und Emotionen: | + | === Neuronales Netzwerk und Emotionen:=== |
Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems. O'Reilly Media. | Géron, A. (2019). Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems. O'Reilly Media. | ||
Zeile 361: | Zeile 367: | ||
-------- | -------- | ||
- | Alles zum Preprocessing: | + | === Alles zum Preprocessing: === |
Pillow instalation: https://www.youtube.com/watch?v=xvhjcQY2lqM&feature=youtu.be | Pillow instalation: https://www.youtube.com/watch?v=xvhjcQY2lqM&feature=youtu.be | ||
Zeile 377: | Zeile 383: | ||
------- | ------- | ||
- | Alles zur Musik und Spotipy: | + | === Alles zur Musik und Spotipy:=== |
https://cs.nju.edu.cn/sufeng/data/musicmood.htm | https://cs.nju.edu.cn/sufeng/data/musicmood.htm | ||
Zeile 389: | Zeile 395: | ||
------ | ------ | ||
- | Telegram Bot: | + | === Telegram Bot:=== |
https://python-telegram-bot.org | https://python-telegram-bot.org |