{"id":13816227,"url":"https://github.com/yzslab/gaussian-splatting-lightning","last_synced_at":"2026-01-20T18:51:01.761Z","repository":{"id":198706600,"uuid":"701366603","full_name":"yzslab/gaussian-splatting-lightning","owner":"yzslab","description":"A 3D Gaussian Splatting framework with various derived algorithms and an interactive web viewer","archived":false,"fork":false,"pushed_at":"2026-01-15T13:06:34.000Z","size":31382,"stargazers_count":1026,"open_issues_count":29,"forks_count":84,"subscribers_count":22,"default_branch":"main","last_synced_at":"2026-01-15T17:20:25.464Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yzslab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-10-06T13:44:06.000Z","updated_at":"2026-01-15T13:06:38.000Z","dependencies_parsed_at":"2024-08-26T14:54:42.353Z","dependency_job_id":"dc4c2a20-bdaa-4664-8c46-7f53aeace8ab","html_url":"https://github.com/yzslab/gaussian-splatting-lightning","commit_stats":null,"previous_names":["yzslab/gaussian-splatting-lightning"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/yzslab/gaussian-splatting-lightning","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yzslab%2Fgaussian-splatting-lightning","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yzslab%2Fgaussian-splatting-lightning/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yzslab%2Fgaussian-splatting-lightning/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yzslab%2Fgaussian-splatting-lightning/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yzslab","download_url":"https://codeload.github.com/yzslab/gaussian-splatting-lightning/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yzslab%2Fgaussian-splatting-lightning/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28609225,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T16:10:39.856Z","status":"ssl_error","status_checked_at":"2026-01-20T16:10:39.493Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T05:00:37.604Z","updated_at":"2026-01-20T18:51:01.742Z","avatar_url":"https://github.com/yzslab.png","language":"Jupyter Notebook","funding_links":[],"categories":["Open Source Implementations","3D视觉生成重建","Tools, Pipeline \u0026 Utilities"],"sub_categories":["Framework","资源传输下载","Photogrammetry \u0026 3D Scanning"],"readme":"# Gaussian Splatting PyTorch Lightning Implementation\n* \u003ca href=\"#1-installation\"\u003eInstallation\u003c/a\u003e\n* \u003ca href=\"#2-training\"\u003eTraining\u003c/a\u003e\n* \u003ca href=\"#4-web-viewer\"\u003eWeb Viewer\u003c/a\u003e\n* \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/releases\"\u003eChangelog\u003c/a\u003e\n## News\n* [2025-06-29] Our paper \"\u003ca href=\"https://yzslab.github.io/REUrbanGS/\"\u003eRobust and Efficient 3D Gaussian Splatting for Urban Scene Reconstruction\u003c/a\u003e\" has been accepted to ICCV 2025, and we will release the code here soon. Stay tuned!\n\n## Known issues\n* ~~Multi-GPU training can only be enabled after densification~~ (Try \u003ca href=\"#216-new-multiple-gpu-training-strategy\"\u003e2.16. New Multiple GPU training strategy\u003c/a\u003e)\n## Features\n* Multi-GPU/Node training\n* Switch between diff-gaussian-rasterization and \u003ca href=\"https://github.com/nerfstudio-project/gsplat\"\u003enerfstudio-project/gsplat\u003c/a\u003e\n* Multiple dataset types support\n  * \u003ca href=\"https://drive.google.com/drive/folders/1JDdLGDruGNXWnM1eqY1FNL9PlStjaKWi\"\u003eBlender (nerf_synthetic)\u003c/a\u003e\n  * Colmap\n  * PolyCam (\u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/tree/main/utils/PolyCam.md\"\u003eSee the instruction here\u003c/a\u003e)\n  * \u003ca href=\"https://github.com/google/nerfies?tab=readme-ov-file#datasets\"\u003eNerfies\u003c/a\u003e\n  * \u003ca href=\"https://github.com/facebookresearch/NSVF?tab=readme-ov-file#dataset\"\u003eNSVF (Synthetic only)\u003c/a\u003e\n  * \u003ca href=\"https://city-super.github.io/matrixcity/\"\u003eMatrixCity\u003c/a\u003e (\u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/tree/main/configs/matrixcity/README.md\"\u003ePrepare your dataset\u003c/a\u003e)\n  * \u003ca href=\"https://www.cs.ubc.ca/~kmyi/imw2020/data.html\"\u003ePhotoTourism\u003c/a\u003e\n* \u003ca href=\"#4-web-viewer\"\u003eInteractive web viewer\u003c/a\u003e\n  * Load multiple models\n  * Model transform\n  * Scene editor\n  * Video camera path editor\n* Video renderer\n* Load a large number of images without OOM\n* Dynamic object mask\n* Derived algorithms\n  * Deformable Gaussians\n    * \u003ca href=\"#25-deformable-3d-gaussians\"\u003eDeformable 3D Gaussians (2.5.)\u003c/a\u003e\n    * \u003ca href=\"#43-load-model-trained-by-other-implementations\"\u003e4D Gaussian (4.3.)\u003c/a\u003e (Viewer Only)\n  * \u003ca href=\"#26-mip-splatting\"\u003eMip-Splatting (2.6.)\u003c/a\u003e\n  * \u003ca href=\"#27-lightgaussian\"\u003eLightGaussian (2.7.)\u003c/a\u003e\n  * \u003ca href=\"#28-absgs--efficientgs\"\u003eAbsGS / EfficientGS (2.8.)\u003c/a\u003e\n  * \u003ca href=\"#29-2d-gaussian-splatting\"\u003e2D Gaussian Splatting (2.9.)\u003c/a\u003e\n  * \u003ca href=\"#210-segment-any-3d-gaussians\"\u003eSegment Any 3D Gaussians (2.10.)\u003c/a\u003e\n  * \u003ca href=\"#212-appearance-model\"\u003eNew Appearance Model (2.12.)\u003c/a\u003e: improve the quality when images have various appearances\n  * \u003ca href=\"#213-3dgs-mcmc\"\u003e3D Gaussian Splatting as Markov Chain Monte Carlo (2.13.)\u003c/a\u003e\n  * \u003ca href=\"#214-feature-distillation\"\u003eFeature distillation (2.14.)\u003c/a\u003e\n  * \u003ca href=\"#215-in-the-wild\"\u003eIn the wild (2.15.)\u003c/a\u003e\n  * \u003ca href=\"#216-new-multiple-gpu-training-strategy\"\u003eNew Multiple GPU training strategy (2.16.)\u003c/a\u003e\n  * \u003ca href=\"#217-spotlesssplats\"\u003eSpotLessSplats (2.17.)\u003c/a\u003e\n  * \u003ca href=\"#218-depth-regularization-with-depth-anything-v2\"\u003eDepth Regularization with Depth Anything V2 (2.18.)\u003c/a\u003e\n  * \u003ca href=\"#219-stopthepop\"\u003eStopThePop (2.19.)\u003c/a\u003e\n  * \u003ca href=\"#220-scale-regularization\"\u003eScale Regularization (2.20.)\u003c/a\u003e\n  * \u003ca href=\"#221-taming-3dgs\"\u003eTaming 3DGS (2.21.)\u003c/a\u003e\n  * \u003ca href=\"#222-bilateral-grid\"\u003eBilateral Grid\u003c/a\u003e\n  * \u003ca href=\"#223-gns\"\u003eGNS\u003c/a\u003e\n## 1. Installation\n### 1.1. Clone repository\n\n```bash\n# clone repository\ngit clone https://github.com/yzslab/gaussian-splatting-lightning.git\ncd gaussian-splatting-lightning\n```\n\n### 1.2. Create virtual environment\n\n```bash\n# create virtual environment\nconda create -yn gspl python=3.9 pip\nconda activate gspl\n```\n\n### 1.3. Install PyTorch\n* Tested on `PyTorch==2.0.1`\n* You must install the one match to the version of your nvcc (nvcc --version)\n* For CUDA 11.8\n\n  ```bash\n  pip install -r requirements/pyt201_cu118.txt\n  ```\n\n### 1.4. Install requirements\n\n```bash\npip install -r requirements.txt\n```\n\n### 1.5. Install optional packages\n* \u003ca href=\"https://ffmpeg.org/\"\u003effmpeg\u003c/a\u003e is required if you want to render video: `sudo apt install -y ffmpeg`\n* If you want to use \u003ca href=\"https://github.com/nerfstudio-project/gsplat\"\u003enerfstudio-project/gsplat\u003c/a\u003e\n\n  NOTE: Only my modified v1 is supported\n  \n  ```bash\n  pip uninstall -y gsplat\n  pip install -r requirements/gsplat.txt\n  ```\n  \n* If you need \u003ca href=\"#210-segment-any-3d-gaussians\"\u003eSegAnyGaussian\u003c/a\u003e\n  * gsplat (see command above)\n  * SAM\n    ```bash\n    pip install -r requirements/sam.txt\n    ```\n  * \u003ca href=\"https://github.com/facebookresearch/pytorch3d/blob/main/INSTALL.md\"\u003efacebookresearch/pytorch3d\u003c/a\u003e\n\n    For `torch==2.0.1` and cuda 11.8:\n    \n    ```bash\n    pip install -r requirements/pytorch3d-pre.txt\n    pip install --no-index --no-cache-dir -r requirements/pytorch3d-py39_cu118_pyt201.txt\n    ```\n   \n  * Download \u003ca href=\"https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth\"\u003eViT-H SAM model\u003c/a\u003e, place it to the root dir of this repo.: `wget -O sam_vit_h_4b8939.pth https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth`\n\n## 2. Training\n### 2.1. Basic command\n```bash\npython main.py fit \\\n    --data.path DATASET_PATH \\\n    -n EXPERIMENT_NAME\n```\nIt can detect some dataset type automatically. You can also specify type with option `--data.parser`. Possible values are: `Colmap`, `Blender`, `NSVF`, `Nerfies`, `MatrixCity`, `PhotoTourism`, `SegAnyColmap`, `Feature3DGSColmap`.\n\n\u003cb\u003e[NOTE]\u003c/b\u003e By default, only checkpoint files will be produced on training end. If you need ply file in vanilla 3DGS's format (can be loaded by SIBR_viewer or some WebGL/GPU based viewer):\n  * [Option 1]: Convert checkpoint file to ply: `python utils/ckpt2ply.py TRAINING_OUTPUT_PATH`, e.g.:\n    * `python utils/ckpt2ply.py outputs/lego`\n    * `python utils/ckpt2ply.py outputs/lego/checkpoints/epoch=300-step=30000.ckpt`\n  * [Option 2]: Start training with option: `--model.save_ply true`\n### 2.2. Some useful options\n* Run training with web viewer\n```bash\npython main.py fit \\\n    --viewer \\\n    ...\n```\n* It is recommended to use config file `configs/blender.yaml` when training on blender dataset.\n```bash\npython main.py fit \\\n    --config configs/blender.yaml \\\n    ...\n```\n* With mask (colmap dataset only)\n  * You may need to undistort mask images too: \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/blob/main/utils/colmap_undistort_mask.py\"\u003eutils/colmap_undistort_mask.py\u003c/a\u003e\n```bash\n# the requirements of mask\n#   * must be single channel\n#   * zero(black) represent the masked pixel (won't be used to supervise learning)\n#   * the filename of the mask file must be image filename + '.png', \n#     e.g.: the mask of '001.jpg' is '001.jpg.png'\n... fit \\\n  --data.parser Colmap \\\n  --data.parser.mask_dir MASK_DIR_PATH \\\n  ...\n```\n* Use downsampled images (colmap dataset only)\n\nYou can use `utils/image_downsample.py` to downsample your images, e.g. 4x downsample: `python utils/image_downsample.py PATH_TO_DIRECTORY_THAT_STORE_IMAGES --factor 4`\n```bash\n# it will load images from `images_4` directory\n... fit \\\n  --data.parser Colmap \\\n  --data.parser.down_sample_factor 4 \\\n  ...\n```\n\nRounding mode is specified by `--data.parser.down_sample_rounding_mode`. Available values are `floor`, `round`, `round_half_up`, `ceil`. Default is `round`.\n\n* Load large dataset without OOM\n  * [1st option] Cache images in uint8 data type\n    ```bash\n    ... fit \\\n        --data.image_uint8 true\n    ```\n  * [2nd option] Limit the maximum number of the cached images\n    * Cache the next batch during training (Recommended)\n      ```bash\n      ... fit \\\n        --data.train_max_num_images_to_cache 512 \\\n        --data.async_caching true \\\n        ...\n      ```\n    * Cache the next batch at the end of the current batch\n      ```bash\n      ... fit \\\n        --data.train_max_num_images_to_cache 1024 \\\n        ...\n      ```\n\n* Speedup training\n  * Store all images in GPU memory\n\n    ```bash\n    ... fit \\\n      --data.image_on_cpu false \\\n      ...\n    ```\n\n    Combining this with `--data.image_uint8 true` to reduce GPU memory consumption is also feasible.\n\n  * Avoid performing a validation after every training epoch\n\n    Simply set `check_val_every_n_epoch` to a very large value. Please note that the metrics starting with `val/`, such as `val/psnr`, on the progress bar will not be updated during the training.\n\n    ```bash\n    ... fit \\\n      --trainer.check_val_every_n_epoch 99999 \\\n      ...\n    ```\n\n  * Take a look at \u003ca href=\"#221-taming-3dgs\"\u003eTaming 3DGS (2.21.)\u003c/a\u003e for further acceleration\n\n### 2.3. Use \u003ca href=\"https://github.com/nerfstudio-project/gsplat\"\u003enerfstudio-project/gsplat\u003c/a\u003e\n\n```bash\npython main.py fit \\\n    --config configs/gsplat.yaml \\\n    ...\n```\n\n### 2.4. Multi-GPU training (DDP)\n\u003cb\u003e[NOTE]\u003c/b\u003e Try \u003ca href=\"#216-new-multiple-gpu-training-strategy\"\u003eNew Multiple GPU training strategy\u003c/a\u003e, which can be enabled during densification.\n\n\u003cb\u003e[NOTE]\u003c/b\u003e Multi-GPU training with DDP strategy can only be enabled after densification. You can start a single GPU training at the beginning, and save a checkpoint after densification finishing. Then resume from this checkpoint and enable multi-GPU training.\n\nYou will get improved PSNR and SSIM with more GPUs:\n![image](https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/06e91e71-5068-46ce-b169-524a069609bf)\n\n\n```bash\n# Single GPU at the beginning\npython main.py fit \\\n    --config ... \\\n    --data.path DATASET_PATH \\\n    --model.density.densify_until_iter 15000 \\\n    --max_steps 15000\n# Then resume, and enable multi-GPU\npython main.py fit \\\n    --config ... \\\n    --trainer configs/ddp.yaml \\\n    --data.path DATASET_PATH \\\n    --max_steps 30000 \\\n    --ckpt_path last  # find latest checkpoint automatically, or provide a path to checkpoint file\n```\n\n### 2.5. \u003ca href=\"https://ingra14m.github.io/Deformable-Gaussians/\"\u003eDeformable 3D Gaussians\u003c/a\u003e\n\u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/177b3fbf-fdd2-490f-b446-433a4d929502\"\u003e\u003c/video\u003e\n\n```bash\npython main.py fit \\\n    --config configs/deformable_blender.yaml \\\n    --data.path ...\n```\n\n### 2.6. \u003ca href=\"https://niujinshuchong.github.io/mip-splatting/\"\u003eMip-Splatting\u003c/a\u003e\nTraining:\n```bash\npython main.py fit \\\n    --config configs/mip_splatting_gsplat_v2.yaml \\\n    --data.path ...\n```\n\nFuse the 3D smoothing filter to the Gaussian parameters:\n```bash\npython utils/fuse_mip_filter.py \\\n    TRAINED_MODEL_DIR\n```\n\n### 2.7. \u003ca href=\"https://lightgaussian.github.io/\"\u003eLightGaussian\u003c/a\u003e\n* Prune \u0026 finetune only currently\n* Train \u0026 densify \u0026 prune\n\n  ```bash\n  ... fit \\\n      --config configs/light_gaussian/train_densify_prune-gsplat.yaml \\\n      --data.path ...\n  ```\n\n* Prune \u0026 finetune (make sure to use the same hparams as the input model used)\n\n  ```bash\n  ... fit \\\n      --config configs/light_gaussian/prune_finetune-gsplat.yaml \\\n      --data.path ... \\\n      ... \\\n      --ckpt_path YOUR_CHECKPOINT_PATH\n  ```\n  \n### 2.8. \u003ca href=\"https://ty424.github.io/AbsGS.github.io/\"\u003eAbsGS\u003c/a\u003e / EfficientGS\n```bash\n... fit \\\n    --config configs/gsplat-absgrad.yaml \\\n    --data.path ...\n```\n\n### 2.9. \u003ca href=\"https://surfsplatting.github.io/\"\u003e2D Gaussian Splatting\u003c/a\u003e\n* Install `diff-surfel-rasterization` first\n  ```bash\n  pip install -r requirements/2DGS.txt\n  ```\n\n* Then start training\n  ```bash\n  ... fit \\\n      --config configs/vanilla_2dgs.yaml \\\n      --data.path ...\n  ```\n\n* Mesh extraction\n\n  * Bounded\n    ```bash\n    python utils/gs2d_mesh_extraction.py MODEL_OUTPUT_PATH\n    ```\n\n  * Unbounded\n    ```bash\n    python utils/gs2d_mesh_extraction.py MODEL_OUTPUT_PATH --unbounded true\n    ```\n  \n### 2.10. \u003ca href=\"https://jumpat.github.io/SAGA/\"\u003eSegment Any 3D Gaussians\u003c/a\u003e\n* First, train a 3DGS scene using gsplat\n  ```bash\n  python main.py fit \\\n      --config configs/gsplat.yaml \\\n      --data.path data/Truck \\\n      -n Truck -v gsplat  # trained model will save to `outputs/Truck/gsplat`\n  ```\n* Then generate SAM masks and their scales\n  * Masks\n    ```bash\n    python utils/get_sam_masks.py data/Truck/images\n    ```\n    You can specify the path to SAM checkpoint via argument `-c PATH_TO_SAM_CKPT`\n  \n  * Scales\n    ```bash\n    python utils/get_sam_mask_scales.py outputs/Truck/gsplat\n    ```\n  \n  Both the masks and scales will be saved in `data/Truck/semantics`, the structure of `data/Truck` will like this:\n  ```bash\n  ├── images  # The images of your dataset\n      ├── 000001.jpg\n      ├── 000002.jpg\n      ...\n  ├── semantic  # Generated by `get_sam_masks.py` and `get_sam_mask_scales.py`\n      ├── masks\n          ├── 000001.jpg.pt\n          ├── 000002.jpg.pt\n          ...\n      └── scales\n          ├── 000001.jpg.pt\n          ├── 000002.jpg.pt\n          ...\n  ├── sparse  # colmap sparse database\n      ...\n  ```\n\n* Train SegAnyGS\n  ```bash\n  python seganygs.py fit \\\n      --config configs/segany_splatting.yaml \\\n      --data.path data/Truck \\\n      --model.initialize_from outputs/Truck/gsplat \\\n      -n Truck -v seganygs  # save to `outputs/Truck/seganygs`\n  ```\n  The value of `--model.initialize_from` is the path to the trained 3DGS model\n\n* Start the web viewer to perform segmentation or cluster\n  ```bash\n  python viewer.py outputs/Truck/seganygs\n  ```\n  \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/0b98a8ed-77d7-436d-b9f8-c5b51af5ba52\"\u003e\u003c/video\u003e\n\n### 2.12. Appearance Model\nWith appearance model, the reconstruction quality can be improved when your images have various appearance, such as different exposure, white balance, contrast and even day and night.\n\nThis model assign an extra feature vector $\\boldsymbol{\\ell}^{(g)}$ to each 3D Gaussian and an appearance embedding vector $\\boldsymbol{\\ell}^{(a)}$ to each appearance group. Both of them will be used as the input of a lightweight MLP to calculate the color.\n\n$$ \\mathbf{C} = f \\left ( \\boldsymbol{\\ell}^{(g)}, \\boldsymbol{\\ell}^{(a)} \\right ) $$\n\nPlease refer to \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/blob/main/internal/renderers/gsplat_appearance_embedding_renderer.py\"\u003einternal/renderers/gsplat_appearance_embedding_renderer.py\u003c/a\u003e for more details.\n  \n| Baseline | New Model |\n| --- | --- |\n| \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/3a990247-b57b-4ba8-8e9d-7346a3bd41e3\"\u003e\u003c/video\u003e | \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/afeea69f-ed74-4c50-843a-e5d480eb66ef\"\u003e\u003c/video\u003e |\n|  | \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/ab89e4cf-80c0-4e99-88bc-3ec5ca047e19\"\u003e\u003c/video\u003e |\n* First generate appearance groups (Colmap or PhotoTourism dataset only)\n  ```bash\n  python utils/generate_image_apperance_groups.py PATH_TO_DATASET_DIR \\\n      --image \\\n      --name appearance_image_dedicated  # the name will be used later\n  ```\n  The images in a group will share a common appearance embedding. The command above will assign each image a group, which means that will not share any appearance embedding between images.\n\n* Then start training\n  ```bash\n  python main.py fit \\\n      --config configs/appearance_embedding_renderer/view_dependent.yaml \\\n      --data.path PATH_TO_DATASET_DIR \\\n      --data.parser Colmap \\\n      --data.parser.appearance_groups appearance_image_dedicated  # value here should be the same as the one provided to `--name` above\n  ```\n  If you are using PhotoTourism dataset, please replace `--data.parser Colmap` with `--data.parser PhotoTourism`.\n\n* \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/tree/main/configs/appearance_embedding_renderer\"\u003eOther available configs\u003c/a\u003e\n  * `view_independent.yaml`: turn off view dependent effects\n  * `sh_view_dependent.yaml`: represent view dependent effects using spherical harmonics\n  * `*-distributed.yaml`: multiple GPUs\n  * `*-estimated_depth_reg.yaml` / `*-estimated_depth_reg-hard_depth.yaml`: with depth regularization\n\n* Remove the dependence on MLP when rendering\n\n  It is recommended to use `view_independent-*` or `sh_view_dependent-*` configs if you want to do so.\n  \n  By running `python utils/fuse_appearance_embeddings_into_shs_dc.py TRAINED_MODEL_DIR`, you can get a fixed appearance checkpoint without requiring a MLP.\n  \n### 2.13. \u003ca href=\"https://ubc-vision.github.io/3dgs-mcmc/\"\u003e3DGS-MCMC\u003c/a\u003e\n\n```bash\n... fit \\\n    --config configs/gsplat-mcmc.yaml \\\n    --model.density.cap_max MAX_NUM_GAUSSIANS \\\n    ...\n```\n`MAX_NUM_GAUSSIANS` is the maximum number of Gaussians that will be used.\n  \nRefer to \u003ca href=\"https://github.com/ubc-vision/3dgs-mcmc\"\u003eubc-vision/3dgs-mcmc\u003c/a\u003e, \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/tree/main/internal/density_controllers/mcmc_density_controller.py\"\u003einternal/density_controllers/mcmc_density_controller.py\u003c/a\u003e and \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/tree/main/internal/metrics/mcmc_metrics.py\"\u003einternal/metrics/mcmc_metrics.py\u003c/a\u003e for more details.\n\n### 2.14. Feature distillation\n\u003cdetails\u003e\n\u003csummary\u003e Click me \u003c/summary\u003e\n \nThis comes from \u003ca href=\"https://feature-3dgs.github.io/\"\u003eFeature 3DGS\u003c/a\u003e. But two stage optimization is adapted here, rather than jointly.\n\n* First, train a model using gsplat (see command above)\n* Then extract feature map from your dataset\n\n  Theoretically, any feature is distillable. You need to implement your own feature map extractor. Here are instructions about extracting SAM and LSeg features.\n\n  * SAM\n    ```bash\n    python utils/get_sam_embeddings.py data/Truck/images\n    ```\n    With this command, feature maps will be saved to `data/Truck/semantic/sam_features`, and preview to `data/Truck/semantic/sam_feature_preview`, respectively.\n  \n  * LSeg: please use \u003ca href=\"https://github.com/ShijieZhou-UCLA/feature-3dgs\"\u003eShijieZhou-UCLA/feature-3dgs\u003c/a\u003e and follow its instruction to extra LSeg features (do not use this repo's virtual environment for it).\n* Then start distillation\n  * SAM\n    ```bash\n    python main.py fit \\\n        --config configs/feature_3dgs/sam-speedup.yaml \\\n        --data.path data/Truck \\\n        --data.parser.down_sample_factor 2 \\\n        --model.initialize_from outputs/Truck/gsplat \\\n        -n Truck -v feature_3dgs-sam\n    ```\n  \n  * LSeg\n  \n    \u003cb\u003e[NOTE]\u003c/b\u003e In order to distill LSeg's high-dimensional features, you may need a GPU equipped with a large memory capacity\n  \n    ```bash\n    python main.py fit \\\n        --config configs/feature_3dgs/lseg-speedup.yaml \\\n        ...\n    ```\n  \n  `--model.initialize_from` is the path to your trained model.\n  \n  Since rasterizing high dimension features is slow, `--data.parser.down_sample_factor` is used here to smaller the rendered feature map to speedup distillation.\n* After distillation finishing, you can use viewer to visualize the feature map rendered from 3D Gaussians\n\n  ```bash\n  python viewer.py outputs/Truck/feature_3dgs\n  ```\n  \n  CLIP is required if you are using LSeg feature: `pip install git+https://github.com/openai/CLIP.git`\n\n  \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/7fd7a636-129e-4568-a436-3a97b9f73a1a\"\u003e\u003c/video\u003e\n\n  LSeg feature is used in this video.\n\n\u003c/details\u003e\n\n### 2.15. In the wild\n\n| | | | |\n| --- | --- | --- | --- |\n| ![image](https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/0f3c7bc8-5219-4e0f-bd9f-97e22b06d5f2) | ![image](https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/215a3467-b29b-486c-8275-eaa5c41f3db5) | ![image](https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/84c35b5a-460e-4977-bfc1-3b95e8768291) | ![image](https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/0ab3415c-da7e-4445-9e0e-a3a419e07f64) |\n\n\n\n\n#### Introduction\n\nBased on the Appearance Model (2.12.) above, this model can produce a visibility map for every training view indicating whether a pixel belongs to transient objects or not.\n\nThe idea of the visibility map is a bit like \u003ca href=\"https://rover-xingyu.github.io/Ha-NeRF/\"\u003eHa-NeRF\u003c/a\u003e, but rather than uses positional encoding for pixel coordinates, 2D dense grid encoding is used here in order to accelerate training.\n\nPlease refer to \u003ca href=\"https://rover-xingyu.github.io/Ha-NeRF/\"\u003eHa-NeRF\u003c/a\u003e, `internal/renderers/gsplat_appearance_embedding_visibility_map_renderer.py` and `internal/metrics/visibility_map_metrics.py` for more details.\n\n\u003cb\u003e[NOTE]\u003c/b\u003e Though it shows the capability to distinguish the pixels of transient objects, may not be able to remove some artifats/floaters belong to transients. And may also treat under-reconstructed regions as transients.\n  \n#### Usage\n\n* \u003ca href=\"https://github.com/NVlabs/tiny-cuda-nn\"\u003etiny-cuda-nn\u003c/a\u003e is required\n```bash\npip install -r requirements/tcnn.txt\n```\n* Preparing dataset\n\nDownload PhotoTourism dataset from \u003ca href=\"https://www.cs.ubc.ca/~kmyi/imw2020/data.html\"\u003ehere\u003c/a\u003e and split file from the \"Additional links\" \u003ca href=\"https://nerf-w.github.io/\"\u003ehere\u003c/a\u003e. The split file should be placed at the same path as the `dense` directory of the PhotoTourism dataset, e.g.:\n```bash\n├──brandenburg_gate\n  ├── dense  # colmap database\n      ├── images\n          ├── ...\n      ├── sparse\n      ...\n  ├── brandenburg.tsv  # split file\n```\n\n[Optional] 2x downsize the images: `python utils/image_downsample.py data/brandenburg_gate/dense/images --factor 2`\n\n* Start training\n\n```bash\npython main.py fit \\\n    --config configs/appearance_embedding_visibility_map_renderer/view_independent-2x_ds.yaml \\\n    --data.path data/brandenburg_gate \\\n    -n brandenburg_gate\n```\n\nIf you have not downsized images, remember to add a `--data.parser.down_sample_factor 1` to the command above.\n\n* Validation on training set\n\n```bash\npython main.py validate \\\n   --config outputs/brandenburg_gate/lightning_logs/version_0/config.yaml \\\n   --save_val \\\n   --val_train\n```\n\nThen you can find the rendered masks and images in `outputs/brandenburg_gate/val`.\n\n### 2.16. New Multiple GPU training strategy\n\n#### Introduction\nThis is a bit like a simplified version of \u003ca href=\"https://daohanlu.github.io/scaling-up-3dgs/\"\u003eScaling Up 3DGS\u003c/a\u003e. \n\nIn the implementation here, Gaussians are stored, projected and their colors are calculated in a distributed manner, and each GPU rasterizes a whole image for a different camera. No Pixel-wise Distribution currently.\n\nThis strategy works with densification enabled.\n\n\u003cb\u003e[NOTE]\u003c/b\u003e\n* Not well validated yet, still under development\n* Multiple GPUs training only currently\n* In order to combine with derived algorithms containing neural networks, you need to manually wrap your networks with DDP, e.g.: \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/blob/main/internal/renderers/gsplat_distributed_appearance_embedding_renderer.py\"\u003einternal/renderers/gsplat_distributed_appearance_embedding_renderer.py\u003c/a\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003eMetrics of MipNeRF360 dataset\u003c/summary\u003e\nOne batch per GPU, 30K iterations, no other hyperparameters changed.\n\n* PSNR\n  ![image](https://github.com/user-attachments/assets/1a7fa6ad-89cf-4a63-9c09-7d74a9e30103)\n\n* SSIM\n  ![image](https://github.com/user-attachments/assets/f4c91a7c-745f-480f-bc06-27692ab09494)\n\n* LPIPS\n  ![image](https://github.com/user-attachments/assets/ff1f98c5-c70e-4897-be25-2a74223c421f)\n\u003c/details\u003e\n\n#### Usage\n* Training\n```bash\npython main.py fit \\\n    --config configs/distributed.yaml \\\n    ...\n```\nBy default, all processes will hold a (redundant) replica of the dataset in memory, which may cause CPU OOM. You can avoid this by adding the option `--data.distributed true`, so that each process loads a different subset of the dataset.\n\n* Merge checkpoints\n\n```bash\npython utils/merge_distributed_ckpts.py outputs/TRAINED_MODEL_DIR\n```\n\n* Start viewer\n\n```bash\npython viewer.py outputs/TRAINED_MODEL_DIR/checkpoints/MERGED_CHECKPOINT_FILE\n```\n\n### 2.17. \u003ca href=\"https://spotlesssplats.github.io/\"\u003eSpotLessSplats\u003c/a\u003e\n\u003cb\u003e[NOTE]\u003c/b\u003e No utilization-based pruning (4.2.3 of the paper) and appearance modeling (4.2.4 of the paper)\n\n* Install requirements\n  ```bash\n  pip install -r requirements/SpotLessSplats.txt\n  ```\n* Extract Stable Diffusion features\n  ```bash\n  python utils/sd_feature_extraction.py YOUR_IMAGE_DIR\n  ```\n* Training\n  * Spatial clustering (SLS-agg, 4.1.1)\n    ```bash\n    python main.py fit \\\n        --config configs/spot_less_splats/gsplat-cluster.yaml \\\n        --data.parser.split_mode \"reconstruction\" \\\n        --data.path YOUR_DATASET_PATH \\\n        -n EXPERIMENT_NAME\n    ```\n  * Spatio-temporal clustering (SLS-mlp, 4.1.2)\n    ```bash\n    python main.py fit \\\n        --config configs/spot_less_splats/gsplat-mlp.yaml \\\n        --data.parser.split_mode \"reconstruction\" \\\n        --data.path YOUR_DATASET_PATH \\\n        -n EXPERIMENT_NAME\n    ```\n  * Other available configs\n    * [gsplat-mlp-with_ssim.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/spot_less_splats/gsplat-mlp-with_ssim.yaml): with SSIM metric\n    * [gsplat-mlp-opacity_reg_0.01.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/spot_less_splats/gsplat-mlp-opacity_reg_0.01.yaml): with opacity regularization, aiming to reduce floaters/artifacts\n    * [view_independent-phototourism-sls-opacity_reg_0.01.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/appearance_embedding_renderer/view_independent-phototourism-sls-opacity_reg_0.01.yaml): with [new appearance model (2.12.)](#212-appearance-model) (not the one mentioned in the SLS paper)\n    \n  Change the value of `--data.parser.split_mode` to `keyword` if you are using the \u003ca href=\"https://storage.googleapis.com/jax3d-public/projects/robustnerf/robustnerf.tar.gz\"\u003eRobustNeRF dataset\u003c/a\u003e.\n\n* Render SLS predicted masks\n  ```bash\n  python utils/render_sls_masks.py outputs/EXPERIMENT_NAME\n  ```\n\n### 2.18. Depth Regularization with \u003ca href=\"https://depth-anything-v2.github.io/\"\u003eDepth Anything V2\u003c/a\u003e\nThis is implemented with reference to \u003ca href=\"https://repo-sam.inria.fr/fungraph/hierarchical-3d-gaussians/\"\u003eHierarchical 3DGS\u003c/a\u003e.\n\n| Baseline | DepthReg |  DepthReg + AppearanceModel |\n| --- | --- | --- |\n| \u003cvideo src=\"https://github.com/user-attachments/assets/138290ca-6c19-4dc0-81c0-f5b1fd7dbb04\"\u003e\u003c/video\u003e | \u003cvideo src=\"https://github.com/user-attachments/assets/4f6b04f7-c889-4d80-b32d-32339fe5ddb7\"\u003e\u003c/video\u003e | \u003cvideo src=\"https://github.com/user-attachments/assets/68c57124-87c0-4eb6-8e2e-4457103beee2\"\u003e\u003c/video\u003e |\n\n* Setup Depth Anything V2\n  ```bash\n  # clone the repo.\n  git clone https://github.com/DepthAnything/Depth-Anything-V2 utils/Depth-Anything-V2\n  \n  # NOTE: do not run `pip install -r utils/Depth-Anything-V2/requirements.txt`\n  \n  # download the pretrained model `Depth-Anything-V2-Large`\n  mkdir utils/Depth-Anything-V2/checkpoints\n  wget -O utils/Depth-Anything-V2/checkpoints/depth_anything_v2_vitl.pth \"https://huggingface.co/depth-anything/Depth-Anything-V2-Large/resolve/main/depth_anything_v2_vitl.pth?download=true\"\n   ```\n* Dataset pre-processing\n  ```bash\n  python utils/estimate_dataset_depths.py data/Family\n  ```\n  \n  Make sure that both the `sparse` and `images` folders exist in `data/Family`.\n    \n  With the operation above, the structure of `data/Family` should be like this:\n  ```bash\n  ├── data/Family\n      ├── estimated_depths  # generated by `utils/run_depth_anything_v2.py`\n          ├── 00001.jpg.npy\n          ├── ...\n      ├── images\n          ├── 00001.jpg\n          ├── ...\n      ├── sparse  # colmap sparse model\n          ├── ...\n      ├── estimated_depth_scales.json  # generated by `utils/get_depth_scales.py`\n      ...\n  ```\n\n* Training\n  ```bash\n  python main.py fit \\\n      --config configs/depth_regularization/estimated_inverse_depth-l1.yaml \\\n      --data.path data/Family \\\n      -n EXPERIMENT_NAME\n  ```\n  \n  Other available configs:\n    * [estimated_inverse_depth-l1_ssim.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/depth_regularization/estimated_inverse_depth-hard_depth-l1_ssim.yaml): with SSIM as an extra depth metric\n    * [estimated_inverse_depth-l2.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/depth_regularization/estimated_inverse_depth-l2.yaml): L2 depth loss\n    * [estimated_inverse_depth-hard_depth-l1.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/depth_regularization/estimated_inverse_depth-hard_depth-l1.yaml): better at removing floaters/artifacts\n    * [estimated_inverse_depth-hard_depth-l1_ssim.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/depth_regularization/estimated_inverse_depth-hard_depth-l1_ssim.yaml)\n    * with [new appearance model (2.12.)](#212-appearance-model)\n      * [view_dependent-estimated_depth_reg.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/appearance_embedding_renderer/view_dependent-estimated_depth_reg.yaml)\n      * [view_dependent-estimated_depth_reg-hard_depth.yaml](https://github.com/yzslab/gaussian-splatting-lightning/blob/main/configs/appearance_embedding_renderer/view_dependent-estimated_depth_reg-hard_depth.yaml)\n    \n    In my experiments, simply L1 is slightly better than L2 or the one with SSIM.\n\n### 2.19. \u003ca href=\"https://r4dl.github.io/StopThePop/\"\u003eStopThePop\u003c/a\u003e\n* Install the StopThePop-Rasterization first:\n  ```bash\n  pip install -r requirements/StopThePop.txt\n  ```\n\n* Training:\n  ```bash\n  python main.py fit \\\n      --config configs/stp/baseline.yaml \\\n      --data.path ... \\\n      ...\n  ```\n\n### 2.20. Scale Regularization\nThe scales of Gaussians will grow to some unreasonable values after densification. For example, some linear shape Gaussians are almost longer than your scene, and appear as artifacts at many viewpoints. This regularization, containing max scale and scale ratio losses, can avoid it. Take a look \u003ca href=\"https://github.com/yzslab/gaussian-splatting-lightning/blob/main/internal/metrics/scale_regularization_metrics.py\"\u003einternal/metrics/scale_regularization_metrics.py\u003c/a\u003e for more details.\n\nUsage: \n```bash\npython main.py fit \\\n    --config configs/scale_reg.yaml \\\n    --model.metric.max_scale 1. \\\n    ...\n```\n\nThe `--model.metric.max_scale` is a scene-specific hyperparameter. The regularization will be applied to the Gaussians with scales exceeding it. It should be greater than `percent_dense * camera_extent`. The `percent_dense` is `0.01` by default. The `camera_extent` will be printed as `spatial_lr_scale=...` at the beginning of the training. Set it to a very large value, e.g. `2048`, to disable the max scale loss if you are not sure what value should be used.\n\n\n### 2.21. \u003ca href=\"https://humansensinglab.github.io/taming-3dgs/\"\u003eTaming 3DGS\u003c/a\u003e\nThere are two implementations: one is the gsplat v1 based, and the other is the vanilla one. The gsplat v1 based implementation currently does not have \"Backpropagation with Per-Splat Parallelization.\"\n\n* (a) Install libraries first\n  * fused-ssim\n    ```bash\n    pip install --no-build-isolation -r requirements/fused-ssim.txt\n    ```\n\n  * my modified gsplat v1 if you want the gsplat v1 based one (refer to \u003ca href=\"#15-install-optional-packages\"\u003e1.5.\u003c/a\u003e for the setup guide)\n\n  * another rasterizer if you want the vanilla one\n    ```bash\n    pip install -r requirements/diff-accel-rasterization.txt\n    ```\n\n* (b) Available config files\n\n  | Type | gsplat v1 | vanilla |\n  | --- | --- | --- |\n  | Competitive quality | `configs/gsplat_v1-accel.yaml` | `configs/taming_3dgs/rasterizer-fused_ssim-aa.yaml` |\n  | More acceleration, slightly lower quality (SparseAdam) | `configs/gsplat_v1-accel_more.yaml` | `configs/taming_3dgs/rasterizer-fused_ssim-sparse_adam-aa.yaml` |\n  | Steerable Densification | `configs/gsplat_v1-accel-steerable.yaml` | - |\n\n  You need to adjust the `--model.density.budget` if you want to use the steerable one.\n\n### 2.22. \u003ca href=\"https://bilarfpro.github.io/\"\u003eBilateral Grid\u003c/a\u003e\n\nThe negative impacts of appearance variations can be largely mitigated using this method.\n\n* PyTorch based version: `configs/bilagrid.yaml`\n* Faster Fully-Fused version\n  * Install the \u003ca href=\"https://github.com/harry7557558/fused-bilagrid\"\u003efused-bilagrid\u003c/a\u003e first: `pip install -r requirements/fused-bilagrid.txt`\n  * Then run training with `configs/bilagrid_fused.yaml`\n\n\n### 2.23. \u003ca href=\"https://xiaobin2001.github.io/GNS-web/\"\u003eGNS\u003c/a\u003e\n\nBetter quality can be achieved with fewer primitives.\n\nMy modified gsplat v1 is required.\n\n```bash\npython main.py fit \\\n  --config configs/gsplat_v1.yaml \\\n  --config configs/gns.yaml \\\n  --model.density.budget YOUR_EXPECTED_BUDGET_GOES_HERE \\\n  ...\n```\n\n## 3. Evaluation\n\nPer-image metrics will be saved to `TRAINING_OUTPUT/metrics` as a `csv` file.\n\n### Evaluate on validation set\n```bash\npython main.py validate \\\n    --config outputs/lego/config.yaml\n```\n\n### On test set\n```bash\npython main.py test \\\n    --config outputs/lego/config.yaml\n```\n\n### On train set\n```bash\npython main.py validate \\\n    --config outputs/lego/config.yaml \\\n    --val_train\n```\n\n### Save images that rendered during evaluation/test\n```bash\npython main.py \u003cvalidate or test\u003e \\\n    --config outputs/lego/config.yaml \\\n    --save_val\n```\nThen you can find the images in `outputs/lego/\u003cval or test\u003e`.\n\n## 4. Web Viewer\n| Transform | Camera Path | Edit |\n| --- | --- | --- |\n| \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/de1ff3c3-a27a-4600-8c76-ab6551df6fca\"\u003e\u003c/video\u003e | \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/3f87243d-d9a1-41e2-9d51-225735925db4\"\u003e\u003c/video\u003e | \u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/7cf0ccf2-44e9-4fc9-87cc-740b7bbda488\"\u003e\u003c/video\u003e |\n\nThe web viewer is powered by \u003ca href=\"https://viser.studio\"\u003eviser\u003c/a\u003e.\n\n### 4.1 Basic usage\n* Also works for \u003ca href=\"https://github.com/graphdeco-inria/gaussian-splatting\"\u003egraphdeco-inria/gaussian-splatting\u003c/a\u003e's ply output\n```bash\npython viewer.py TRAINING_OUTPUT_PATH\n# e.g.: \n#   python viewer.py outputs/lego/\n#   python viewer.py outputs/lego/checkpoints/epoch=300-step=30000.ckpt\n#   python viewer.py outputs/lego/baseline/point_cloud/iteration_30000/point_cloud.ply  # only works with VanillaRenderer\n```\n### 4.2 Load multiple models and enable transform options\n```bash\npython viewer.py \\\n    outputs/garden \\\n    outputs/lego \\\n    outputs/Synthetic_NSVF/Palace/point_cloud/iteration_30000/point_cloud.ply \\\n    --enable_transform\n```\n\n### 4.3 Load model trained by other implementations\n\u003cb\u003e[NOTE]\u003c/b\u003e The commands in this section only design for third-party outputs\n\n* \u003ca href=\"https://github.com/ingra14m/Deformable-3D-Gaussians\"\u003eingra14m/Deformable-3D-Gaussians\u003c/a\u003e\n\n```bash\npython viewer.py \\\n    Deformable-3D-Gaussians/outputs/lego \\\n    --vanilla_deformable \\\n    --reorient disable  # change to enable when loading real world scene\n```\n\n* \u003ca href=\"https://github.com/hustvl/4DGaussians\"\u003ehustvl/4DGaussians\u003c/a\u003e\n```bash\npython viewer.py \\\n    4DGaussians/outputs/lego \\\n    --vanilla_gs4d\n```\n\n* \u003ca href=\"https://github.com/hbb1/2d-gaussian-splatting\"\u003ehbb1/2d-gaussian-splatting\u003c/a\u003e\n```bash\n# Install `diff-surfel-rasterization` first\npip install -r requirements/diff-surfel-rasterization.txt\n# Then start viewer\npython viewer.py \\\n    2d-gaussian-splatting/outputs/Truck \\\n    --vanilla_gs2d\n```\n\n* \u003ca href=\"https://github.com/Jumpat/SegAnyGAussians\"\u003eJumpat/SegAnyGAussians\u003c/a\u003e\n```bash\npython viewer.py \\\n    SegAnyGAussians/outputs/Truck \\\n    --vanilla_seganygs\n```\n\n* \u003ca href=\"https://github.com/autonomousvision/mip-splatting\"\u003eautonomousvision/mip-splatting\u003c/a\u003e\n```bash\npython viewer.py \\\n    mip-splatting/outputs/bicycle \\\n    --vanilla_mip\n```\n\n## 5. F.A.Q.\n\u003cb\u003eQ: \u003c/b\u003e The viewer shows my scene in unexpected orientation, how to rotate the camera, like the `U` and `O` key in the SIBR_viewer?\n\n\u003cb\u003eA: \u003c/b\u003e Check the `Orientation Control` on the right panel, rotate the camera frustum in the scene to the orientation you want, then click `Apply Up Direction`.\n\u003cvideo src=\"https://github.com/yzslab/gaussian-splatting-lightning/assets/564361/7e9198b5-d853-4800-aac2-1774640a8874\"\u003e\u003c/video\u003e\n\n\u003cbr/\u003e\n\nBesides: You can also click the 'Reset up direction' button. Then the viewer will use your current orientation as the reference.\n * First use mouse to rotate your camera to the orientation you want\n * Then click the 'Reset up direction' button\n\n\n##\n\n\u003cb\u003eQ: \u003c/b\u003e The web viewer is slow (or low fps, far from real-time).\n\n\u003cb\u003eA: \u003c/b\u003e This is expected because of the overhead of the image transfer over network. You can get around 10fps in 1080P resolution, which is enough for you to view the reconstruction quality.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyzslab%2Fgaussian-splatting-lightning","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyzslab%2Fgaussian-splatting-lightning","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyzslab%2Fgaussian-splatting-lightning/lists"}