Esta es la implementación del proyecto "Comprensión semántica de entornos exteriores para la navegación" completado en el Laboratorio de sistemas robóticos de ETH Zurich en el semestre de primavera de 2023.
El objetivo del proyecto era investigar cómo el reciente modelo de segmentación semántica no supervisada STEGO (Hamilton et al., 2022) podría usarse en un canal de navegación al aire libre para un robot móvil terrestre, centrándose principalmente en el contexto de la Navegación Visual Salvaje. sistema (Frey y Mattamala et al.).
Este paquete se basa en una versión refactorizada de STEGO: Segmentación semántica no supervisada mediante correspondencias de características destiladas de Hamilton et al.
SLIC (método de segmentación de WVN), STEGO estándar y STEGO con agrupación de funciones por imagen que segmenta escenas naturales.
Configuración
Instalación
Descarga del conjunto de datos
Preprocesamiento de datos
Descarga del modelo
Preprocesamiento KNN
Segmentación de demostración
Evaluar la segmentación
Segmentación de trenes
Evaluar para WVN
Generar parcelas
Licencia
Clonar el repositorio:
git clone https://github.com/leggedrobotics/self_supervised_segmentation.git cd self_supervised_segmentation
Instalar el entorno:
conda env create -f environment.yml conda activate stego pip install -e .
Descargue conjuntos de datos generales utilizados por Hamilton et al.:
python scripts/download_stego_datasets.py
NOTA: Es posible que wget
, que se utiliza en los scripts de descarga, no siempre funcione bien con estas descargas grandes. En caso de que la descarga falle, intente descargar los conjuntos de datos seleccionados con azcopy. Por ejemplo, para descargar el conjunto de datos cocostuff:
azcopy copy https://marhamilresearch4.blob.core.windows.net/stego-public/pytorch_data/cocostuff.zip ./cocostuff.zip
En el caso del conjunto de datos cocostuff, Hamilton et al. Utilice subconjuntos de muestras de entrenamiento y validación para experimentos, que también se utilizaron en este proyecto. Se pueden obtener listas de muestras descargando el conjunto de datos desde el enlace anterior. Luego, se puede generar un conjunto de datos seleccionado de acuerdo con una lista seleccionada con scripts/create_curated_dataset.py
.
Descargue conjuntos de datos con escenas naturales:
# 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*
Para facilitar el uso de varios conjuntos de datos con el paquete, se han agregado scripts de preprocesamiento a scripts/data_preprocessing
. Antes de ejecutar, ajuste las rutas en cada secuencia de comandos de preprocesamiento.
Preprocesamiento de cocostuff:
# 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
Preprocesamiento RUGD:
# Preprocess RUGD python scripts/data_preprocessing/preprocess_RUGD.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
Preprocesamiento del bosque de Friburgo:
# Preprocess Freiburg Forest python scripts/data_preprocessing/preprocess_freiburg_forest.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
Para utilizar datos personalizados con este paquete, preprocéselos para que tengan la siguiente estructura:
YOUR_DATASET |-- imgs |-- train |-- val |-- labels |-- train |-- val
Con imágenes RGB en el directorio imgs
y (opcionalmente) anotaciones en el directorio labels
.
Si se proporciona el directorio labels
, debe contener una etiqueta para todas las imágenes en imgs
, y cada etiqueta tiene el mismo nombre que su imagen correspondiente (excluyendo la extensión de archivo). Las anotaciones deben proporcionarse como máscaras de un solo canal del mismo tamaño que sus imágenes correspondientes.
Descargar puntos de control del modelo STEGO:
python scripts/download_stego_models.py
Convierta los puntos de control seleccionados a la estructura del modelo utilizada por este paquete. Establezca las rutas de entrada y salida en scripts/cfg/convert_checkpoint_config.yaml
y ejecute:
python scripts/convert_original_stego_checkpoint.py
Para utilizar un conjunto de datos preprocesado con un modelo seleccionado y con una resolución seleccionada, el script precompute_knns.py
debe ejecutarse con los parámetros y el modelo seleccionados. Esto creará el archivo de vecinos más cercanos en un subdirectorio nns
separado del conjunto de datos seleccionado. Ajuste los parámetros en scripts/cfg/knn_config.yaml
y ejecute:
python scripts/precompute_knns.py
Para generar predicciones de segmentación para una carpeta de imágenes seleccionada:
Ajuste las rutas de entrada y salida en scripts/cfg/demo_config.yaml
Correr:
python scripts/demo_segmentation.py
Esto generará visualizaciones de segmentaciones no supervisadas en output_dir/experiment_name/cluster
y visualizaciones de segmentaciones de sonda lineal en output_dir/experiment_name/linear
.
Para evaluar STEGO en un conjunto de datos seleccionado con métricas no supervisadas:
Ajuste las rutas y los parámetros en scripts/cfg/eval_config.yaml
Correr:
python scripts/eval_segmentation.py
El script calculará e imprimirá los resultados de la evaluación con los datos proporcionados.
Después de realizar los pasos de preprocesamiento descritos en Configuración, puede entrenar STEGO con los datos seleccionados.
Antes del entrenamiento, seleccione la columna vertebral y ajuste los parámetros del modelo y del entrenamiento.
STEGO se construyó sobre la base de DINO ViT, pero se puede utilizar con cualquier Vision Transformer. Todas las redes troncales disponibles se pueden encontrar en stego/backbones/backbone.py
. Para agregar una nueva red troncal, agregue todo el código necesario para la red troncal a la carpeta stego/backbones
y modifique stego/backbone/backbones.py
:
Agregue una implementación de la clase Backbone
para su red troncal,
Agregue su implementación a la función get_backbone
con el nombre deseado.
Los parámetros de STEGO se especifican en stego/cfg/model_config.yaml
. En este archivo puedes:
seleccione la columna vertebral,
especificar otros parámetros del modelo,
especifique los parámetros de entrenamiento: tasas de aprendizaje y parámetros de pérdida de correspondencia de STEGO.
Se pueden configurar otros parámetros para el entrenamiento en scripts/cfg/train_config.yaml
.
Después de ajustar los parámetros, ejecute el entrenamiento con:
python scripts/train.py
STEGO se implementa con Pytorch Lightning, que se encarga de guardar los puntos de control durante el entrenamiento, en un directorio que se puede especificar en scripts/cfg/train_config.yaml
.
El registro se implementa con pesos y sesgos. Para usar W&B en la nube, inicie sesión en wandb:
wandb login
Durante el entrenamiento, además de las métricas no supervisadas, los valores de pérdida y otros parámetros, se registran visualizaciones de segmentaciones de muestras y el gráfico de distribución de similitud de características aprendidas.
Para ejecutar el experimento que compara métodos de segmentación en el contexto de un canal de navegación exterior:
Genere etiquetas de transitabilidad binaria para un conjunto de datos seleccionado. Actualmente sólo está disponible el preprocesamiento para el bosque de Friburgo. Sin embargo, también puede preprocesar diferentes conjuntos de datos para este experimento con este script siempre que cambie TRAVERSABLE_IDS
por ID de clases transitables en su conjunto de datos. Correr:
# Adjust paths in the script before running python scripts/data_preprocessing/generate_traversability_labels_freiburg_forest.py
Ajustar parámetros en scripts/cfg/eval_clusters_wvn.yaml
Correr:
python scripts/eval_clusters_wvn.py
El script calculará e imprimirá los resultados de la evaluación con los datos proporcionados y guardará las visualizaciones seleccionadas.
El script scripts/plot.py
permite la generación de curvas de recuperación de precisión que muestran el rendimiento de las características en la predicción de la coexistencia de etiquetas. También proporciona una trama interactiva que visualiza similitudes de características en imágenes seleccionadas.
Para generar los gráficos:
Ajuste las rutas y los parámetros en scripts/cfg/plot_config.yaml
Correr:
python scripts/plot.py
Copyright (c) 2022-2024, ETH Zurich, Piotr Libera, Jonas Frey, Matias Mattamala. All rights reserved. Licensed under the MIT license.
Este proyecto se basa en trabajos anteriores de Mark Hamilton.
Copyright (c) Mark Hamilton. All rights reserved. Licensed under the MIT license.
Los archivos en stego/backbones/dino
tienen la licencia Apache 2.0 de Facebook, Inc. y sus afiliados. Consulte los encabezados de los archivos para obtener más detalles.