Implementação oficial de "Splatter Image: Ultra-Fast Single-View 3D Reconstruction" (CVPR 2024)
[16 de abril de 2024] Várias grandes atualizações no projeto desde o primeiro lançamento:
Confira a demonstração online. Executar a demonstração localmente geralmente será ainda mais rápido e você poderá ver os loops renderizados com Gaussian Splatting (em oposição ao objeto .ply extraído, que pode mostrar artefatos). Para executar a demonstração localmente, basta seguir as instruções de instalação abaixo e depois ligar:
python gradio_app.py
conda create --name splatter-image
conda activate splatter-image
Instale o Pytorch seguindo as instruções oficiais. A combinação Pytorch / Python / Pytorch3D que foi verificada para funcionar é:
Instale outros requisitos:
pip install -r requirements.txt
Instale o renderizador Gaussian Splatting, ou seja, a biblioteca para renderizar uma nuvem de pontos gaussianos em uma imagem. Para fazer isso, extraia o repositório Gaussian Splatting e, com seu ambiente conda ativado, execute pip install submodules/diff-gaussian-rasterization
. Você precisará atender aos requisitos de hardware e software. Fizemos todos os nossos experimentos em uma GPU NVIDIA A6000 e medições de velocidade em uma GPU NVIDIA V100.
Se você quiser treinar com dados CO3D, você precisará instalar o Pytorch3D 0.7.2. Veja as instruções aqui. Recomenda-se instalar com pip a partir de um binário pré-construído. Encontre um binário compatível aqui e instale-o com pip
. Por exemplo, com Python 3.8, Pytorch 1.13.0, CUDA 11.6 execute pip install --no-index --no-cache-dir pytorch3d -f https://anaconda.org/pytorch3d/pytorch3d/0.7.2/download/linux-64/pytorch3d-0.7.2-py38_cu116_pyt1130.tar.bz2
.
Para treinamento/avaliação nas aulas do ShapeNet-SRN (carros, cadeiras), baixe o srn_*.zip (* = carros ou cadeiras) da pasta de dados PixelNeRF. Descompacte o arquivo de dados e altere SHAPENET_DATASET_ROOT
em datasets/srn.py
para a pasta pai da pasta descompactada. Por exemplo, se sua estrutura de pastas for: /home/user/SRN/srn_cars/cars_train
, em datasets/srn.py
defina SHAPENET_DATASET_ROOT="/home/user/SRN"
. Nenhum pré-processamento adicional é necessário.
Para treinamento/avaliação em CO3D baixe as aulas de hidrante e ursinho do release CO3D. Para fazer isso, execute os seguintes comandos:
git clone https://github.com/facebookresearch/co3d.git
cd co3d
mkdir DOWNLOAD_FOLDER
python ./co3d/download_dataset.py --download_folder DOWNLOAD_FOLDER --download_categories hydrant,teddybear
Em seguida, defina CO3D_RAW_ROOT
como seu DOWNLOAD_FOLDER
em data_preprocessing/preoprocess_co3d.py
. Defina CO3D_OUT_ROOT
para onde deseja armazenar os dados pré-processados. Correr
python -m data_preprocessing.preprocess_co3d
e defina CO3D_DATASET_ROOT:=CO3D_OUT_ROOT
.
Para ShapeNet multicategoria, usamos o conjunto de dados ShapeNet 64x64 por NMR hospedado por autores de DVR, que pode ser baixado aqui. Descompacte a pasta e defina NMR_DATASET_ROOT
para o diretório que contém as pastas da subcategoria após a descompactação. Em outras palavras, o diretório NMR_DATASET_ROOT
deve conter as pastas 02691156
, 02828884
, 02933112
etc.
Para treinamento no Objaverse usamos renderizações de Zero-1 a 3 que podem ser baixadas com o seguinte comando:
wget https://tri-ml-public.s3.amazonaws.com/datasets/views_release.tar.gz
Isenção de responsabilidade: observe que as renderizações são geradas com Objaverse. As renderizações como um todo são lançadas sob a licença ODC-By 1.0. As licenças para renderizações de objetos individuais são liberadas sob a mesma licença Creative Commons que estão no Objaverse.
Além disso, baixe lvis-annotations-filtered.json
do repositório do modelo. Este json que contém a lista de IDs de objetos do subconjunto LVIS. Esses ativos são de qualidade superior.
Defina OBJAVERSE_ROOT
em datasets/objaverse.py
para o diretório da pasta descompactada com renderizações e defina OBJAVERSE_LVIS_ANNOTATION_PATH
no mesmo arquivo para o diretório do arquivo .json
baixado.
Observe que o conjunto de dados Objaverse destina-se apenas para treinamento e validação. Não possui um subconjunto de teste.
Para avaliar o modelo treinado no Objaverse, usamos o conjunto de dados Google Scanned Objects para garantir que não haja sobreposição com o conjunto de treinamento. Baixe renderizações fornecidas pelo Free3D. Descompacte a pasta baixada e defina GSO_ROOT
em datasets/gso.py
para o diretório da pasta descompactada.
Observe que o conjunto de dados Google Scanned Objects não se destina ao treinamento. É usado para testar o modelo treinado no Objaverse.
Modelos pré-treinados para todos os conjuntos de dados agora estão disponíveis por meio de Huggingface Models. Se você deseja apenas executar uma avaliação qualitativa/quantitativa, não precisa baixá-los manualmente, eles serão usados automaticamente se você executar o script de avaliação (veja abaixo).
Você também pode baixá-los manualmente se desejar, clicando manualmente no botão de download na página de arquivos do modelo Huggingface. Baixe o arquivo de configuração com ele e veja eval.py
para saber como o modelo é carregado.
Depois de baixar o conjunto de dados relevante, a avaliação pode ser executada com
python eval.py $dataset_name
$dataset_name
é o nome do conjunto de dados. Apoiamos:
gso
(objetos digitalizados do Google),objaverse
(Objaverso-LVIS),nmr
(ShapeNet multicategoria),hydrants
(hidrantes CO3D),teddybears
(ursinhos de pelúcia CO3D),cars
(carros ShapeNet),chairs
(cadeiras ShapeNet). O código baixará automaticamente o modelo relevante para o conjunto de dados solicitado.Você também pode treinar seus próprios modelos e avaliá-los com
python eval.py $dataset_name --experiment_path $experiment_path
$experiment_path
deve conter um arquivo model_latest.pth
e uma pasta .hydra
com config.yaml
dentro dele.
Para avaliar a divisão de validação, chame com a opção --split val
.
Para salvar renderizações dos objetos com a câmera se movendo em loop, chame com a opção --split vis
. Com esta opção, as pontuações quantitativas não são retornadas, pois as imagens reais não estão disponíveis em todos os conjuntos de dados.
Você pode definir quantos objetos salvar renderizações com a opção --save_vis
. Você pode definir onde salvar as renderizações com a opção --out_folder
.
Os modelos de visão única são treinados em dois estágios, primeiro sem LPIPS (a maior parte do treinamento), seguido de ajuste fino com LPIPS.
python train_network.py +dataset=$dataset_name
opt.pretrained_ckpt
(por padrão definido como nulo). python train_network.py +dataset=$dataset_name +experiment=$lpips_experiment_name
$lpips_experiment_name
usar depende do conjunto de dados. Se $dataset_name estiver em [carros, hidrantes, ursinhos de pelúcia], use lpips_100k.yaml. Se $dataset_name for cadeiras, use lpips_200k.yaml. Se $dataset_name for nmr, use lpips_nmr.yaml. Se $dataset_name for objaverse, use lpips_objaverse.yaml. Lembre-se de colocar o diretório do modelo do primeiro estágio no arquivo .yaml apropriado antes de iniciar o segundo estágio.Para treinar uma execução de modelo de duas visualizações:
python train_network.py +dataset=cars cam_embd=pose_pos data.input_images=2 opt.imgs_per_obj=5
O loop de treinamento é implementado em train_network.py
e o código de avaliação está em eval.py
. Os conjuntos de dados são implementados em datasets/srn.py
e datasets/co3d.py
. O modelo é implementado em scene/gaussian_predictor.py
. A chamada para o renderizador pode ser encontrada em gaussian_renderer/__init__.py
.
O rasterizador gaussiano assume a ordem linha principal das matrizes de transformação de corpo rígido, ou seja, que os vetores de posição são vetores linha. Também requer câmeras na convenção COLMAP/OpenCV, ou seja, que x aponte para a direita, y para baixo e z para longe da câmera (para frente).
@inproceedings{szymanowicz24splatter,
title={Splatter Image: Ultra-Fast Single-View 3D Reconstruction},
author={Stanislaw Szymanowicz and Christian Rupprecht and Andrea Vedaldi},
year={2024},
booktitle={The IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
}
S. Szymanowicz é apoiado por uma bolsa EPSRC Doctoral Training Partnerships (DTP) EP/R513295/1 e pela bolsa Oxford-Ashton. A. Vedaldi é apoiado pelo ERC-CoG UNION 101001212. Agradecemos a Eldar Insafutdinov por sua ajuda com os requisitos de instalação.