IGLICT / GaussianMesh

Code for 'Real-time Large-scale Deformation of Gaussian Splatting'
MIT License
47 stars 3 forks source link

Real-time Large-scale Deformation of Gaussian Splatting

This repository contains the implementation with jittor for paper "Real-time Large-scale Deformation of Gaussian Splatting".

teaser-24-7

Video Demo Demo

Set-up

Basic Requirements

CUDA>=11
g++

Conda

conda create -n jittor-gaussian python=3.9
conda activate jittor-gaussian
python3.9 -m pip install jittor
python -m pip install libigl
pip install cmake plyfile tqdm icecream

Compile the submodules

The simple-knn and diff_gaussian_rasterizater modules should be compiled with cmake and make:

cd gaussian-renderer/diff_gaussian_rasterizater
cmake .
make -j
cd ../../scene/simple-knn
cmake .
make -j

You will get simpleknn.so and CudaRasterizer.so in simple-knn and diff_gaussian_rasterizater folders.

The ACAP modules should be compiled:

cd ACAP
unzip pyACAPv1.zip
chmod +x install_OpenMesh.sh
install_OpenMesh.sh
python setup.py install

Download

LPIPS

The repository uses Jittor_Perceptual-Similarity-Metric for evaluation. Please download the pretrained model following the origin repository and put the weight file in lpips_jittor folder.

Get Starting

0.Example

There is an example of final directory:

<gaussian-mesh-splatting>
|---data
|   |---<garden>
|   |   |---sparse
|   |   |---images
|   |   |---masks(no need if without background)
|   |   |---mesh_sequnce
|   |   |   |---1.obj (origin mesh)
|   |   |   |---2.obj (deformed mesh)
|   |   |   |---3.obj (deformed mesh)
|   |   |   |---...
|---output
|   |---<graden>
|   |   |---deform (final results directory)
|   |   |---point_cloud/iteration_30000
|     |   |   |---point_cloud.ply
|   |   |     |---bg_point_cloud.ply
|   |   |---cameras.json
|   |   |---...
|---mesh_preprocess
|   |---<your mesh reconstruction method>
|   |---MeshFix
|---train.py
|---render.py
|---edit.py
|---...

Given the example command:

# with background
python train_mesh_gaussian.py -r 1 -s data/excavator -m output/excavator  --is_exist_bg --input_mesh data/mesh_sequnce/1.obj

python train_bg_gaussian.py -r 1 -s data/excavator -m output/excavator \
--mesh_gaussian_path output/excavator/point_cloud/iteration_30000/point_cloud.ply  --is_exist_bg

python render.py -s data/excavator -m output/excavator --eval

python edit.py --camera_path output/excavator --object_name excavator \
--object_gaussian output/excavator/point_cloud/iteration_30000/point_cloud.ply \
--object_origin_mesh data/mesh_sequnce/1.obj \
--object_deform_mesh data/mesh_sequnce/4.obj \
--render_path output/excavator/deform \
--is_exist_bg --background_gaussian output/excavator/point_cloud/iteration_30000/bg_point_cloud.ply

# without background
python train_mesh_gaussian.py -s data/excavator -m output/excavator --input_mesh data/mesh_sequnce/1.obj

python render.py -s data/excavator -m output/excavator --eval

python edit.py --camera_path output/excavator --object_name excavator \
--object_gaussian output/excavator/point_cloud/iteration_30000/point_cloud.ply \
--object_origin_mesh data/mesh_sequnce/1.obj \
--object_deform_mesh data/mesh_sequnce/4.obj \
--render_path output/excavator/deform

1.Preparation

2.Training

Deform an object without background

python train_mesh_gaussian.py -r 1 -s <path to COLMAP or NeRF Synthetic dataset> -m <output_path>\
--input_mesh <mesh_path> 

Deform an object with background

python train_mesh_gaussian.py -r 1 -s <path to COLMAP dataset> -m <output_path>  --input_mesh <mesh_path>\
--is_exist_bg
python train_bg_gaussian.py -r 1 -s <path to COLMAP dataset> -m <output_path> --mesh_gaussian_path <output_path>/point_cloud/iteration_30000/point_cloud.ply  --is_exist_bg

3.Rendering & Evaluation

python render_origin.py -m <output_path> -s <dataset_path>
python metrics.py -m <output_path> 

4.Editing Gaussian

Use edit.py to deform gaussians:

Available parameters #### camera_path the same with output path!!! #### object_name any name you want.It is mainly uesd in multi objects deformation in the same scene. #### object_gaussian mesh_based_gaussian_model(ply format) #### object_origin_mesh mesh before deformation,the same as the input mesh in training(obj format) #### object_deform_mesh deformed mesh(obj format) #### render_path saved path(custom format) #### is_exist_bg(Used in scene deformation) If you want to deform objects with the scene, use it. #### background_gaussian(Used in scene deformation) the background gaussian_model(ply format)


This is a script of rendering one deformation with training/testing json(or generating circle poses):

Deform an object without background

python edit.py --camera_path <output_path> --object_name <any name> --object_gaussian <output_path>/iteration_30000/point_cloud.ply \
--object_origin_mesh <output_path>/proxy_mesh.obj \
--object_deform_mesh <output_path>/deform_mesh.obj \
--render_path <output_path>/deform

Deform objects with background

python edit.py --camera_path <output_path> --object_name <any name> --object_gaussian <output_path>/iteration_30000/point_cloud.ply \
--object_origin_mesh <output_path>/proxy_mesh.obj \
--object_deform_mesh <output_path>/deform_mesh.obj \
--render_path <output_path>/deform \
--is_exist_bg --background_gaussian /<output_path>/iteration_30000/bg_point_cloud.ply

You can also make an animation (like flying butterfly) Reference comment code in "edit.py".

Results

Acknowledgements

The original implementation comes from the following cool project: