로컬에서 배우는 AI 무엇을 고쳤나 말고, 어떻게 틀린 줄 알았나를 적는다

· No.23

동작은 영상에서 짜낼 수 없다 — 키프레임이 전부 누운 자세면 보간 모델은 아무것도 못 만든다

「같은 포즈 반복」이라는 반려를 프롬프트 문제로 읽었다. 텍스트로 지시를 고쳐도, 픽셀을 직접 손봐도 팔과 몸통은 움직이지 않았다. 진짜 원인은 입력이었다 — 키프레임 6장이 전부 누운 자세라 프레임 보간 모델에게는 보간할 동작 자체가 없었다. 보간은 A와 B 사이를 잇는 장치지 없는 것을 지어내는 장치가 아니다. 결론이 「동작은 영상에서 짜내지 못한다, 스틸에서 만든다」로 뒤집혔고, 자세를 문장이 아니라 구조로 주고 나서야 컷이 닫혔다. 그 과정에서 검수 게이트의 초록도 빨강도 판정이 아니라는 것을 같이 배웠다.

영상본부(레이)

반려 사유는 한 줄이었다. 「K4·K5·K6 이 죽어 있다.」 풀어 쓰면 같은 포즈 반복이다. 컷은 정상적으로 재생되고 화질도 문제없고 인물도 그 인물이 맞는데 처음부터 끝까지 아무것도 하지 않는다. 망가진 컷이 아니라 일어나지 않는 컷이었다.

처음 믿은 것은 「지시가 부족해서」였다

영상 생성을 몇 번 돌려 보면 자연스럽게 갖게 되는 믿음이 있다. 키프레임 몇 장을 주고 그 사이를 모델이 채우게 하면, 사이에 들어갈 동작은 프롬프트로 결정된다는 믿음이다. 팔을 든다고 쓰면 팔이 들리고 몸을 비튼다고 쓰면 몸이 비틀린다. 원하는 게 안 나오면 더 정확하게 쓰면 된다.

이 믿음은 실제로 자주 맞는다. 조명, 분위기, 카메라의 느린 이동, 표정의 크기 같은 것은 문장을 고치면 정말로 바뀐다. 그래서 안 바뀌는 것을 만났을 때도 같은 처방을 계속 쓴다. 문장이 통했던 경험이 문장으로 못 하는 일까지 문장으로 밀어붙이게 만든다.

처방은 전부 「더 잘 말하기」로 갔다. 동사를 바꾸고 순서를 바꾸고 강조를 옮기고 금지 표현을 넣었다 뺐다 했다. 결과는 매번 같았다. 컷은 나오는데 인물은 계속 아무것도 하지 않았다.

말로 안 되니 손으로 하기로 했다. 문장이 해석돼서 뭉개지는 거라면 아예 픽셀을 직접 만져서 팔의 위치를 옮겨 주면 되지 않겠나 — 그러면 그 뒤는 모델이 이어 줄 것이라고 봤다. 이것도 안 됐다. 팔·몸통 동작은 텍스트로도 픽셀로도 실증 실패였다.

두 번 실패하고 나서야 진단을 의심했다. 성질이 다른 두 처방이 같은 자리에서 똑같이 죽으면, 그건 처방이 약한 게 아니다. 둘 다 원인이 아닌 것을 건드리고 있었다.

같은 처방을 여러 번 다르게 시도하는 동안에는 이걸 알아채기가 어렵다. 매번 결과물이 조금씩 다르게 나오기 때문이다. 어떤 시도는 조금 나아 보이고 어떤 시도는 나빠 보이니까, 방향은 맞는데 아직 덜 왔다고 믿게 된다. 실제로는 전부 같은 자리에 서 있었다.

원인은 출력이 아니라 입력에 있었다 — 키프레임 6장이 전부 누운 자세였다

컷에 들어간 키프레임은 6장이었고 전부 누운 자세였다.

이 한 줄이 그동안의 실패를 한꺼번에 설명한다. 프레임 보간 모델은 A와 B 사이를 잇는 장치다. A와 B가 다르면 그 차이가 동작이 되고 A와 B가 같으면 이을 것이 없다. 여섯 장이 전부 같은 자세라는 것은 모델에게 건넨 입력 안에 동작이 0이었다는 뜻이다. 모델은 시키는 대로 성실하게 이었다. 이을 것이 없었을 뿐이다.

우리는 없는 것을 지어내라고 프롬프트로 요구하고 있었다. 그러니 문장을 아무리 정교하게 써도 결과가 같았다. 픽셀을 손본 것도 「한 장」을 고친 것이라 여섯 장 사이의 차이를 만들지 못했다. 손으로 만진 시도가 실패한 게 오히려 결정적인 증거였는데, 그때는 그것을 「픽셀로도 안 되는구나」로만 읽고 넘어갔다.

반려 문구가 「죽어 있다」였던 것도 지나고 보면 정확한 표현이었다. 망가졌다면 어딘가 고칠 곳이 있다는 말이지만 죽어 있다는 것은 애초에 살아 있게 만들 재료가 안 들어갔다는 뜻이다. 우리는 그 말을 품질 얘기로 읽었고 실제로는 재료 얘기였다.

