헬스보이 현동이가 알려주는 정확한 플랭크 자세! 헬창이 되고 싶은 사람들은 NeRF모델을 이용해 뽑은, 현동이 피규어를 요리조리 살펴보고 자신과 비교하며 운동해보는건 어떨까? 🏋🏻
데이터야놀자 2022 프로젝트 설명 발표영상 / 발표자료
최종 결과물 (실제 피규어), 결과물 정성평가 | NeRF 3D 표현 |
---|---|
PlankHyundong/
├── nerf_quick_start.ipynb
├── notebooks
│ ├── nerf_colab.ipynb
│ ├── nerf_wandb_colab.ipynb
│ ├── colmap_colab.ipynb
│ ├── extract_mesh_colab.ipynb
│ └── sampling_colab.ipynb
└── data
├── video
│ └── video.MOV
├── (images)
│ └── ...
└── (logs)
└── ...
- notebook 폴더에는 최종 결과물을 만드는 파이프라인에 필요한 노트북이 각각 저장되어 있습니다.
- 전체 워크플로를 빠르게 훑어볼 수 있도록
nerf_quick_start.ipynb
이라는 단일 노트북을 제공합니다. nerf_quick_start.ipynb
은 총 4단계로 이루어져 있으며 구성은 다음과 같습니다.
step | content |
---|---|
1️ | Video Sampling : 비디오로부터 이미지 샘플링하기 |
2️ | Run COLMAP to get camera pose : 이미지에 대한 카메라 포즈 구하기 |
3️ | Run NeRF : NeRF 모델 학습시키기 |
4️ | Get Mesh file : NeRF 모델로부터 Mesh 만들고 다듬기 |
- 필요한 데이터는
data/video/video.MOV
의 경로에 있습니다. - 처음 부분에 해당 폴더를 clone받는 셀을 추가해두었습니다.
- 위 폴더에
images
,logs
라는 하위 폴더를 생성합니다. 각 폴더에는 샘플링한 이미지들과 config, mesh, weight 및 영상 파일 등이 저장됩니다.
output | 설명 | |
---|---|---|
1️⃣ | RGB 비디오 | 피사체를 가운데에 두고 촬영자가 360도로 회전하며 영상을 수집합니다. |
2️⃣ | N * RGB 이미지 세트 | 비디오를 샘플링하여 이미지들을 얻어냅니다. |
3️⃣ | N * 카메라 포즈 세트 | 카메라 포즈는 NeRF 학습에 필요합니다. 2️⃣ 에서 샘플링된 이미지들에 LLFF를 수행합니다. |
4️⃣ | 학습된 NeRF 모델 파일 | NeRF 모델을 학습시킵니다. NeRF 모델에 담긴 3D 표현을 implicit 3D 표현이라고 합니다. |
5️⃣ | 메쉬 오브젝트 파일 | implicit 3D 표현에 메쉬를 적용합니다. 'explicit' 3D 표현의 형태로 변환합니다. |
6️⃣ | 3D 프린터 인쇄 파일 | 슬라이서 소프트웨어를 이용합니다. 3D 프린터의 파라미터를 세팅하고 인쇄 준비를 마칩니다. |
6️⃣ | 3D 프린터로 출력한 피규어 | 3D 프린터로 최종 결과물을 뽑아냅니다. |
아래에서는 파이프라인 각각에 대해 설명합니다.
권장, 360도 촬영 |
---|
이 프로젝트에서 촬영한 방법 |
➕ 촬영 권장사항과 주의사항은 다음을 확인해주세요!
- 스크립트를 이용해 촬영한 비디오를 이미지로 등간격 샘플링합니다.
- ✅ 카메라 트래젝토리가 길다면 더 잘게 잘라 주는 것이 좋습니다.
- ❗ 카메라 트래젝토리가 짧고 렌즈를 열어두는 시간이 짧은 경우, 동영상으로부터 이미지를 너무 잘게 샘플링한다면 성능에 악영향을 미칠 수 있습니다.
➕ 자세한 파라미터는 다음을 확인해주세요!
NOTE: 반드시 GPU 런타임을 사용해야 합니다.
- NeRF 의 입력은 (이미지, 카메라포즈) 의 집합입니다.
- 커스텀 이미지로부터 이미지 각각에 해당하는 카메라 포즈를 계산하기 위해 COLMAP을 기반으로 동작하는 LLFF 저자의 스크립트를 사용합니다.
- 실행이 완료되면 데이터셋 폴더 안에 NeRF 모델을 실행시키는 데 필요한
poses_bounds.npy
파일이 생성됩니다.
➕ LLFF 환경 구축에 어려움이 생기면 다음을 확인해주세요!
NOTE: 반드시 GPU 런타임을 사용해야 합니다.
옵션 | 역할 |
---|---|
--no_ndc , --spherify , --lindisp |
forward facing scene 에서는 필요하지 않지만, 360 scene 에 대해서는 반드시 사용해야 하는 플래그입니다. |
RGB | RGB_still | disparity |
---|---|---|
➕ wandb 연동과 nerf 파라미터 실험 결과를 알고 싶다면 다음을 확인해주세요!
NOTE: 반드시 GPU 런타임을 사용해야 합니다.
- NeRF 모델로 학습시킨 학습시킨 모델을 로드한 뒤,
PyMCubes
패키지를 통해 표면(iso-surface)을 추출하고 그 결과물인3d.obj
파일을 저장하는 단계입니다. - 학습된 NeRF 모델의 3D 표현(implicit representation)을 시각화 하기 위해
pyrender
을 이용해turntable.mp4
영상을 생성합니다. - 이 노트북의 출처는 NeRF 공식 저장소입니다.
- 시뮬레이터를 통해 수집한 데이터가 아니라 직접 수집한 데이터를 통해 NeRF 모델을 학습시켰기 때문에 추출한 mesh에 노이즈가 많을 수 있습니다.
- 이 경우 3d 프린터로 출력 전 blender로 직접 노이즈를 제거해주어야 합니다.
➕ 메쉬 만들기와 관련된 파라미터의 실험 결과와 데이터에 따른 mesh 다듬기 유의사항을 알고 싶다면, 다음을 확인해주세요!
슬라이서 소프트웨어 | 출력 중인 모습 |
---|---|
➕ 3D 프린터 옵션 실험 결과를 알고 싶다면 다음을 확인해주세요!
before | after | |
---|---|---|
라프트 제거 |
- Google COLAB
- 플랭크현동팀의 모든 실험은 Google COLAB Pro, Google COLAB Pro+ 에서 진행되었습니다.
- 환경에 대한 걱정 없이 실행할 수 있도록 이미 의존성이 모두 스크립트로 정의되어 있는 플랭크현동팀의 노트북들이 준비되어 있습니다.
- Weight and Bias (wandb)
- Local Light Field Fusion (LLFF), COLMAP
- Tensorflow 1.15
- NeRF 공식 저장소와 NeRF 공식 저장소를 수정하여 wandb 가 자동으로 연결되도록 수정한 저장소는 TensorFlow 1.15 를 사용합니다.
Google COLAB | WandB | Tensorflow (1.15.x) |
---|---|---|
Blender | Sindoh | 3DWOX1/DP203 |
---|---|---|
YongJae Cho 📖 💻 |
dusruddl2 📖 💻 |
Sumyeong-Jang 📖 💻 |
Janghoo Lee 📖 💻 |
cmoweg 📖 💻 |
- 이 프로젝트는 all-contributors 스펙을 준수합니다. 어떤 기여이든 상관없이 환영합니다!
- 세종대학교 인공지능 동아리 SAI
- 프로젝트 칸반