PMA: Towards Parameter-Efficient Point Cloud Understanding via Point Mamba Adapter

December 13, 2025 ยท View on GitHub

This repository provides the official implementation of PMA: Towards Parameter-Efficient Point Cloud Understanding via Point Mamba Adapter at CVPR 2025.

1. Introduction

Applying pre-trained models to assist point cloud understanding has recently become a mainstream paradigm in 3D perception. However, existing application strategies are straightforward, utilizing only the final output of the pre-trained model for various task heads. It neglects the rich complementary information in the intermediate layer, thereby failing to fully unlock the potential of pre-trained models. To overcome this limitation, we propose an orthogonal solution: Point Mamba Adapter (PMA), which constructs an ordered feature sequence from all layers of the pre-trained model and leverages Mamba to fuse all complementary semantics, thereby promoting comprehensive point cloud understanding. Constructing this ordered sequence is non-trivial due to the inherent isotropy of 3D space. Therefore, we further propose a geometryconstrained gate prompt generator (G2PG) shared across different layers, which applies shared geometric constraints to the output gates of the Mamba and dynamically optimizes the spatial order, thus enabling more effective integration of multi-layer information. Extensive experiments conducted on challenging point cloud datasets across various tasks demonstrate that our PMA elevates the capability for point cloud understanding to a new level by fusing diverse complementary intermediate features

img.png

In the following, we will guide you how to use this repository step by step. ๐Ÿค—

2. Preparation

git clone https://github.com/zyh16143998882/PMA.git
cd PMA/

2.1 Requirements

conda create -y -n pma python=3.9
conda activate pma
ppip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
pip install -r requirements.txt

# PointNet++
pip install "git+https://github.com/erikwijmans/Pointnet2_PyTorch.git#egg=pointnet2_ops&subdirectory=pointnet2_ops_lib"

# GPU kNN
pip install --upgrade https://github.com/unlimblue/KNN_CUDA/releases/download/0.2/KNN_CUDA-0.2-py3-none-any.whl

pip install causal-conv1d==1.1.1
pip install mamba-ssm==1.1.1

2.2 Download the point cloud datasets and organize them properly

Before running the code, we need to make sure that everything needed is ready. First, the working directory is expected to be organized as below:

click to expand ๐Ÿ‘ˆ
PMA/
โ”œโ”€โ”€ cfgs/
โ”œโ”€โ”€ data/
โ”‚   โ”œโ”€โ”€ ModelNet/ # ModelNet40
โ”‚   โ”‚   โ””โ”€โ”€ modelnet40_normal_resampled/
โ”‚   โ”‚       โ”œโ”€โ”€ modelnet40_shape_names.txt
โ”‚   โ”‚       โ”œโ”€โ”€ modelnet40_train.txt
โ”‚   โ”‚       โ”œโ”€โ”€ modelnet40_test.txt
โ”‚   โ”‚       โ”œโ”€โ”€ modelnet40_train_8192pts_fps.dat
โ”‚   โ”‚       โ””โ”€โ”€ modelnet40_test_8192pts_fps.dat
โ”‚   โ”œโ”€โ”€ ModelNetFewshot/ # ModelNet Few-shot
โ”‚   โ”‚   โ”œโ”€โ”€ 5way10shot/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ 0.pkl
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ...
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ 9.pkl
โ”‚   โ”‚   โ”œโ”€โ”€ 5way20shot/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ...
โ”‚   โ”‚   โ”‚   ...
โ”‚   โ”‚   โ”œโ”€โ”€ 10way10shot/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ...
โ”‚   โ”‚   โ”‚   ...
โ”‚   โ”‚   โ””โ”€โ”€ 10way20shot/
โ”‚   โ”‚       โ”œโ”€โ”€ ...
โ”‚   โ”‚       ...
โ”‚   โ”œโ”€โ”€ ScanObjectNN/ # ScanObjectNN
โ”‚   โ”‚   โ”œโ”€โ”€ main_split/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ training_objectdataset_augmentedrot_scale75.h5
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ test_objectdataset_augmentedrot_scale75.h5
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ training_objectdataset.h5
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ test_objectdataset.h5
โ”‚   โ”‚   โ””โ”€โ”€ main_split_nobg/
โ”‚   โ”‚       โ”œโ”€โ”€ training_objectdataset.h5
โ”‚   โ”‚       โ””โ”€โ”€ test_objectdataset.h5
โ”‚   โ”œโ”€โ”€ ShapeNet55-34/ # ShapeNet55/34
โ”‚   โ”‚   โ”œโ”€โ”€ shapenet_pc/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ 02691156-1a04e3eab45ca15dd86060f189eb133.npy
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ 02691156-1a6ad7a24bb89733f412783097373bdc.npy
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ...
โ”‚   โ”‚   โ”‚   ...
โ”‚   โ”‚   โ””โ”€โ”€ ShapeNet-55/
โ”‚   โ”‚       โ”œโ”€โ”€ train.txt
โ”‚   โ”‚       โ””โ”€โ”€ test.txt
โ”‚   โ””โ”€โ”€ shapenetcore_partanno_segmentation_benchmark_v0_normal/ # ShapeNetPart
โ”‚       โ”œโ”€โ”€ 02691156/
โ”‚       โ”‚   โ”œโ”€โ”€ 1a04e3eab45ca15dd86060f189eb133.txt
โ”‚       โ”‚   โ”œโ”€โ”€ ...
โ”‚       โ”‚   ...
โ”‚       โ”‚โ”€โ”€ ...
โ”‚       โ”‚โ”€โ”€ train_test_split/
โ”‚       โ””โ”€โ”€ synsetoffset2category.txt
โ”œโ”€โ”€ datasets/
โ”œโ”€โ”€ ...
...