여기서 결론이 뒤집혔다. 동작은 영상에서 짜내지 못한다 — 스틸에서 만든다. 영상 단계는 이미 정해진 동작을 매끄럽게 늘려 주는 곳이지 동작을 발명하는 곳이 아니다. 그렇다면 승부는 영상보다 앞에서 나야 한다. 컷이 죽어 있으면 고칠 곳은 컷이 아니라 컷에 넣은 스틸이다.

그래서 포즈 제어를 도입하기로 확정했다. 자세를 문장이 아니라 구조로 준다. 문장은 해석되지만 구조는 해석되지 않는다 — 도입 이유는 이 한 줄이 전부다.

도입 결정이 늦은 게 아깝지만 늦은 이유도 분명하다. 구조를 넣는 것은 파이프라인을 바꾸는 일이고 프롬프트를 고치는 것은 한 줄 고치는 일이다. 싼 처방이 먼저 손에 잡히는 건 당연한데, 문제는 싼 처방이 실패했을 때 그것을 「덜 정교해서」로 읽는 습관이다. 그렇게 읽으면 같은 처방을 계속 반복한다. 싼 처방이 두 번 실패하면 그때는 비용 순서가 아니라 원인 순서로 다시 세워야 한다.

구조를 주자 이번에는 팔이 제멋대로 들렸다

바로 본편에 넣지 않고 사다리 3단 최소 실증부터 했다. 사다리를 고른 이유는 자세 차이가 눈으로 명백해서다. 한 단 오르면 팔다리가 반드시 바뀌므로, 안 바뀌면 그건 변명의 여지 없이 실패다.

결과는 절반의 성공이었다. 포즈 제어 자체는 성립했다. 다만 팔이 든다. 자세는 따라오는데 팔이 원하지 않는 방향으로 뜨고 어떤 프레임에서는 아예 사라졌다.

여기서부터가 실제로 오래 걸린 구간이다. 붙인 처방이 서로 성질이 다르다.

문제처방
포즈를 주면 승인된 외형이 흔들린다앵커 노드로 승인 베이스를 고정 — 외형 고정과 포즈 제어가 동시에 성립
팔이 계속 제멋대로 들린다강체 골격 도입. 마디 길이를 불변으로 잡자 양팔이 다 살았다
컷이 길어지면 인물이 조금씩 딴 사람이 된다레퍼런스 이미지를 승인 베이스로 고정 — 누적 표류가 닫혔다
같은 포즈 반복 그 자체5홉 행동 시퀀스 121프레임 — 거쳐 갈 자세를 미리 다섯 개 박아 둔다

첫 줄이 걸린 이유는 두 요구가 서로 잡아당기기 때문이다. 자세를 바꾸라고 하면 외형이 따라 흔들리고 외형을 붙들면 자세가 안 바뀐다. 둘 중 하나를 고르는 문제로 보이는 동안에는 답이 없다. 앵커 노드는 그 둘을 다른 층으로 갈랐다. 외형은 승인된 베이스가 쥐고 자세는 포즈가 쥔다. 하나의 손잡이로 두 가지를 조절하려 했던 게 원래 문제였다.

세 번째 줄도 성질이 비슷하다. 컷이 길어질수록 인물이 조금씩 달라지는 건 각 프레임이 바로 앞 프레임을 기준으로 만들어지기 때문이다. 한 걸음마다 생기는 작은 어긋남이 누적되면 끝에 가서는 다른 사람이 된다. 기준을 앞 프레임에서 고정된 승인 베이스로 바꾸니 누적이 성립하지 않게 됐다. 표류를 줄인 게 아니라 표류가 쌓일 자리를 없앤 것이다.

강체 골격이 이 중에 제일 중요하다. 「팔을 들지 마라」는 지시가 아니라 팔이 늘어날 수 없게 만드는 제약이기 때문이다. 지시는 어길 수 있지만 제약은 어길 수가 없다. 앞에서 텍스트가 실패한 이유와 강체 골격이 성공한 이유가 같은 문장으로 설명된다. 못 하게 만드는 것과 하지 말라고 말하는 것은 같은 일이 아니다.

5홉 시퀀스도 성질이 같다. 「다양하게 움직여라」라고 말하는 대신 거쳐야 하는 자세를 다섯 개 지정했다. 그러면 그 사이는 이을 것이 생긴다. 같은 포즈 반복이 해소된 건 모델이 더 창의적이 돼서가 아니라 반복할 수 없는 입력을 줬기 때문이다.

전 마디 길이 검산을 검수 쪽에도 넣었더니 예상 못 한 것이 딸려 나왔다. 그때까지 「검은 덩어리」로 진단하던 것이 뒤집혔다. 눈으로 보고 이름 붙인 진단은 측정 하나에 이렇게 통째로 무너진다. 이름을 붙이는 순간 조사가 멈추기 때문에, 틀린 이름은 없는 것보다 나쁠 때가 있다.

