Taste Distillation (취향 증류)
이 독립형 스킬은 scripts/ 디렉토리에 구현체를 제공합니다. 이후 생성된 또는 로컬 테이크 편집에는 taste-application을 사용하세요. 각 명명된 장르는 자체 팩에 보관하세요. Flash Ethereal의 측정값을 Fluid Sketch 또는 3D Cyber Glitch에 대해 묵시적으로 재사용하지 마십시오. 측정된 0은 유효한 데이터입니다. 빈 필드와 구분하십시오.
로컬 종속성은 scripts/requirements.txt에 있습니다. 별도로 승인된 제공자 작업을 위해서는 scripts/requirements-live.txt, 자격 증명 및 명시적인 TASTE_FORGE_ALLOW_LIVE=1이 필요합니다. --dry-run은 자격 증명을 읽거나 작업을 제출하지 않습니다. 워크플로가 로컬 엔드포인트 이름에서 저장되었다고 추론하지 마십시오. 실제 제공자측 워크플로 또는 요청 증거를 사용하십시오.
참조 비디오를 스타일 팩으로 변환합니다. 즉, 이후 단계에서 결정론적으로 소비하는 측정값과 에셋이 포함된 폴더입니다.
활성화 시기 (When to Activate)
- "이 클립들의 룩을 캡처해 줘" / "분위기를 증류해 줘" / "이걸 반복 가능하게 만들어 줘"
- 사용자가 참조 영상을 가지고 있고 LUT, 그레이드 또는 일치하는 페이싱을 원할 때
- 장르별로 구분된 룩 라이브러리를 구축할 때
- 답변이 원래 "프롬프트로 스타일을 설명해"였을 모든 요청
핵심 발견 (The Core Finding)
프롬프트는 그레이드를 전달할 수 없습니다. 측정만이 가능합니다.
실제 영상에서 측정된 결과: 세 번의 유료 생성에서 색상 방향을 강화했을 때 미드톤 a*가 +1.9 → +2.8 → +0.3으로 이동한 반면, 목표는 +24.9였습니다. 대비는 34.7 목표에 대해 ~19를 벗어나지 않았습니다. 측정된 팩을 동일한 영상에 적용한 결과, 크로마 MAE는 1.88, 대비는 33.7로 단 한 번의 결정론적 패스에 무료로 달성되었습니다.
따라서 분할은 다음과 같습니다: 모델은 콘텐츠, 모션 및 조명 구조를 제공하고, 팩은 룩을 제공합니다. 생성 프롬프트의 색상 단어는 쓸모없을 뿐만 아니라 비용이 들며 렌더를 LUT가 원하는 중립 기준에서 멀어지게 만듭니다. 프롬프트에 명시적으로 말하십시오: "색상: 없음. 중립으로 렌더링. 그레이딩은 이후 적용됨."
팩 구성 (What a Pack Contains)
stylepacks/<genre>/
grade.json 측정된 색상 통계 (아래 참조)
cadence.json 감지된 모든 샷 경계 + 파생된 분포
look.cube 33^3 LUT, Resolve에 노드 LUT로 직접 드래그
spec.json VLM 설명, 측정값에 기반
grounding.txt VLM에 제공된 측정된 사실
stills/ 가장 긴 샷의 전체 해상도 프레임 (컨디셔닝 이미지)
plates/ 검정 위에 추출된 스크린 블렌드 오버레이 요소
props/ 생성된 GLB 메시
pack.json 매니페스트
실행 방법 (Running It)
python mint.py --genre <name> --refs a.mov b.mov c.mov # 오프라인, API 키 불필요
python distill.py --genre <name> # VML 호출 한 번
mint.py는 순수한 수치 분석입니다. 네트워크, 키, 결정론적 작업이 없으므로 팩을 백업 대신 재생성할 수 있습니다.
중요한 측정값 (The Measurements That Matter)
전역이 아닌 루미넌스 영역별 크로마 (Chroma by luminance zone, not globally)
색상 정체성은 보통 하나의 루미넌스 밴드에 있습니다. 전역 a*/b* 오프셋은 수학적으로 split-toning을 나타낼 수 없습니다. 영역 내에서 크로마를 측정하십시오 (L* 에지 [0,15,35,55,75,100]).
실제 시그니처: L*25에서 바이올렛 (a* +24.9, b* −17.5), 양쪽 끝은 거의 중립. 가장 어둡고 가장 밝은 영역만 보고하면 "균일한 색조"로 나타납니다. 항상 전체 곡선을 출력하십시오.
평균 + 표준편차 대신 중앙값 + MAD (Median + MAD, never mean + std)
실제 참조 세트의 크로마는 강한 오른쪽 편향을 가집니다. 한 측정 릴에서 평균 미드톤 크로마는 36.9였고 중앙값은 17.5였습니다. 따라서 평균 기반 LUT는 재료가 정당화하는 것보다 ~3배 더 강하게 색상을 밀어냅니다.
대비는 흰색-검정이 아닌 std(L*) (Contrast is std(L*), not white minus black)
거의 모든 실제 영상에서 흰색-검정 범위는 ~100이며 아무것도 구분하지 못합니다.
배경 비율은 일급 통계량 (Background share is a first-class statistic)
L*10 미만 픽셀의 비율을 기록하십시오. 분포의 어떤 모멘트도 이를 볼 수 없습니다. 클립이 올바른 평균, 표준편차 및 크로마를 가질 수 있지만 검은색이 회색으로 올라갔을 수 있습니다. 이것이 바로 MAE 1.88 / 대비 33.7을 기록하면서 실제 프레임이 진흙탕 보라색이었던 등급이 발생한 방식입니다.
측정 전 인터페이스 마스킹 (Mask the interface before measuring)
화면 녹화 참조에는 정적 요소(레터박스 바, 상태 표시줄, 좋아요 아이콘, 캡션 텍스트)가 포함됩니다. 이 모든 것이 통계에 룩인 것처럼 포함됩니다. 검은색 막대는 그림자 가중치를 부풀리고, 빨간 하트는 a*를 마젠타 방향으로 왜곡합니다. 시간적 분산은 이를 깔끔하게 분리합니다 — 영상은 움직이고 인터페이스는 움직이지 않습니다. 따라서 수동 조정된 크롭이 필요하지 않습니다. 실제 자료에서 이는 ~65%의 픽셀을 유지합니다.
케이던스는 적응형 임계값 필요 (Cadence needs an adaptive threshold)
올바른 콘텐츠 감지기 임계값은 재료에 따라 다릅니다. 고대비 액션 참조는 30에서도 충분히 컷을 감지하지만, 분위기 있는 영상은 컷을 숨깁니다. 하강하는 임계값을 스윕하고 가장 민감한 설정이 찾는 샷의 ≥90%를 여전히 복구하는 가장 높은 임계값을 취하십시오. 이는 실제 컷을 노이즈보다 선호합니다. 터무니없는 컷 속도(>100/분)를 암시하는 임계값은 거부하십시오. 연속적인 카메라 움직임은 모든 프레임에서 감지기를 트리거합니다.
전체 스윕을 공유된 StatsManager로 한 번의 디코드 패스로 실행하십시오. 기본 버전은 임계값당 다시 디코드하며, 60fps 소스에서는 초와 분의 차이를 만듭니다.
오버레이 플레이트: 스크린샷이 아닌 에셋 (Overlay Plates: Assets, Not Screenshots)
스틸은 전체 프레임입니다. 하나를 합성하면 단순히 다른 그림을 위에 놓는 것입니다. 플레이트는 참조의 그래픽 어휘(플레어, 스트릭, 글리치 조각)를 검정 위에 추출하여 키잉 없이 스크린 블렌드되도록 한 것입니다.
실제 자료에서 발생한 두 가지 함정:
- 절대 임계값은 실패합니다. 밝은 참조에서
L>55 AND 크로마>12선택은 프레임의 ~90%를 차지하며, "플레이트"는 사진입니다. 여기에는 알아볼 수 있는 얼굴이 포함됩니다. 백분위수(~상위 3%)로 선택하고 프레임의 ~22% 이상을 덮는 플레이트는 거부하십시오. - 밝기가 아닌 분리도로 순위를 매기십시오. "밝고 채도가 높은 픽셀의 비율"은 세탁된 프레임을 상위에, 하나의 강렬한 플레어가 있는 검은 프레임(실제 시그니처)을 하위에 배치합니다.
p99.5(에너지) / 중앙값(에너지)로 점수를 매기십시오.
또한 점수 매기기 전에 마스킹하십시오. 각인된 타이포그래피는 밝고 채도가 높으며 대비가 높으므로 마스킹되지 않은 실행은 다른 사람의 타이틀 카드의 완벽한 플레이트를 생성합니다.
VLM 접지 (Grounding the VLM)
설명을 요청하기 전에 측정값을 시스템 프롬프트에 주입하십시오. 접지되지 않은 VLM은 +24.9 a* 색조가 있는 영상에 대해 "눈에 띄는 색보정 없음, 중립"이라고 보고합니다. 접지되면 색조를 올바르게 설명하고 보조 악센트를 독립적으로 추론합니다.
모호한 단어(varied, mixed, dynamic, some, often, neutral, or)를 금지하십시오. 모델은 "다양한 조명"을 렌더링할 수 없습니다. 프롬프트뿐만 아니라 코드에서도 금지를 적용하십시오. 실행 3회 중 약 1회에서 위반되었습니다. 필드별로 다시 질문하고, N번 시도 후 가장 덜 모호한 답변을 유지하십시오. 실패하지 마십시오.
사용자에게 언급할 가치가 있는 주의 사항: 스펙이 측정값에 접지되면 더 이상 측정값에 대한 독립적인 확인이 아닙니다.
LUT 베이킹 주의 사항 (LUT Baking Gotchas)
- LUT는 픽셀별 RGB 함수만 인코딩할 수 있습니다. 분포에 의존하는 모든 것(히스토그램 매칭, 백분위수 앵커)은 베이킹 전에 상수로 축소되어야 합니다. 그렇지 않으면 영상 대신 균일한 LUT 그리드를 묵시적으로 측정합니다.
cv2.cvtColor(LAB2RGB)는 내부적으로 클램핑되므로, 이를 사용한 OOG(Out Of Gamut) 테스트는 0%를 보고합니다. Lab→linear sRGB를 수동으로 변환하십시오. 실제 측정값은 83.3% OOG였습니다.- 크로마 전송은 오프셋으로, 아핀(affine)이 아닙니다. 아핀은 소스 σ로 나누어 과도하게 확대됩니다. 실제 영상에서 b*를 −17.5 목표에 대해 +11.6으로 뒤집었습니다. 오프셋은 MAE를 6.23에서 2.13으로 낮췄습니다.
- 영역 압축(Gamut compression)은 동일한 MAE에 대해 3.8배의 런타임 비용이 발생했습니다. 선택 사항으로 만드십시오.
안티 패턴 (Anti-Patterns)
| 하지 말아야 할 것 | 이유 |
|---|---|
| 합성 테스트 영상에 대해 튜닝 | 한 프로젝트에서 네 가지 잘못된 결론을 초래했으며, 실제 영상이 모든 것을 뒤집었음 |
| MAE만 신뢰 | 1.88 MAE는 시각적으로 손상된 프레임에서 성공으로 보였음 |
| 크로마에 평균/표준편차 사용 | 오른쪽 편향, ~3배 과도하게 밀어냄 |
| 엔드포인트 영역만 비교 | 양쪽 끝은 구성상 거의 중립임 |
| 룩을 설명하고 멈춤 | 스펙은 콘텐츠와 구조를 위한 것이며, 팩은 색상을 위한 것임 |
핸드오프 (Handoff)
팩은 인터페이스입니다. 일단 존재하면 taste-application 스킬을 사용하여 생성 및 조립하거나 look.cube를 색보정사에게 직접 전달하십시오.
번들 코드 (Bundled Code)
이 스킬의 scripts/는 의사 코드가 아닌 작동하는 구현입니다. 프로젝트별 가정이 없습니다. 모든 참조 비디오를 가리키면 팩을 생성합니다.
pip install -r scripts/requirements.txt
export FAL_KEY=... # fal을 호출하는 단계에만 필요
모든 네트워크 호출은 TASTE_FORGE_DRY_RUN=1 또는 --dry-run 아래에 스텁되어 있으므로, 계획, 프롬프트, 트랙 레이아웃 및 매니페스트를 비용 없이 검사할 수 있습니다.