| name | tha3-head-rotation |
| description | 마스터 1장 → THA3(Talking Head Anime 3) 신경망으로 자연스러운 머리 좌우턴/끄덕임 자산 추출. 핵심은 신경망 내부 appearance-flow(editor grid_change) 텐서를 직접 export해 맥 네이티브 cv2.remap 워프 + 리그 디포머 변위로 재사용. 트리거 — "머리 회전", "고개 돌리기/끄덕임", "THA3", "flow 텐서 추출", "head rotation", "2D 머리 턴", "appearance flow", "원본화질 회전 자산". 2026-06-20 008 아카네로 flow export end-to-end 실증(L1=0.0055 검증). |
THA3 머리회전 — flow 텐서 추출 (AUTORIG-INOCHI2D-ABSORB-001)
2D 머리 큰턴/끄덕임은 정면 픽셀 워프로 원리적 불가(새 면이 드러남 → 어안왜곡/디졸브, [[angle-artwork-swap-abandoned]]). 해법 = THA3 신경망이 같은 이미지 1장을 회전시키되, 그 내부 appearance-flow(변위장)를 직접 빼와 맥에서 원본 마스터를 워프 = 원본화질 + 진짜 회전 + GPU 불요 런타임.
⚠️ 이 스킬은 flow 추출까지가 검증 완료(durable). 하류(reveal 자산·디포머·배포)는 R&D 진행 중(§7).
전제
- THA3는 맥 미지원(Nvidia 필수) → Colab T4로 추출만 하고 끔. 추출 후 워프/구동은 전부 맥 네이티브.
colab (google-colab-cli, ~/.local/bin/colab), ADC 인증(~/.config/gcloud/application_default_credentials.json). 명령은 --auth adc.
- 가중치 = Dropbox zip 834MB →
data/models/{standard_float,...}. standard_float = 선명 모델(separable_half는 화질 나쁨, 거부됨).
- 참조 구현:
experiments/autorig-character-008/tha3_out/ — export_head_tha3.py(VM export)·flow_warp.py(맥 워프)·reveal_regions.py. 새 캐릭터는 입력 이미지만 갈면 됨.
1. Colab 세션 + THA3 셋업
export PATH="$HOME/.local/bin:$PATH"
colab --auth adc new -s tha3 --gpu T4
colab --auth adc exec -s tha3 -f <local.py> --timeout 900 로 로컬 파이썬을 VM서 실행. upload 명령 없음 → 바이너리(입력 이미지)는 base64를 파이썬 문자열로 임베드해 exec로 VM에 기록.
2. 입력 준비 (crypko 표준 프레이밍)
THA3 입력 = 512² RGBA, 얼굴 crypko 표준위치. rembg(u2net)로 흰배경 제거(흰셔츠 보존) → 얼굴크기 매칭 + 중심정렬해 512 캔버스 합성. 008 프레이밍 상수: s=106/313≈0.339; offset=(round(257-509*s), round(156-261*s)). 결과 PNG를 base64 → VM /content/akane_b64.txt.
3. flow export (핵심)
export_head_tha3.py 가 하는 일 (검증된 규약):
load_poser("standard_float", cuda), extract_pytorch_image_from_PIL_image(pil, scale=2, offset=-1) → [4,512,512] in [-1,1].
- pose = 45차원 0벡터,
head_x=39(pitch)·head_y=40(yaw) 세팅. 인덱스는 get_pose_parameter_groups()로 조회 + 39/40 교차검증. (pose 1D, 배치 아님)
- 7×7 grid: head_x·head_y ∈ [-1,1] 7스텝(±1≈±15° gentle).
- 프레임마다 2회 호출:
poser.pose(img,pose,0)=최종이미지[4,512,512], poser.pose(img,pose,4)=editor grid_change[2,512,512].
- output_index=4 =
editor_07.GRID_CHANGE_INDEX. all_outputs서 editor가 맨앞이라 절대 인덱스도 4. (rotator grid_change는 7=editor5개+rotator2; editor 것이 원본→최종 전체 flow라 이게 정답.)
- 저장: 이미지
out_img/r{i}_c{j}.png, flow out_flow/r{i}_c{j}.npy(float16).
colab --auth adc exec -s tha3 -f export_head_tha3.py --timeout 600
colab --auth adc download -s tha3 /content/tha3_export.zip ./tha3_export.zip
colab --auth adc stop -s tha3
4. 자체검증 + 맥 워프 (성역: ground truth)
export 스크립트가 1프레임에서 flow를 입력에 grid_sample 적용→실제 출력과 L1 비교. align_corners·sign 변종을 다 돌려 최저 선택. 확정 규약: sampling_grid = base_grid + grid_change, sign=+1, L1≈0.005면 정확(=editor grid_change가 전체 변환 flow임 증명). L1이 크면 잘못 — 인덱스/규약 재확인.
맥 워프(flow_warp.py, cv2.remap, GPU 불요):
flow=[2,H,W] (ch0=x, ch1=y, 정규화[-1,1])
src_px = x + flow_x*(W-1)/2 ; src_py = y + flow_y*(H-1)/2
remap(src_resized_to_S, map_x, map_y, INTER_LINEAR)
검증: flow_warp_check.png 좌(THA3 net 정답)/우(워프) 전 각도 일치 확인. neutral flow median|mag|≈0.005(거의 identity, max는 배경코너 outlier).
5. flow 사용처 (왜 텐서로 빼나)
- 원본화질 워프 — flow를 고해상 마스터에 적용(정규화라 해상도 무관) → 512 소프트 출력 대신 원본 픽셀이 모션대로 이동. 알파=THA3 실루엣, RGB=원본.
- ★리그 디포머 변위 — flow를 파트별 메시 정점 변위로 변환 → 프레임블렌드가 아닌 진짜 메시 리깅(입·표정 물리와 합침). (주인님 통찰)
- 표정/입/눈 — 같은 export 루틴에서 pose의 나머지 다이얼(눈썹·입·눈)도 베이크 가능(45dim 전부 노출).
- 런타임 블렌드 — 7×7 프레임 이중선형 블렌드(슬라이더/웹캠),
tha3_slider.html 참조.
트러블슈팅 (실제 겪은 것)
| 증상 | 원인 | 해결 |
|---|
colab list 없음 | 명령은 ls | colab ls / 세션 sessions.json(~/.config/colab-cli) |
| 바이너리 업로드 불가 | upload 명령 없음 | base64 문자열 임베드 → exec로 VM에 기록 |
| 화질 나쁨 | separable_half 모델 | standard_float 사용 |
| flow가 회전 재현 못함 | 잘못된 output_index/규약 | editor index=4, base+gc sign+1, L1로 검증 |
| neutral flow 큰 값 | 배경코너 outlier | median |
| 정면픽셀 워프 어안/디졸브 | 따로 생성한 뷰 합성 시도 | 금지 — THA3 flow만이 정답([[angle-artwork-swap-abandoned]]) |
6. 산출물 / 증거
- flow 49장:
tha3_out/grid_change_flow/*.npy, net 이미지: grid7_net/, 원천(THA3 standard): grid7_hq/.
- 검증:
flow_warp_check.png, export 로그 L1=0.0055.
- SPEC:
docs/ref/rnd/AUTORIG-INOCHI2D-ABSORB-001.md. 메모리 [[tha3-head-rotation-breakthrough]].
7. 한계 / 다음 (R&D)
- gentle 한정: 단일 앞면 워프라 완전 옆모습(새 면)은 불가. ±15° 자연스러움.
- reveal 구멍(미해결): 회전 시 가려졌던 부위(정수리·턱밑·먼볼) 소스 없음 → 이제 정확 flow로 "입력 밖 샘플링" 픽셀을 계산 검출 → reveal 자산 저작(학습 불필요, THA3 추론만).
- 디포머 변환·배포: flow→메시 키폼→기존 리그(물리·입·표정) 통합→정적 웹앱+웹캠. 수렴 시 이 스킬에 §추가.