Festnetz

Zusammenfassung

Festnetz ist ein Experiment, bei dem Sie Google Earth-Satellitenbilder durch Geste erkunden können. Mithilfe einer Kombination aus maschinellem Lernen, Datenoptimierung und Grafikkartenleistung kann der Test effizient im Webbrowser deines Telefons ausgeführt werden, ohne dass Back-End-Server erforderlich sind. Dies ist ein Einblick in unseren Entwicklungsprozess und die verschiedenen Ansätze, die wir versucht haben, um uns zum Endergebnis zu bringen.

https://g.co/LandLines

Als sich das Data Arts-Team auf die Untersuchung eines Datasets aus Erdbildern kam, war ich ziemlich begeistert – die Bilder waren schön und enthüllten alle Arten von Strukturen und Texturen, sowohl von Menschenhand als auch natürlich. Ich war fasziniert davon, wie ich dieses Dataset verbinden kann. Ich habe verschiedene erste Experimente mit Bildern und mit verschiedenen Möglichkeiten zum Filtern und Organisieren durchgeführt.

t-Sne-Ähnlichkeits-Layout
t-sne-Ähnlichkeits-Layout, hohe Auflösung, 50 MB

Als Gruppe kamen wir immer wieder auf die schönen und dominanten Linien in den Bildern zurück. Diese Linien waren leicht zu erkennen – Autobahnen, Flüsse, Bergränder und Grundstücke – und wir haben einige Projekte zur Erforschung dieser Linien entworfen. Als Künstlerin fühlte ich mich von den wunderbaren Dingen inspiriert, die man mit Liniensammlungen alles machen kann – siehe z. B. Cassandra C Jones's Arbeit mit Blitzen. Ich habe mich auf die Arbeit mit diesem Dataset gefreut.

Linienerkennung

Eine der ersten Herausforderungen bestand darin, Linien in den Bildern zu erkennen. Es ist einfach, ein Blatt Papier zu nehmen, es auf den Ausdruck eines dieser Fotos zu legen und die Linien zu zeichnen, die Ihr Auge sieht. Im Allgemeinen funktionieren Algorithmen für maschinelles Sehen zum Auffinden von Linien bei sehr unterschiedlichen Bildern jedoch nicht so gut.

Ich habe eine frühere Version der Suche entwickelt, indem ich einen Algorithmus für ein Projekt mit lokalen Projekten gezeichnet habe. Dafür haben wir die zu suchenden Zeilen mit Anmerkungen versehen. Es hat Spaß gemacht, auf Kunstwerken zu zeichnen, aber mühsam, wenn Sie von Dutzenden von Bildern zu Tausenden wechseln. Ich wollte das Suchen von Linien automatisieren.

Bei diesen Flugaufnahmen habe ich traditionelle Linienerkennungsalgorithmen wie den Cilny-Edge-Erkennungsalgorithmus von openCv ausprobiert. Dabei stellte ich fest, dass entweder sehr ununterbrochene Liniensegmente oder, wenn der Schwellenwert zu locker war, Tonnen von Störlinien ausgegeben wurden. Außerdem waren die Grenzwerte für gute Ergebnisse bei verschiedenen Bildsätzen unterschiedlich und ich wollte einen Algorithmus, mit dem ohne Überwachung ein konsistentes Set fehlerfreier Zeilen gefunden werden kann.

Ich habe mit verschiedenen Linienerkennungsalgorithmen experimentiert, einschließlich neuerer Algorithmen wie gPb (PDF), die zwar erstaunliche Ergebnisse lieferten, aber einige Minuten pro Bild erforderten. Am Ende habe ich mich mit der Edge-Erkennung von Structured Forest erledigt, einem Algorithmus, der mit openCV ausgeliefert wird.

Als ich ein gutes Linienbild hatte, hatte ich immer noch das Problem, die Linien tatsächlich zu erhalten und einzelne Linien voneinander zu identifizieren, z.B. wie ich aus diesen Rasterdaten Vektoren machen kann. Bei Problemen mit dem maschinellen Sehen untersuche ich häufig imageJ, eine Open-Source-Java-basierte Bildverarbeitungsumgebung, die von Wissenschaftlern und Forschern verwendet wird und eine solide Umgebung aus Plug-ins bietet. Ich habe ein Plug-in namens Randerkennung gefunden, mit dem ein Intensitätsbild in eine Reihe von Liniensegmenten umgewandelt wird. Übrigens fand ich auch diesen Code zur Kantenerkennung und Beschriftung von Matlab hilfreich.

Bild mit erkannten Liniensegmenten
Bild mit erkannten Liniensegmenten

Serverlos

Außerdem wollte ich herausfinden, ob es möglich ist, eine Anwendung zur Datenvisualisierung zu verwenden, die im Wesentlichen serverlos ist, bei der der Abgleich und die Verbindung clientseitig erfolgen. Ich arbeite normalerweise mit openFrameworks, einem C++-Framework für das Codieren von Creatives. Abgesehen von gelegentlichen Knotenprojekten habe ich nicht viel serverseitig programmiert. Ich würde gern wissen, ob es möglich ist, die gesamte Berechnung clientseitig durchzuführen und den Server nur für die Bereitstellung von JSON- und Bilddaten zu verwenden.