Here we have also collected the download links of required datasets for you:

  • ShapeNet55/34 (for pre-training): [link].
  • ScanObjectNN: [link].
  • ModelNet40: [link 1] (pre-processed) or [link 2] (raw).
  • ModelNet Few-shot: [link].
  • ShapeNetPart: [link].

3. Download the pre-train point cloud models

Download the weights of each pre-trained point cloud model from their official repositories and place them in the "ckpts" directory.

Point-BERT, Point-MAE, Point-GPT

The ckpts directory is expected to be organized as below:

PMA/
โ”œโ”€โ”€ cfgs/
โ”œโ”€โ”€ ckpts/
โ”‚   โ”œโ”€โ”€ bert.pth
โ”‚   โ”œโ”€โ”€ mae.pth
โ”‚   โ”œโ”€โ”€ gptl.pth
...

4. Tune pre-trained point cloud models on downstream tasks

4.1 Object Classification

ModelNet40 (click to expand ๐Ÿ‘ˆ)
cd sh
bash model_bert_pma.sh  # Point-BERT
bash model_pma.sh       # Point-MAE
bash model_gpt_pma.sh       # Point-GPTL
ScanObjectNN (OBJ-BG) (click to expand ๐Ÿ‘ˆ)
cd sh
bash bg_bert_pma.sh  # Point-BERT
bash bg_pma.sh       # Point-MAE
bash bg_gpt_pma.sh       # Point-GPTL
ScanObjectNN (OBJ-ONLY) (click to expand ๐Ÿ‘ˆ)
bash only_bert_pma.sh  # Point-BERT
bash only_pma.sh       # Point-MAE
bash only_gpt_pma.sh       # Point-GPTL
ScanObjectNN (PB-T50-RS) (click to expand ๐Ÿ‘ˆ)
bash hard_bert_pma.sh  # Point-BERT
bash hard_pma.sh       # Point-MAE
bash hard_gpt_pma.sh       # Point-GPTL

4.2 Part Segmentation on ShapeNet-Part

Part Segmentation (click to expand ๐Ÿ‘ˆ)
cd segmentation

CUDA_VISIBLE_DEVICES=0 python main.py --log_dir mae_ma_log --ckpts ../ckpts/mae.pth --seed 0 --model mae_ma --epoch 300
CUDA_VISIBLE_DEVICES=0 python main.py --log_dir bert_ma_log --ckpts ../ckpts/mae.pth --seed 0 --model bert_ma --epoch 300
CUDA_VISIBLE_DEVICES=0 python main.py --log_dir gpt_ma_log --ckpts ../ckpts/mae.pth --seed 0 --model gpt_ma --epoch 300

