Skip to content

헬창이 되고 싶은 현동이의 플랭크 자세를 과연 3D로 만들어 박제시킬 수 있을까?

Notifications You must be signed in to change notification settings

yyongjae/PlankHyundong

 
 

Repository files navigation

logo


All Contributors

Hits

🇰🇷 한국어 / 🇬🇧 English


플랭크 현동 3D

헬스보이 현동이가 알려주는 정확한 플랭크 자세! 헬창이 되고 싶은 사람들은 NeRF모델을 이용해 뽑은, 현동이 피규어를 요리조리 살펴보고 자신과 비교하며 운동해보는건 어떨까? 🏋🏻

데이터야놀자 2022 프로젝트 설명 발표영상 / 발표자료


최종 결과물

최종 결과물 (실제 피규어), 결과물 정성평가 NeRF 3D 표현

목차


빠른 시작

Open In Colab

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 프린터로 최종 결과물을 뽑아냅니다.

아래에서는 파이프라인 각각에 대해 설명합니다.


1️⃣ 피사체 동영상 촬영하기

권장, 360도 촬영
이 프로젝트에서 촬영한 방법

➕ 촬영 권장사항과 주의사항은 다음을 확인해주세요!


2️⃣ 비디오로부터 이미지 샘플링하기

Open In Colab

  • 스크립트를 이용해 촬영한 비디오를 이미지로 등간격 샘플링합니다.
  • ✅ 카메라 트래젝토리가 길다면 더 잘게 잘라 주는 것이 좋습니다.
  • ❗ 카메라 트래젝토리가 짧고 렌즈를 열어두는 시간이 짧은 경우, 동영상으로부터 이미지를 너무 잘게 샘플링한다면 성능에 악영향을 미칠 수 있습니다.

➕ 자세한 파라미터는 다음을 확인해주세요!


3️⃣ 이미지에 대한 카메라 포즈 구하기

Open In Colab

NOTE: 반드시 GPU 런타임을 사용해야 합니다.

  • NeRF 의 입력은 (이미지, 카메라포즈) 의 집합입니다.
  • 커스텀 이미지로부터 이미지 각각에 해당하는 카메라 포즈를 계산하기 위해 COLMAP을 기반으로 동작하는 LLFF 저자의 스크립트를 사용합니다.
  • 실행이 완료되면 데이터셋 폴더 안에 NeRF 모델을 실행시키는 데 필요한 poses_bounds.npy 파일이 생성됩니다.

➕ LLFF 환경 구축에 어려움이 생기면 다음을 확인해주세요!


4️⃣ NeRF 모델 학습시키기

Open In Colab

NOTE: 반드시 GPU 런타임을 사용해야 합니다.

학습 옵션

옵션 역할
--no_ndc, --spherify, --lindisp forward facing scene 에서는 필요하지 않지만, 360 scene 에 대해서는 반드시 사용해야 하는 플래그입니다.

결과

RGB RGB_still disparity

➕ wandb 연동과 nerf 파라미터 실험 결과를 알고 싶다면 다음을 확인해주세요!


5️⃣ NeRF 모델로부터 Mesh 만들고 다듬기

Mesh 만들기

Open In Colab

NOTE: 반드시 GPU 런타임을 사용해야 합니다.

  • NeRF 모델로 학습시킨 학습시킨 모델을 로드한 뒤, PyMCubes 패키지를 통해 표면(iso-surface)을 추출하고 그 결과물인 3d.obj 파일을 저장하는 단계입니다.
  • 학습된 NeRF 모델의 3D 표현(implicit representation)을 시각화 하기 위해 pyrender 을 이용해 turntable.mp4 영상을 생성합니다.
  • 이 노트북의 출처는 NeRF 공식 저장소입니다.

Mesh 다듬기

  • 시뮬레이터를 통해 수집한 데이터가 아니라 직접 수집한 데이터를 통해 NeRF 모델을 학습시켰기 때문에 추출한 mesh에 노이즈가 많을 수 있습니다.
  • 이 경우 3d 프린터로 출력 전 blender로 직접 노이즈를 제거해주어야 합니다.

➕ 메쉬 만들기와 관련된 파라미터의 실험 결과와 데이터에 따른 mesh 다듬기 유의사항을 알고 싶다면, 다음을 확인해주세요!


6️⃣ 피규어 인쇄하고 후가공하기

피규어 인쇄하기

슬라이서 소프트웨어 출력 중인 모습

➕ 3D 프린터 옵션 실험 결과를 알고 싶다면 다음을 확인해주세요!

인쇄된 피규어 후가공하기

before after
라프트 제거

환경

Google COLAB WandB Tensorflow (1.15.x)
Blender Sindoh 3DWOX1/DP203


YongJae Cho

📖 💻

dusruddl2

📖 💻

Sumyeong-Jang

📖 💻

Janghoo Lee

📖 💻

cmoweg

📖 💻

logo-color.png

About

헬창이 되고 싶은 현동이의 플랭크 자세를 과연 3D로 만들어 박제시킬 수 있을까?

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages

  • Jupyter Notebook 100.0%