Bei der Zeichenanwendung ist der Abgleich ein sehr aufwendiger Vorgang. Wenn Sie eine Linie zeichnen, müssen wir unter mehr als Zehntausenden von Liniensegmenten die beste Übereinstimmung finden. Um die Entfernung einer Zeichnung zu einer anderen zu berechnen, verwenden wir einen Messwert des Dollar-Gestenerkennung, der wiederum viele Entfernungsberechnungen beinhaltet. In der Vergangenheit habe ich Threading und andere Tricks verwendet, aber um auf einem Clientgerät (einschließlich Smartphones) in Echtzeit arbeiten zu können, brauchte ich etwas Besseres. Ich habe mir Messwertbäume für die Suche nach den nächsten/nächsten Nachbarn angesehen und mich dann für Aussichtspunktbäume entschieden (JavaScript-Implementierung). Der Aussichtspunkt-Baum wird im Grunde aus einem Satz von Daten und einem Entfernungsmesswert erstellt. Wenn Sie ein neues Datenelement eingeben, erhalten Sie recht schnell eine Liste der nächstgelegenen Werte. Als ich zum ersten Mal auf einem Smartphone sah, war ich kaputt. Einer der großen Vorteile dieser speziellen View-Point-Baum-Implementierung besteht darin, dass Sie den Baum nach der Berechnung speichern und die Kosten für die Berechnung dieses Baums sparen können.

Nächste Ergebnisse Gezeichnete Ergebnisse
Beispiele für Ergebnisse aus dem Aussichtspunkt-Baum. Die gezeichnete Eingabe befindet sich auf der rechten Seite und die nächstgelegenen Ergebnisse links.

Eine weitere Herausforderung bei der Funktion ohne Server besteht darin, die Daten auf ein Mobilgerät zu laden. Die Daten zu Baum- und Liniensegmenten waren über 12 MB groß und die Bilder sind recht groß. Wir wollten, dass der Download schnell und responsiv ist. Unser Ziel war es, den Download so gering wie möglich zu halten. Unsere Lösung bestand darin, Daten schrittweise zu laden. In der Zeichnen-App teilen wir das Dataset des Aussichtspunkts in fünf Teile auf. Wenn die App nur den ersten Block lädt, lädt sie dann alle 10 Sekunden einen weiteren Datenblock im Hintergrund, sodass die App in der ersten Minute der Nutzung im Grunde immer besser wird. Auch in der Drag-App wurde intensiv daran gearbeitet, Bilder im Cache zu speichern, damit beim Ziehen neue Bilder im Hintergrund geladen werden.

Außerdem war es schwieriger, einen Preloader für beide Anwendungen zu erstellen, als erwartet. Die anfängliche Verzögerung beim Laden von Daten wäre also nachvollziehbar. Ich habe den Fortschritts-Callback für Ajax-Anfragen und für pixi.js verwendet, um die asynchron geladenen Bilder zu prüfen und damit die Vorabladenachricht zu senden.

Verbundene Leitung

Zum Ziehen wollte ich eine Endloslinie aus den Linien erstellen, die wir in der Kantenerkennung gefunden haben. Der erste Schritt bestand darin, Linien aus dem Linienerkennungs-Algorithmus zu filtern und lange Linien zu identifizieren, die an einer Kante beginnen und an einer der drei anderen Kanten enden.

Rote Linien für gute Verbindungen Rote Linien für gute Verbindungen
Gute Linien für eine rot markierte Verbindung

Als ich eine Reihe langer Linien hatte (oder um einen genaueren Begriff zu verwenden, Polylinien, eine Sammlung verbundener Punkte), um sie zu verbinden, habe ich diese Linien in eine Reihe von Winkeländerungen konvertiert. Eine Polylinie ist in der Regel eine Reihe von Punkten: Punkt a ist mit Punkt b verbunden, der mit Punkt c verbunden ist. Stattdessen können Sie die Linie als eine Reihe von Winkeländerungen behandeln: Sie bewegen sich vorwärts und drehen sich um einen bestimmten Betrag, dann vorwärts und dann um einen bestimmten Betrag. Eine gute Möglichkeit, dies zu visualisieren, sind Drahtbiegemaschinen, die ein Stück Draht nehmen und während es extrudiert wird, Rotationen durchführen. Die Form der Zeichnung entsteht durch Drehen.

Wenn Sie die Linie als Winkeländerungen und nicht als Punkte betrachten, wird es einfacher, Linien zu einer größeren Linie mit weniger Unterbrechungen zu kombinieren. Statt Punkte zusammenzufügen, fügen Sie im Prinzip relative Winkeländerungen hinzu. Um eine Linie hinzuzufügen, nehmen Sie den aktuellen Winkel der Hauptlinie und addieren die relativen Änderungen der hinzuzufügenden Linie.

Übrigens habe ich diese Technik verwendet, bei der eine Linie in eine Reihe von Winkeländerungen für die künstlerische Ausnutzung umgewandelt wurde. Sie können Zeichnungen „freilösen“, ähnlich wie Draht (z. B. mit Draht ein- und ausrollen). Beispiele: eins, zwei, drei

Diese Winkelberechnung ermöglicht es uns, die Linie beim Ziehen zu steuern. Wir berechnen, wie sich der Hauptwinkel von der gewünschten Richtung befindet, und suchen nach einem Bild, mit dem wir die Linie am besten in die richtige Richtung bewegen können. Es kommt nur darauf an, relativ zu denken.

Abschließend möchte ich noch betonen, dass die Teilnahme an diesem Projekt wirklich Spaß machte. Es ist aufregend, als Künstler gebeten zu werden, ein Dataset zu verwenden, das so schön wie diese Bilder ist, und ich fühle mich geehrt, dass sich das Data Arts-Team an uns gewendet hat. Ich hoffe, Sie haben Spaß beim Experimentieren!