Dabei handelt es sich um die Umsetzung des Projekts „Semantic Understanding of Outdoor Environments for Navigation“, das im Frühjahrssemester 2023 am Robotic Systems Lab der ETH Zürich abgeschlossen wurde.
Das Ziel des Projekts bestand darin, zu untersuchen, wie das aktuelle unbeaufsichtigte semantische Segmentierungsmodell STEGO (Hamilton et al., 2022) in einer Outdoor-Navigationspipeline für einen mobilen Bodenroboter verwendet werden könnte, wobei der Schwerpunkt auf dem Kontext der Wild Visual Navigation lag System (Frey & Mattamala et al.).
Dieses Paket basiert auf einer überarbeiteten Version von STEGO: Unsupervised Semantic Segmentation by Distilling Feature Correspondences von Hamilton et al.
SLIC (WVN-Segmentierungsmethode), Standard-STEGO und STEGO mit Feature-Clustering pro Bild, das natürliche Szenen segmentiert.
Aufstellen
Installation
Datensatz-Download
Datenvorverarbeitung
Modell-Download
KNN-Vorverarbeitung
Demo-Segmentierung
Bewerten Sie die Segmentierung
Zugsegmentierung
Auf WVN prüfen
Diagramme erstellen
Lizenz
Klonen Sie das Repository:
git clone https://github.com/leggedrobotics/self_supervised_segmentation.git cd self_supervised_segmentation
Installieren Sie die Umgebung:
conda env create -f environment.yml conda activate stego pip install -e .
Laden Sie allgemeine Datensätze herunter, die von Hamilton et al. verwendet werden:
python scripts/download_stego_datasets.py
HINWEIS: wget
, das in den Download-Skripten verwendet wird, funktioniert bei diesen großen Downloads möglicherweise nicht immer gut. Falls der Download fehlschlägt, versuchen Sie, die ausgewählten Datensätze mit azcopy herunterzuladen. So laden Sie beispielsweise den cocostuff-Datensatz herunter:
azcopy copy https://marhamilresearch4.blob.core.windows.net/stego-public/pytorch_data/cocostuff.zip ./cocostuff.zip
Im Fall des Cocostuff-Datensatzes haben Hamilton et al. Verwenden Sie Teilmengen von Trainings- und Validierungsproben für Experimente, die auch in diesem Projekt verwendet wurden. Probenlisten können durch Herunterladen des Datensatzes über den obigen Link abgerufen werden. Anschließend kann mit scripts/create_curated_dataset.py
ein entsprechend einer ausgewählten Liste kuratierter Datensatz generiert werden.
Datensätze mit Naturszenen herunterladen:
# Download RUGD wget http://rugd.vision/data/RUGD_frames-with-annotations.zip wget http://rugd.vision/data/RUGD_annotations.zip unzip RUGD_frames-with-annotations.zip -d RUGD unzip RUGD_annotations.zip -d RUGD rm RUGD_annotations.zip RUGD_frames-with-annotations.zip # Download Freiburg Forest wget http://deepscene.cs.uni-freiburg.de/static/datasets/download_freiburg_forest_annotated.sh bash download_freiburg_forest_annotated.sh tar -xzf freiburg_forest_annotated.tar.gz rm freiburg_forest_annotated.tar.gz*
Um die Verwendung verschiedener Datensätze mit dem Paket zu erleichtern, wurden Vorverarbeitungsskripte zu scripts/data_preprocessing
hinzugefügt. Passen Sie vor der Ausführung die Pfade in jedem Vorverarbeitungsskript an.
Kokosstoff-Vorverarbeitung:
# Preprocess full Cocostuff python scripts/data_preprocessing/preprocess_cocostuff.py # Create the curated dataset python scripts/data_preprocessing/create_curated_dataset.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
RUGD-Vorverarbeitung:
# Preprocess RUGD python scripts/data_preprocessing/preprocess_RUGD.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
Vorverarbeitung Freiburger Wald:
# Preprocess Freiburg Forest python scripts/data_preprocessing/preprocess_freiburg_forest.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
Um benutzerdefinierte Daten mit diesem Paket zu verwenden, verarbeiten Sie es vor, sodass es die folgende Struktur hat:
YOUR_DATASET |-- imgs |-- train |-- val |-- labels |-- train |-- val
Mit RGB-Bildern im imgs
-Verzeichnis und (optional) Anmerkungen im labels
-Verzeichnis.
Wenn das labels
-Verzeichnis bereitgestellt wird, sollte es ein Label für alle Bilder in imgs
enthalten, wobei jedes Label den gleichen Namen hat wie das entsprechende Bild (mit Ausnahme der Dateierweiterung). Anmerkungen sollten als Einkanalmasken in der gleichen Größe wie die entsprechenden Bilder bereitgestellt werden.
Laden Sie die Kontrollpunkte des STEGO-Modells herunter:
python scripts/download_stego_models.py
Konvertieren Sie ausgewählte Prüfpunkte in die von diesem Paket verwendete Modellstruktur. Legen Sie Eingabe- und Ausgabepfade in scripts/cfg/convert_checkpoint_config.yaml
fest und führen Sie Folgendes aus:
python scripts/convert_original_stego_checkpoint.py
Um einen vorverarbeiteten Datensatz mit einem ausgewählten Modell und einer ausgewählten Auflösung zu verwenden, muss das Skript precompute_knns.py
mit den ausgewählten Parametern und dem ausgewählten Modell ausgeführt werden. Dadurch wird die Datei „Nächste Nachbarn“ in einem separaten Unterverzeichnis nns
des ausgewählten Datensatzes erstellt. Passen Sie die Parameter in scripts/cfg/knn_config.yaml
an und führen Sie Folgendes aus:
python scripts/precompute_knns.py
So generieren Sie Segmentierungsvorhersagen für einen ausgewählten Bildordner:
Passen Sie die Eingabe- und Ausgabepfade in scripts/cfg/demo_config.yaml
an
Laufen:
python scripts/demo_segmentation.py
Dadurch werden Visualisierungen unbeaufsichtigter Segmentierungen in output_dir/experiment_name/cluster
und Visualisierungen linearer Sondensegmentierungen in output_dir/experiment_name/linear
generiert.
So bewerten Sie STEGO anhand eines ausgewählten Datensatzes mit unbeaufsichtigten Metriken:
Passen Sie Pfade und Parameter in scripts/cfg/eval_config.yaml
an
Laufen:
python scripts/eval_segmentation.py
Das Skript berechnet und druckt die Ergebnisse der Auswertung anhand der angegebenen Daten.
Nachdem Sie die im Setup beschriebenen Vorverarbeitungsschritte durchgeführt haben, können Sie STEGO anhand der ausgewählten Daten trainieren.
Wählen Sie vor dem Training das Backbone aus und passen Sie die Parameter des Modells und des Trainings an.
STEGO wurde auf Basis von DINO ViT erstellt, kann aber mit jedem Vision Transformer verwendet werden. Alle verfügbaren Backbones finden Sie in stego/backbones/backbone.py
. Um ein neues Backbone hinzuzufügen, fügen Sie den gesamten für das Backbone erforderlichen Code zum Ordner stego/backbones
hinzu und ändern Sie stego/backbone/backbones.py
:
Fügen Sie eine Implementierung der Backbone
-Klasse für Ihr Backbone hinzu.
Fügen Sie Ihre Implementierung mit dem gewünschten Namen zur Funktion get_backbone
hinzu.
Die Parameter von STEGO sind in stego/cfg/model_config.yaml
angegeben. In dieser Datei können Sie:
Wählen Sie das Rückgrat aus,
andere Modellparameter angeben,
Geben Sie Trainingsparameter an: Lernraten und STEGOs Korrespondenzverlustparameter.
Weitere Parameter für das Training können in scripts/cfg/train_config.yaml
festgelegt werden.
Führen Sie nach dem Anpassen der Parameter das Training aus mit:
python scripts/train.py
STEGO wird mit Pytorch Lightning implementiert, das das Speichern der Prüfpunkte während des Trainings in einem Verzeichnis übernimmt, das in scripts/cfg/train_config.yaml
angegeben werden kann.
Die Protokollierung wird mit Weights & Biases implementiert. Um W&B über die Cloud zu nutzen, melden Sie sich bei wandb an:
wandb login
Während des Trainings werden neben unbeaufsichtigten Metriken, Verlustwerten und anderen Parametern auch Visualisierungen von Probensegmentierungen und das Diagramm der erlernten Merkmalsähnlichkeitsverteilung protokolliert.
So führen Sie das Experiment durch, das Segmentierungsmethoden im Kontext einer Outdoor-Navigationspipeline vergleicht:
Generieren Sie binäre Traversierbarkeitsbezeichnungen für einen ausgewählten Datensatz. Derzeit ist nur die Vorverarbeitung für den Freiburger Wald verfügbar. Sie können mit diesem Skript jedoch auch verschiedene Datensätze für dieses Experiment vorverarbeiten, vorausgesetzt, Sie ändern TRAVERSABLE_IDS
in IDs durchquerbarer Klassen in Ihrem Datensatz. Laufen:
# Adjust paths in the script before running python scripts/data_preprocessing/generate_traversability_labels_freiburg_forest.py
Passen Sie die Parameter in scripts/cfg/eval_clusters_wvn.yaml
Laufen:
python scripts/eval_clusters_wvn.py
Das Skript berechnet und druckt die Ergebnisse der Auswertung der angegebenen Daten und speichert die ausgewählten Visualisierungen.
Das Skript scripts/plot.py
ermöglicht die Generierung von Precision-Recall-Kurven, die die Leistung von Features bei der Vorhersage des gleichzeitigen Auftretens von Etiketten zeigen. Es bietet außerdem eine interaktive Darstellung, die Merkmalsähnlichkeiten in ausgewählten Bildern visualisiert.
So erstellen Sie die Diagramme:
Passen Sie Pfade und Parameter in scripts/cfg/plot_config.yaml
an
Laufen:
python scripts/plot.py
Copyright (c) 2022-2024, ETH Zurich, Piotr Libera, Jonas Frey, Matias Mattamala. All rights reserved. Licensed under the MIT license.
Dieses Projekt basiert auf früheren Arbeiten von Mark Hamilton.
Copyright (c) Mark Hamilton. All rights reserved. Licensed under the MIT license.
Dateien in stego/backbones/dino
werden von Facebook, Inc. und seinen Tochtergesellschaften unter der Apache 2.0-Lizenz lizenziert. Weitere Informationen finden Sie in den Dateikopfzeilen.