Official implementation of PU-Gaussian: Point Cloud Upsampling using 3D Gaussian Representation, accepted at ICCV 2025 e2e3D Workshop.
Mahmoud Khater1,2, Mona Strauss1,2, Philipp von Olshausen2, Alexander Reiterer1,2
1 University of Freiburg, Germany
2 Fraunhofer IPM, Freiburg, Germany
Clone the repo and install dependencies:
git clone https://github.com/mvg-inatech/PU-Gaussian.git
cd PU-Gaussian
pip install -r requirements.txtCompile submodules:
cd pointops && pip install .
cd utils/chamfer3d && pip install .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 10000Quick 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)
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-GANanddata/PU1Krespectively. -
PU-GAN: Requires preprocessing from meshes.
-
PU1K: No preprocessing required; just place files in the correct folder structure.
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 32768Optional: add noise to low-res input:
python prepare_pugan.py --mode test --input_pts_num 2048 --gt_pts_num 8192 --noise_level 0.01Simply unzip the dataset into data/PU1K with the required folder structure.
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 16PU1K:
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 4python prepare_pugan.py --mode train --input_pts_num 2048 --gt_pts_num 40960
python generate_dataset.py --dataset pugan --save_dir data/PU-GAN/trainThe 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/trainNote: This step may take some time.
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
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 pu1kFor more information on evaluation, please refer to [ Grad-PU ]
@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}
}
This project is released under the MIT License. See LICENSE for details.
For questions or issues, please open an issue in this repository or contact the authors.
This project builds upon PU-GCN, Grad-PU, PU-CRN, and RepKPU. Please cite them if you use this work.