다니던 회사를 그만두고 대학원 인턴 생활을 시작했다.
9월 22일부터 시작했는데 좀만 더 쉴걸 그랬나
사수분이랑 얘기한 연구주제는 이미지를 기반으로 디폼된 캐릭터를 꺼내오는 것

지금은 시간이 지나서 다이어그램으로 어느정도 정리해본 최적화 파이프라인.
이걸 기반으로 이미지 - 디폼 캐릭터 Ground Truth 데이터셋을 만들어서 디폼된 캐릭터 생성 모델을 만드는게 최종 목표다.
회사 생활을 하다보면 내가 지금 어떤 일을 해야하는지 팀 단위로 목표가 있었고 구성원으로서 할 일을 챙겨갈 수 있었는데 대학원에 와서 인턴 생활을 하면서 처음 느꼈던 감정은 막막함..? 이였던 것 같다. 그래서 이제 뭘 해야하는거지? 이걸 하고 싶으면 이걸 공부하는게 맞는건가?
사실 학부때 인공지능 관련 수업들, 선형대수 수업들 어려워서 공부 안하거나 넘어갔는데 정작 대학원에 와서는 저 두개를 제일 많이 쓰고 있다. (ㅋㅋ; 사람 인생이 어떻게 흘러갈지 모른다더디) 개발자로서의 진로 설정에서부터 대학원생을 바꾸는게 쉬운 결정은 아닌데 6주정도 인턴을 해보니 엄청 안맞지는 않아서?(그렇다고 천직이라는건 아니다) 좀 더 전문가가 되고 싶다는 욕심도 있고.. 내년 가을학기 석사 지원을 향해서 노력해보려고 한다.
인턴 생활을 하고 있는 연구실에서 주마다 세미나를 여는데 이때 아무것도 모르는 상태다 보니 모르는 키워드들이 우다다다 나와서 당황하고 있다. 얼른 공부해서 알아들을 수 있는 단계가 되어야겠다 싶어서 스탠퍼트 강의 CS221이랑 CS231N을 들어보려고 한다. 가을학기 지원 이전에 저 강의 2개랑 영어성적 갱신, 그리고 지금 연구하고 있는것 마무리가 큰 목표다.
앞으로의 목표는 저렇고, 지금까지 해온걸 시간표 대로 적으려고 한다. 나중에는 회고록 양식 같은걸 찾아서 맞춰서 작성해봐야겠다. 여담으로 연구하면서 이것도 해보고 저것도 해보고 하는데 정리가 잘 안 된 상태에서 이걸 어찌저찌 해결해도 어떻게 해결했는지가 너무 분산되어 있어서 모르겠더라. 체계적으로 접근하는? 한단계씩 접근하는 습관을 들여야겠다.
1주차
처음 연구실에 온거라 우선 PC 세팅부터 했다. 우분투로 GUI PC 를 돌리는건 처음이라서 좀 당황했지만, 그래도 어찌저찌 했다. 사실 저때는 한글 설치하는거도 까다로워서 매번 한글 치는 사이트 들어가서 꺼내오고 했다. 한글 키보드를 6주차 후반에야 설치했나? 진작에 할걸 왜 안했는지 모르겠다 ㅋㅋ
이외에도 vscode라던지 이것저것 깔고 논문 인쇄하고 등등 하면서 우선적으로 공부해야할 내용을 파악했다. 베이스라인 논문을 읽기 전에 핵심적인 내용인 MVC 논문을 읽고, 사수분이 작업해보라고 추천해준 프레임워크 사용방법을 배웠다.
MVC 논문에 대한 내용은 블로그에 논문 리뷰로 작성해두었으니 참고.
프레임워크는 아래걸 사용했다.
https://github.com/seokhyeonhong/aPyOpenGL
GitHub - seokhyeonhong/aPyOpenGL: Python framework for motion data manipulation & visualization
Python framework for motion data manipulation & visualization - seokhyeonhong/aPyOpenGL
github.com
opengl을 C++로 만 써봤지 파이썬은 생각도 못하고 있었는데 파이썬으로도 가능했다니 충격이였다. 이러면 맥에서도 시도해볼걸 그랬나?
2주차 ~ 3주차
이때는 MVC 코드를 실제로 완성하고 aPyOpenGL에 구현하는 단계를 밟았다. 잘 돌아가는걸 확인했고, 다른 사수분이 제공해주셨던 코드에서 엣지 케이스를 수정해 PR을 날렸다. 오픈소스 커뮤니티의 기여자가 된 기분? 이후엔 베이스라인 논문을 읽었다.
https://arxiv.org/abs/1909.02807
Real-time Deformation with Coupled Cages and Skeletons
Skeleton-based and cage-based deformation techniques represent the two most popular approaches to control real-time deformations of digital shapes and are, to a vast extent, complementary to one another. Despite their complementary roles, high-end modeling
arxiv.org
Real-time Deformation with Coupled Cages and Skeletons 라는 논문인데 아래 두개가 논문의 핵심 내용이다.


