In einer digitalisierten Welt sind präzise und aktuelle Daten entscheidend. In dieser Blogserie zeige ich, wie moderne Technologien wie Deep Learning genutzt werden können, um Daten zu Rollstuhlpark-plätzen effizient zu pflegen. Im dritten und letzten Teil dieser Serie wenden wir das trainierte Deep-Neural-Network flächendeckend auf den Kanton Fribourg an. Zusätzlich skalieren und automatisieren wir die Prozesse mithilfe eines Open-Source-Frameworks.
Im ersten Teil dieser Blogserie habe ich aufgezeigt, wie wir die Punktkoordinaten bestehender Rollstuhlparkplätze vorverarbeiten und passende swisstopo-Bilder automatisiert beschaffen können. Im zweiten Teil habe ich die Aufbereitung der Trainingsdaten und das Training des neuronalen Netzes beschrieben. Dabei haben wir Bildkacheln und Labels erstellt, das Modell mittels Transfer Learning trainiert und anhand üblicher Metriken wie dem IoU-Score und dem F1-Score evaluiert. Diese Schritte bilden die Grundlage für den Einsatz von Deep Learning zur Erkennung und Aktualisierung der Rollstuhlparkplatz-Daten für rollstuhlparkplatz.ch (mehr Informationen zum Projektkontext finden Sie im ersten Blogpost der Serie).
Der Weg zur Automatisierung …
Nach der erfolgreichen Entwicklung und Evaluierung unseres neuronalen Netzes besteht die nächste Herausforderung darin, alle notwendigen Bearbeitungsschritte zu automatisieren. Unser Ziel ist es, das zuvor entwickelte Deep-Learning-Modell mit Kedro nahtlos in einen automatisierten Workflow zu integrieren – von der Beschaffung der Geodaten bis zur flächendeckenden Detektion und Validierung der gefundenen Rollstuhlparkplätze.
Das entwickelte neuronale Netz kommt nun zum Einsatz, um anhand der zugeschnittenen Orthofoto-Bilder Rollstuhlparkplätze im Kanton Fribourg zu erkennen. Die Wahl fiel bewusst auf den Kanton Fribourg, da er einer der grösseren Kantone der Schweiz ist und bereits über eine vergleichsweise gut erfasste Datenbasis an Rollstuhlparkplätzen verfügt.
Bevor wir in die Details eintauchen, verschaffen wir uns zunächst einen Überblick über die einzelnen Schritte:
1. Beschaffung der amtlichen Vermessungsdaten (AV)
2. Orthofoto-Kacheln herunterladen und zu einem Mosaik verarbeiten
3. Erstellung eines Gitternetzes
4. Selektion relevanter Kacheln
6. Flächendeckende Erkennung im Kanton Fribourg
7. Reduktion von False Positives durch logistische Regression
Die Schritte 2. bis 5. wurden bereits ausführlich in den ersten beiden Teilen dieser Blogserie beschrieben.
Nachdem wir einen Überblick über den gesamten Workflow erhalten haben, beginnen wir nun mit dem ersten Schritt – der Beschaffung der AV-Daten. Dieser Schritt bildet die Grundlage für die weiteren Verarbeitungsschritte.
Vorbereitung der Datenpipeline
1. Beschaffung der amtlichen Vermessungsdaten (AV)
geodienste.ch stellt schweizweit harmonisierte und aggregierte kantonale Geobasisdaten in unterschiedlichen Formaten zur Verfügung. Ein besonders bedeutender und häufig genutzter Datensatz sind die AV-Daten. Diese enthalten detaillierte geometrische Daten über das Grundeigentum und bilden die Grundlage für zahlreiche geografische Informationen und Anwendungen in Wirtschaft, Verwaltung und der Gesellschaft.
Wir laden die aktuellen AV-Daten für den Kanton Fribourg im Format Geopackage (*.gpkg) herunter. Aus den AV-Daten nutzen wir die Informationen der Ebene «Bodenbedeckung», da diese präzise Angaben zur Oberflächenbeschaffenheit und -nutzung des Grundeigentums liefert. Dadurch können wir das Einsatzgebiet unseres Algorithmus bereits gezielt auf potenzielle Parkflächen eingrenzen, die sich meist in der Nähe von befestigen Flächen wie Parkplätzen oder Strassen, aber z. B. nicht in Waldgebieten befinden.
2. Orthofoto-Kacheln herunterladen und zu einem Mosaik verarbeiten
Neben den AV-Daten benötigen wir natürlich entzerrte SWISSIMAGE-Luftbilder im GeoTIFF-Format von swisstopo. Mithilfe der Rastereinteilung aus dem ersten Blogpost und der Methode download_tiles() erstellen wir Datei-Links und laden so insgesamt 1’134 Orthofoto-Kacheln mit einer Grösse von je 1 km x 1 km herunter. Die Kacheln werden zusammen mit den Orientierungsparametern (in den sogenannten «World Files», *.tfw) zu einem Orthofotomosaik verarbeitet. Dieser Schritt stellt sicher, dass wir ein zusammenhängendes und georeferenziertes Bild für die nächsten Verarbeitungsschritte erhalten.
3. Erstellung eines Gitternetzes
Die Orthofoto-Kacheln liegen aktuell noch in einer (zu) mächtigen Grösse von 1km2 (das entspricht 10’000 x 10’000 Pixel) vor. Wir teilen diese Bilder in kleinere Kacheln auf. Für das Training haben wir Kacheln in der Grösse von 256 x 256 Pixel erstellt. Um die Kachel-Bearbeitungsmenge für die gesamte Fläche des Kantons Fribourg möglichst gering zu halten, schneiden wir die Kacheln auf die Grösse 1’024 x 1’024 Pixel zu, da unser Algorithmus auch mit grösseren Bildern als den im Training verwendeten arbeiten kann.
4. Selektion relevanter Kacheln
Wenn wir die in den Trainingsdaten verwendeten Rollstuhlparkplätze mit den AV-Daten räumlich verschneiden, lässt sich einfach feststellen, dass die meisten Parkplätze sich auf «übrigen befestigten Flächen» befinden, teilweise aber auch auf Trottoirs oder Strassen/Wegen. Wir filtern die AV-Daten daher auf die Kategorie «übrige befestigte Flächen», die unter anderem Zugangswege zu Gebäuden, Abstellflächen, Rast- und Vorplätze, Sportanlagen sowie Parkplätze umfasst (siehe rote Flächen in untenstehender Abbildung) und ermitteln die relevanten Kacheln. Theoretisch könnte die Filterung um die Klassen «Trottoir» und «Strasse/Weg» erweitert werden. Unsere bisherigen Erfahrungen haben jedoch gezeigt, dass diese Flächen bereits durch übrig befestigte Flächen abgedeckt sind. Zudem besteht bei der Erweiterung auf «Strasse/Weg» das Risiko, dass auch kilometerlange (Land-)Strassen ohne potenzielle Rollstuhlparkplätze integriert werden.
5. Extraktion von Bildkacheln
Das Orthofoto-Mosaik wird mit den vorselektierten Kacheln abgeglichen, um Bilder im Format 1’024 x 1’024 Pixel zu extrahieren. Das ergibt insgesamt etwa 33’000 Einzelbilder. Für eine effiziente Verarbeitung setzen wir neben rasterio und pillow auch die Open-Source-Bibliothek Dask zur Parallelisierung ein. Dadurch reduziert sich die Gesamtverarbeitungszeit erheblich von ursprünglich rund 64 Stunden auf «nur» 8 Stunden.
Anwendung des trainierten Modells
Das trainierte neuronale Netz wird nun auf die zugeschnittenen Orthofoto-Bilder des Kantons Fribourg angewendet, um Rollstuhlparkplätze automatisch zu erkennen und zu klassifizieren. Die erkannten Parkplätze werden als Centroid-Punkte gespeichert, die später von einem zweiten Klassifikator überprüft und gefiltert werden, um die Genauigkeit der Detektion weiter zu steigern.
6. Flächendeckende Erkennung im Kanton Fribourg
Für die flächendeckende Erkennung von Rollstuhlparkplätzen im Kanton Fribourg werden die 33’000 Bilder im Vorfeld gleichmässig in acht Batches aufgeteilt. Diese Batches werden parallel durch das Modell verarbeitet, was die Analyse effizient skaliert und die GPU-Ressourcen optimal nutzt.
Für eine noch schnellere Verarbeitung empfiehlt es sich, das Modell auf (mindestens) einer GPU auszuführen. Meiner Erfahrung nach beschleunigt dies die Geschwindigkeit des Erkennungsprozesses im Vergleich zur CPU-Nutzung um etwa das 20-fache. Ein Konfidenzschwellenwert von 90% stellt sicher, dass nur die zuverlässigsten Vorhersagen berücksichtigt werden. So werden ausschliesslich Bildbereiche als Rollstuhlparkplätze klassifiziert, die mit hoher Sicherheit korrekt erkannt wurden.
Zusätzlich kann die Datenübertragung zwischen CPU und GPU durch die Verwendung von pin_memory=True
im DataLoader
weiter beschleunigt werden. Diese Einstellung hält die Daten direkt im page-locked-Speicher, was die Übertragung zur GPU schneller macht. Die Nutzung von torch.no_grad()
hilft ausserdem, den Speicherverbrauch zu minimieren und die Ausführungsgeschwindigkeit zu erhöhen, indem auf das Speichern des Berechnungsverlaufs verzichtet wird.
Insgesamt erkennt der Algorithmus aus den 33’000 Bildkacheln rund 4’900 potenzielle Rollstuhlparkplätze. Die Ergebnisse werden als Bounding Boxes ausgegeben, aus denen anschliessend Centroid-Punkte berechnet und im GeoJSON-Format gespeichert werden.
7. Reduktion von False Positives durch logistische Regression
4’900 Rollstuhlparkplätze im Kanton Fribourg? Diese Zahl erscheint hoch – insbesondere, da bisher nur 526 (unüberdachte) Rollstuhlparkplätze offiziell erfasst sind, und der Kanton eigentlich als überdurchschnittlich gut dokumentiert gilt. Ein Blick auf einige Beispiele zeigt, dass der Algorithmus nicht nur Rollstuhl-Piktogramme erkennt, sondern auch ähnliche Symbole (wie das Fahrrad-Piktogramm für Velostreifen), häufig fälschlicherweise als «Parkplatz» klassifiziert (s. unten).
Da solche Velo-Symbole teilweise alle 100 m auftreten, erhalten wir rasch einige False Positives (Falschdetektionen).
Ein heuristischer Ansatz wäre, die Detektionen anhand der AV-Bodenbedeckung «übrige befestigte Fläche» zu filtern. Dadurch liessen sich die tatsächlichen Rollstuhlparkplätze im Beispielfall zuverlässig identifizieren:
Allerdings funktioniert dieser Ansatz nur in etwa 75% der Fälle. Wertvolle, korrekte Detektionen würden damit fälschlicherweise ausgeschlossen, während gleichzeitig dennoch falsche Detektionen in den Datensatz gelangen (siehe nächste Abbildung). Der ausschliessliche Einsatz der AV-Bodenbedeckung stösst daher schnell an seine Grenzen.
Um die Erkennung weiter zu verbessern, habe ich deshalb ein logistisches Regressionsmodell entwickelt. Dieses Modell bewertet die Detektionen anhand verschiedener Merkmale, wie etwa dem Erkennungsscore des neuronalen Netzes (z. B. 99.7 Konfidenz), der Art der Bodenbedeckung, der Entfernung zum nächsten Gebäude sowie der Anzahl der Einwohnerinnen und Einwohner sowie Arbeitsplätze im Umkreis von 100 Metern. Auf dieser Basis entscheidet das Modell, ob eine Detektion als Rollstuhlparkplatz (=1) oder als kein Rollstuhlparkplatz (=0) klassifiziert wird. Dank dieser zusätzlichen Prüfung gelingt es, die Anzahl der False Positives erheblich zu reduzieren und damit in 96% der Fälle die Rollstuhlparkplätze korrekt zu identifizieren!
Nach Anwendung der Methode sinkt die Anzahl der erkannten Rollstuhlparkplätze von etwa 4’900 auf (plausiblere!) 1’400. Ein Vergleich mit den bereits bekannten Rollstuhlparkplätzen (526) zeigt, dass der Algorithmus 997 neue Parkplätze entdeckt hat – eine Steigerung um 190% im Vergleich zur ursprünglichen Anzahl.
Diese Ergebnisse verdeutlichen, dass der Einsatz von Deep-Learning-Methoden einen erheblichen Mehrwert bieten kann! Im vorliegenden Beispiel wird die Qualität der Geodaten zu Rollstuhlparkplätzen signifikant verbessert.
Automatisierung mit Kedro
Die sieben zuvor beschriebenen Datenverarbeitungs- und Analyseschritte wollen wir nun in einer Pipeline vollständig automatisieren. Wir setzen dabei auf das Open-Source-Framework Kedro. Kedro bietet für komplexe, wiederholbare Workflows im Bereich Deep Learning und Geodatenverarbeitung viele Vorteile.
Warum Kedro?
Unsere Pipeline umfasst mehrere Verarbeitungsschritte wie etwa das Herunterladen und Vorverarbeiten von AV-Daten, das Erstellen eines Orthofoto-Mosaiks, die Anwendung des trainierten Modelles usw. Kedro sorgt dafür, dass diese Schritte strukturiert, reproduzierbar und skalierbar ablaufen:
- Modulare Struktur: Kedro teilt unsere Pipelines in klar definierte Nodes auf, wobei jeder Node einen spezifischen Arbeitsschritt abdeckt (z. B. Laden der AV-Daten, Bilder schneiden, etc.).
- Zentrale Konfiguration: Alle Parameter (Dateipfade, Schwellenwerte, etc.) können zentral in Konfigurationsdateien im YAML-Format verwaltet werden. Das ermöglicht eine einfache Versionierung und Anpassung.
- Parallelisierung: Durch die Integration von Dask können wir die Verarbeitung von >10’000 Orthofoto-Kacheln effizient und parallel skalieren.
- Datenmanagement: Kedro verwaltet alle eingesetzten Datenquellen und Formate zentral in einem Datenkatalog (z. B. AV-Daten als Geopackage, Orthofoto-Kacheln als GeoTIFF), was eine konsistente und fehlerfreie Verarbeitung gewährleistet.
Wie kann ich Kedro einsetzen?
1. Gewünschte Python-Umgebung aktivieren und kedro über pip installieren.
2. Neues Kedro-Projekt erstellen: kedro new
3. Wir fügen unsere Funktionen bei nodes.py ein:
def download_av_data():
...
return "path_to_av_data"
def download_orthophotos():
...
return ["path_to_tile1", "path_to_tile2"]
def select_orthophotos(av_data, tiles):
...
selected_tiles = ["selected_tile1.tif", "selected_tile2.tif"]
return selected_tiles
def create_orthomosaic(selected_tiles):
...
return "path_to_orthomosaic"
def create_fishnet(orthomosaic):
...
fishnet = ["grid_cell1.tif", "grid_cell2.tif"]
return fishnet
...
4. Wir importieren unsere Funktionen aus nodes.py und erstellen die Pipeline in pipeline.py
def create_pipeline(**kwargs):
return Pipeline(
[
node(download_av_data, None, "av_data"),
node(download_orthophotos, None, "tiles"),
node(select_orthophotos, ["av_data", "tiles"], "selected_tiles"),
node(create_orthomosaic, "selected_tiles", "orthomosaic"),
node(create_fishnet, "orthomosaic", "fishnet"),
node(select_relevant_tiles, ["fishnet", "av_data"], "relevant_tiles"),
node(clip_raster, "relevant_tiles", "clipped_tiles"),
node(run_model, "clipped_tiles", "model_results"),
node(
prepare_features,
["model_results", "av_data", "statent", "statpop"],
"features"),
node(run_logistic_regression, "features", "filtered_detections"),
node(save_results, "filtered_detections", None),
]
)
5. Pipeline grafisch visualisieren: kedro viz
5. Pipeline ausführen mit: kedro run
Kedro ermöglichte es uns, alle Bearbeitungsschritte – von der Beschaffung der Geodaten bis zur flächendeckenden Anwendung des Modells – einfach zu automatisieren. Durch die modulare Struktur und die zentrale Verwaltung können wir die Pipeline flexibel gestalten, um die grossen Datenmengen zu verarbeiten. kedro ipython
erwies sich während der Erstellung der Pipeline als äusserst hilfreich für interaktive Tests und schnelles Debugging. Noch ein Tipp: Am besten aktiviert man die Versionierung der Datensätze, um jederzeit auf frühere Versionen zugreifen zu können, und integriert bei Bedarf kedro jupyter
, wenn man bevorzugt in Notebooks arbeitet.
Fazit
In dieser dreiteiligen Blogserie (Teil 1, Teil 2) habe ich gezeigt, wie Deep Learning und automatisierte Datenverarbeitung erfolgreich zur Aktualisierung von Daten zu Rollstuhlparkplätzen eingesetzt werden können. Im ersten Teil habe ich gezeigt, wie wir Daten vorverarbeiten und Luftbilder automatisiert beschaffen, im zweiten Teil das Modell trainiert und evaluiert, und im dritten Teil den gesamten Workflow mithilfe von Kedro automatisiert.
Am Beispiel des Kantons Fribourg konnte ich die bestehenden amtlichen Daten um beeindruckende +190% neue Rollstuhlparkplätze erweitern. Das Projekt verdeutlicht meiner Meinung nach das enorme Potenzial, die Methode auf die gesamte Schweiz auszuweiten und so die Barrierefreiheit für Nutzende von Rollstuhlparkplätzen nachhaltig und effizient zu verbessern.
Haben Sie selbst Projekte oder Herausforderungen im Bereich der automatisierten Datenerfassung und -verarbeitung, bei denen moderne Technologien wie künstliche Intelligenz und Deep Learning nützlich sein könnten? Oder möchten Sie sich einfach über die Möglichkeiten dieser Technologien austauschen? Kontaktieren Sie mich unverbindlich.
Entdecke mehr von digital.ebp.ch
Subscribe to get the latest posts sent to your email.