Awesome WM with Xfce 4

So you want to combine the power of Awesome WM with the convenience of the a full desktop environment?

I wanted to replace xfwm4 (the window manager of Xfce) with Awesome and could not find anything working on the web. But this little line of bash does the trick:

$ killall xfwm4 && awesome

It works better than I expected and integrates really well into Xfce.

Have a nice day.

Auslandsjahr in England

Vor ungefähr zwei Wochen hat ein weiteres Langzeitexperiment begonnen. Ich arbeite für ein Jahr in England als Freiwilliger in einer Jugendherberge die sehr abgelegen in Dartmoor im Südwesten Englands liegt. Darüber zu schreiben ist mir wahrscheinlich zu aufwändig aber ich versuche in regelmäßigen Abständen Bilder hier zu veröffentlichen. Die Rechte an allen Bildern sind zunächst bei mir. Wer eins verwenden möchte kann mich aber gerne fragen.

Die ersten Paar Bildergalerien sind hier zu finden:

Raumbestimmung per W-Lan

Die zunehmende Popularität von Routern mit W-Lan Funktion hat dazu geführt, dass besonders im Urbanen Umfeld innerhalb eines Gebäudes mehrere W-Lan Netzwerke aufgespürt werden können. Jedes dieser Netzwerke hat eine einzigartige ID (die MAC Adresse) anhand der es identifiziert werden kann. Die Signalstärke dieser Netzwerke schwankt — basierend auf einigen Umweltfaktoren wie z.B. die Entfernung zur Basisstation, die Anzahl und Beschaffenheit der Wände die zwischen dem Computer und der Basisstation liegen (besonders Feuchtigkeit spielt eine Rolle) etc.

Das führt dazu, dass die Anzahl und die Signalstärke der W-Lan Netzwerke in jedem Raum unterschiedliche Charakteristika aufweist anhand derer jeder Raum erkannt werden kann. So kann man ohne zusätzliches Equipment (eine W-Lan Karte vorausgesetzt) eine erstaunlich gute Raumbestimmung realisieren, die sich auf die Funkabdeckung per W-Lan stützt.

Diese Anwendung umzusetzen hatte ich Zeit nach meinem Abitur im Juni.

Die Unterscheidung der Räume erfolgt über ein feed forward Multilayer Perceptron mit der Architektur (AnzahlBekannterNetzwerke)-15-5-2. Das MLP hat für jedes bekannte Funknetzwerk ein Eingabeneuron, welches immer mit der aktuellen Signalstärke gefüttert wird. Sollte ein Netzwerk temporär nicht verfügbar sein (manche Netzwerke mit schwacher Signalstärke sind z.B. nur einzelnen Räumen zu empfangen), wird das entsprechende Eingabeneuron mit der geringstmöglichen Signalstärke versorgt. Wie vielleicht schon aufgefallen ist hat das MLP nur zwei Ausgangsneurone. Das hängt damit zusammen, dass ein MLP immer nur zwischen zwei Räumen unterscheiden kann. An dem Versucht einem MLP mehr als zwei Räume beizubringen bin ich leider gescheitert. Deshalb verwende ich mehrere MLP’s, die im KO-System entscheiden um welchen Raum es sich handelt.

