https://github.com/Anttwo/Frosting?tab=readme-ov-file
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 시키는 명령문을 작성해보면, 잘 학습되는것을 확인할 수 있습니당.