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 Rollstuhlparkplätzen effizient zu aktualisieren und zu pflegen. Im zweiten Teil widmen wir uns der Aufbereitung der Trainingsdaten und dem Training des neuronalen Netzes.
Im ersten Teil dieser Blogserie habe ich gezeigt, wie wir die Punktkoordinaten bestehender Rollstuhlparkplätze vorprozessieren und passende swisstopo-Bilder sehr einfach automatisiert beschaffen können. 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).
Trainingsdaten fertigstellen
Das Erstellen von Trainingsdaten für Deep Learning-Modelle wie Faster R-CNN ist oft der aufwändigste Schritt der Anwendung von Deep Learning. Eine Umfrage des globalen Marktforschungsunternehmen IDC (International Data Corporation) ergab, dass in Data Science-Projekten fast immer 80% der Zeit für das Sammeln und Vorbereiten von Daten aufgewendet wird und nur circa 20% für die eigentlichen Analysen. Deep Learning-Modelle benötigen eine grosse Anzahl von Bildern mit annotierten Objekten (Englisch: «labelled» bzw. «labelling»), damit sie effektiv lernen können.
Parkplatz-Punkte voruntersuchen
Für unseren Anwendungsfall möchten wir die Zeit für die Datenaufbereitung minimieren. Zunächst laden wir die Geometrien der Parkplatz-Punkte und das Orthofoto-Mosaik in ein GIS. Anschliessend analysieren wir eine vielfältige Stichprobe von circa 700 Punkten, um festzustellen, ob dort im Bildmaterial jeweils ein Parkplatz mit Rollstuhl-Piktogramm sichtbar ist.
Punkte zu Bounding Boxes transformieren
Unser gewählter Algorithmus «Faster R-CNN» kann nicht direkt mit den Rollstuhlparkplätzen, die als Punkte vorliegen, umgehen, sondern benötigt stattdessen sogenannte Bounding Boxes, die die Lage der Rollstuhl-Piktogramme im Orthofoto beschreiben. Wir testen in einem iterativen Prozess verschiedene Positionen, Grössen und Formen, um die optimalen Label-Parameter zu finden. Die besten Trainingsergebnisse werden mit den folgende Einstellungen erzielt:
- Punktposition: Punkte werden händisch auf Piktogramme verschoben
- Bounding Box in quadratischer Form
- Dimensionen: 1.2 m x 1.2 m = 1.44 m²
Die Bounding Boxes können unter Verwendung der GIS-Standardfunktionen «Buffer» und «Envelope» relativ einfach erstellt und als Flächen im GeoJSON-Format exportiert werden.
Gitternetz erstellen und Kacheln selektieren
Die einzelnen Orthofoto-Kacheln liegen aktuell noch in einer (zu) mächtigen Grösse von 1 km² (10’000 x 10’000 Pixel) vor. Wir teilen diese Bilder in kleinere Kacheln von 256 x 256 Pixeln auf, denn Convolutional Neural Networks (CNNs) können ihre Fähigkeit zur Erkennung von lokalen Mustern, in unserem Fall das Rollstuhl-Piktogramm, so viel effizienter und schneller zur Anwendung bringen.
Wir erstellen die kleineren Orthofoto-Kacheln mit folgenden vier Arbeitsschritten:
- Schweiz in acht gleich grosse Rechtecke unterteilen (links)
- In jedem Rechteck ein regelmässiges Raster mit Kacheln der Grösse 256 x 256 Pixel anlegen. Für die acht Rechtecke ergeben sich dadurch etwa 197 Millionen Kacheln.
- Kacheln auf den Umriss der Schweiz begrenzen. Dadurch ergeben sich etwa 63 Millionen Kacheln (Mitte). Diese werden für das spätere Deployment des Deep Learning-Modells benötigt.
- Für den den Trainingsprozess des Modells werden die Kacheln anhand der Bounding Boxes der Parkplatz-Piktogramme gefiltert. So bleiben circa 600 Kacheln übrig (rechts).
Jede Gitterzelle soll später einem aufbereiteten Bild entsprechen. Bei einer Pixelauflösung von 10 cm ergibt das eine reale Grösse von 25,6 m x 25,6 m. Die Berechnungen erfolgen parallel mithilfe der Python-Bibliothek «concurrent.futures». Alternativ liessen sich die Kacheln beispielsweise auch mit ArcGIS und der Funktion «Create Fishnet» oder mit dem Open-Source-GIS QGIS und der Funktion «Gitter erzeugen» erstellen.
Bilder ausschneiden
Das Orthofoto-Mosaik wird mit den soeben erzeugten 600 «Parkplatz-Kacheln» abgeglichen. Dabei dienen die Kacheln als eine Art Ausstechform und stanzen Bilder entsprechend der Pixelgrösse 256 x 256 aus. Zusätzlich verschieben wir das Gitternetz in seiner Position um jeweils 50% (128 Pixel) nach Osten, Süden und Westen und stanzen so pro Bild drei weitere Bilder aus. Für diesen Prozess empfehle ich die Python-Bibliotheken «rasterio» und «pillow».
Die Sliding-Window-Technik mit 50% Offset nennt sich «Striding». Sie kann als eine Form von Data Augmentation betrachtet werden, da sie die Anzahl der Trainingsbeispiele erhöht und somit zur Verbesserung der Modellgenauigkeit beiträgt sowie Überanpassung (Overfitting) reduziert. Unser Trainingsset umfasst nun also über 2’400 Bilder.
Labels erstellen
Nun müssen wir jede Bounding Box eindeutig einem Bild zuweisen. Durch die räumliche Überlagerung der Bildkacheln und Bounding Boxes können die Rechtecke präzise zugeordnet und die exakte Position der Labels innerhalb eines Bildes bestimmt werden. Diese Zuordnung erfolgt für Faster R-CNN gemäss dem Pascal VOC-Annotationsschema (siehe Abbildung unten, Mitte), das eine standardisierte Struktur für die Speicherung von Bounding Box-Koordinaten (xmin, ymin, xmax, ymax) und Klassenlabels im XML-Format vorgibt. Wir verwenden die Python-Bibliotheken «rasterio» und «ElementTree».
Die untere Kachel zeigt zwei Rollstuhlparkplätze, deren Positionen durch Bounding Boxes in einer Pascal VOC-XML-Datei annotiert sind. Diese Annotationen enthalten die genauen Bildkoordinaten der Rollstuhlparkplätze und sind mit dem Label name = 1 (entspricht der Klasse «Parkplatz») versehen.
Damit sind die Trainingsdaten für Faster R-CNN nun fertig vorbereitet und wir können endlich mit dem Modell-Training starten.
Neuronales Netz trainieren
Das Modell-Training wird mit dem Deep Learning-Framework PyTorch durchgeführt. PyTorch finde ich im Vergleich zu TensorFlow einfacher und flexibler in der Bedienung, insbesondere bei der dynamischen Graph-Erstellung.
Für unsere Anwendung mit rund 2’400 Bildern und nur einer Klasse («Parkplatz») verwende ich die in meinem HP ZBook integrierte NVIDIA RTX A2000 GPU mit 8 GB Arbeitsspeicher, die dafür völlig ausreichend ist. Alternativ könnten die Daten auch auf Google Drive gespeichert und das Modell über den Jupyter Notebook Service von Google Colab in der Cloud mit beispielsweise einer NVIDIA Tesla T4 GPU mit 16 GB Arbeitsspeicher trainiert werden.
Datensatz aufteilen
Algorithmen neigen dazu, den aus den Trainingsdaten gelernten Mustern zu stark zu folgen, was zu einer Überanpassung bzw. zu «Overfitting» des Modells führen kann. Dabei lernt der Algorithmus Zusammenhänge und Beziehungen aus den Trainingsdaten so gut, dass sie für die Gesamtheit der Daten nicht mehr zutreffen (also eigentlich zu wenig verallgemeinerbar sind). Daher ist es im Deep Learning üblich, den gelabelten Datensatz in drei separate Teile aufzuteilen: Trainings-, Validierungs- und Testdaten im Mengenverhältnis 60%, 20% und 20%.
- Die Trainingsdaten werden natürlich für das Training des Modells eingesetzt.
- Die Validierungsdaten werden für die Abstimmung der Modell-Hyperparameter während des Trainings verwendet.
- Die Testdaten werden beim Training nicht genutzt. Der Algorithmus kennt diese Daten nicht (darf diese nicht zum Lernen nutzen). Die Testdaten dienen der Qualitätsmessung des Modells.
Wir ermitteln mit einer simpeln Shuffle-Funktion eine zufällige Auswahl von Bildern (20% Testdaten). Diese werden fürs erste «weggelegt». Die verbleibenden Daten trennen wir dann unmittelbar vor dem Modell-Training via Subset-Funktion von PyTorch weiter in Trainings- (60%) und Validierungsdaten (20%) auf.
Transfer Learning
Für die Detektion der Rollstuhlparkplätze setzen wir auf ein vortrainiertes Faster R-CNN-Netzwerk mit Microsoft Resnet50-Backbone, das bereits etwa 80 verschiedene Objekte erkennen kann (Abbildung unten, links). Dieses vortrainierte Modell ist jedoch nicht auf unseren Anwendungsfall trainiert und «kennt» Rollstuhlparkplätze daher noch nicht. Um den Algorithmus darauf zu trainieren werden dem Modell die gelabelten Parkplatzbilder und ein neuer Klassifikationslayer für «Parkplatz» hinzugefügt (Abbildung unten, rechts). Das Pre-Training erfolgt hierbei mit den Gewichten aus dem Microsoft Common Objects in Context-Datensatz (MS COCO). Durch Transfer Learning können wir die bereits erlernten Merkmale des Modells nutzen und die Trainingszeit sowie die benötigte Datenmenge erheblich reduzieren.
Training und Validierung
Wir trainieren verschiedene Modelle jeweils über maximal 100 Epochen. Folgende (Hyper-)Parameter haben sich für unseren Anwendungsfall besonders bewährt:
- Anteil Validierungsdaten: Ursprünglich wurde das Modell mit einem Anteil von 10% Validierungsdaten trainiert. Dieser Ansatz führte jedoch dazu, dass insbesondere verblasste Rollstuhlsymbole häufig nicht erkannt wurden. Durch die Erhöhung des Anteils der Validierungsdaten auf 20% konnten wir die Präzision um 25% steigern.
- Batch Size: Es wurden verschiedene Batch-Grössen getestet: 2, 4, 6, 8 und 12. Die besten Ergebnisse wurden mit einer Batch-Grösse von 4 erzielt. Mit leistungsfähigeren GPUs (zum Beispiel A4000) sind jedoch bessere Ergebnisse bei grösseren Batch-Grössen denkbar. Eine zu kleine Batch-Grösse, wie etwa 2, führte zu unsichereren Trainingsergebnissen und instabilen Gradienten, während eine zu grosse Batch-Grösse, wie 8, zu leicht schlechteren Ergebnissen führte.
- Lernstrategie: Wir beginnen mit einer Lernrate von 0,01. Falls die Performance auf den Validierungsdaten über 5 Epochen hinweg nicht verbessert wird, reduzieren wir die Lernrate um den Faktor 10, also auf 0,001, auf 0,0001 usw. Falls die Performance bei einer Lernrate von 0,00001 nicht weiter verbessert wird, beenden wir das Training. Dieser Prozess wird mithilfe des «ReduceLROnPlateau»-Schedulers von PyTorch gesteuert.
Evaluation
Die Qualität des trainierten Modells wurde anhand von etwa 400 unabhängigen Testbildern in den Testdaten überprüft. Dabei zeigt das Modell eine zuverlässige Detektion von Rollstuhlparkplätzen, unabhängig davon, ob sie gelb oder weiss markiert sind:
Selbst Parkplätze im Schatten und solche mit verblassten Rollstuhlsymbolen werden durch das Modell gut erkannt:
Anwendung des fertig trainierten Modells in schwierigen Settings
Gelegentlich kommt es zu Verwechslungen (False Positives) bei Parkplätzen mit Ladestationen für Elektrofahrzeuge (Abbildung unten, links). Bei Rollstuhlparkplätzen mit blauem Hintergrund (Abbildung unten, Mitte) oder mit ungewöhnlich grossen Markierungen (Abbildung unten, rechts) erkennt das Modell die Rollstuhlparkplätze nicht (False Negatives): Der Trainingsdatensatz enthielt zu wenige Beispiele mit diesen Konfigurationen der Symbolik.
Alle erzeugten Vorhersage-Bounding-Boxes werden mit den gelabelten Bounding Boxes aus dem Ground Truth-Datensatz verglichen. Die Ähnlichkeit wird anhand des IoU («Intersection over Union») gemessen. Überschreitet der IoU-Score einen vordefinierten Schwellenwert, wird die Vorhersage als richtig bewertet:
Mit dem trainierten Modell und dem IoU-Schwellenwert von 0.5 werden auf den Testdaten folgende Ergebnisse erzielt:
Gelabelte Parkplätze | True Positive | False Positive | False Negative | F1-Score % | Recall % | Precision % |
527 | 469 | 29 | 58 | 91.5 | 89.0 | 94.2 |
Lese-Beispiele zur Interpretation:
- True Positive: Das Modell hat 469 der 527 tatsächlich vorhandenen Rollstuhlparkplätze korrekt als solche erkannt.
- False Positive: Das Modell hat 29 Objekte fälschlicherweise als Rollstuhlparkplätze identifiziert, obwohl es sich nicht um solche Parkplätze handelt.
- False Negative: Das Modell hat 58 real vorhandene Rollstuhlparkplätze fälschlicherweise nicht als solche erkannt.
Fazit
Unser Deep Learning-Modell zeigt eine hervorragende Leistung bei der Erkennung von Rollstuhlparkplätzen mit hoher Präzision und hohem Recall. Das heisst: Es identifiziert die meisten vorhandenen Parkplätze korrekt (hoher Recall) und macht dabei nur wenige Fehler (hohe Präzision). Der hohe F1-Score von 91.5% unterstreicht die gute Balance zwischen Präzision und Recall und weist auf die Zuverlässigkeit des Modells hin. Um die Erkennungsleistung weiter zu verbessern, planen wir, dem Trainingsdatensatz etwa 40-50 Rollstuhlparkplätze mit blauem Hintergrund sowie weitere ungewöhnliche Arten der Markierung hinzuzufügen und dann den Trainingsprozess abzuschliessen.
In diesem zweiten Teil der Blogserie habe ich die Trainingsdaten für den Algorithmus Faster R-CNN aufbereitet und die Anwendung von Deep Learning zur Erkennung von Rollstuhlparkplätzen erläutert. Im nächsten und letzten Teil werden wir die alle Verarbeitungsschritte mit Kedro in eine Datenpipeline verpacken und den trainierten Algorithmus auf den Kanton Thurgau anwenden. Seien Sie gespannt!
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.