25 Trainingsbeispiele pro kartografiertem Raum haben Sich als ideal erwiesen. Bei der doppelten Menge wurden die MLP’s nicht ordentlich Trainiert. Konkret bin ich mit meinem Laptop durch die zu kartografierenden Räume gegangen und habe sie einzeln “gescannt”. Dabei beeinflusst das “wie” sehr stark die spätere Erkennungsrate der Räume. Die schlechtesten Ergebnisse habe ich erhalten als ich durch die Räume gelaufen bin um auch in wirklich jedem Winkel die Netzwerke zu erfassen. Anfangs dachte ich zwar, dass so die Räume besser voneinander abgegrenzt werden können aber letztlich wurden wahrscheinlich dadurch die Trainingseingaben für einen Raum so unterschiedlich, dass sie für das MLP schwer zu erlernen waren. Daraufhin habe ich das ganz gegenteilige Extrem ausprobiert (in der Hoffnung, dass einfachere Trainingsdaten besser gelernt werden) indem ich für den Scan für 25 Trainingsbeispiele das Laptop einfach in die Mitte des Raumes gehalten habe. Damit waren schon wesentlich bessere Erkennungsraten möglich; das System war aber noch lange nicht zufriedenstellend. Erst eine Mischung aus beiden Methoden hat gute Erkennungsraten ermöglicht. Dafür habe ich mich in einem Radius von ca. 2m um das Zentrum des jeweiligen Raumes bewegt. Dadurch waren die Trainingsdaten weder vollkommen Einseitig noch allzu komplex. Links abgebildet ist die Erkennungsqualität an Verschiedenen Orten in den kartografierten Räumen (ein Klick macht es größer). Ich habe an jedem Punkt 5 Messungen gemacht und jeweils die Anzahl der erfolgreichen Messungen eingetragen. Das ist zwar nur eine sehr grobe Messsicherheit, aber ich hatte nicht mehr Zeit und auch nicht mehr Lust (irgendwann wird so ein Laptop auch schwer). An den Türen und in der Nähe des Bücherregals sinkt die Genauigkeit leicht, bleibt aber stets über 50%iger Genauigkeit. Insgesamt bin ich mit der Genauigkeit von ca. 89,4% recht zufrieden.

Ein Sonderfall entsteht, wenn man das Laptop auf dem Boden und nicht (so wie auch bei den Scans vorher aufgezeichnet) in Brusthöhe versucht zu lokalisieren. Teilweise bleiben die Messwerte gleich; teilweise (wie z.B. oben links im Raum) sinkt aber die Erkennungsrate stark. Anscheinend spielt die Höhe eine recht große Rolle.

Zu überprüfen bleibt jetzt noch wie sich das System mit noch mehr als nur vier Räumen verhält.

Die Software habe ich in Java geschrieben, für die Neuronalen Netze habe ich die einfach zu bedienende und recht flotte Bibliothek “Snipe” von David Kriesel benutzt. Um an die W-Lan Daten zu kommen habe ich (da ich ein Macbook benutze) den Befehl “airport -s” mit dem ProcessBuilder verwendet weil Java diese Funktion leider nicht zur Verfügung stellt. Deshalb ist die Software auch noch nicht platformunabhängig. Da sie auch noch nicht ganz für den Endbenutzer fertig ist stelle ich sie hier nicht zum Download bereit. An Interessierte verschicke ich sie gerne samt Quellcode per Email. Vielleicht entsteht dann ja auch eine Version für Linux & Windows. Bei vielen Interessierten werde ich sie auf jeden fall bequemer zu bedienen machen.

Telefon als Nummernfeld

Während der letzten Weihnachtsferien habe ich durch diesen Kommentar auf hackaday.com inspiriert ein altes Telefon (PTT Typ T65 de Luxe Smaragt von Ericsson von einem Niederländischen Flohmarkt, das Modell entspricht ungefähr einem FeTap 611) mit meinem Arduino verdrahtet und ein kleines Sketch geschrieben um die Impulse zu zählen, die von der Wählscheibe beim Wählen kommen.

Telefon an einem Arduino

Die Schaltung gestaltet sich denkbar einfach; die Wählscheibe verhält sich nicht anders als ein Schalter, der ein und aus geht. SerialServer von Dan O’Sullivan und ein kleines Java Programm, das sich mit dem Server verbindet um den Tastendruck zu simulieren machen das Telefon zu einem (fast) vollständigen Nummernfeld, das unabhängig von der aktuellen Anwendung mit der es genutzt werden soll funktioniert (AAC Keys hätte es auch getan, läuft aber nicht auf Linux soweit ich weiß).

Natürlich wäre es noch besser gewesen eine USB-Tastatur zu simulieren, aber dann währe warscheinlich ein USB-Shield für mein Arduino notwendig gewesen und das wäre mir zu viel Aufwand.

Hier eine kurze Demonstration:

Pixel Clustering

Im Moment studiere ich mit meiner Schulklasse ein Theaterstück ein (,,Wie es euch gefällt” von William Shakespeare), so dass ich während den Szenen, in denen ich nicht mitspiele viel Wartezeit habe, während der ich nichts zu tun habe. So kam ich zu folgendem Gedankenexperiment, dass ich noch am selben Tag in die Tat umgesetzt habe.

