├── LICENSE
├── README.md
├── checkpoints
├── README.md
└── big-lama-config.yaml
├── create_SDFT_pairs.py
├── demo
├── GS_depth_video.gif
├── GS_render_video.gif
├── Overview.png
├── Teaser.png
└── input_panorama.png
├── gaussian_renderer
├── __init__.py
└── network_gui.py
├── input
├── Camera_Trajectory
│ ├── camera_pose_frame000000.txt
│ ├── camera_pose_frame000001.txt
│ ├── camera_pose_frame000002.txt
│ ├── camera_pose_frame000003.txt
│ ├── camera_pose_frame000004.txt
│ ├── camera_pose_frame000005.txt
│ ├── camera_pose_frame000006.txt
│ ├── camera_pose_frame000007.txt
│ ├── camera_pose_frame000008.txt
│ ├── camera_pose_frame000009.txt
│ ├── camera_pose_frame000010.txt
│ ├── camera_pose_frame000011.txt
│ ├── camera_pose_frame000012.txt
│ ├── camera_pose_frame000013.txt
│ ├── camera_pose_frame000014.txt
│ ├── camera_pose_frame000015.txt
│ ├── camera_pose_frame000016.txt
│ ├── camera_pose_frame000017.txt
│ ├── camera_pose_frame000018.txt
│ ├── camera_pose_frame000019.txt
│ ├── camera_pose_frame000020.txt
│ ├── camera_pose_frame000021.txt
│ ├── camera_pose_frame000022.txt
│ ├── camera_pose_frame000023.txt
│ ├── camera_pose_frame000024.txt
│ ├── camera_pose_frame000025.txt
│ ├── camera_pose_frame000026.txt
│ ├── camera_pose_frame000027.txt
│ ├── camera_pose_frame000028.txt
│ ├── camera_pose_frame000029.txt
│ ├── camera_pose_frame000030.txt
│ ├── camera_pose_frame000031.txt
│ ├── camera_pose_frame000032.txt
│ ├── camera_pose_frame000033.txt
│ ├── camera_pose_frame000034.txt
│ ├── camera_pose_frame000035.txt
│ ├── camera_pose_frame000036.txt
│ ├── camera_pose_frame000037.txt
│ ├── camera_pose_frame000038.txt
│ ├── camera_pose_frame000039.txt
│ ├── camera_pose_frame000040.txt
│ ├── camera_pose_frame000041.txt
│ ├── camera_pose_frame000042.txt
│ ├── camera_pose_frame000043.txt
│ ├── camera_pose_frame000044.txt
│ ├── camera_pose_frame000045.txt
│ ├── camera_pose_frame000046.txt
│ ├── camera_pose_frame000047.txt
│ ├── camera_pose_frame000048.txt
│ ├── camera_pose_frame000049.txt
│ ├── camera_pose_frame000050.txt
│ ├── camera_pose_frame000051.txt
│ ├── camera_pose_frame000052.txt
│ ├── camera_pose_frame000053.txt
│ ├── camera_pose_frame000054.txt
│ ├── camera_pose_frame000055.txt
│ ├── camera_pose_frame000056.txt
│ ├── camera_pose_frame000057.txt
│ ├── camera_pose_frame000058.txt
│ ├── camera_pose_frame000059.txt
│ ├── camera_pose_frame000060.txt
│ ├── camera_pose_frame000061.txt
│ ├── camera_pose_frame000062.txt
│ ├── camera_pose_frame000063.txt
│ ├── camera_pose_frame000064.txt
│ ├── camera_pose_frame000065.txt
│ ├── camera_pose_frame000081.txt
│ ├── camera_pose_frame000082.txt
│ ├── camera_pose_frame000083.txt
│ ├── camera_pose_frame000084.txt
│ ├── camera_pose_frame000085.txt
│ ├── camera_pose_frame000086.txt
│ ├── camera_pose_frame000087.txt
│ ├── camera_pose_frame000088.txt
│ ├── camera_pose_frame000089.txt
│ ├── camera_pose_frame000090.txt
│ ├── camera_pose_frame000091.txt
│ ├── camera_pose_frame000092.txt
│ ├── camera_pose_frame000093.txt
│ ├── camera_pose_frame000094.txt
│ ├── camera_pose_frame000095.txt
│ ├── camera_pose_frame000096.txt
│ ├── camera_pose_frame000097.txt
│ ├── camera_pose_frame000098.txt
│ ├── camera_pose_frame000099.txt
│ ├── camera_pose_frame000100.txt
│ ├── camera_pose_frame000101.txt
│ ├── camera_pose_frame000102.txt
│ ├── camera_pose_frame000103.txt
│ ├── camera_pose_frame000104.txt
│ ├── camera_pose_frame000105.txt
│ ├── camera_pose_frame000106.txt
│ ├── camera_pose_frame000107.txt
│ ├── camera_pose_frame000108.txt
│ ├── camera_pose_frame000109.txt
│ ├── camera_pose_frame000110.txt
│ ├── camera_pose_frame000111.txt
│ ├── camera_pose_frame000112.txt
│ ├── camera_pose_frame000113.txt
│ ├── camera_pose_frame000114.txt
│ ├── camera_pose_frame000115.txt
│ ├── camera_pose_frame000116.txt
│ ├── camera_pose_frame000117.txt
│ ├── camera_pose_frame000118.txt
│ ├── camera_pose_frame000119.txt
│ ├── camera_pose_frame000120.txt
│ ├── camera_pose_frame000121.txt
│ ├── camera_pose_frame000122.txt
│ ├── camera_pose_frame000123.txt
│ ├── camera_pose_frame000124.txt
│ ├── camera_pose_frame000125.txt
│ ├── camera_pose_frame000126.txt
│ ├── camera_pose_frame000127.txt
│ ├── camera_pose_frame000128.txt
│ ├── camera_pose_frame000129.txt
│ ├── camera_pose_frame000130.txt
│ ├── camera_pose_frame000131.txt
│ ├── camera_pose_frame000132.txt
│ ├── camera_pose_frame000133.txt
│ ├── camera_pose_frame000134.txt
│ ├── camera_pose_frame000135.txt
│ ├── camera_pose_frame000136.txt
│ ├── camera_pose_frame000137.txt
│ ├── camera_pose_frame000138.txt
│ ├── camera_pose_frame000139.txt
│ ├── camera_pose_frame000140.txt
│ ├── camera_pose_frame000141.txt
│ ├── camera_pose_frame000142.txt
│ ├── camera_pose_frame000143.txt
│ ├── camera_pose_frame000144.txt
│ ├── camera_pose_frame000145.txt
│ ├── camera_pose_frame000146.txt
│ ├── camera_pose_frame000147.txt
│ ├── camera_pose_frame000148.txt
│ ├── camera_pose_frame000149.txt
│ ├── camera_pose_frame000150.txt
│ ├── camera_pose_frame000151.txt
│ ├── camera_pose_frame000152.txt
│ ├── camera_pose_frame000153.txt
│ ├── camera_pose_frame000154.txt
│ └── camera_pose_frame000155.txt
├── another_input_panorama.png
└── input_panorama.png
├── modules
├── equilib
│ ├── __init__.py
│ ├── cube2equi
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── numpy.py
│ │ └── torch.py
│ ├── equi2cube
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── numpy.py
│ │ └── torch.py
│ ├── equi2equi
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── numpy.py
│ │ └── torch.py
│ ├── equi2pers
│ │ ├── __init__.py
│ │ ├── base.py
│ │ ├── numpy.py
│ │ └── torch.py
│ ├── grid_sample
│ │ ├── __init__.py
│ │ ├── cpp
│ │ │ ├── __init__.py
│ │ │ └── setup.py
│ │ ├── numpy
│ │ │ ├── __init__.py
│ │ │ ├── bicubic.py
│ │ │ ├── bilinear.py
│ │ │ ├── grid_sample.py
│ │ │ └── nearest.py
│ │ └── torch
│ │ │ ├── __init__.py
│ │ │ ├── bicubic.py
│ │ │ ├── bilinear.py
│ │ │ ├── grid_sample.py
│ │ │ ├── native.py
│ │ │ └── nearest.py
│ ├── numpy_utils
│ │ ├── __init__.py
│ │ ├── grid.py
│ │ ├── intrinsic.py
│ │ └── rotation.py
│ └── torch_utils
│ │ ├── __init__.py
│ │ ├── func.py
│ │ ├── grid.py
│ │ ├── intrinsic.py
│ │ └── rotation.py
├── geo_predictors
│ ├── PanoFusionDistancePredictor.py
│ ├── __init__.py
│ ├── geo_predictor.py
│ ├── networks.py
│ ├── omnidata
│ │ ├── modules
│ │ │ ├── __init__.py
│ │ │ ├── channel_attention.py
│ │ │ ├── midas
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_model.py
│ │ │ │ ├── blocks.py
│ │ │ │ ├── dpt_depth.py
│ │ │ │ ├── midas_net.py
│ │ │ │ ├── midas_net_custom.py
│ │ │ │ ├── transforms.py
│ │ │ │ └── vit.py
│ │ │ └── unet.py
│ │ ├── omnidata_normal_predictor.py
│ │ ├── omnidata_predictor.py
│ │ ├── task_configs.py
│ │ └── transforms.py
│ ├── pano_fusion_inv_predictor.py
│ ├── pano_fusion_normal_predictor.py
│ ├── pano_geo_refiner.py
│ └── pano_joint_predictor.py
├── inpainters
│ ├── SDFT_inpainter.py
│ ├── __init__.py
│ ├── inpainter.py
│ ├── lama
│ │ ├── __init__.py
│ │ ├── models
│ │ │ ├── __init__.py
│ │ │ └── ade20k
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── color150.mat
│ │ │ │ ├── mobilenet.py
│ │ │ │ ├── object150_info.csv
│ │ │ │ ├── resnet.py
│ │ │ │ ├── segm_lib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── nn
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── modules
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── batchnorm.py
│ │ │ │ │ │ ├── comm.py
│ │ │ │ │ │ ├── replicate.py
│ │ │ │ │ │ ├── tests
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── test_numeric_batchnorm.py
│ │ │ │ │ │ │ └── test_sync_batchnorm.py
│ │ │ │ │ │ └── unittest.py
│ │ │ │ │ └── parallel
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── data_parallel.py
│ │ │ │ └── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── th.py
│ │ │ │ └── utils.py
│ │ ├── predict_config.yaml
│ │ └── saicinpainting
│ │ │ ├── __init__.py
│ │ │ ├── evaluation
│ │ │ ├── __init__.py
│ │ │ ├── data.py
│ │ │ ├── evaluator.py
│ │ │ ├── losses
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_loss.py
│ │ │ │ ├── fid
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── fid_score.py
│ │ │ │ │ └── inception.py
│ │ │ │ ├── lpips.py
│ │ │ │ └── ssim.py
│ │ │ ├── masks
│ │ │ │ ├── README.md
│ │ │ │ ├── __init__.py
│ │ │ │ ├── countless
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── countless2d.py
│ │ │ │ │ ├── countless3d.py
│ │ │ │ │ ├── images
│ │ │ │ │ │ ├── gcim.jpg
│ │ │ │ │ │ ├── gray_segmentation.png
│ │ │ │ │ │ ├── segmentation.png
│ │ │ │ │ │ └── sparse.png
│ │ │ │ │ ├── memprof
│ │ │ │ │ │ ├── countless2d_gcim_N_1000.png
│ │ │ │ │ │ ├── countless2d_quick_gcim_N_1000.png
│ │ │ │ │ │ ├── countless3d.png
│ │ │ │ │ │ ├── countless3d_dynamic.png
│ │ │ │ │ │ ├── countless3d_dynamic_generalized.png
│ │ │ │ │ │ └── countless3d_generalized.png
│ │ │ │ │ ├── requirements.txt
│ │ │ │ │ └── test.py
│ │ │ │ └── mask.py
│ │ │ ├── refinement.py
│ │ │ ├── utils.py
│ │ │ └── vis.py
│ │ │ ├── training
│ │ │ ├── __init__.py
│ │ │ ├── data
│ │ │ │ ├── __init__.py
│ │ │ │ ├── aug.py
│ │ │ │ ├── datasets.py
│ │ │ │ └── masks.py
│ │ │ ├── losses
│ │ │ │ ├── __init__.py
│ │ │ │ ├── adversarial.py
│ │ │ │ ├── constants.py
│ │ │ │ ├── distance_weighting.py
│ │ │ │ ├── feature_matching.py
│ │ │ │ ├── perceptual.py
│ │ │ │ ├── segmentation.py
│ │ │ │ └── style_loss.py
│ │ │ ├── modules
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── depthwise_sep_conv.py
│ │ │ │ ├── fake_fakes.py
│ │ │ │ ├── ffc.py
│ │ │ │ ├── multidilated_conv.py
│ │ │ │ ├── multiscale.py
│ │ │ │ ├── pix2pixhd.py
│ │ │ │ ├── spatial_transform.py
│ │ │ │ └── squeeze_excitation.py
│ │ │ ├── trainers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ └── default.py
│ │ │ └── visualizers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base.py
│ │ │ │ ├── colors.py
│ │ │ │ ├── directory.py
│ │ │ │ └── noop.py
│ │ │ └── utils.py
│ ├── lama_inpainter.py
│ └── pano_pers_fusion_inpainter.py
└── mesh_fusion
│ ├── __init__.py
│ ├── render.py
│ ├── sup_info.py
│ └── util.py
├── pano2room.py
├── requirements.txt
├── scene
├── __init__.py
├── arguments.py
├── cameras.py
├── dataset_readers.py
└── gaussian_model.py
├── scripts
├── accelerate.yaml
├── create_SDFT_pairs.sh
├── run_Pano2Room.sh
└── train_SDFT.sh
├── train_SDFT.py
└── utils
├── __init__.py
├── camera_utils.py
├── common_utils.py
├── functions.py
├── general.py
├── generic_utils.py
├── geo_utils.py
├── graphics.py
├── loss.py
├── sh.py
├── system.py
├── trajectory.py
└── warp_utils.py
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Tricky
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Welcome to Pano2Room!
2 |
3 | [Pano2Room: Novel View Synthesis from a Single Indoor Panorama (SIGGRAPH Asia 2024)](https://arxiv.org/abs/2408.11413).
4 |
5 | ## Overview
6 | #### In short, Pano2Room converts an input panorama into 3DGS.
7 |
8 |
9 |
10 |
11 |
12 | ## Demo
13 | In this demo, specify input panorama as:
14 |
15 |
16 | Then, Pano2Room generates the corresponding 3DGS and renders novel views:
17 |
18 |
19 |
20 | And the corresponding rendered depth:
21 |
22 |
23 |
24 | ## Quick Run
25 | ### 0. Setup the environment
26 | (1) Create a new conda environment and install [Pytorch3D](https://github.com/facebookresearch/pytorch3d) (for mesh rendering) and [diff-gaussian-rasterization-w-depth](https://github.com/JonathonLuiten/diff-gaussian-rasterization-w-depth) (for 3DGS rendering with depth) accordingly. Other requirements are specified in \.
27 |
28 | (2) Download pretrained weights in \ (for image inpainting and depth estimation). See \ for instructions.
29 |
30 | ### 1. Run Demo
31 | ```
32 | sh scripts/run_Pano2Room.sh
33 | ```
34 | This demo converts \ to 3DGS and renders novel views as in \