레퍼런스 영상에서는 춤만 가져온다 — LTX-2.5 댄스 쇼츠를 상용 품질로 끌어올린 네 가지 수정
LTX-2.5 프로덕션 리포트
발행일: 2026년 9월 15일
개요
LTX-2.5 IC-LoRA로 댄스 쇼츠를 만든다. 레퍼런스 댄스 영상에서 동작을 뽑고, 그 동작을 우리 캐릭터 이미지에 입혀 30fps 세로 영상으로 렌더하는 파이프라인이다. LTX-2.5는 고해상도 영상을 적은 메모리로 빠르게 뽑는다는 장점이 분명했다. 하지만 몇 초짜리 데모와 20~30초짜리 상용 쇼츠 사이에는 해결하지 못한 프로덕션 문제가 쌓여 있었다.
이 글은 그 문제들을 며칠 동안 하나씩 닫은 기록이다. 결론부터 적으면 네 가지를 바꿨다.
문제
증상
바꾼 것
레퍼런스 의상이 새어 나옴
치마·스타킹 캐릭터의 종아리에서 머리카락 같은 줄이 자람
뎁스 가이드 → 스켈레톤 가이드
긴 체인의 색 흐름
뒤로 갈수록 천장이 녹색으로 흐르고 머리색이 바램
브리지마다 구도 맞춘 키프레임 기준 색 보정 + 인물 밝기 상한
디지털 풍화
창밖 하늘이 격자·얼룩으로 뭉개짐
브리지마다 배경 되돌리기
머리 위 연기·후광
인물 머리 둘레에 어두운 연기가 떠 있음
인물을 통째로 지운 고정 배경판 + SAM 인물 마스크
0. 원칙 하나: 레퍼런스에서 무엇을 가져오는가
모든 수정은 제품 오너가 정한 원칙 하나에서 나왔다.
레퍼런스 영상 속 캐릭터의 배치, 프레임 내 위치, 크기, 스켈레톤, 안무, 포즈 는 따라가고, 색감, 밝기, 색상, 외모, 의상, 정체성, 체형 은 원본 캐릭터를 따라가야 한다. 레퍼런스 영상은 해부학적 정보와 안무만 따른다.
말로는 당연하다. 그런데 파이프라인을 뜯어 보면 레퍼런스의 외형 정보가 새어 들어가는 통로가 여러 개 였다. 아래 네 절은 그 통로를 하나씩 막은 이야기다.
1. 뎁스 가이드는 의상 실루엣까지 실어 나른다
증상
치마에 스타킹을 신은 캐릭터로 렌더했더니, 3초 후반부터 종아리와 다리에서 분홍색 줄이나 머리카락 같은 가닥이 여러 군데 솟아났다. 레퍼런스 영상의 무용수는 끝이 벌어진 나팔 청바지 를 입고 있었다. 가닥은 바로 그 청바지 윤곽을 따라 자라는 것처럼 보였다. 다른 소스에서도 레퍼런스 스커트 모양을 따라가는 흔적이 나왔다.
그림 1: 뎁스 가이드는 의상 실루엣(왼쪽)을 포함하지만, 스켈레톤 가이드(오른쪽)는 순수하게 동작 정보만 전달한다.
원인
안무 조건으로 넣던 가이드는 뎁스(깊이) 영상 이었다. 뎁스는 관절만이 아니라 몸의 표면 전체 를 담는다. 나팔 청바지의 벌어진 밑단도 깊이 윤곽으로 들어간다. 모델은 캐릭터 이미지에 없는 그 윤곽을 무언가로 채워야 했고 , 그 결과가 가닥이었다.
수정
가이드를 ViTPose가 뽑은 몸·손·머리 막대 스켈레톤 으로 바꿨다. 스켈레톤에는 관절 위치와 뼈대만 있고 옷의 표면은 없다. 원칙의 "해부학적 정보와 안무만"에 정확히 맞는 신호다.
가닥이 나오던 소스에서 시드 셋 기준 가닥 수 10·7·10 → 0·0·0
대가: 손가락 이상은 조금 많아지는 방향 이었다. 사람이 가린 판정으로 확인한 대가이고, 오너가 알고 받아들였다.
덤: 뎁스 추정 모델(비상업 라이선스)과 손 뎁스 보강 단계를 통째로 건너뛴다.
한 가지 함정이 더 있었다. 이름이 비슷한 "스켈레톤 가이드 옵션"은 스켈레톤을 그려 넣는 기능이 아니었다. 뎁스 가이드에서 뼈대 둘레 밖의 뎁스를 약하게 만드는 후처리 였다. 이 옵션을 켜면 무릎 아래 가닥이 두 시드에서 10/10으로 났고, 끄면 0/10이었다. 뼈대 둘레만 남긴 뎁스도 결국 표면 윤곽을 싣고 있었던 것이다. 그래서 이 옵션은 끄고, 가이드 자체를 뎁스 없는 스켈레톤으로 바꿨다.
2. 이어 붙일 때마다 색이 흐른다
구조
한 번에 렌더할 수 있는 길이에는 한계가 있다. 그래서 57프레임 조각을 여러 개 만들고, 앞 조각의 마지막 프레임을 다음 조각의 시작 이미지(브리지)로 넘겨 잇는다. 20초면 브리지가 열 번 넘게 생긴다.
증상
브리지를 거칠 때마다 색이 조금씩 옮겨 가서, 뒤로 갈수록 천장이 녹색으로 흘렀다. 처음에는 첫 브리지를 색 기준으로 삼았지만, 그 기준 자체가 이미 조금 흐른 상태였다.
그림 2: 프레임이 진행될수록 색상 정보가 왜곡되어 천장이 녹색으로 변하고 머리색이 바래는 현상.
수정 1 — 기준을 원본으로
과거 음악 영상 체인에서 같은 문제를 푼 코드가 있었다. 일정 간격마다 원본 이미지의 색 분포와 밝기로 되돌리는 방식이다. 원본 이미지로 모든 것을 재설정하지는 않고, 색 분포와 밝기만 가져온다. 기준 이미지는 레퍼런스 구도에 맞춰 스테이징한 키프레임 으로 정했다. 매 브리지를 그 키프레임에 Reinhard 색 전달(70%)과 히스토그램 매칭(30%)으로 맞춘다.
수정 2 — 인물 밝기 상한
기준을 키프레임으로 바꾸자 새 문제가 나왔다. 브리지 순간의 구도가 키프레임과 크게 다르면(예: 팔이 얼굴을 가리는 순간) 히스토그램 매칭이 인물을 끌어올렸다. 한 소스에서 인물 밝기가 한 번에 +23 (L 채널) 뛰었고, 그 뒤로 머리색이 금발에서 흰빛으로 바랬다.
그래서 보정이 인물 밝기를 k 넘게 옮기면 보정 강도를 k/|ΔL|로 줄인다. k=6은 임의로 고른 값이 아니다. 보정 없이 렌더한 원시 영상 여섯 편에서 인물 밝기의 자연 프레임 변동(널 분포 p95)을 재니 중앙값이 ≈5.9였다. 즉 "보정 한 번이 자연 변동 이상으로 인물 밝기를 옮기지 않게" 하는 값이다.
대가로 창밖이 조금 밝아지고 얼굴 채도가 약간 빠진다(최종본 기준 −11). 오너가 판정에서 확인하고 받아들였다.
3. 디지털 풍화: 밝기로는 못 고치는 것
색을 잡고 나니 다른 결함이 드러났다. 창밖 하늘이 격자 모양으로 뭉개지고 얼룩이 쌓였다. 오너는 이렇게 판정했다. "이건 밝기 보정으로 못 고친다."
그림 3: 반복적인 VAE 인코딩/디코딩으로 인해 배경의 하늘이 격자무늬와 얼룩으로 뭉개지는 '디지털 풍화' 현상.
원인 격리
원인 후보는 둘이었다. 브리지 프레임을 H.264로 저장하는 코덱 손실 , 그리고 브리지가 다음 조각의 조건으로 들어갈 때마다 거치는 VAE 인코드·디코드 왕복 이다(LTX VAE는 공간 32×32, 시간 8배로 압축한다). 둘을 떼어 쟀다.
VAE 왕복만 10회 → 체인 거칠기 증가의 0.71 재현
코덱만 → 0.40
주범은 VAE 누적이었다. VAE가 왜 이런 흔적을 남기는지는 이전 글 에 따로 정리했다.
수정 (W2)
풍화가 다음 조각으로 상속되지 않게 끊었다. 매 브리지에서 인물이 아닌 영역을 키프레임 원본 화소로 덮는다. 인물은 브리지의 것을 그대로 둔다. 브리지 인물과 키프레임 인물 둘 다의 둘레 33px 밖 만 배경으로 보고, 8px 페더로 섞는다.
하늘 거칠기 −62% , 인물 곡선 이탈 0
오너 판정: "격자 얼룩이 거의 보이지 않는다"
대가: 카메라가 움직이는 소스에서는 배경이 얼어붙는다. 그래서 카메라 워크가 있는 소스에서는 자동으로 끈다.
같은 시기에 시도했다가 나빠짐으로 닫은 것 도 있다. 무손실로 이음매 뽑기, 잠재 공간에서 바로 이어받기, 브리지마다 배경을 인페인트하기다. 브리지마다 인페인트하는 방식은 인페인트 결함이 브리지 수만큼 쌓여 모자이크가 됐다.
4. 머리 위의 연기: 인물을 통째로 지운 배경판
하늘이 깨끗해지자 원래 있던 결함이 더 잘 보였다. 인물 머리 위, 창살 근처에 어두운 연기 같은 번짐 이 떠 있었다. 오너 메모는 이랬다. "머리 주변 후광이 이질감이 난다. 바닥 배경도 조금씩 달라진다."
그림 4: 키프레임에서 인물을 제거해 배경판(P)을 만들고, SAM 마스크를 이용해 새 프레임의 인물을 배경판 위에 정교하게 합성하는 과정.
왜 W2로는 안 되나
W2는 키프레임 속 인물 자리 를 되돌리지 않는다. 그 자리에는 키프레임의 인물이 서 있으니, 되돌리면 유령이 생기기 때문이다. 연기는 정확히 그 자리, 키프레임 인물의 정수리 근처에서 났다. 그 자리를 넘기면 연기가 남고, 되돌리면 창 너머 건물이 지워진다.
오너의 방향: "배경 인페인트를 초기 프레임으로 고정하자"
브리지마다 인페인트하면 결함이 쌓인다(3절). 그래서 인페인트는 작업당 한 번만 한다. 키프레임에서 인물을 통째로 지운 빈 방 한 장(배경판 P) 을 만들고, 브리지에서는 그 화소를 합성만 한다.
빈 방 한 장 만들기가 생각보다 어려웠다. 실패한 시도를 순서대로 적는다.
시도
결과
Qwen 편집에 "사람 없는 같은 방" 지시
방을 다시 구도 함(인물 밖 영역 평균 화소차 29)
렌더 프레임들의 중앙값
관문 통과 못 함(표본 오염으로 계열을 닫음)
LaMa 단독
소파·벽 영역이 번지고 녹은 면 으로 남음
LaMa → Qwen 부분 디노이즈(0.5·0.7)
LaMa의 번짐을 그대로 물려받음
LaMa refine → Qwen 마스크 인페인트(denoise 1.0)
통과 : LaMa가 구조(창살·소파 선)를, Qwen이 질감을 맡음
중간에 구현 버그 도 하나 있었다. 인물 마스크 속 구멍을 메우려고 flood fill을 (0,0) 한 점에서만 시작했다. 그랬더니 뻗은 팔과 몸, 화면 가장자리에 둘러싸인 실제로 보이는 소파 약 10만 화소 가 "구멍"으로 먹혔다. 1px 테두리를 두르고 바깥에서 채우도록 고치자 마스크가 화면의 55.5%에서 46.3%로 줄었고, 소파가 살아났다.
마스크가 인물을 지킨다: selfie 대 SAM
배경판을 쓰면 키프레임 인물 자리도 되돌리므로 , 브리지 인물을 지키는 것은 브리지 인물 마스크 하나 뿐이다. 여기서 두 번째 실패가 나왔다.
처음에는 가벼운 MediaPipe selfie 세그멘터를 썼다. 이 마스크는 검은 장미 무늬 치마의 큰 덩이를 인물 밖으로 놓쳤다. 놓친 치마는 배경판, 즉 빈 소파로 덮였다. 가린 판정에서 치마에 소파 조각이 덮인 칸이 기준 1칸 → 16칸 이었고, 등록한 규칙에 따라 "나빠짐"으로 읽었다.
마스크를 GroundingDINO + SAM ("person")으로 바꾸고 구멍 메움과 33px 팽창을 붙였다(W6c).
측정
현행(W2)
selfie 마스크(W6a)
SAM 마스크(W6c)
하체 인물 손상 칸
1
16
1
머리 둘레 연기 점수 합
16
—
1
이음매 배경 튐(현행 대비)
×1
×1.43
×1.17
머리 둘레 후광 화소 지표
×1
×1.06
×0.91
SAM이 인물이라고 한 화소 중 배경판으로 덮인 화소는 브리지 7장 모두 0 이었다. 같은 앵커를 selfie로 합성했다면 장당 111~47,245화소가 덮였을 자리다.
정직하게 적어 둘 한계
머리 둘레 판은 결론을 못 냈다. 같은 그림을 두 번 넣은 12쌍 중 4쌍에서 판정자의 답이 갈렸고, 미리 등록한 "판정 흔들림" 문턱에 닿았다. 16 → 1은 큰 차이지만 규칙대로 "받치지 못함"으로 적었다. 채택은 오너가 영상을 직접 보고 결정했다.
판정자가 앞 판을 이미 봤다. 모양이 같은 칸은 앞 판과 같게 매겼다고 스스로 밝혔다.
대부분의 측정이 한 소스·한 시드·8조각 에서 나왔다. 그래서 세 소스 프로덕션 최종본으로 다시 확인한다.
마스크 밖으로 날리는 머리카락 끝 은 배경판에 덮인다.
비용: 배경판은 작업당 약 2분(LaMa CPU 약 1분 + Qwen), SAM은 브리지당 5~10초(렌더 시간의 약 4%).
프로덕션으로 옮기면서 하나를 더 발견했다. LaMa refine은 돌릴 때마다 결과가 달랐다. 특징 공간에서 Adam을 15번 도는 최적화라, 같은 입력 두 판의 평균 화소차가 0.02~0.22였다. 배경판은 체인 내내 쓰는 한 장이라 시드를 고정했고, 그 뒤로 같은 입력 두 판은 차 0 이 됐다. 합성 단계는 연구 판과 화소 최대차 0 으로 옮겼다.
5. 이 속도로 결정할 수 있었던 이유: 판정 절차
며칠 사이에 스무 개 넘는 개입을 채택하거나 닫았다. 그게 가능했던 것은 모델보다 판정 절차 덕이 컸다.
맹검 판 : 조건 이름을 지운 크롭을 섞어 판정자에게 준다. 키는 봉인해 폴더 밖에 둔다.
중복 쌍을 심는다 : 같은 그림을 두 번 넣으면 판정자의 잡음 바닥을 공짜로 얻는다. 위의 "결론 못 냄"이 바로 이 쌍에서 나왔다.
양성·음성 계측기를 심는다 : 결함이 확실한 칸과 확실히 깨끗한 칸이다. "58칸 전부 없음" 같은 0은 양성 대조가 12/12로 잡힌 뒤에야 믿었다.
읽는 규칙은 네 갈래로 미리 등록한다 : 좋아짐 · 안 움직임 · 나빠짐 · 바닥이 결론을 못 받침 . 규칙 밖 결과는 해석하지 않고 "규칙에 없다"로 신고한다.
개수 가드 : 답지 줄 수, 파싱 수, 봉인 키 항목 수가 하나라도 다르면 채점기가 수를 내지 않고 멈춘다. 파싱 한 글자 차이로 26줄이 조용히 빠져 "100%"가 나온 적이 있다.
요청문 오염을 적는다 : 판정 요청에 "치마 손상" 같은 결함 이름이 들어가면 확증력이 약해진다. 그런 일이 있으면 숨기지 않고 결과 옆에 적었다.
정답지 주인은 오너다 : 세 세션이 같은 이름을 붙이고 셋 다 틀린 적이 있다. 최종 채택은 늘 오너가 영상을 보고 했다.
남은 일
세 소스 프로덕션 최종본 확인(진행 중)
손가락 뭉개짐: 스테이지1 격자가 손가락보다 크다(손가락 하나가 VAE 격자 0.77칸). 조건이나 프롬프트로는 못 고치는 층이라, 손 영역을 따로 고해상도로 렌더하는 방향이 남아 있다.
치마 밑단의 짧은 올: 스켈레톤 가이드에서도 한 소스에 남아 있다.
긴 AI 영상의 품질은 모델 한 번의 성능보다 이어 붙이는 층에서 무엇이 새어 들어가고 무엇이 쌓이는지 가 결정했다. 레퍼런스에서는 춤만 가져오고, 나머지는 매 이음매에서 원본으로 되돌린다. 이번 작업을 한 줄로 줄이면 그렇다.