Ich habe mich gefragt, was wohl passiert, wenn man jeden Pixel eines Bildes als Punkt in einem fünfdimensionalen Raum ansieht. Dabei sind die ersten beiden Koordinaten die x- und y Koordinaten des Pixels im Bild selber und die letzten drei Koordinaten ergeben sich aus den RGB-Werten des Pixels. Ein Pixel an der Stelle x=7 und y = 23 mit der Farbe R=55, G=88, B = 180 hat ist also ein Punkt im fünfdimensionalen Raum: P(7|23|55|88|180).

Wenn man dann alle Pixel eines Bildes in Punkte umwandelt erhält man also Punktwolken im fünfdimensionalen Raum, die man mit einem einfachen Clusteringverfahren zusammenfassen kann. Wenn man das tut und die so als ,,zusammenhängend” erkannten Pixel gleichfarbig einfärbt, so dachte ich mir, müssten doch ganz nette Bilder entstehen.

Nach der Umsetzung bestätigte sich das auch:

Ich habe die Bilder direkt von meiner Webcam genommen, leider ist an ein in Echtzeit berechneter Effekt  nicht umsetzbar, da es sehr lange dauert, bis der Clustering-Algorithmus bei so vielen Bildern sehr lange zum terminieren braucht. Wer an dem Programm interessiert ist, kann gerne mit mir in Kontakt treten. Es ist in Java geschrieben und dadurch einigermaßen plattformunabhängig.

Biologisch motiviertes Training neuronaler Netze

Schon vor längerer Zeit habe ich mir Gedanken darüber gemacht, wie man neuronale Netze ,,biologischer” trainiert.

Gegeben sei dazu ein neuronales Netz mit folgender Topologie:

Biologisch trainiertes NetzwerkEs gibt mehrere Schichten, die untereinander vollverknüpft sind, genau wie bei einem Multilayer Perceptron (blaue Verknüpfungen). Jedes Neuron übergibt während jedem Simulationsschritt seine Aktivierung — über eine gewichtete Verbindung (rot) — an jedes Gewicht weiter (aus Gründen der Übersicht habe ich das linke Gewicht mit seinen Verknüpfungen ausgelassen).

Während jedem Zeitschritt werden dann die einkommenden Aktivierungen in jedem Gewicht verarbeitet, indem alle Aktivierungen aufsummiert werden und dem Gewicht aufaddiert werden (es folgt daraus, dass die roten Verbindungen sehr schwach sein müssen, damit die Gewichtsveränderungen in den blauen Verbindungen nicht zu hoch sind).

Das Netz mit den roten Verbindungen ist also das ,,Lehrernetz”, das Netz mit den blauen Verbindungen ist das ,,Schülernetz”. Die beiden Netze teilen sich die Neuronen, haben aber eigene Verknüpfungen. Die Gewichte des Lehrernetzes müssen jetzt nur noch so verändert werden, dass sie in der Lage sind das Schülernetz zu trainieren. Das könnte mit einem evolutionären Algorithmus herbeiführen.
Jeweils ein Organismus besteht aus einem Lehrer- und einem Schülernetz. Zur Berechnung der Fitness werden zunächst die Gewichte des Schülernetzes zufällig initialisiert. Die Aufgabe des Lehrernetzes ist es dann dem Schülernetz ausgewählte Probleme beizubringen. Je nachdem wie gut das Schülernetz nach einer bestimmten Zeit oder Anzahl von Simulationsschritten im Lösen der Aufgabe ist, wird der Organismus bewertet. Die zu lehrenden Probleme müssen natürlich zunächst einfach sein und dürfen nicht zu ,,spezifisch” oder zu ,,schwer” werden.

Eine mögliche Erweiterung könnte sein, zwischen jedes Neuron des Schülernetzes und jedes Gewicht des Schülernetzes (die ja durch das Lehrernetz verbunden sind), ein Neuron zu platzieren, dass allein dem Lehrernetz vorbehalten ist. Dadurch ist das Lehrernetz ,,schlauer”.

Hier gibt es eine ausführlichere Version der obigen Grafik.

Anlass für diesen Artikel war übrigens dieser Thread im Board von David Kriesel