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은 자격 증명을 읽거나 작업을 제출하지 않습니다. 로컬 엔드포인트 이름에서 워크플로가 저장되었다고 추론하지 마십시오. 실제 제공자 측 워크플로 또는 요청 증거를 사용하십시오.
참조 비디오를 스타일 팩으로 변환합니다: 나중 단계에서 결정론적으로 사용하는 측정값과 에셋이 포함된 폴더입니다.
활성화 시점
- "이 클립들의 룩을 캡처해 줘" / "분위기를 추출해 줘" / "이걸 반복 가능하게 만들어 줘"
- 사용자가 참조 영상을 가지고 있고 LUT, 그레이드, 또는 일치하는 페이싱을 원할 때
- 장르별로 분류된 룩 라이브러리를 구축할 때
- 답변이 "프롬프트로 스타일을 설명하세요"가 될 수밖에 없는 모든 요청
핵심 발견
프롬프트는 그레이드를 제공할 수 없습니다. 측정이 제공할 수 있습니다.
실제 영상에서 측정된 결과: 세 번의 유료 생성에서 컬러 방향을 점진적으로 조정했을 때 미드톤 a*가 +1.9 → +2.8 → +0.3으로 이동한 반면, 목표는 +24.9였고 콘트라스트는 목표 34.7에 대해 ~19를 벗어나지 않았습니다. 측정된 팩을 동일한 영상에 적용한 결과, 크로마 MAE 1.88과 콘트라스트 33.7을 단 한 번의 결정론적 패스로 무료로 달성했습니다.
따라서 구분은 다음과 같습니다: 모델은 콘텐츠, 모션 및 조명 구조를 제공하고, 팩은 룩을 제공합니다. 생성 프롬프트의 컬러 단어는 쓸모없을 뿐만 아니라 비용을 발생시키고 LUT가 원하는 중립 기준에서 렌더를 멀어지게 합니다. 프롬프트에 명시적으로 명시하십시오: "색상: 없음. 중립으로 렌더링. 그레이딩은 이후에 적용됩니다."
팩에 포함된 내용
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 매니페스트
실행 방법
python mint.py --genre <name> --refs a.mov b.mov c.mov # 오프라인, API 키 불필요
python distill.py --genre <name> # VLM 호출 1회
mint.py는 순수 수치 분석입니다 — 네트워크 없음, 키 없음, 결정론적이므로 팩을 백업 대신 재생성할 수 있습니다.
중요한 측정값
전역이 아닌 휘도 영역별 크로마
색상 정체성은 일반적으로 하나의 휘도 대역에 있습니다. 전역 a*/b* 오프셋은 수학적으로 스플릿 토닝을 표현할 수 없습니다. 영역 내 크로마를 측정하십시오 (L* 가장자리 [0,15,35,55,75,100]).
실제 시그니처: L25에서 바이올렛 (a +24.9, b* -17.5), 양쪽 끝에서 거의 중립. 가장 어둡고 밝은 영역만 보고하면 "균일한 캐스트"로 오인됩니다 — 항상 전체 곡선을 출력하십시오.
평균 + 표준편차 대신 중앙값 + MAD
실제 참조 세트의 크로마는 강하게 오른쪽으로 치우칩니다. 한 측정 릴에서 평균 미드톤 크로마는 36.9인 반면 중앙값은 17.5였습니다. 따라서 평균 기반 LUT는 재료가 정당화하는 것보다 약 3배 강하게 색상을 밀어냅니다.
콘트라스트는 흰색-검정 차이가 아닌 std(L*)
흰색-검정 범위는 거의 모든 실제 영상에서 ~100이며 아무것도 구별하지 못합니다.
배경 비율은 일급 통계량입니다
L*10 미만 픽셀의 비율을 기록하십시오. 분포의 어떤 모멘트도 이를 볼 수 없습니다: 클립이 올바른 평균, 표준편차 및 크로마를 가지면서도 블랙이 회색으로 리프트될 수 있습니다. 이것이 바로 MAE 1.88 / 콘트라스트 33.7을 기록하면서 실제 프레임이 진흙탕 보라색 덩어리였던 그레이드가 발생한 방식입니다.
측정 전 인터페이스 마스킹
화면 녹화 참조는 정적 요소(레터박스 바, 상태 표시줄, 좋아요 아이콘, 캡션 텍스트)를 수반합니다. 이 모든 것이 통계에 룩인 것처럼 포함됩니다: 검은색 막대는 그림자 가중치를 부풀리고, 빨간색 하트는 a*를 마젠타 방향으로 편향시킵니다. 시간적 변동성이 이를 깔끔하게 분리합니다 — 영상은 움직이고 인터페이스는 움직이지 않습니다. 따라서 수동 자르기가 필요 없습니다. 실제 재료에서 이는 약 65%의 픽셀을 유지합니다.
케이던스는 적응형 임계값 필요
올바른 콘텐츠 감지기 임계값은 재료에 따라 다릅니다: 고대비 액션 참조는 30에서도 충분히 강하게 컷을 감지하지만, 분위기 있는 참조는 그 아래에 컷을 숨깁니다. 임계값을 내림차순으로 스윕하고 가장 민감한 설정이 찾는 샷의 ≥90%를 여전히 복구하는 가장 높은 값을 취하십시오. 이는 노이즈보다 실제 컷에 편향됩니다. 터무니없는 컷률(>100/분)을 의미하는 임계값은 거부하십시오. 연속 카메라 움직임은 모든 프레임에서 감지기를 트리거합니다.
전체 스윕을 공유 StatsManager로 한 번의 디코드 패스로 실행하십시오. 기본 버전은 임계값마다 다시 디코드하므로 60fps 소스에서는 초와 분의 차이가 발생합니다.
오버레이 플레이트: 스크린샷이 아닌 에셋
스틸은 전체 프레임입니다. 합성하면 단순히 다른 사진을 위에 올리는 것입니다. 플레이트는 참조의 그래픽 어휘(플레어, 줄무늬, 글리치 조각)를 검정 배경에 추출하여 키잉 없이 화면 블렌드되도록 한 것입니다.
실제 재료에서 발견된 두 가지 함정:
- 절대 임계값은 실패합니다. 밝은 참조에서
L>55 AND chroma>12선택은 프레임의 ~90%를 차지하며 "플레이트"는 그림입니다 — 알아볼 수 있는 얼굴을 포함합니다. 백분위수(~상위 3%) 로 선택하고 프레임의 ~22% 이상을 덮는 플레이트는 거부하십시오. - 밝기가 아닌 분리도로 순위를 매기십시오. "밝고 채도 높은 픽셀의 비율"은 탈색된 프레임을 1위로, 하나의 강렬한 플레어가 있는 검은 프레임(실제 시그니처)을 거의 바닥에 순위를 매깁니다.
p99.5(에너지) / 중앙값(에너지)점수를 사용하십시오.
또한 점수 매기기 전에 마스킹하십시오: 각인된 타이포그래피는 밝고, 채도가 높으며, 대비가 높으므로 마스킹되지 않은 실행은 다른 사람의 타이틀 카드의 완벽한 플레이트를 생성합니다.
VLM 근거 제시
설명을 요청하기 전에 측정값을 시스템 프롬프트에 제공하십시오. 근거가 없으면 VLM은 +24.9 a* 캐스트가 있는 영상에 대해 "뚜렷한 컬러 그레이딩 없음, 중립"이라고 보고합니다. 근거가 있으면 캐스트를 올바르게 설명하고 보조 악센트를 독립적으로 추론합니다.
모호한 단어 사용을 금지하십시오 (다양한, 혼합된, 다이나믹한, 일부, 종종, 중립, 또는) — 모델은 "다양한 조명"을 렌더링할 수 없습니다. 프롬프트뿐만 아니라 코드에서도 금지를 강제하십시오: 대략 3번 중 1번의 실행에서 위반되었습니다. 필드별로 다시 질문하고, N번 시도 후 가장 덜 모호한 답변을 유지하십시오. 실패하는 대신.
사용자에게 언급할 가치가 있는 주의사항: 스펙이 측정값에 근거하면 더 이상 이에 대한 독립적인 확인이 아닙니다.
LUT 베이킹 주의사항
- LUT는 픽셀별 RGB 함수만 인코딩할 수 있습니다. 분포 종속적인 것(히스토그램 매칭, 백분위수 앵커)은 베이킹 전에 상수로 축소되어야 합니다. 그렇지 않으면 영상 대신 균일한 LUT 그리드를 조용히 측정합니다.
cv2.cvtColor(LAB2RGB)는 내부적으로 클램핑하므로 이를 사용한 out-of-gamut 테스트는 0%를 보고합니다. Lab→선형 sRGB를 수동으로 변환하십시오. 실제 측정값은 83.3% OOG였습니다.- 크로마 전달은 오프셋으로, 아핀(affine)으로 하지 마십시오. 아핀은 소스 σ로 나누어 과도하게 적용됩니다. 실제 영상에서 b*를 목표 -17.5에 대해 +11.6으로 반전시켰습니다. 오프셋은 MAE를 6.23에서 2.13으로 낮췄습니다.
- 영역 압축(Gamut compression)은 동일한 MAE에 대해 3.8배의 런타임 비용이 들었습니다. 옵트인으로 만드십시오.
안티-패턴
| 하지 말 것 | 이유 |
|---|---|
| 합성 테스트 영상에 대해 튜닝 | 한 프로젝트에서 네 가지 잘못된 결론을 초래했습니다. 실제 영상이 모두 뒤집었습니다. |
| MAE만 신뢰 | 1.88 MAE가 눈에 띄게 깨진 프레임에서 성공처럼 보였습니다. |
| 크로마에 평균/표준편차 사용 | 오른쪽으로 치우쳐 약 3배 너무 강하게 적용됩니다. |
| 엔드포인트 영역만 비교 | 양쪽 끝은 구성상 거의 중립입니다. |
| 룩을 설명하고 중단 | 스펙은 콘텐츠와 구조를 위한 것입니다. 팩은 컬러를 위한 것입니다. |
인계
팩이 인터페이스입니다. 팩이 생성되면 taste-application 스킬을 사용하여 이에 대해 생성 및 조립하거나 look.cube를 컬러리스트에게 직접 전달하십시오.
번들 코드
이 스킬의 scripts/는 의사 코드가 아닌 작동하는 구현체입니다. 프로젝트별 가정이 없습니다: 모든 참조 비디오를 가리키면 팩을 생성합니다.
pip install -r scripts/requirements.txt
export FAL_KEY=... # fal을 호출하는 단계에만 필요
모든 네트워크 호출은 TASTE_FORGE_DRY_RUN=1 또는 --dry-run 아래에서 스텁 처리되므로 계획, 프롬프트, 트랙 레이아웃 및 매니페스트를 지출 없이 검사할 수 있습니다.