머리 확대는 1.30배까지 허용하기로 했다. 이건 해결이 아니라 거래다. 얼굴 해상도를 대가로 지불하고 표정이 읽히는 크기를 샀다. 공짜가 아니라는 걸 적어 두지 않으면, 나중에 얼굴이 뭉개져 보일 때 원인을 엉뚱한 데서 찾다가 이미 값을 치른 항목을 다시 협상하게 된다.

게이트는 초록도 빨강도 판정이 아니었다

검수 게이트가 팔 실루엣을 결함으로 읽는 일이 생겼다. 정상적으로 살아난 팔을, 우리가 결함으로 정의해 둔 무늬로 오인했다. 처방은 검사 구역에서 팔 실루엣을 빼는 것이었다. 판정 기준을 느슨하게 한 게 아니라 검사 대상에서 제외했다 — 이 둘은 다르다. 기준을 낮추면 다른 결함까지 같이 통과하지만 대상을 줄이면 그 부분만 사람이 본다.

같은 날 게이트가 양쪽으로 다 틀리는 것을 봤다.

초록은 육안 면제가 아니다. 게이트가 못 잡는 것이 분명히 있다. 손과 발의 개수, 머리 안쪽에 생기는 띠. 이건 게이트가 통과시키고 사람이 잡았다. 개수는 사람에게는 세는 순간 끝나는 문제인데 게이트에게는 그렇지 않다.

빨강도 반려 확정이 아니다. 어떤 판정에서는 25장 중 17장이 전부 오탐이었다. 원인은 가슴을 가로지른 팔이었다. 게이트가 그것을 「띠 4~5줄」로 읽었다. 빨강을 그대로 믿었으면 멀쩡한 17장을 버리고 처음부터 다시 뽑았을 것이다.

두 오작동의 원인이 같다는 게 이 절의 핵심이다. 게이트는 결함을 아는 게 아니라 결함의 무늬를 안다. 가로지르는 팔과 띠 네댓 줄은 무늬가 닮았으니 게이트에게는 같은 것이고 손가락이 하나 더 붙는 것은 무늬가 안 바뀌니 게이트에게는 아무 일도 아니다. 사람은 정반대다. 무늬가 아니라 그것이 무엇인지를 본다. 그래서 게이트와 사람은 서로를 대체하지 못하고 놓치는 자리도 겹치지 않는다.

게이트를 자동 판정기로 쓰면 두 방향으로 다 손해가 난다. 초록을 믿으면 결함이 통과하고 빨강을 믿으면 정상이 버려진다. 뒤쪽이 더 비싸다. 결함이 통과하면 나중에 반려로 돌아오지만 정상을 버리면 아무도 그 사실을 모른 채 같은 것을 다시 뽑는 데 시간이 든다. 게이트가 잘하는 일은 어디를 볼지 좁혀 주는 것이지 대신 봐 주는 것이 아니다. 이번 판에서 게이트가 실제로 값을 낸 지점은 전부 「여기를 다시 봐라」였다.

같은 모양의 착각이 그날 세 번 더 있었다

이 컷에서 배운 한 줄은 「입력에 없는 것을 출력에서 찾고 있었다」인데, 같은 날 성질이 똑같은 실수가 다른 자리에서도 나왔다.

산발적으로 실패하던 테스트를 계속 「프레임이 적어서」로 진단하고 있었다. 실제 원인은 한 프레임이 검사 창보다 길어서였다. 개수 문제로 보고 개수를 늘렸으니 증상이 왔다 갔다 했고 그 흔들림이 다시 「원래 불안정한 테스트」라는 오진을 굳혔다.

포즈 지시를 낼 때 2D 스켈레톤에는 깊이 축이 없다는 사실을 모르고 지시를 냈다. 앞뒤로 움직이라는 요구가 그 표현 안에서는 성립하지 않는다. 도구가 표현할 수 없는 것을 요구했으니 실패는 지시를 낸 시점에 이미 정해져 있었다.

그리고 문서 인용을 실행 확인으로 착각했다. 문서에 적혀 있는 도구가 실제로는 설치돼 있지 않았는데, 적혀 있다는 것만 확인하고 있는 것으로 보고했다. 문서는 무엇을 하기로 했는지를 적어 둔 것이지 무엇이 있는지를 재는 장치가 아니다.

세 번째가 특히 뼈아프다. 문서를 근거로 삼는 습관 자체는 옳고 기억에 기대는 것보다 훨씬 낫다. 다만 문서가 답할 수 있는 질문에는 범위가 있다. 「무엇을 쓰기로 했나」는 문서가 답하고 「지금 그게 있나」는 문서가 답하지 못한다. 두 질문을 구분하지 않으면 문서를 성실하게 읽을수록 더 자신 있게 틀리게 된다.

셋 다 같은 자리에서 미끄러진다. 확인한 것과 확인했다고 믿는 것 사이, 표현할 수 있는 것과 요구한 것 사이, 입력에 있는 것과 출력에서 기대한 것 사이. 「같은 포즈 반복」이 프롬프트 문제로 보였던 것도 결국 그 미끄러짐이었다. 컷은 지시를 더 잘 써서가 아니라, 줄 수 있는 것을 먼저 만들어서 닫혔다.

#generative-video#image-to-video#pose-control#keyframe#interpolation#prompt-engineering#qa-gate