Runsen Xu Xiaolong Wang Tai Wang Yilun Chen Jiangmiao Pang* Dahua Lin
Université chinoise de Hong Kong Laboratoire d'IA de Shanghai Université du Zhejiang
PointLLM est en ligne ! Essayez-le sur http://101.230.144.196 ou sur OpenXLab/PointLLM.
Vous pouvez discuter avec PointLLM des modèles du jeu de données Objaverse ou de vos propres nuages de points !
N'hésitez pas à nous faire part de vos retours ! ?
Dialogue 1 | Dialogue 2 | Dialogue 3 | Dialogue 4 |
---|---|---|---|
Veuillez vous référer à notre article pour plus de résultats.
!!!Remarque : Les mesures traditionnelles telles que BLEU-1, ROUGE-L et METEOR ont tendance à favoriser des réponses plus courtes et peuvent ne pas capturer efficacement la précision sémantique. Pour une discussion détaillée à ce sujet, veuillez vous référer à notre article. Nous suggérons à la communauté de ne pas se fier uniquement à ces mesures pour l'évaluation.Veuillez vous référer à notre article pour plus de résultats.
Nous testons nos codes dans l'environnement suivant :
Pour commencer :
git clone [email protected]:OpenRobotLab/PointLLM.git
cd PointLLM
conda create -n pointllm python=3.10 -y
conda activate pointllm
pip install --upgrade pip # enable PEP 660 support
pip install -e .
# * for training
pip install ninja
pip install flash-attn
8192_npy
contenant 660 000 fichiers de nuages de points nommés {Objaverse_ID}_8192.npy
. Chaque fichier est un tableau numpy avec des dimensions (8192, 6), où les trois premières dimensions sont xyz
et les trois dernières dimensions sont rgb
dans la plage [0, 1]. cat Objaverse_660K_8192_npy_split_a * > Objaverse_660K_8192_npy.tar.gz
tar -xvf Objaverse_660K_8192_npy.tar.gz
PointLLM
, créez un dossier data
et créez un lien symbolique vers le fichier non compressé dans le répertoire. cd PointLLM
mkdir data
ln -s /path/to/8192_npy data/objaverse_data
PointLLM/data
, créez un répertoire nommé anno_data
.anno_data
. Le répertoire devrait ressembler à ceci : PointLLM/data/anno_data
├── PointLLM_brief_description_660K_filtered.json
├── PointLLM_brief_description_660K.json
└── PointLLM_complex_instruction_70K.json
PointLLM_brief_description_660K_filtered.json
est filtré de PointLLM_brief_description_660K.json
en supprimant les 3 000 objets que nous avons réservés comme ensemble de validation. Si vous souhaitez reproduire les résultats dans notre article, vous devez utiliser PointLLM_brief_description_660K_filtered.json
pour la formation. Le PointLLM_complex_instruction_70K.json
contient des objets de l'ensemble de formation.pointllm/data/data_generation/system_prompt_gpt4_0613.txt
. PointLLM_brief_description_val_200_GT.json
que nous utilisons pour les benchmarks sur l'ensemble de données Objaverse, et placez-le dans PointLLM/data/anno_data
. Nous fournissons également ici les 3000 identifiants d'objets que nous filtrons lors de la formation et leur GT de référencement correspondant, qui peuvent être utilisés pour évaluer sur l'ensemble des 3000 objets.modelnet40_data
dans PointLLM/data
. Téléchargez la répartition de test des nuages de points ModelNet40 modelnet40_test_8192pts_fps.dat
ici et placez-la dans PointLLM/data/modelnet40_data
.PointLLM
, créez un répertoire nommé checkpoints
.checkpoints
. cd PointLLM
scripts/PointLLM_train_stage1.sh
scripts/PointLLM_train_stage2.sh
Habituellement, vous n'avez pas à vous soucier du contenu suivant. Ils servent uniquement à reproduire les résultats dans notre article v1 (PointLLM-v1.1). Si vous souhaitez comparer avec nos modèles ou utiliser nos modèles pour des tâches en aval, veuillez utiliser PointLLM-v1.2 (voir notre article v2), qui offre de meilleures performances.
PointLLM v1.1 et v1.2 utilisent des encodeurs et projecteurs de points pré-entraînés légèrement différents. Si vous souhaitez reproduire PointLLM v1.1, modifiez le fichier config.json
dans le répertoire des poids initiaux du LLM et des encodeurs de points, par exemple, vim checkpoints/PointLLM_7B_v1.1_init/config.json
.
Modifiez la clé "point_backbone_config_name"
pour spécifier une autre configuration d'encodeur de point :
# change from
" point_backbone_config_name " : " PointTransformer_8192point_2layer " # v1.2
# to
" point_backbone_config_name " : " PointTransformer_base_8192point " , # v1.1
Modifiez le chemin du point de contrôle de l'encodeur de points dans scripts/train_stage1.sh
:
# change from
point_backbone_ckpt= $model_name_or_path /point_bert_v1.2.pt # v1.2
# to
point_backbone_ckpt= $model_name_or_path /point_bert_v1.1.pt # v1.1
torch.float32
pour discuter des modèles 3D d'Objaverse. Les points de contrôle du modèle seront téléchargés automatiquement. Vous pouvez également télécharger manuellement les points de contrôle du modèle et spécifier leurs chemins. Voici un exemple : cd PointLLM
PYTHONPATH= $PWD python pointllm/eval/PointLLM_chat.py --model_name RunsenXu/PointLLM_7B_v1.2 --data_name data/objaverse_data --torch_dtype float32
Vous pouvez également modifier facilement les codes d'utilisation de nuages de points autres que ceux d'Objaverse, à condition que les nuages de points entrés dans le modèle aient des dimensions (N, 6), où les trois premières dimensions sont xyz
et les trois dernières dimensions sont rgb
( dans la plage [0, 1]). Vous pouvez échantillonner les nuages de points pour obtenir 8 192 points, car notre modèle est formé sur de tels nuages de points.
Le tableau suivant présente les exigences GPU pour différents modèles et types de données. Nous vous recommandons d'utiliser torch.bfloat16
le cas échéant, qui est utilisé dans les expériences de notre article.
Modèle | Type de données | Mémoire GPU |
---|---|---|
PointLLM-7B | torche.float16 | 14 Go |
PointLLM-7B | torche.float32 | 28 Go |
PointLLM-13B | torche.float16 | 26 Go |
PointLLM-13B | torche.float32 | 52 Go |
cd PointLLM
PYTHONPATH= $PWD python pointllm/eval/chat_gradio.py --model_name RunsenXu/PointLLM_7B_v1.2 --data_name data/objaverse_data
cd PointLLM
export PYTHONPATH= $PWD
# Open Vocabulary Classification on Objaverse
python pointllm/eval/eval_objaverse.py --model_name RunsenXu/PointLLM_7B_v1.2 --task_type classification --prompt_index 0 # or --prompt_index 1
# Object captioning on Objaverse
python pointllm/eval/eval_objaverse.py --model_name RunsenXu/PointLLM_7B_v1.2 --task_type captioning --prompt_index 2
# Close-set Zero-shot Classification on ModelNet40
python pointllm/eval/eval_modelnet_cls.py --model_name RunsenXu/PointLLM_7B_v1.2 --prompt_index 0 # or --prompt_index 1
{model_name}/evaluation
sous forme de dict au format suivant : {
" prompt " : " " ,
" results " : [
{
" object_id " : " " ,
" ground_truth " : " " ,
" model_output " : " " ,
" label_name " : " " # only for classification on modelnet40
}
]
}
cd PointLLM
export PYTHONPATH= $PWD
export OPENAI_API_KEY=sk- ****
# Open Vocabulary Classification on Objaverse
python pointllm/eval/evaluator.py --results_path /path/to/model_output --model_type gpt-4-0613 --eval_type open-free-form-classification --parallel --num_workers 15
# Object captioning on Objaverse
python pointllm/eval/evaluator.py --results_path /path/to/model_output --model_type gpt-4-0613 --eval_type object-captioning --parallel --num_workers 15
# Close-set Zero-shot Classification on ModelNet40
python pointllm/eval/evaluator.py --results_path /path/to/model_output --model_type gpt-3.5-turbo-0613 --eval_type modelnet-close-set-classification --parallel --num_workers 15
Ctrl+C
. Cela enregistrera les résultats temporaires. Si une erreur se produit lors de l'évaluation, le script enregistrera également l'état actuel. Vous pouvez reprendre l'évaluation là où elle s'est arrêtée en exécutant à nouveau la même commande.{model_name}/evaluation
sous un autre dict. Certaines des mesures sont expliquées comme suit : " average_score " : The GPT-evaluated captioning score we report in our paper.
" accuracy " : The classification accuracy we report in our paper, including random choices made by ChatGPT when model outputs are vague or ambiguous and ChatGPT outputs " INVALID " .
" clean_accuracy " : The classification accuracy after removing those " INVALID " outputs.
" total_predictions " : The number of predictions.
" correct_predictions " : The number of correct predictions.
" invalid_responses " : The number of " INVALID " outputs by ChatGPT.
# Some other statistics for calling OpenAI API
" prompt_tokens " : The total number of tokens of the prompts for ChatGPT/GPT-4.
" completion_tokens " : The total number of tokens of the completion results from ChatGPT/GPT-4.
" GPT_cost " : The API cost of the whole evaluation process, in US Dollars ?.
--start_eval
et en spécifiant le --gpt_type
. Par exemple: python pointllm/eval/eval_objaverse.py --model_name RunsenXu/PointLLM_7B_v1.2 --task_type classification --prompt_index 0 --start_eval --gpt_type gpt-4-0613
python pointllm/eval/traditional_evaluator.py --results_path /path/to/model_captioning_output
Les contributions de la communauté sont les bienvenues !? Si vous avez besoin d'aide, n'hésitez pas à ouvrir un problème ou à nous contacter.
Si vous trouvez notre travail et cette base de code utiles, pensez à mettre en vedette ce dépôt ? et citer :
@inproceedings { xu2024pointllm ,
title = { PointLLM: Empowering Large Language Models to Understand Point Clouds } ,
author = { Xu, Runsen and Wang, Xiaolong and Wang, Tai and Chen, Yilun and Pang, Jiangmiao and Lin, Dahua } ,
booktitle = { ECCV } ,
year = { 2024 }
}
Ce travail est sous la licence internationale Creative Commons Attribution-Pas d’Utilisation Commerciale-Partage dans les mêmes conditions 4.0.
Ensemble, rendons le LLM pour la 3D génial !