https://github.com/Anttwo/Frosting?tab=readme-ov-file
GitHub - Anttwo/Frosting: [ECCV 2024 - ORAL] Official PyTorch implementation of Gaussian Frosting: Editable Complex Radiance Fie
[ECCV 2024 - ORAL] Official PyTorch implementation of Gaussian Frosting: Editable Complex Radiance Fields with Real-Time Rendering - Anttwo/Frosting
github.com

https://github.com/Anttwo/Frosting/blob/main/media/gifs/buzz_dancing_sh.gif
[ required ubuntu environment]
ubuntu 20.04
cuda 11.8
Gaussian Frosting Pipeline ์์ฝ (5๋จ๊ณ + ์ ํ์ ๋จ๊ณ)
1. Short Vanilla 3DGS Optimization (7k iterations)
- ๋ชฉ์ : Gaussians๊ฐ ์ฅ๋ฉด์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์น๋๋๋ก ์ด๊ธฐ ์ต์ ํ ์งํ.
- ์ค๋ช : 3D Gaussian Splatting ๋ชจ๋ธ์ 7,000๋ฒ ๋ฐ๋ณต ํ์ตํ์ฌ Gaussians๋ฅผ ์ฅ๋ฉด์ ์์น์ํด.
2. Surface Regularization (ํ๋ฉด ์ ๊ทํ)
- ๋ชฉ์ : Gaussians๋ฅผ ์ฅ๋ฉด ํ๋ฉด๊ณผ ์ ๋ ฌ๋๋๋ก ์ต์ ํ.
- ์ค๋ช : ํ๋ฉด๊ณผ ์ผ์นํ๋๋ก Gaussians์ ์์น ๋ฐ ๋ฐฐ์น๋ฅผ ์กฐ์ ํ์ฌ ๋์ฑ ์ ํํ ํ๋ฉด ์ ๋ณด๋ฅผ ํ๋ณด.
3. Mesh Extraction (๋ฉ์ฌ ์ถ์ถ)
- ๋ชฉ์ : ์ต์ ํ๋ Gaussians๋ก๋ถํฐ ๋ฉ์ฌ๋ฅผ ์ถ์ถํ์ฌ Frosting ๋ ์ด์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ.
- ์ค๋ช : Gaussians๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 3D ๋ฉ์ฌ ๋ชจ๋ธ ์์ฑ.
4. Frosting Layer Initialization (Frosting ๋ ์ด์ด ์ด๊ธฐํ)
- ๋ชฉ์ : ๋ฉ์ฌ ์ฃผ์์ ๊ฐ์ฐ์์ ๋ ์ด์ด๋ฅผ ์์ฑํ์ฌ ํ๋ฉด ๊ทผ์ฒ ์ธ๋ถ ์ ๋ณด ๋ฐ ์ฌ์ง ๋๊ป๋ฅผ ๋ฐ์.
- ์ค๋ช
:
- ์ฌ์ง์ "๋ถํ์ค์ฑ(fuzziness)"์ด ํฐ ๋ถ๋ถ์ผ์๋ก ๋๊ป๊ฐ ์ฆ๊ฐํ๋ ์ ์ํ ๋ ์ด์ด ์์ฑ.
- Gaussians๊ฐ ํ๋ฉด์ ์ผ๋ง๋ ์ ์ ๋ ฌ๋๋์ง ๋ถ์ํ์ฌ ๋๊ป๋ฅผ ๊ณ์ฐ.
5. Frosting Layer Optimization (Frosting ๋ ์ด์ด ์ต์ ํ)
- ๋ชฉ์ : ํ๋ฉด ๊ทผ์ฒ ์ธ๋ถ ์ ๋ณด ๋ฐ ๋ณผ๋ฅจ ํจ๊ณผ๋ฅผ ์ ํํ๊ฒ ํํํ๋๋ก ์ต์ ํ.
- ํน์ง:
- GPU ์ฑ๋ฅ์ ๋ฐ๋ผ Frosting ๋ ์ด์ด ๋ด Gaussians ์๋ฅผ ์กฐ์ ๊ฐ๋ฅ.
- ๋ณต์กํ ๋ถ๋ถ์ ๋ ๋ง์ Gaussians๋ฅผ ์๋์ผ๋ก ํ ๋น.
- Occlusion Culling (์ ํ ์ฌํญ):
- ๋ฉ์ฌ์ ์ํด ๊ฐ๋ ค์ง Gaussians๋ฅผ ๊ฑด๋๋์ผ๋ก์จ ์ต์ ํ ์๋ ํฅ์.
- ๋ ๋๋ง ํ์ง์๋ ์ฝ๊ฐ์ ์ํฅ์ ์ค ์ ์์.
6. Textured Mesh Extraction (์ ํ์ ๋จ๊ณ)
- ๋ชฉ์ : Frosting ๋ ์ด์ด๋ก๋ถํฐ ํ ์ค์ฒ ๋ฉ์ฌ๋ฅผ ์ถ์ถํ์ฌ Blender์ ๊ฐ์ ํด์์ ์๊ฐํ, ํธ์ง, ์ ๋๋ฉ์ด์ ์ ํ์ฉ.
- ์ค๋ช
: ํ
์ค์ฒ๊ฐ ํฌํจ๋ ๋ฉ์ฌ๋ฅผ ์ถ์ถํ์ฌ ๋์ฑ ์ง๊ด์ ์ธ ์๊ฐํ ๋ฐ ์กฐ์ ๊ฐ๋ฅ
๊ฐ์ํ๊ฒฝ๊ตฌ์ถ
git cloning ํฉ์๋ค.
# HTTPS
git clone https://github.com/Anttwo/Frosting.git --recursive
/Frosting ํด๋ ๋ค์ด๊ฐ์
python install.py
conda activate frosting
์ด๊ฒ ์ ๊ฐ window ์ปด์ด๋ ubuntu ํ๊ฒฝ์ด๋ ๋๋ค ์๋ํด๋ดค๋๋ฐ,
environment.yml ์ linux ์ ์ฉ ํจํค์ง๋ค์ด ๋๋ฌด ๋ง์์, window ์์๋ ํ๊ฒฝ๊ตฌ์ถ์ด ์ ์๋ฉ๋๋ค..(์๋์ฐ์ปด์์๋ building ๋ชปํ ๋ฏ.. ์๋๋ฉด linux ํจํค์ง๋ฅผ ๋นผ๊ณ ์ค์นํด๋ ๋๊ธด ํ๋๋ฐ, dependency ๋ฌธ์ ๊ฐ ์๊ธธ ์๋ ์์ด์ ์ผ๋จ์ pass!!)
Training
python train_full_pipeline.py -s <path to COLMAP dataset> --gaussians_in_frosting 2_000_000 -r <"dn_consistency", "density" or "sdf"> --use_occlusion_culling False --export_obj True
python train_full_pipeline.py -s /source/sola/Frosting/data/tandt_db/db/playroom --gaussians_in_frosting 2_000_000 -r dn_consistency --use_occlusion_culling False --export_obj True
Gaussian Frosting ํ์ดํ๋ผ์ธ ์์ฝ
- Frosting ๋ ์ด์ด์ ์ฌ์ฉํ๋ Gaussians ์ ์กฐ์ (--gaussians_in_frosting)
- ๊ธฐ๋ณธ๊ฐ: 2,000,000 Gaussians
- ๊ณ ํ์ง์ ์ํด 5,000,000 Gaussians ์๋ ๊ฐ๋ฅ.
- ์ ๊ทํ ๋ฐฉ๋ฒ ์ ํ (--regularization_type / -r)
- ์ต์ : "dn_consistency"(์ถ์ฒ), "density", "sdf"
- "density": ์ค๋ธ์ ํธ ์ค์ฌ ์ฅ๋ฉด์ ์ ํฉ
- "sdf": ๋ฐฐ๊ฒฝ์ด ๋ณต์กํ ์ฅ๋ฉด (์: Mip-NeRF 360)์ฉ.
- Occlusion Culling (--use_occlusion_culling)
- ๊ธฐ๋ณธ๊ฐ: False
- True์ผ ๊ฒฝ์ฐ, ์ต์ ํ ๋ฐ ๋ ๋๋ง ์๋ ๊ฐ์ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์.
- ํ์ง์ ์ฝ๊ฐ์ ์ํฅ ์์.
- ํ
์ค์ฒ ๋ฉ์ฌ ์ถ์ถ (--export_obj)
- ๊ธฐ๋ณธ๊ฐ: True
- Blender์์ ํธ์ง ๋ฐ ์๊ฐํ์ ํ์ํ .obj ํ์ผ์ ์์ฑ.
์ค์ํ ์ฃผ์ ํ๋ผ๋ฏธํฐ ์ค๋ช (train_full_pipeline.py)
ํ๋ผ๋ฏธํฐํ์ ์ค๋ช
--scene_path / -s | str | COLMAP ๋ฐ์ดํฐ์ ์ด ์๋ ๊ฒฝ๋ก. |
--gs_output_dir | str | Vanilla 3D Gaussian Splatting ์ฒดํฌํฌ์ธํธ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก. (์์ ๊ฒฝ์ฐ 3DGS ๋ชจ๋ธ์ ์๋ก ํ์ต) |
--eval | bool | ํ๋ จ ์ด๋ฏธ์ง์ ๋ํด ํ๊ฐ๋ฅผ ์ํ. ๊ธฐ๋ณธ๊ฐ False. |
--low_poly | bool | Low-poly ๋ฉ์ฌ ์์ฑ (200,000 vertices). |
--high_poly | bool | High-poly ๋ฉ์ฌ ์์ฑ (1,000,000 vertices). |
--refinement_time | str | ์ต์ ํ ์๊ฐ ์ค์ : "short" (2k ๋ฐ๋ณต), "medium" (7k), "long" (15k). |
--export_ply | bool | ์ต์ข Frosting 3D Gaussians๋ฅผ .ply ํ์ผ๋ก ๋ด๋ณด๋ด๊ธฐ. ๊ธฐ๋ณธ๊ฐ True. |
--poisson_depth | int | ๋ฉ์ฌ ์ถ์ถ์ ์ํ Poisson ์ฌ๊ตฌ์ฑ ๊น์ด. ๊ธฐ๋ณธ๊ฐ -1(์๋ ์ค์ ). |
--cleaning_quantile | float | ๋ฉ์ฌ ์ ๋ฆฌ ์ ์ฌ์ฉ๋๋ ๋ถ์์. ๊ธฐ๋ณธ๊ฐ 0.1. |
--connected_components_vis_th | float | ๋ณด์ด์ง ์๋ ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์ ์ ๊ฑฐ ์๊ณ๊ฐ. |
--texture_square_size | int | UV ํ ์ค์ฒ์์ ์ผ๊ฐํ๋น ํ ๋น๋ ์ฌ๊ฐํ ํฌ๊ธฐ. ๊ธฐ๋ณธ๊ฐ 8 (ํฐ ๊ฐ์ ํด์๋ ์ฆ๊ฐ). |
--white_background | bool | ์ด๋ฏธ์ง ๋ฐฐ๊ฒฝ์ ํฐ์์ผ๋ก ์ค์ ํ ์ง ์ฌ๋ถ. ๊ธฐ๋ณธ๊ฐ False. |
๊ธฐ๋ณธ ์ค์
- high_poly ๋ชจ๋ + refinement_time "long" (15k ๋ฐ๋ณต).
- ์ ํ์ง ๋ชจ๋: --refinement_time "short" ์ค์ ์ 2~3๋ถ ์์.
- ๊ณ ํ์ง ๋ชจ๋: "long" ์ค์ ์ ์ต๋ 30๋ถ ์์.
Frosting ์์๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ์ต์ ์ง์ํฉ๋๋ค.
1. Training from Scratch (์ฒ์๋ถํฐ ํ์ต)
- ์ด๊ธฐํ ๋ฐฉ์:
- ์๋ฌด๋ฐ ์ฌ์ ํ์ต ์์ด Gaussian splats๋ฅผ ๋ฌด์์๋ก ์ด๊ธฐํํ์ฌ ํ์ต์ ์์ํฉ๋๋ค.
- ํ์ต ์๊ฐ:
- ์ฒ์๋ถํฐ ์ต์ ์ Gaussians ์์น์ ์์, ๋ฐ๋ ๋ฑ์ ํ์ตํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
- ํ์ํ ๋ฆฌ์์ค:
- ๋๊ท๋ชจ ์ฐ์ฐ ๋ฆฌ์์ค๊ฐ ํ์ํ๋ฉฐ, ์ด๊ธฐ ์๋ ด ์๋๊ฐ ๋๋ฆด ์ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ ํ์ง:
- ์ต์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ์๊ฐ๋ฉฐ ํ์ตํ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ์ข์ ์ ์์ง๋ง, ํ์ต ๊ณผ์ ์ด ๋ ๊ธธ์ด์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
2. Training from a Vanilla Gaussian Splatting Model (๊ธฐ์กด ๋ชจ๋ธ ๊ธฐ๋ฐ ํ์ต)
- ์ด๊ธฐํ ๋ฐฉ์:
- ๊ธฐ์กด Vanilla Gaussian Splatting ๋ชจ๋ธ์ ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ถ๋ฌ์ ํ์ต์ ์์ํฉ๋๋ค.
- ํ์ต ์๊ฐ:
- ๊ธฐ์กด ๋ชจ๋ธ์ ์ฌ์ ํ์ต๋ Gaussians๊ฐ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ํ์ต ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ ์ ์์ต๋๋ค.
- ํ์ํ ๋ฆฌ์์ค:
- ํ์ต์ด ๋น ๋ฅด๊ฒ ์งํ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฐ์ฐ ํจ์จ์ด ๋์์ง๋๋ค.
- ๊ฒฐ๊ณผ ํ์ง:
- ์ฌ์ ํ์ต๋ ์ ๋ณด๊ฐ ๊ธฐ๋ฐ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ ์์ ์ ์ด๊ณ ๋น ๋ฅด๊ฒ ์ข์ ํ์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ํ์ง๋ง ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ด ํน์ ๋ฐ์ดํฐ์ ๋ง์ถฐ์ ธ ์์ผ๋ฉด, ์ผ๋ฐํ๋ ๋ชจ๋ธ๋ณด๋ค ์ฝ๊ฐ ์ ํ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค.
์๋ ์ฝ๋๋ ๊ธฐ์กด 3dgs ๋ชจ๋ธ ๊ธฐ๋ฐ ํ์ต ์ฝ๋์ ๋๋ค.
python train_full_pipeline.py -s <path to COLMAP dataset> --gaussians_in_frosting 2_000_000 -r <"dn_consistency", "density" or "sdf"> --use_occlusion_culling False --export_obj True --gs_output_dir <path to the output directory of the vanilla 3DGS>
python train_full_pipeline.py -s /source/sola/Frosting/data/tandt_db/db/drjohnson --gaussians_in_frosting 2_000_000 -r dn_consistency --use_occlusion_culling False --export_obj True --gs_output_dir /source/sola/Frosting/data/3dgs_model/drjohnson
์ด๋ ๊ฒ ๋๋ฆฌ๋, ํด๋น colmap data set ํด๋์ ์ด๋ฏธ์ง๊ฐ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
FileNotFoundError: [Errno 2] No such file or directory: '/source/sola/Frosting/data/tandt_db/db/drjohnson/images/IMG_6292.jpg.jpg'
์๋ฌ์ฝ๋๋ฅผ ๋ณด๋, ํ์ผ๋ช ์ ํ์ฅ์๊ฐ ์ค๋ณต๋์ด ๋ค์ด๊ฐ ์๋๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
=> name์ ํ์ฅ์๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ, ๋ค์ ์ถ๊ฐํ์ง ์๋๋ก ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
(rootํด๋)/frosting_scene ํด๋๋ก ๋ค์ด๊ฐ์ cameras.py ์ฝ๋๋ฅผ ์ผ๋ถ ์์ ํด์ค์ผํฉ๋๋ค.
์์ ๋ ์ฝ๋ ์์:
# ํ์ฅ์๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์๋์ง ํ์ธ ํ ์ถ๊ฐ
if not name.endswith(('.jpg', '.png', '.jpeg', '.JPG', '.PNG')):
image_path = os.path.join(image_dir, name + extension)
else: image_path = os.path.join(image_dir, name)
์ฝ๋ ์ ์ฉ ์์น:
load_gs_cameras ํจ์ ๋ด, ๋ค์ ์ฝ๋ ๋ถ๋ถ์ ์ ์ฝ๋๋ก ๊ต์ฒดํฉ๋๋ค:
image_path = os.path.join(image_dir, name + extension)
๊ทธ๋ฆฌ๊ณ ๋ค์ train ์ํค๋ ๋ช ๋ น๋ฌธ์ ์์ฑํด๋ณด๋ฉด, ์ ํ์ต๋๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋น.