Il s'agit de la mise en œuvre du projet "Semantic Understanding of Outdoor Environments for Navigation" achevé au Robotic Systems Lab de l'ETH Zurich au semestre de printemps 2023.
L'objectif du projet était d'étudier comment le récent modèle de segmentation sémantique non supervisé STEGO (Hamilton et al., 2022) pourrait être utilisé dans un pipeline de navigation extérieure pour un robot mobile au sol, en mettant l'accent principalement sur le contexte de la navigation visuelle sauvage. système (Frey & Mattamala et al.).
Ce package est construit sur une version refactorisée de STEGO : Unsupervised Semantic Segmentation by Distilling Feature Correspondences par Hamilton et al.
SLIC (méthode de segmentation de WVN), STEGO standard et STEGO avec regroupement de fonctionnalités par image segmentant les scènes naturelles.
Installation
Installation
Téléchargement de l'ensemble de données
Prétraitement des données
Téléchargement du modèle
Prétraitement KNN
Segmentation de la démo
Évaluer la segmentation
Segmentation des trains
Évaluer pour WVN
Générer des tracés
Licence
Clonez le dépôt :
git clone https://github.com/leggedrobotics/self_supervised_segmentation.git cd self_supervised_segmentation
Installez l'environnement :
conda env create -f environment.yml conda activate stego pip install -e .
Téléchargez les ensembles de données générales utilisés par Hamilton et al. :
python scripts/download_stego_datasets.py
REMARQUE : wget
, qui est utilisé dans les scripts de téléchargement, peut ne pas toujours fonctionner correctement avec ces téléchargements volumineux. En cas d'échec du téléchargement, essayez de télécharger les ensembles de données sélectionnés avec azcopy. Par exemple, pour télécharger l'ensemble de données cocosuff :
azcopy copy https://marhamilresearch4.blob.core.windows.net/stego-public/pytorch_data/cocostuff.zip ./cocostuff.zip
Dans le cas de l'ensemble de données cocosuff, Hamilton et al. utiliser des sous-ensembles d'échantillons de formation et de validation pour les expériences, qui ont également été utilisés dans ce projet. Des listes d'échantillons peuvent être obtenues en téléchargeant l'ensemble de données à partir du lien ci-dessus. Ensuite, un ensemble de données organisé selon une liste sélectionnée peut être généré avec scripts/create_curated_dataset.py
.
Téléchargez des ensembles de données avec des scènes naturelles :
# 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*
Pour faciliter l'utilisation de divers ensembles de données avec le package, des scripts de prétraitement ont été ajoutés à scripts/data_preprocessing
. Avant l'exécution, ajustez les chemins dans chaque script de prétraitement.
Prétraitement des produits coco :
# 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
Prétraitement RUGD :
# Preprocess RUGD python scripts/data_preprocessing/preprocess_RUGD.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
Prétraitement de la forêt de Fribourg :
# Preprocess Freiburg Forest python scripts/data_preprocessing/preprocess_freiburg_forest.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
Pour utiliser des données personnalisées avec ce package, prétraitez-les pour avoir la structure suivante :
YOUR_DATASET |-- imgs |-- train |-- val |-- labels |-- train |-- val
Avec des images RVB dans le répertoire imgs
et (éventuellement) des annotations dans le répertoire labels
.
Si le répertoire labels
est fourni, il doit contenir une étiquette pour toutes les images dans imgs
, chaque étiquette portant le même nom que son image correspondante (à l'exclusion de l'extension de fichier). Les annotations doivent être fournies sous forme de masques monocanal de la même taille que les images correspondantes.
Téléchargez les points de contrôle du modèle STEGO :
python scripts/download_stego_models.py
Convertissez les points de contrôle sélectionnés en structure de modèle utilisée par ce package. Définissez les chemins d'entrée et de sortie dans scripts/cfg/convert_checkpoint_config.yaml
et exécutez :
python scripts/convert_original_stego_checkpoint.py
Pour utiliser un ensemble de données prétraité avec un modèle sélectionné et à une résolution sélectionnée, le script precompute_knns.py
doit être exécuté avec les paramètres et le modèle sélectionnés. Cela créera le fichier des voisins les plus proches dans un sous-répertoire distinct nns
de l'ensemble de données sélectionné. Ajustez les paramètres dans scripts/cfg/knn_config.yaml
et exécutez :
python scripts/precompute_knns.py
Pour générer des prédictions de segmentation pour un dossier d'images sélectionné :
Ajustez les chemins d'entrée et de sortie dans scripts/cfg/demo_config.yaml
Courir:
python scripts/demo_segmentation.py
Cela générera des visualisations de segmentations non supervisées dans output_dir/experiment_name/cluster
et des visualisations de segmentations de sondes linéaires dans output_dir/experiment_name/linear
.
Pour évaluer STEGO sur un ensemble de données sélectionné avec des métriques non supervisées :
Ajustez les chemins et les paramètres dans scripts/cfg/eval_config.yaml
Courir:
python scripts/eval_segmentation.py
Le script calculera et imprimera les résultats de l'évaluation sur les données fournies.
Après avoir effectué les étapes de prétraitement décrites dans la configuration, vous pouvez entraîner STEGO sur les données sélectionnées.
Avant l'entraînement, sélectionnez le backbone et ajustez les paramètres du modèle et de l'entraînement.
STEGO a été construit sur la base de DINO ViT, mais il peut être utilisé avec n'importe quel Vision Transformer. Tous les backbones disponibles peuvent être trouvés dans stego/backbones/backbone.py
. Pour ajouter un nouveau backbone, ajoutez tout le code nécessaire au backbone dans le dossier stego/backbones
et modifiez stego/backbone/backbones.py
:
Ajoutez une implémentation de la classe Backbone
pour votre backbone,
Ajoutez votre implémentation à la fonction get_backbone
avec le nom souhaité.
Les paramètres de STEGO sont spécifiés dans stego/cfg/model_config.yaml
. Dans ce fichier vous pouvez :
sélectionnez la colonne vertébrale,
spécifier d'autres paramètres du modèle,
spécifier les paramètres d'entraînement : taux d'apprentissage et paramètres de perte de correspondance de STEGO.
D'autres paramètres de formation peuvent être définis dans scripts/cfg/train_config.yaml
.
Après avoir ajusté les paramètres, lancez la formation avec :
python scripts/train.py
STEGO est implémenté avec Pytorch Lightning, qui gère la sauvegarde des points de contrôle pendant la formation, dans un répertoire qui peut être spécifié dans scripts/cfg/train_config.yaml
.
La journalisation est implémentée avec Weights & Biases. Pour utiliser W&B sur le cloud, connectez-vous à wandb :
wandb login
Pendant la formation, outre les métriques non supervisées, les valeurs de perte et d'autres paramètres, les visualisations des segmentations d'échantillons et le tracé de distribution de similarité des caractéristiques apprises sont enregistrés.
Pour exécuter l'expérience qui compare les méthodes de segmentation dans le contexte d'un pipeline de navigation extérieure :
Générez des étiquettes de traversabilité binaire pour un ensemble de données sélectionné. Actuellement, seul le prétraitement pour la forêt de Fribourg est disponible. Cependant, vous pouvez également prétraiter différents ensembles de données pour cette expérience avec ce script à condition de remplacer TRAVERSABLE_IDS
par les ID des classes traversables dans votre ensemble de données. Courir:
# Adjust paths in the script before running python scripts/data_preprocessing/generate_traversability_labels_freiburg_forest.py
Ajustez les paramètres dans scripts/cfg/eval_clusters_wvn.yaml
Courir:
python scripts/eval_clusters_wvn.py
Le script calculera et imprimera les résultats de l'évaluation sur les données fournies, et enregistrera les visualisations sélectionnées.
Le script scripts/plot.py
permet de générer des courbes de rappel de précision montrant les performances des fonctionnalités dans la prédiction de la cooccurrence d'étiquettes. Il fournit également un tracé interactif visualisant les similitudes des caractéristiques dans les images sélectionnées.
Pour générer les tracés :
Ajustez les chemins et les paramètres dans scripts/cfg/plot_config.yaml
Courir:
python scripts/plot.py
Copyright (c) 2022-2024, ETH Zurich, Piotr Libera, Jonas Frey, Matias Mattamala. All rights reserved. Licensed under the MIT license.
Ce projet est basé sur des travaux antérieurs de Mark Hamilton.
Copyright (c) Mark Hamilton. All rights reserved. Licensed under the MIT license.
Les fichiers dans stego/backbones/dino
sont sous licence Apache 2.0 par Facebook, Inc. et ses sociétés affiliées. Voir les en-têtes de fichiers pour plus de détails.