Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1920:projekt_-_bericht [2020/04/01 16:12] justanni |
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. |
- | + | ||
- | + | ||
- | **2. Projektbestandteile** | + | |
- | + | ||
- | + | ||
- | 2.1 Neuronales Netzwerk zur Emotionserkennung | + | |
- | + | ||
- | 2.2 Bild-Preprocessing | + | |
- | + | ||
- | 2.3 Spotipy | + | |
- | + | ||
- | 2.4 Telegram Bot | + | |
- | + | ||
- | + | ||
- | **3. Bericht über den Verlauf** | + | |
- | + | ||
- | **4. Fazit und Ausblick** | + | |
- | + | ||
- | **5. Literaturangabe und verwendete Software** | + | |
- | + | ||
- | ------------------------------------------------------------------- | + | |
- | **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. | + | |
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. | 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. | ||
Zeile 35: | Zeile 11: | ||
--------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ||
- | **2. Projektbestandteile** | + | ====== 2. Projektbestandteile ====== |
- | Unser Projekt besteht grob gesagt aus zwei verschieden Skripten: | + | Unser Projekt besteht aus den folgenden Python-Skripten bzw. Teilen: |
- | * Apollon-Programm (hier sind die einzelnen Bestandteile des Projekts gelistet) | + | * Skript zum Aufsetzen + Trainieren des Neuronalen Netzwerks |
- | * Apollon-Bot (quasi die Oberfläche, welcher das Apollon-Programm dann aufruft und ausführt) | + | * **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) | ||
Im Folgenden werden zunächst die einzelnen Bestandteile des Apollon-Programms erklärt und im Anschluss der Apollon-Bot dargestellt. | 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__ | + | ===== 2.1 Neuronales Netzwerk zur Emotionserkennung ===== |
+ | |||
+ | 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. | ||
- | Alle, die sich mit Machine Learning schon auskennen, können gerne den nächsten Absatz überspringen. | + | === ⇒ Exkurs: Warum braucht APOLLON Machine Learning + CNN? === |
+ | 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!) | ||
- | ⇒ //Exkurs: Warum braucht APOLLON Machine Learning + CNN?// | + | 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. | ||
- | Da Nutzer*innen Selfies an APOLLON schicken, muss unser Programm in der Lage sein, **neue** Bilder zu erkennen und zu klassifizieren. | ||
- | **Umsetzung für APOLLON** | + | === 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 passierte 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 74: | 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 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. |
Die finale Netzwerk-Architektur sieht so aus: | Die finale Netzwerk-Architektur sieht so aus: | ||
Zeile 143: | Zeile 128: | ||
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). | 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__ | + | ===== 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 199: | Zeile 184: | ||
</code> | </code> | ||
- | __2.3 Spotipy__ | + | ===== 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 274: | 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 320: | Zeile 305: | ||
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. | 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 330: | 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). | 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). | ||
Zeile 344: | Zeile 332: | ||
-------------------------------- | -------------------------------- | ||
- | **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. | ||
Zeile 354: | Zeile 342: | ||
--------------------- | --------------------- | ||
- | **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 379: | 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 395: | 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 407: | Zeile 395: | ||
------ | ------ | ||
- | Telegram Bot: | + | === Telegram Bot:=== |
https://python-telegram-bot.org | https://python-telegram-bot.org |