사실 아직 이해 못한 구간 (MEC...etc) 등이 있다. 시간이 되면 저기까지 이해하고 논문 리뷰를 작성해보고 싶다. MVC 논문 리뷰 게시글을 작성하면서 느낀건데 내 언어로 내 자료로 표현해보는게 논문을 이해하는데 큰 도움이 되더라.
2주차는 목요일까지 이 논문만 읽었고 추석이랑 3주차까지는 이 논문을 구현한 리포지토리를 파이썬 언어로 컨버팅하는데 집중했다. 이거 진짜 뼈빠지는줄 알았는데 어떻게든 구현해냈고, 요긴하게 쓰는중이다.
https://github.com/Junhyung-Choi/SACRED
GitHub - Junhyung-Choi/SACRED: SACRED: Skeleton And Cage Real-time Editor/Deformer
SACRED: Skeleton And Cage Real-time Editor/Deformer - Junhyung-Choi/SACRED
github.com
이게 구현한 요소고 원본 리포지토리는 해당 리포지토리 readme에 작성되어있다. 사실 이때까지 MVC를 다시 읽을때마다 헷갈리는 구간들이 있어서 다시 읽고 수정하고 했다. 위에 작성한 PR도 이때 잡아냈던 것 같다. Determinant, Orientation 등에 대한 요소가 엄청 헷갈렸는데 저녁 내내 제미니랑 싸우면서 이해하고 간게 도움이 된 거 같기도 하다
4주차
베이스라인 논문 컨버팅했으니 이걸 이제 플랫폼에 올리는 작업을 진행했다. 다 만들어진줄 알았는데 웬걸 버그 천지였다.
프레임은 1초당 1프레임 나와서 보이지는 않지, 연산자는 안돌지. 대환장 파티였다.
그래서 우선 레스트 포즈랑 모션이 적용된 포즈를 나눠서 보일 수 있는 모드를 만들고 (사실 저 두 모드에 대한 지식이 없어서 어떤게 되야 하는지부터 정의하고 넘어갔던 거 같다) 레스트 포즈 에디팅부터 작업했었다. 이건 MVC연산만 알면 대충 구현할 수 있어서 쉬운 초기 작업이였다

다만 저때는 되게 coarse 한 케이지로 연산자를 돌려봤는데

하나의 케이지 버텍스에 영향받는 소스 버텍스들이 너무 많았나 엄청 튀더라. 이게 내가 연산자를 잘못 작성한줄 알았는데 알고보니 그거까진 아니고 케이지가 너무 엉성해서 그랬던 것 같다


변형이 많이 일어날 관절측에 케이지 버텍스를 많이 배치해두니 어느정도 괜찮은 효과를 보이더라.
다만 4주차의 진짜 적은 회전과 관절이였다. aPyOpenGL은 캐릭터 스키닝을 쉐이더 단에서 처리하고 있었고, 나는 스켈레톤 정보를 케이지로 조정해야 했기에 스켈레톤, 스키닝 작업, 메시 정보들을 전부 다시 한번씩 해야 하는 상황이였다. 이건 진짜로 헬이였는데 GPU에 올라가는것을 가정한 프레임워크를 거의 뜯어고쳐서 메모리를 덮어씌우고 연산을 따로 돌려줘야 하는 작업이였다. 특히 내가 작성한 코드와 프레임워크의 코드가 right-hand rule을 따르는지, left-hand rule을 따르는지, zup인지 yup인지 quaternion은 w,x,y,z 인지 x,y,z,w 인지 따라서 조합이 너무 많아서 CPU에서 케이지를 기반으로 변형된 스켈레톤을 이제 다시 GPU로 넘겨줘야 하는데 값이 이상하게 되는지 캐릭터가 만세를 한다던지 몸이 없어진다거나 팔다리가 다 분해되어 세로로 올라간다거나 렌더링되는 앞뒤가 다르다거나 했다. 진짜 저때는 너무 스트레스 받아서 역류성 식도염이 올라오더라.
거기다가 금요일에 whoami 를 발표하게 되어 그거 준비도 하고 이것저것 해서 결국 그 주는 리타이어 했다 많은 시행착오를 겪고 나니 지금 비슷한 상황을 겪어도 조금은 덜 당황하게 된게 위안 아닌 위안이랄까
사실 whoami 도 순탄치 않았다 화면공유 안되고 피피티 멈추고 ㅋㅋ... 다음에는 발표 준비 열심히 해야지
5주차
CageReverser 연산자까지 마무리하면 베이스라인 논문을 구현 완료했으니 연구 주제를 잡아보려고 했는데 실제로 결과를 보니 잘 안되는 요소가 많았다.
아래는 그 에러와 해결했던 방법들
1. 케이지 Reverser 하고 나면 한쪽다리에 엣지 케이스들이 생기던 이슈
- 그 다리를 횡절단 하는 케이지 페이스가 몰래 숨어있었다. 내 실수.
- 부동소수점 이슈인가 했는데 휴먼 에러였고 (코드는 완벽했다 ㅋㅋ)
2. x,y 변형은 잘먹는데 z가 안먹던 이슈 (스켈레톤이랑 메시 스키닝이 반대로 되던 이슈)
- quaternion 실수부 위치 문제였다
- x,y,z,w 가 예뻐서 (w가 오메가라고 생각했다) 저거 기준으로 작성했는데 aPyOpenGL이 w,x,y,z로 작성되어 있더라. 저거때문에 로테이션 매트릭스가 잘 안나와서 z축이 반전되어 적용되었었다.
3. 케이지 조정시 스켈레톤만 조정하고 메시는 조정 안하던 이슈
- 이건 내가 단순히 놓쳤던거. 원래는 저 파란색 본만 늘어나는게 아니라 오른쪽처럼 머리도 같이 늘어나야 했는데 내가 메시 업데이트를 까먹고 있었다. 다른 사수분이 알려주어서 수정 완료


