Esta é a implementação oficial do artigo NeurIPS 2023: Síntese de cenas orientada por linguagem usando modelo de difusão multicondicional.
É altamente recomendável que você crie um ambiente Conda para gerenciar melhor todos os pacotes Python necessários.
conda create -n lsdm python=3.8
conda activate lsdm
Depois de criar o ambiente, instale o pytorch com CUDA. Você pode fazer isso executando
conda install pytorch pytorch-cuda=11.6 -c pytorch -c nvidia
As outras dependências necessárias para este trabalho estão listadas em requisitos.txt. Recomendamos os seguintes comandos para instalar dependências:
pip install git+https://github.com/openai/CLIP.git
pip install transformers
conda install -c pytorch3d -c conda-forge pytorch3d=0.7.3
pip install -r requirements.txt
PRO-teXt é uma extensão do PROXD. Visite o site deles para obter primeiro o conjunto de dados PROXD. Disponibilizamos a extensão do PRO-teXt conforme link. Você também precisa obter o HUMANISE através da página do projeto. A hierarquia do conjunto de dados deve seguir este modelo:
|- data/
|- protext
|- mesh_ds
|- objs
|- proxd_test
|- proxd_test_edit
|- proxd_train
|- proxd_valid
|- scenes
|- supp
|- proxd_train
|- proxd_valid
Todos os pontos de verificação do modelo usados para benchmark no artigo estão disponíveis neste link.
Para peças de visualização, utilizamos um subconjunto do conjunto de dados 3D-Future. O subconjunto pode ser baixado no link, creditado aos autores.
Para treinar uma linha de base, use o seguinte comando:
python -m run.train_ < baseline >
--train_data_dir data/protext/proxd_train
--valid_data_dir data/protext/proxd_valid
--fix_ori
--epochs 1000
--out_dir training
--experiment < baseline >
Por exemplo, se quiser treinar LSDM, use o seguinte comando:
python -m run.train_sdm
--train_data_dir data/protext/proxd_train
--valid_data_dir data/protext/proxd_valid
--fix_ori
--epochs 1000
--out_dir training
--experiment sdm
Para testar uma linha de base, use o seguinte comando:
python -m run.test_ < baseline > data/protext/proxd_test/
--load_model training/ < baseline > /model_ckpt/best_model_cfd.pt
--model_name < baseline >
--fix_ori --test_on_valid_set
--output_dir training/ < baseline > /output
Por exemplo, você pode usar:
python -m run.test_sdm data/protext/proxd_test/
--load_model training/sdm/model_ckpt/best_model_cfd.pt
--model_name sdm
--fix_ori
--test_on_valid_set
--output_dir training/sdm/output
para testar um ponto de verificação LSDM. Observe que você também pode treinar no conjunto de dados HUMANISE. Basta substituir o caminho de data/protext/proxd_train
por data/humanise/train
.
Para gerar uma sequência de vídeo como em nosso artigo, você pode prosseguir seguindo as seguintes etapas:
python fit_custom_obj.py
--sequence_name < sequence_name >
--vertices_path data/supp/proxd_valid/vertices/ < sequence_name > _verts.npy
--contact_labels_path data/supp/proxd_valid/semantics/ < sequence_name > _cfs.npy
--output_dir fitting_results/ < baseline >
--label < num_label >
--file_name training/sdm/output/predictions/ < interaction_name > .npy
onde sequence_name
é o nome do movimento humano e interaction_name
é o nome da pose_humana . Observe que nomeamos a pose humana de forma muito próxima ao seu movimento humano correspondente. Além disso, num_label
pode ser encontrado no arquivo mpcat40.tsv
. Por exemplo, você pode usar o seguinte comando:
python vis_fitting_results.py
--fitting_results_path fitting_results/ < baseline > / < sequence_name > /
--vertices_path data/supp/proxd_valid/vertices/ < sequence_name > _verts.npy
Por exemplo,
python vis_fitting_results.py
--fitting_results_path fitting_results/sdm/N0Sofa_00034_02/
--vertices_path data/supp/proxd_valid/vertices/N0Sofa_00034_02_verts.npy
O script executado acima salvará os quadros renderizados em fitting_results/N0Sofa_00034_02/rendering
. Observe que você precisa de uma tela para executar este comando. Caso você esteja testando o projeto em um servidor que não possui serviço de exibição, você ainda pode carregar os objetos salvos e malhas humanas e utilizar outras abordagens para visualizá-los. Para obter as malhas humanas, você ainda pode executar o comando acima e esperar até que o programa saia automaticamente. O script salvará as malhas humanas de sua sequência de movimento especificada em fitting_results/<sequence name>/human/mesh
.
Os objetos de melhor ajuste são armazenados em fitting_results/<sequence name>/fit_best_obj/<object category>/<object index>/<best_obj_id>/opt_best.obj
. Como mencionado antes, você pode obter <best_obj_id>
em fitting_results/<sequence name>/fit_best_obj/<object category>/<object index>/best_obj_id.json
.
Parte de nossa base de código é baseada em Ye et al.. Se você achar este trabalho útil, considere citar:
@article{vuong2023language,
title={Language-driven Scene Synthesis using Multi-conditional Diffusion Model},
author={Vuong, An Dinh and Vu, Minh Nhat and Nguyen, Toan and Huang, Baoru and Nguyen, Dzung and Vo, Thieu and Nguyen, Anh},
journal={arXiv preprint arXiv:2310.15948},
year={2023}
}