[Mesh] SuGaR coarse mesh & refined mesh extraction
Gaussian Splatting์ ํตํ surface mesh ๋ฐ์ธ๋ฉ ๋ฐฉ๋ฒ
์ด ๋ฌธ์๋ SuGaR ๋ชจ๋ธ์์ Gaussian splats๋ฅผ surface mesh์ ๋ฐ์ธ๋ฉํ๋ ๊ณผ์ ์ ์ค๋ช ํฉ๋๋ค. SuGaR ๋ชจ๋ธ์์ Gaussian splats๋ ์ ๋ค๋ก ๊ตฌ์ฑ๋ 3D ๊ณต๊ฐ์์ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด ์ ๋ค์ด ํน์ ํ๋ฉด์ ๋ฐ์ธ๋ฉ๋ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ๋ชจ๋ธ์ ํ์ต๊ณผ ๋ ๋๋ง ํ์ง์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ฐ์ธ๋ฉ ๊ณผ์
SuGaR ๋ชจ๋ธ์์๋ surface mesh์ ๊ฐ triangle(=face)์ ํน์ ๊ฐ์์ Gaussian splats๋ฅผ ํ ๋นํ์ฌ ํ๋ฉด์ ํํ์ ํ
์ค์ฒ๋ฅผ ๋ณด๋ค ์ ๋ฐํ๊ฒ ํํํ ์ ์์ต๋๋ค. ์ฝ๋์์ ๊ฐ๊ธฐ ๋ค๋ฅธ n_gaussians_per_surface_triangle
๊ฐ์ ๋ํด ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ธ๋ฉ์ ์ํํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์ฉ์ด ์ ๋ฆฌ
- triangle: surface mesh๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋จ์์ ๋๋ค. ๊ฐ ์ผ๊ฐํ์ ์ธ ๊ฐ์ ๊ผญ์ง์ ์ ๊ฐ์ง๋ฉฐ, ์ด ๊ผญ์ง์ ์ ์ฐ๊ฒฐํ๋ ๋ณ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- face: SuGaR์์๋ face๊ฐ surface mesh์ triangle๊ณผ ๋์ผํ ์๋ฏธ๋ก ์ฌ์ฉ๋ฉ๋๋ค. (์ฆ, SuGaR์์๋ face = triangle)
- face์ ์ข
๋ฅ:
- triangle (์ผ๊ฐํ): ์ธ ๊ฐ์ ๊ผญ์ง์ ๊ณผ ์ธ ๊ฐ์ ๋ณ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- Qaud (์ฌ๊ฐํ): ๋ค ๊ฐ์ ๊ผญ์ง์ ๊ณผ ๋ค ๊ฐ์ ๋ณ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- Polygon (๋ค๊ฐํ): ๋ค์ฏ ๊ฐ ์ด์์ ๊ผญ์ง์ ๊ณผ ๋ณ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, pentagon(์ค๊ฐํ), hexagon(์ก๊ฐํ) ๋ฑ์ด ์์ต๋๋ค.
- face์ ์ข
๋ฅ:
- Surface Mesh: ์ฌ๋ฌ ๊ฐ์ ์ผ๊ฐํ์ผ๋ก ๊ตฌ์ฑ๋ 3D ๋ชจ๋ธ์ ํ๋ฉด์ ์๋ฏธํฉ๋๋ค.
sugar_model.py
์์ ๊ฐ triangle๋ง๋ค Gaussian Splats์ ๋ฌด๊ฒ์ค์ฌ(barycentric coordinates)์ ํ์ฉํ์ฌ ๋ฐฐ์นํฉ๋๋ค.
1. 1๊ฐ์ Gaussian splat per ์ผ๊ฐํ
๊ฐ ์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ์ ์ฌ์ฉํ์ฌ Gaussian splat์ ๋ฐฐ์นํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋จ์ผ Gaussian splat์ด ์ผ๊ฐํ์ ์ ์ฒด๋ฅผ ๋ํํ๊ฒ ๋ฉ๋๋ค.
if n_gaussians_per_surface_triangle == 1:
self.surface_triangle_circle_radius = 1. / 2. / np.sqrt(3.)
self.surface_triangle_bary_coords = torch.tensor(
[[1/3, 1/3, 1/3]],
dtype=torch.float32,
device=nerfmodel.device,
)[..., None]
2. 3๊ฐ์ Gaussian splats per ์ผ๊ฐํ
๊ฐ ์ผ๊ฐํ์ ์ค์ฌ๊ณผ ๊ฐ ๋ชจ์๋ฆฌ์ ๊ฐ๊น์ด ์์น์ Gaussian splats๋ฅผ ๋ฐฐ์นํ์ฌ ์ผ๊ฐํ์ ๋ณด๋ค ์ ๋ฐํ๊ฒ ํํํฉ๋๋ค.
if n_gaussians_per_surface_triangle == 3:
self.surface_triangle_circle_radius = 1. / 2. / (np.sqrt(3.) + 1.)
self.surface_triangle_bary_coords = torch.tensor(
[[1/2, 1/4, 1/4],
[1/4, 1/2, 1/4],
[1/4, 1/4, 1/2]],
dtype=torch.float32,
device=nerfmodel.device,
)[..., None]
3. 4๊ฐ์ Gaussian splats per ์ผ๊ฐํ
์ค์ฌ๊ณผ ๊ฐ ๋ชจ์๋ฆฌ์ ๋ํด, ์ผ๊ฐํ ๋ด๋ถ์ ๋ค๋ฅธ ๋ ์ ์๋ Gaussian splats๋ฅผ ์ถ๊ฐ๋ก ๋ฐฐ์นํฉ๋๋ค.
if n_gaussians_per_surface_triangle == 4:
self.surface_triangle_circle_radius = 1 / (4. * np.sqrt(3.))
self.surface_triangle_bary_coords = torch.tensor(
[[1/3, 1/3, 1/3],
[2/3, 1/6, 1/6],
[1/6, 2/3, 1/6],
[1/6, 1/6, 2/3]],
dtype=torch.float32,
device=nerfmodel.device,
)[..., None] # n_gaussians_per_face, 3, 1
4. 6๊ฐ์ Gaussian splats per ์ผ๊ฐํ
๋์ฑ ์ด์ดํ๊ฒ ์ผ๊ฐํ ๋ด๋ถ์ Gaussian splats๋ฅผ ๋ฐฐ์นํ์ฌ ์ผ๊ฐํ์ ๋์ฑ ์ ๋ฐํ๊ฒ ํํํฉ๋๋ค.
if n_gaussians_per_surface_triangle == 6:
self.surface_triangle_circle_radius = 1 / (4. + 2.*np.sqrt(3.))
self.surface_triangle_bary_coords = torch.tensor(
[[2/3, 1/6, 1/6],
[1/6, 2/3, 1/6],
[1/6, 1/6, 2/3],
[1/6, 5/12, 5/12],
[5/12, 1/6, 5/12],
[5/12, 5/12, 1/6]],
dtype=torch.float32,
device=nerfmodel.device,
)[..., None]
๊ฒฐ๋ก
์ด๋ฌํ ๋ฐฉ์์ ํตํด ๋ชจ๋ธ์ surface mesh์ ๋ํ ์ผ์ ๋ณด๋ค ์ ํํํ ์ ์์ผ๋ฉฐ, Gaussian splats์ ์์ ๋ฐฐ์น ๋ฐฉ๋ฒ์ ์กฐ์ ํจ์ผ๋ก์จ ๋ชจ๋ธ์ ํํ๋ ฅ์ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ธ์ ํ์ต๊ณผ ๋ ๋๋ง ํ์ง์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
sugar_model.py
์์ surface_mesh์ binding๋ ๋ชจ๋ gaussian๋ค์ densities ์ด๊ธฐํ ๋ฐฉ๋ฒ
if self.binded_to_surface_mesh and (not learn_surface_mesh_opacity):
all_densities = inverse_sigmoid(0.9999 * torch.ones((n_points, 1), dtype=torch.float, device=points.device))
self.learn_opacities = False
else:
all_densities = inverse_sigmoid(0.1 * torch.ones((n_points, 1), dtype=torch.float, device=points.device))
self.all_densities = nn.Parameter(all_densities,
requires_grad=self.learn_opacities).to(nerfmodel.device)
self.return_one_densities = False
ํ๋ผ๋ฏธํฐ ์ค๋ช ๋ฐ ์ญํ
- self.binded_to_surface_mesh: Gaussian๋ค์ด surface mesh์ ๋ฐ์ธ๋ฉ๋์ด ์๋์ง๋ฅผ ๋ํ๋ ๋๋ค.
- learn_surface_mesh_opacity: surface mesh์ ์กด์ฌํ๋ Gaussian๋ค์ ๋ถํฌ๋ช ๋(opacity)๋ฅผ ํ์ตํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ถํฌ๋ช ๋๋ฅผ ํ์ตํ์ง ์์ผ๋ฉด, ๋ถํฌ๋ช ๋ ๊ฐ์ด ๊ณ ์ ๋ ์ฑ๋ก ์ ์ง๋ฉ๋๋ค.
Gaussian๋ค์ด surface_mesh์ binding ๋์ด์๋์ง ์ฌ๋ถ์ surface_mesh_opacity ํ์ต ์ฌ๋ถ์ ๋ฐ๋ฅธ ๋ชจ๋ gaussian๋ค์ densities ์ด๊ธฐํ ๋ฐฉ๋ฒ
- CASE 1:
self.binded_to_surface_mesh
๊ฐ ์ฐธ์ด๊ณlearn_surface_mesh_opacity
๊ฐ ๊ฑฐ์ง์ผ ๋if self.binded_to_surface_mesh and (not learn_surface_mesh_opacity): all_densities = inverse_sigmoid(0.9999 * torch.ones((n_points, 1), dtype=torch.float, device=points.device)) self.learn_opacities = False
- surface mesh์ ๋ฐ์ธ๋ฉ๋์ด ์๊ณ , surface mesh์ opacity๋ฅผ ํ์ตํ์ง ์๋๋ก ์ค์ ๋์ด ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ชจ๋ Gaussian๋ค์ density๊ฐ์ 0.9999๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ์ญ ์๊ทธ๋ชจ์ด๋ ํจ์๊ฐ ์ ์ฉ๋์ด ๋งค์ฐ ํฐ ์์ ๊ฐ์ด ๋ฉ๋๋ค. ์ด๋ ๋ฐ๋๊ฐ ๋งค์ฐ ๋์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ๋ชจ๋ ๊ฐ์ฐ์์๋ค์ densities ๊ฐ์ ๋งค์ฐ ๋์ ๊ฐ์ผ๋ก ์ค์ ํ์ฌ ํ๋ฉด์ด ๊ฑฐ์ ์์ ํ๊ฒ ๋ถํฌ๋ช
ํ๊ฒ ๋ง๋ญ๋๋ค.
- ์๋ฏธ: Gaussian๋ค์ด surface mesh์ ๊ณ ์ ๋์ด ์์ผ๋ฉฐ, Gaussian๋ค์ opacities ๊ฐ๋ค์ด ํ์ตํ ํ์๊ฐ ์์์ ๋ํ๋ ๋๋ค.
- surface mesh์ ๋ฐ์ธ๋ฉ๋์ด ์๊ณ , surface mesh์ opacity๋ฅผ ํ์ตํ์ง ์๋๋ก ์ค์ ๋์ด ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ชจ๋ Gaussian๋ค์ density๊ฐ์ 0.9999๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ์ญ ์๊ทธ๋ชจ์ด๋ ํจ์๊ฐ ์ ์ฉ๋์ด ๋งค์ฐ ํฐ ์์ ๊ฐ์ด ๋ฉ๋๋ค. ์ด๋ ๋ฐ๋๊ฐ ๋งค์ฐ ๋์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ๋ชจ๋ ๊ฐ์ฐ์์๋ค์ densities ๊ฐ์ ๋งค์ฐ ๋์ ๊ฐ์ผ๋ก ์ค์ ํ์ฌ ํ๋ฉด์ด ๊ฑฐ์ ์์ ํ๊ฒ ๋ถํฌ๋ช
ํ๊ฒ ๋ง๋ญ๋๋ค.
- CASE 2: ๊ทธ ์ธ์ ๊ฒฝ์ฐ (Gaussian๋ค์ด surface mesh์ ๋ฐ์ธ๋ฉ๋์ง ์์๊ฑฐ๋, surface mesh์ ์กด์ฌํ๋ Gaussian๋ค์ opacity๋ฅผ ํ์ตํ๋ ๊ฒฝ์ฐ)
else: all_densities = inverse_sigmoid(0.1 * torch.ones((n_points, 1), dtype=torch.float, device=points.device)) self.learn_opacities = True
- Gaussian๋ค์ด surface mesh์ ๋ฐ์ธ๋ฉ๋์ง ์์๊ฑฐ๋, surface mesh์ ์กด์ฌํ๋ Gaussian๋ค์ ๋ถํฌ๋ช
๋(opacity)๋ฅผ ํ์ตํ๋๋ก ์ค์ ๋ ๊ฒฝ์ฐ์
๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ชจ๋ Gaussian๋ค์ density๊ฐ์ 0.1๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ์ญ ์๊ทธ๋ชจ์ด๋ ํจ์๊ฐ ์ ์ฉ๋์ด ์์ ๊ฐ์ด ๋ฉ๋๋ค. ์ด๋ ๋ฐ๋๊ฐ ๋ฎ์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ. ๋ชจ๋ Gaussian๋ค์ densities ๊ฐ์ ๋ฎ์ ๊ฐ์ผ๋ก ์ด๊ธฐํํ์ฌ Gaussian๋ค์ opacities๋ฅผ ํ์ตํ๋๋ก ํฉ๋๋ค.
- ์๋ฏธ: Gaussian๋ค์ด surface mesh์ ๊ณ ์ ๋์ด ์์ง ์์ผ๋ฉฐ, Gaussian๋ค์ opacieties ๊ฐ๋ค์ด ํ์ต์ ํตํด ์กฐ์ ๋ ํ์๊ฐ ์์์ ๋ํ๋ ๋๋ค.
- Gaussian๋ค์ด surface mesh์ ๋ฐ์ธ๋ฉ๋์ง ์์๊ฑฐ๋, surface mesh์ ์กด์ฌํ๋ Gaussian๋ค์ ๋ถํฌ๋ช
๋(opacity)๋ฅผ ํ์ตํ๋๋ก ์ค์ ๋ ๊ฒฝ์ฐ์
๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ชจ๋ Gaussian๋ค์ density๊ฐ์ 0.1๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ์ญ ์๊ทธ๋ชจ์ด๋ ํจ์๊ฐ ์ ์ฉ๋์ด ์์ ๊ฐ์ด ๋ฉ๋๋ค. ์ด๋ ๋ฐ๋๊ฐ ๋ฎ์ ์ํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ. ๋ชจ๋ Gaussian๋ค์ densities ๊ฐ์ ๋ฎ์ ๊ฐ์ผ๋ก ์ด๊ธฐํํ์ฌ Gaussian๋ค์ opacities๋ฅผ ํ์ตํ๋๋ก ํฉ๋๋ค.
Leave a comment