https://github.com/Anttwo/SuGaR?tab=readme-ov-file
GitHub - Anttwo/SuGaR: [CVPR 2024] Official PyTorch implementation of SuGaR: Surface-Aligned Gaussian Splatting for Efficient 3D
[CVPR 2024] Official PyTorch implementation of SuGaR: Surface-Aligned Gaussian Splatting for Efficient 3D Mesh Reconstruction and High-Quality Mesh Rendering - Anttwo/SuGaR
github.com
[ required ubuntu environment]
ubuntu 20.04
cuda 11.8
# HTTPS
git clone https://github.com/Anttwo/SuGaR.git --recursive
SuGaR/ ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ์
python install.py
conda activate sugar
python train_full_pipeline.py -s <path to COLMAP dataset> -r <"dn_consistency", "density" or "sdf"> --high_poly True --export_obj True
colmap ํํ์ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์ด์๋ค๋ ์ ์ ํ์ train ์ด ๊ฐ๋ฅํฉ๋๋ค.
-r argument ๋ฅผ ์ฌ์ฉํ์ฌ regularization method ์ ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
- Regularization Method (-r ์ธ์):
- ์ ํ ๊ฐ๋ฅ ์ต์ : "dn_consistency", "density", "sdf"
- ์ถ์ฒ: "dn_consistency" (์ต์ ๋ฐฉ์, ์ต๊ณ ํ์ง ๋ฉ์ฌ ์ ๊ณต)
- ๋
ผ๋ฌธ ๊ฒฐ๊ณผ:
- ๊ฐ์ฒด ์ค์ฌ ์ฅ๋ฉด: "density"
- ๋ฐฐ๊ฒฝ์ด ๋ณต์กํ ์ฅ๋ฉด (Mip-NeRF 360 ๋ฐ์ดํฐ์ ): "sdf"
- Polygon ์ค์ (--high_poly, --low_poly ์ธ์):
- --high_poly True: 100๋ง ๊ฐ์ ์ ์ , ์ผ๊ฐํ๋น 1๊ฐ Gaussian
- --low_poly True: 20๋ง ๊ฐ์ ์ ์ , ์ผ๊ฐํ๋น 6๊ฐ Gaussian
- Refinement Time (--refinement_time ์ธ์):
- ์ค์ ๊ฐ๋ฅ ์ต์ : "short" (2k ๋ฐ๋ณต), "medium", "long" (15k ๋ฐ๋ณต)
- ๊ธฐ๋ณธ๊ฐ: "long" (15k ๋ฐ๋ณต)
- "short"๋ ์ถฉ๋ถํ ์ข์ ํ์ง ์ ๊ณต ๊ฐ๋ฅ
- OBJ ํ์ผ ๋ด๋ณด๋ด๊ธฐ (--export_obj ์ธ์):
- ๊ธฐ๋ณธ ์ค์ : OBJ ํ์ผ ์ถ์ถ ํ์ฑํ
- ์ฉ๋: Blender์์ ์ฅ๋ฉด ํธ์ง, ๊ฒฐํฉ, ์ ๋๋ฉ์ด์ ์์ ์ ํ์
<ํ๋ผ๋ฏธํฐ ์์ฝ>
--scene_path / -s | str | COLMAP ๋ฐ์ดํฐ์ ์ด ํฌํจ๋ ์์ค ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก. | N/A |
--gs_output_dir | str | ๊ธฐ๋ณธ 3D Gaussian Splatting ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก. ์ ๊ณตํ์ง ์์ผ๋ฉด ์ฒ์๋ถํฐ ๋ชจ๋ธ์ ์ต์ ํํ์ฌ ํ์ต์ ์์ํจ. | N/A |
--regularization_type / -r | str | Gaussians ์ ๋ ฌ ์ ์ฌ์ฉํ๋ Regularization ์ ํ: "dn_consistency", "density", "sdf". "dn_consistency" ์ฌ์ฉ ๊ถ์ฅ. | N/A |
--eval | bool | True์ผ ๊ฒฝ์ฐ ํ์ต ์ด๋ฏธ์ง์ ํ๊ฐ ๋ถํ ์ ์ํํจ. | True |
--low_poly | bool | True์ผ ๊ฒฝ์ฐ Low Poly ๋ฉ์ฌ ์ฌ์ฉ (20๋ง ์ ์ , ์ผ๊ฐํ๋น 6๊ฐ์ Gaussian). | False |
--high_poly | bool | True์ผ ๊ฒฝ์ฐ High Poly ๋ฉ์ฌ ์ฌ์ฉ (100๋ง ์ ์ , ์ผ๊ฐํ๋น 1๊ฐ์ Gaussian). | False |
--refinement_time | str | Refinement ๋จ๊ณ์ ์ฌ์ฉํ ๋ฐ๋ณต ์๊ฐ: "short" (2k ๋ฐ๋ณต), "medium" (7k ๋ฐ๋ณต), "long" (15k ๋ฐ๋ณต). | "long" |
--export_ply | bool | True์ผ ๊ฒฝ์ฐ 3D Gaussian์ .ply ํ์ผ๋ก ๋ด๋ณด๋. ํ์ผ ํฌ๊ธฐ๊ฐ ํฌ์ง๋ง (์ฝ 500MB), 3DGS ๋ทฐ์ด ์ฌ์ฉ์ ํ์ํจ. | True |
--export_obj / -t | bool | True์ผ ๊ฒฝ์ฐ ์ ์ ๋ SuGaR ๋ชจ๋ธ์์ ์ ํต์ ์ธ ํ ์ค์ฒ ๋ฉ์ฌ๋ฅผ .obj ํ์ผ๋ก ์ต์ ํ ํ ๋ด๋ณด๋. UV ํ ์ค์ฒ ๊ณ์ฐ์ Nvdiffrast๋ก ๋ช ์ด ๋ง์ ์ฒ๋ฆฌ๋จ. | True |
--square_size | int | UV ํ ์ค์ฒ์์ ๊ฐ ์ผ๊ฐํ ์์ ํ ๋น๋ ์ฌ๊ฐํ ํฌ๊ธฐ. ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ ๊ฐ์ ํ์. | 8 |
--white_background | bool | True์ผ ๊ฒฝ์ฐ ์ด๋ฏธ์ง ๋ฐฐ๊ฒฝ์ ํฐ์์ผ๋ก ์ค์ ํจ. | False |
1. Training from Scratch (์ฒ์๋ถํฐ ํ์ต)
- ์ด๊ธฐํ ๋ฐฉ์:
- ์๋ฌด๋ฐ ์ฌ์ ํ์ต ์์ด Gaussian splats๋ฅผ ๋ฌด์์๋ก ์ด๊ธฐํํ์ฌ ํ์ต์ ์์ํฉ๋๋ค.
- ํ์ต ์๊ฐ:
- ์ฒ์๋ถํฐ ์ต์ ์ Gaussians ์์น์ ์์, ๋ฐ๋ ๋ฑ์ ํ์ตํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
- ํ์ํ ๋ฆฌ์์ค:
- ๋๊ท๋ชจ ์ฐ์ฐ ๋ฆฌ์์ค๊ฐ ํ์ํ๋ฉฐ, ์ด๊ธฐ ์๋ ด ์๋๊ฐ ๋๋ฆด ์ ์์ต๋๋ค.
- ๊ฒฐ๊ณผ ํ์ง:
- ์ต์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ์๊ฐ๋ฉฐ ํ์ตํ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ์ข์ ์ ์์ง๋ง, ํ์ต ๊ณผ์ ์ด ๋ ๊ธธ์ด์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
2. Training from a Vanilla Gaussian Splatting Model (๊ธฐ์กด ๋ชจ๋ธ ๊ธฐ๋ฐ ํ์ต)
- ์ด๊ธฐํ ๋ฐฉ์:
- ๊ธฐ์กด Vanilla Gaussian Splatting ๋ชจ๋ธ์ ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ถ๋ฌ์ ํ์ต์ ์์ํฉ๋๋ค.
- ํ์ต ์๊ฐ:
- ๊ธฐ์กด ๋ชจ๋ธ์ ์ฌ์ ํ์ต๋ Gaussians๊ฐ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ํ์ต ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ ์ ์์ต๋๋ค.
- ํ์ํ ๋ฆฌ์์ค:
- ํ์ต์ด ๋น ๋ฅด๊ฒ ์งํ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฐ์ฐ ํจ์จ์ด ๋์์ง๋๋ค.
- ๊ฒฐ๊ณผ ํ์ง:
- ์ฌ์ ํ์ต๋ ์ ๋ณด๊ฐ ๊ธฐ๋ฐ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ ์์ ์ ์ด๊ณ ๋น ๋ฅด๊ฒ ์ข์ ํ์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ํ์ง๋ง ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ด ํน์ ๋ฐ์ดํฐ์ ๋ง์ถฐ์ ธ ์์ผ๋ฉด, ์ผ๋ฐํ๋ ๋ชจ๋ธ๋ณด๋ค ์ฝ๊ฐ ์ ํ์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ต๋๋ค.
์ ๋ ์ฒ์๋ถํฐ ํ์ตํ๋ scratch ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ์ต์ ํ๋, output ํด๋์ fined_mesh ์ refined_ply ํ์ผ์ด ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
์ ์ด์ , Viewer ๋ฅผ ์ด์ฉํด์ output ์ ๋ ๋๋งํ์ฌ ๋ณผ ์ ์์ต๋๋ค.
- ์๋ .ply ํ์ผ ๋ด๋ณด๋ด๊ธฐ: ์ต์ ํ ํ ./output/refined_ply/ ๋๋ ํ ๋ฆฌ์ SuGaR ํ์ด๋ธ๋ฆฌ๋ ํํ์ด ํฌํจ๋ refined 3D Gaussian .ply ํ์ผ์ด ์๋์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
- ์ด .ply ํ์ผ์ ๋ชจ๋ 3D Gaussian Splatting Viewer์์ ํธํ๋ฉ๋๋ค.
- ์ถ์ฒ Viewer:
- ์ค๋ฆฌ์ง๋ 3D Gaussian Splatting Viewer (์๋ณธ ๊ตฌํ์ Viewer)
- SuperSplat Viewer (๊ฐ๋ ฅํ ์ฑ๋ฅ์ ๋ทฐ์ด)
- SuperSplat ์น ๋ฒ์ : ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์๊ฐํ ๊ฐ๋ฅ.
- SuGaR ์ ์ฉ ๋ทฐ์ด:
- ํ ์ค์ฒ ๋ฉ์ฌ, ์์ด์ดํ๋ ์ ๋ฉ์ฌ, refined 3D Gaussian์ ์๊ฐํํ ์ ์๋ ์ ์ฉ ์ค์๊ฐ ๋ทฐ์ด๋ ์ ๊ณต๋ฉ๋๋ค.
SIBR_gaussianViewer_app.exe ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฐ์์ ply ํ์ผ์ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, ์ ํ์ต๋์ด ๋ ๋๋ง ๋ ๋ชจ์ต์ ํ์ธํ ์ ์์์ต๋๋ค.
ํ์ง๋ง SuGaR ๋ ผ๋ฌธ ๋ด์์๋ ์ ๊ณตํ๋ viewer๊ฐ ๋ฐ๋ก ์์์ต๋๋ค.
SuGaR ์์ ์ ๊ณตํ๋ viewer ๋ linux ํ๊ฒฝ๊ณผ Mac OS ํ๊ฒฝ์์๋ build ๊ฐ ๋๋ค๊ณ ํฉ๋๋ค.
์ ๋ ์ด์ ubuntu ์ vessl ์๋ฒ ํ๊ฒฝ์์ ์งํํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ์ค์ ์์ด follow up ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
(window ์ฌ์ฉ์์ ๊ฒฝ์ฐ WSL ์ ํตํด์ linux ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋ค๊ณ ํฉ๋๋ค.)
curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install aptitude
sudo aptitude install -y npm
./sugar_viewer/ ํด๋๋ก ๋ค์ด๊ฐ์
npm install
cd ..
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
์ค์น๊ฐ ์๋ฃ๋๋ฉด, ํฐ๋ฏธ๋์ ๋ซ์๋ค๊ฐ ๋ค์ ์ด๊ฑฐ๋ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ์ฉํฉ๋๋ค
python train_full_pipeline.py -s <path to COLMAP dataset> -r <"dn_consistency", "density" or "sdf"> --high_poly True --export_obj True --gs_output_dir <path to the Gaussian Splatting output directory>
python train_full_pipeline.py -s /source/sola/SuGaR/data/tandt_db/db/drjohnson -r dn_consistency --high_poly True --export_obj True --gs_output_dir /source/sola/SuGaR/data/3dgs_model/drjohnson
์ด๋ ๊ฒ ๋๋ฆฌ๋, ํด๋น colmap data set ํด๋์ ์ด๋ฏธ์ง๊ฐ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.
FileNotFoundError: [Errno 2] No such file or directory: '/source/sola/SuGaR/data/tandt_db/db/drjohnson/images/IMG_6292.jpg.jpg'
์๋ฌ์ฝ๋๋ฅผ ๋ณด๋, ํ์ผ๋ช ์ ํ์ฅ์๊ฐ ์ค๋ณต๋์ด ๋ค์ด๊ฐ ์๋๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
=> name์ ํ์ฅ์๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ, ๋ค์ ์ถ๊ฐํ์ง ์๋๋ก ์กฐ๊ฑด๋ฌธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
(rootํด๋)/sugar_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)
* antialiasing issue
sugar_scene ํด๋์ ์๋ sugar_model.py ์์ ํ์.
raster_settings = GaussianRasterizationSettings(
image_height=int(self.image_height),
image_width=int(self.image_width),
tanfovx=self.tanfovx,
tanfovy=self.tanfovy,
bg=bg_color,
scale_modifier=1.,
viewmatrix=world_view_transform,
projmatrix=full_proj_transform,
sh_degree=sh_deg,
campos=camera_center,
prefiltered=False,
debug=False,
antialiasing=True # antialiasing ๋งค๊ฐ๋ณ์ ์ถ๊ฐ
)
* rasterizer ์ output ๊ฐ์ ์ค๋ฅ.
# error code
rendered_image, radii = rasterizer(
ValueError: too many values to unpack (expected 2)
rasterizer์ output ์ ์ง์ ์ถ๋ ฅํด์ ๋ณด๋๊น, 3๊ฐ์ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์์์.
๊ทธ๋ฐ๋ฐ rendered_image ์ radii ๋๊ฐ๋ก๋ง output ์ ๋ฐ์ผ๋ ค๊ณ ํ๋๊น ๋ฐ์ํ๋ ์ค๋ฅ...
๊ทผ๋ฐ ์ ์ด๊ฒ ์๋ง๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.... ์ฝ๋ ์์์๋ค์ด ์ ๋ง์ถฐ๋์์ํ
๋ฐ...?
rendered_image, radii, additional_output = rasterizer(
means3D = positions,
means2D = means2D,
shs = shs,
colors_precomp = splat_colors,
opacities = splat_opacities,
scales = scales,
rotations = quaternions,
cov3D_precomp = cov3D)
๊ทธ๋์ ์์ ๊ฐ์ด sugar_scene/sugar_model.py ๋ฅผ ์์ ํด์ฃผ์๋ค.
additional_output ์ด ์ด๋์ ์ฌ์ฉ๋๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง...
๊ทธ๋ฆฌ๊ณ ๋ค์ train ์ํค๋ ๋ช ๋ น๋ฌธ์ ์์ฑํด๋ณด๋ฉด, ์ ํ์ต๋๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋น.