5. Validate with checkpoints

For reproducibility, logs and checkpoints of fine-tuned models of Point-GPT and Point-MAE can be found in the table below.

Notes: As the server hosting the original artifacts was wiped, the code and checkpoints herein represent a reproduction. Most experimental results match or outperform the original paper, with a few metrics showing a slight degradation..

ModelDatasetTuned ParametersAcc.Checkpoints Download
Point-MAEScanObjectNN1.1M90.71%OBJ-BG
Point-MAEScanObjectNN1.1M90.88%OBJ-ONLY
Point-MAEScanObjectNN1.1M86.44%PB-T50-RS
Point-MAEScanObjectNN1.1M94.04%ModelNet
Point-GPTScanObjectNN4.9M98.97%OBJ-BG
Point-GPTScanObjectNN4.9M96.90%OBJ-ONLY
Point-GPTScanObjectNN4.9M95.52%PB-T50-RS
Point-GPTScanObjectNN4.9M94.85%ModelNet

The evaluation commands with checkpoints should be in the following format:

CUDA_VISIBLE_DEVICES=<GPU> python main.py --test --config <yaml_file_name> --exp_name <output_file_name> --ckpts <path/to/ckpt>
For Point-MAE model, click to expand ๐Ÿ‘ˆ
# object classification on ScanObjectNN (PB-T50-RS)
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_scan_hardest_ma.yaml --ckpts ./checkpoint/mae/hard/ckpt-best.pth --test --exp_name hard_mae_test

# object classification on ScanObjectNN (OBJ-BG)
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_scan_objbg_ma.yaml --ckpts ./checkpoint/mae/bg/ckpt-best.pth --test --exp_name bg_mae_test

# object classification on ScanObjectNN (OBJ-ONLY)
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_scan_objonly_ma.yaml --ckpts ./checkpoint/mae/only/ckpt-best.pth --test --exp_name only_mae_test

# object classification on ModelNet40
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_modelnet_ma.yaml --ckpts ./checkpoint/mae/model/ckpt-best.pth --test --exp_name model_mae_test
For PointGPT model, click to expand ๐Ÿ‘ˆ
# object classification on ScanObjectNN (PB-T50-RS)
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_scan_hardest_gpt_ma.yaml --ckpts ./checkpoint/gpt/hard/ckpt-best.pth --test --exp_name hard_gpt_test

# object classification on ScanObjectNN (OBJ-BG)
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_scan_objbg_gpt_ma.yaml --ckpts ./checkpoint/gpt/bg/ckpt-best.pth --test --exp_name bg_gpt_test

# object classification on ScanObjectNN (OBJ-ONLY)
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_scan_objonly_gpt_ma.yaml --ckpts ./checkpoint/gpt/only/ckpt-best.pth --test --exp_name only_gpt_test

# object classification on ModelNet40
CUDA_VISIBLE_DEVICES=0 python main.py --config cfgs/finetune_modelnet_gpt_ma.yaml --ckpts ./checkpoint/gpt/model/ckpt-best.pth --test --exp_name model_gpt_test

6. Bibliography

If you find this code useful or use the toolkit in your work, please consider citing:

@inproceedings{zha2025pma,
  title={PMA: Towards Parameter-Efficient Point Cloud Understanding via Point Mamba Adapter},
  author={Zha, Yaohua and Wang, Yanzi and Guo, Hang and Wang, Jinpeng and Dai, Tao and Chen, Bin and Ouyang, Zhihao and Yuerong, Xue and Chen, Ke and Xia, Shu-Tao},
  booktitle={Proceedings of the Computer Vision and Pattern Recognition Conference},
  pages={16976--16986},
  year={2025}
}

7. Acknowledgements

Our codes are built upon Point-BERT, Point-MAE, Point-GPT, Mamba). Thanks for their efforts.

8. Contact

If you have any question, you can raise an issue or email Yaohua Zha (zyh1614399882@gmail.com).