이걸 화요일까지 디버깅하고 완성해서 이제는 논문 흐름?을 준비했던 것 같다. 개념을 이해하고 다이어그램을 그렸는데 그게 제일 처음에 올려둔 다이어그램.
추가적으로 이때 오픈소스 기여자가 되기도 했다. 무려 3.2k star의 contributor가 되는 영광 아닌 영광을 얻었다고 평가한다 - 라고 말하지만 사실 별거 없다. 그냥 한국어 번역 파일이 없어보여서 추가해서 PR 올려봤는데 받아주더라 ㅋㅋ

이건 나중에 따로 더 후기를 써봐야겠다
6주차
이 글을 쓰고 있는 주차다. 다이어그램에 있는 요소처럼 이제는 렌더러를 기반으로 최적화 스텝을 밟아야 하다보니 Differntiable Renderer를 다루는 시간을 가졌다. 처음엔 nvdiffrast를 써보려고 했는데 이게 너무 로우레벨로 작성되어 있어서 이것저것 데이터를 불러오고 렌더러 설정하고 하려면 까다롭겠더라. 그래서 PyTorch3D 로 변경했다. 튜토리얼 따라하면서 이상한점이 보이길래 이슈도 써뒀는데 이거 읽어주려나 모르겠다
https://github.com/facebookresearch/pytorch3d/issues/2009
Confusing 3D plot visualization in `deform_source_mesh_to_target_mesh.ipynb` · Issue #2009 · facebookresearch/pytorch3d
🐛 Bugs / Unexpected behaviors Hello, I noticed that the 3D plotting function (plot_pointcloud) in the deform_source_mesh_to_target_mesh tutorial uses a confusing visualization setup. The code plots...
github.com
이후 튜토리얼 따라해보면서 사수분이 제공해주신 obj 파일을 불러오고, 이거 스키닝 가중치 뽑아서 모션을 입혀보는 작업을 진행했다.
처음엔 또 파이토치 축이 안맞는거 같아서 고민했지만, 사실 그건 아니였고 plot으로 결과를 띄워보니까 레스트 포즈 초반 위치가 0, root_pos_y, 0이 아니여서 스키닝 연산이 이상하게 먹히고 있던 거였다. bvh 파일 offset을 제거하니 문제 해결.
이거 작업하면서 bvh파일이 어떻게 구성되는지, Forward Kinematics가 어떻게 구현되는지를 깨달았던 것 같다. 컨버팅할때는 제미니 통해서 했는데 다 쓰고 나서 나중에 이해한게 레전드
다만 아직도 LBS에 대해선 완벽히 이해하진 못한거 같다. 이거도 나중에 게시글로 정리해봐야하나.
이제 이미지에서 HMR로 추측한 SMPL을 꺼내와서 작업해야하는데 이게 좀 어렵다. 그냥 SMPL 메시 데이터만 줄 거 같고 조인트 정보를 꺼내와야하는데 방법을 찾아봐야겠지?
그리고 사수분이 제공해주신 모델 파일은 SMPLx 인데 손을 떼버리신건지 22개 조인트고, HMR에선 24개더라. 파이토치 구현을 전부 22개 기준으로 해뒀는데 그냥 24개로 다시 뽑아봐야겠다. 스키닝 웨이트도 다시 추출해야하네 <- 이건 좀 귀찮다
금요일인 오늘은 랩에서 수통골 산책을 다녀왔다. 오리백숙도 먹고 세미나도 듣고 하루가 정말 빨리 간다.
사실 6주도 꽤나 빨리 간거 같다. 시간은 엄청 빠르게 흐르는데, 내 진도랑 학습능률도 빠르게 높아졌으면 좋겠다.
다음주부터는 스터디를 참여하기로 했다. 강의도 들어야 하는데
좀 더 치열하게 살야야겠지?
힘내보자