Skip to content

gnathoi/PU-Gaussian

 
 

Repository files navigation

PU-Gaussian: Point Cloud Upsampling using 3D Gaussian Representation

Official implementation of PU-Gaussian: Point Cloud Upsampling using 3D Gaussian Representation, accepted at ICCV 2025 e2e3D Workshop.

Authors

Mahmoud Khater1,2, Mona Strauss1,2, Philipp von Olshausen2, Alexander Reiterer1,2
1 University of Freiburg, Germany
2 Fraunhofer IPM, Freiburg, Germany


Installation

Clone the repo and install dependencies:

git clone https://github.com/mvg-inatech/PU-Gaussian.git
cd PU-Gaussian
pip install -r requirements.txt

Compile submodules:

cd pointops && pip install .
cd utils/chamfer3d && pip install .

Quick Start: Point Cloud Upsampling

If you are only interested in upsampling your point cloud with our pretrained model.

Upsample a point cloud with the pretrained model using a single command:

python infer.py \
  --inference_input_path path_to_your_pc.pcd \
  --inference_output_path path_to_your_upsampled_pc.ply \
  --ckpt pretrained_model/pu_gaussian_pugan_Best.pth \
  --return_color \
  --patch_size 10000

Quick Tips:

The script can handle point clouds of any size, limited only by your system RAM.

  • Adjust --patch_size to fit your GPU memory.

  • Add --return_color to preserve input colors.

  • Add --remove_duplicates to eliminate duplicate points. (not necessary in most cases)

  • upsampling rate: 4×

  • Add --add_original to add original points to upsampled output. (This will change the upsampling rate)

Data Preparation

Option 1: Quick Test Setup

You can directly download the test point clouds and run inference using the models in pretrained_model.

  • Download the PU-GAN dataset

  • Download the PU1K dataset

  • Extract them into data/PU-GAN and data/PU1K respectively.

  • PU-GAN: Requires preprocessing from meshes.

  • PU1K: No preprocessing required; just place files in the correct folder structure.

PU-GAN Test Data Preparation

Generate point clouds from meshes using Poisson disk sampling:

# 4X upsampling
python prepare_pugan.py --mode test --input_pts_num 2048 --gt_pts_num 8192

# 16X upsampling
python prepare_pugan.py --mode test --input_pts_num 2048 --gt_pts_num 32768

Optional: add noise to low-res input:

python prepare_pugan.py --mode test --input_pts_num 2048 --gt_pts_num 8192 --noise_level 0.01

PU1K Test Data

Simply unzip the dataset into data/PU1K with the required folder structure.


Testing

Use pretrained models in pretrained_model/ to reproduce our results.

PU-GAN:

# 4X
python test.py --dataset pugan   --test_input_path ./data/PU-GAN/test_pointcloud/input_2048_4X/input_2048/   --test_gt_path ./data/PU-GAN/test_pointcloud/input_2048_4X/gt_8192/   --ckpt pretrained_model/pu_gaussian_pugan_Best.pth   --save_dir results/PU-GAN/4x --up_rate 4

# 16X
python test.py --dataset pugan   --test_input_path ./data/PU-GAN/test_pointcloud/input_2048_16X/input_2048/   --test_gt_path ./data/PU-GAN/test_pointcloud/input_2048_16X/gt_32768/   --ckpt pretrained_model/pu_gaussian_pugan_Best.pth   --save_dir results/PU-GAN/16x --up_rate 16

PU1K:

python test.py --dataset pu1k   --test_input_path ./data/PU1K/test/input_2048/input_2048   --test_gt_path ./data/PU1K/test/input_2048/gt_8192   --ckpt pretrained_model/pu_gaussian_pu1k_Best.pth   --save_dir results/PU1K/4x --up_rate 4

Option 2: Full Dataset (for training & reproducing results)

PU-GAN

python prepare_pugan.py --mode train --input_pts_num 2048 --gt_pts_num 40960
python generate_dataset.py --dataset pugan --save_dir data/PU-GAN/train

PU1K

The PU1K dataset includes PU-GAN data and ShapeNet meshes. Since PU1K depends on PU-GAN preprocessing, process PU-GAN first.

Download the raw meshes from this link and extract them to data/PU1K_raw_meshes.

python prepare_pu1k.py --mode train --input_pts_num 2048 --gt_pts_num 40960
python generate_dataset.py --dataset pu1k --save_dir data/PU1K/train

Note: This step may take some time.


Expected Data Folder Structure

data  
├── PU-GAN
│   ├── test                 # raw test mesh files
│   ├── test_pointcloud      # generated test point clouds
│   │    ├── input_2048_16X
│   │    ├── input_2048_4X
│   │    ├── input_2048_4X_noise_0.01
│   │    ...
│   ├── train_pointcloud     # processed training point clouds
│   └── train
│        └── PUGAN_x20.h5
├── PU1K
│   ├── test
│   │    ├── input_1024
│   │    ├── input_2048
│   │    ...
│   ├── train_pointcloud     # processed training point clouds
│   └── train
│        └── pu1k_x20.h5
└── PU1K_raw_meshes          # raw meshes for PU1K dataset

Training

To train from scratch, edit config.py with the dataset path and run:

# pugan training
python train.py --dataset pugan

# pu1k training
python train.py --dataset pu1k

Evaluation

For more information on evaluation, please refer to [ Grad-PU ]

Citation

@inproceedings{khater2025pu,
  title={PU-Gaussian: Point Cloud Upsampling using 3D Gaussian Representation},
  author={Khater, Mahmoud and Strauss, Mona and Von Olshausen, Philipp and Reiterer, Alexander},
  booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision},
  pages={2623--2631},
  year={2025}
}

License

This project is released under the MIT License. See LICENSE for details.


Contact

For questions or issues, please open an issue in this repository or contact the authors.


Acknowledgments

This project builds upon PU-GCN, Grad-PU, PU-CRN, and RepKPU. Please cite them if you use this work.

About

PU-Gaussian: Point Cloud Upsampling using 3D Gaussian Representation

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 64.3%
  • Cuda 23.9%
  • C++ 11.8%