Esta é a implementação do projeto “Compreensão Semântica de Ambientes Externos para Navegação” concluído no Laboratório de Sistemas Robóticos da ETH Zurique no semestre da primavera de 2023.
O objetivo do projeto era investigar como o recente modelo de segmentação semântica não supervisionada STEGO (Hamilton et al., 2022) poderia ser usado em um pipeline de navegação outdoor para um robô móvel terrestre, com foco principal no contexto do Wild Visual Navigation. sistema (Frey & Mattamala et al.).
Este pacote é construído em uma versão refatorada do STEGO: Unsupervised Semantic Segmentation by Distilling Feature Correspondences de Hamilton et al.
SLIC (método de segmentação WVN), STEGO padrão e STEGO com recurso de agrupamento por imagem segmentando cenas naturais.
Configurar
Instalação
Download do conjunto de dados
Pré-processamento de dados
Baixar modelo
Pré-processamento KNN
Segmentação de demonstração
Avalie a segmentação
Segmentação de trens
Avaliar para WVN
Gerar gráficos
Licença
Clone o repositório:
git clone https://github.com/leggedrobotics/self_supervised_segmentation.git cd self_supervised_segmentation
Instale o ambiente:
conda env create -f environment.yml conda activate stego pip install -e .
Baixe conjuntos de dados gerais usados por Hamilton et al.:
python scripts/download_stego_datasets.py
NOTA: wget
, usado nos scripts de download, nem sempre funciona bem com esses downloads grandes. Caso o download falhe, tente baixar os conjuntos de dados selecionados com azcopy. Por exemplo, para baixar o conjunto de dados cocostuff:
azcopy copy https://marhamilresearch4.blob.core.windows.net/stego-public/pytorch_data/cocostuff.zip ./cocostuff.zip
No caso do conjunto de dados cocostuff, Hamilton et al. utilizar subconjuntos de amostras de treinamento e validação para experimentos, que também foram utilizados neste projeto. Listas de amostras podem ser obtidas baixando o conjunto de dados no link acima. Então, um conjunto de dados curado de acordo com uma lista selecionada pode ser gerado com scripts/create_curated_dataset.py
.
Baixe conjuntos de dados com cenas naturais:
# 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 o uso de vários conjuntos de dados com o pacote, scripts de pré-processamento foram adicionados a scripts/data_preprocessing
. Antes de executar, ajuste os caminhos em cada script de pré-processamento.
Pré-processamento 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
Pré-processamento RUGD:
# Preprocess RUGD python scripts/data_preprocessing/preprocess_RUGD.py # Crop the dataset (only for training) python scripts/data_preprocessing/crop_dataset.py
Pré-processamento da Floresta de Freiburg:
# 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 usar dados personalizados com este pacote, pré-processe-o para ter a seguinte estrutura:
YOUR_DATASET |-- imgs |-- train |-- val |-- labels |-- train |-- val
Com imagens RGB no diretório imgs
e (opcionalmente) anotações no diretório labels
.
Se o diretório labels
for fornecido, ele deverá conter um rótulo para todas as imagens em imgs
, com cada rótulo com o mesmo nome de sua imagem correspondente (excluindo a extensão do arquivo). As anotações devem ser fornecidas como máscaras de canal único do mesmo tamanho das imagens correspondentes.
Baixe os pontos de verificação do modelo STEGO:
python scripts/download_stego_models.py
Converta os pontos de verificação selecionados na estrutura do modelo usada por este pacote. Defina os caminhos de entrada e saída em scripts/cfg/convert_checkpoint_config.yaml
e execute:
python scripts/convert_original_stego_checkpoint.py
Para usar um conjunto de dados pré-processado com um modelo selecionado e em uma resolução selecionada, o script precompute_knns.py
precisa ser executado com os parâmetros e o modelo selecionados. Isso criará o arquivo de vizinhos mais próximos em um subdiretório separado nns
do conjunto de dados selecionado. Ajuste os parâmetros em scripts/cfg/knn_config.yaml
e execute:
python scripts/precompute_knns.py
Para gerar previsões de segmentação para uma pasta de imagens selecionada:
Ajuste os caminhos de entrada e saída em scripts/cfg/demo_config.yaml
Correr:
python scripts/demo_segmentation.py
Isso gerará visualizações de segmentações não supervisionadas em output_dir/experiment_name/cluster
e visualizações de segmentações de sonda linear em output_dir/experiment_name/linear
.
Para avaliar o STEGO em um conjunto de dados selecionado com métricas não supervisionadas:
Ajuste caminhos e parâmetros em scripts/cfg/eval_config.yaml
Correr:
python scripts/eval_segmentation.py
O script irá calcular e imprimir os resultados da avaliação nos dados fornecidos.
Depois de executar as etapas de pré-processamento descritas em Configuração, você poderá treinar o STEGO nos dados selecionados.
Antes do treinamento, selecione o backbone e ajuste os parâmetros do modelo e do treinamento.
O STEGO foi construído com base no DINO ViT, mas pode ser usado com qualquer Vision Transformer. Todos os backbones disponíveis podem ser encontrados em stego/backbones/backbone.py
. Para adicionar um novo backbone, adicione todo o código necessário para o backbone na pasta stego/backbones
e modifique stego/backbone/backbones.py
:
Adicione uma implementação da classe Backbone
para seu backbone,
Adicione sua implementação à função get_backbone
com o nome desejado.
Os parâmetros do STEGO são especificados em stego/cfg/model_config.yaml
. Neste arquivo você pode:
selecione a espinha dorsal,
especificar outros parâmetros do modelo,
especifique parâmetros de treinamento: taxas de aprendizagem e parâmetros de perda de correspondência do STEGO.
Outros parâmetros para treinamento podem ser definidos em scripts/cfg/train_config.yaml
.
Após ajustar os parâmetros, execute o treinamento com:
python scripts/train.py
STEGO é implementado com Pytorch Lightning, que salva os pontos de verificação durante o treinamento, em um diretório que pode ser especificado em scripts/cfg/train_config.yaml
.
O registro é implementado com Pesos e Vieses. Para usar W&B na nuvem, faça login no wandb:
wandb login
Durante o treinamento, além de métricas não supervisionadas, valores de perda e outros parâmetros, são registradas visualizações de segmentações de amostra e o gráfico de distribuição de similaridade de recursos aprendidos.
Para executar o experimento que compara métodos de segmentação no contexto de um pipeline de navegação externa:
Gere rótulos de capacidade de travessia binária para um conjunto de dados selecionado. Atualmente, apenas o pré-processamento para a Floresta de Freiburg está disponível. No entanto, você também pode pré-processar diferentes conjuntos de dados para este experimento com este script, desde que você altere TRAVERSABLE_IDS
para IDs de classes percorríveis em seu conjunto de dados. Correr:
# Adjust paths in the script before running python scripts/data_preprocessing/generate_traversability_labels_freiburg_forest.py
Ajuste os parâmetros em scripts/cfg/eval_clusters_wvn.yaml
Correr:
python scripts/eval_clusters_wvn.py
O script irá calcular e imprimir os resultados da avaliação nos dados fornecidos e salvar as visualizações selecionadas.
O script scripts/plot.py
permite a geração de curvas de recuperação de precisão mostrando o desempenho de recursos na previsão da coocorrência de rótulos. Ele também fornece um gráfico interativo que visualiza semelhanças de recursos em imagens selecionadas.
Para gerar os gráficos:
Ajuste caminhos e parâmetros em 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 projeto é baseado em trabalhos anteriores de Mark Hamilton.
Copyright (c) Mark Hamilton. All rights reserved. Licensed under the MIT license.
Os arquivos em stego/backbones/dino
são licenciados sob a licença Apache 2.0 pelo Facebook, Inc. e suas afiliadas. Consulte os cabeçalhos dos arquivos para obter detalhes.