본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

역방향 작도는 기하 문제야

~13 min · inverse-problem, geometry, reframe, determinism

Level 0빈 종이
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"각도를 알려주면 상자 그리는 건 아무나 해. 어려운 건 사진만 보고 그 각도를 알아내는 거지."

정방향은 쉽고 역방향은 어렵다

작도 문제에는 방향이 둘 있어. 정방향은 값을 넣어서 그림을 얻는 쪽이야. 3D 렌더러에 머리 모델이랑 yaw 20도, 초점거리를 주면 투영된 그림이 나와. 어떤 그래픽 엔진이든 하는 일이고 별로 안 어려워.

공부에 필요한 건 역방향이야. 흐름이 정반대지. 그림은 이미 있어. 진짜 얼굴 사진 말이야. 여기서 값을 거꾸로 알아내야 해. 어떤 yaw, pitch, roll 이었고 카메라는 어디 있었나? 그 값만 되찾으면 작도는 거기서 저절로 따라 나와. Loomis 가 하는 일이 이 역방향 하나고, 역문제는 원래 정방향보다 훨씬 어렵기로 유명해.

모델한테 그냥 그리라고 하면 안 되나

솔깃한 지름길이 있지. 작도가 그려진 사진 수천 장으로 모델을 훈련시켜서 공이랑 상자를 바로 그리게 하는 거야. 작도처럼 보이는 게 나오긴 해. 근데 그럴듯해 보이는 건 기준이 못 돼. 생성 모델이 맞추는 건 기하학적 일관성이 아니라 그럴듯한 자국이거든. 자기가 칠한 공이 자기가 같이 칠한 턱 각도랑 맞을 이유가 없어. 밑의 구조를 푼 게 아니라 답의 겉모습만 흉내낸 거니까. 믿을 만한 기준이 되는 게 존재 이유인 도구한테 흉내는 실격이야.

정답지는 재현이 돼야 한다

엔진 전체가 이 문장 하나를 지키려고 지어졌어. 재현이 안 되는 정답지는 정답지가 아니다. 기하에 같은 사진을 두 번 넣으면 소수점까지 똑같은 작도가 나와. 몇 년 뒤에 넣어도 똑같고. 사진만 정해지면 답도 정해진다는 뜻이야. 반면 샘플링 온도나 가중치 업데이트가 끼어드는 모델은 그걸 약속 못 해. 화요일에 본 답이 목요일에 달라지는 순간, 그건 이미 대볼 기준이 아니야. 여기서 기하를 고른 이유는 더 화려해서가 아니라 말이 안 바뀌어서야.

기하는 '모르겠다'고 말할 줄 안다

조용한 장점이 하나 더 있어. 얼굴이 너무 돌아갔거나 조명이 landmark 를 먹어버리면 기하는 뻥카를 안 쳐. reprojection error 를 크게 뱉지. 이 fit 은 흔들리니까 덜 믿으라는 신호야. 생성기는 반대야. 아무것도 모르는 상황에서도 구조상 자신 있어 보이는 결과를 내놔. 배우는 사람한테는 정직한 '잘 모르겠어' 가 자신만만한 오답보다 훨씬 값져. 그리고 그 말을 해줄 수 있는 건 기하 쪽뿐이고.

Code

두 방향을 나란히 놓으면·python
# FORWARD: parameters -> picture. Easy. Any 3D renderer does this.
def render(head_model, yaw, pitch, roll, focal):
    posed = rotate(head_model, yaw, pitch, roll)
    return project(posed, focal)          # a picture

# INVERSE: picture -> parameters. Hard. This IS Loomis.
def recover(photo):
    pts2d = detect_landmarks(photo)       # where the features actually landed
    pts3d = CANONICAL_HEAD                 # where they sit on a reference skull
    yaw, pitch, roll, focal = solve_pnp(pts2d, pts3d)   # invert the projection
    err = reprojection_error(pts2d, pts3d, yaw, pitch, roll, focal)
    return (yaw, pitch, roll, focal), err  # the answer AND how much to trust it

# A generator would skip straight to drawing marks that look plausible.
# recover() instead SOLVES for the parameters -- reproducibly, with an error bar.

External links

Exercise

네 분야에서 정방향과 역방향이 짝을 이루는 걸 하나 대봐. 렌더와 파싱, 인코딩과 디코딩, 컴파일과 디컴파일, 합성과 분석 같은 거. 어느 쪽이 더 어려운지, 그리고 그 어려운 쪽 답이 왜 가끔 하나로 안 정해지는지 설명해봐. 마지막으로 그 결과를 믿어야 하는 상황이라면 정확한 방법으로 풀지 학습 모델로 근사할지 골라보고 이유를 붙여.
Hint
정방향은 함수를 그냥 계산하는 거고 역방향은 그걸 거꾸로 푸는 거야. 역방향은 종종 답이 하나로 안 정해져. 서로 다른 원인이 같은 결과를 낼 수 있으니까. 한 사진에서 여러 머리 각도가 비슷해 보이는 것처럼. Loomis 가 focal 탐색 범위를 좁혀둔 이유도 그거고. 결과를 믿어야 한다는 조건이 붙으면 대개 정확한 방법 쪽으로 기울어. 모델 쪽이 만들기 더 쉬울 때도.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.