Этот документ фиксирует правила для ноды MatAnyone2 и разделяет:
- подтвержденное поведение из оригинального авторского контекста MatAnyone2
- наши локальные правила интеграции в KeyFlow Studio
Цель документа: исключить путаницу между входной seed-mask, выходным alpha matte, RGB-выходом fg, preview-результатами и production downstream-подключениями.
Первичный источник по поведению MatAnyone2:
- официальный GitHub-репозиторий авторов MatAnyone2
- README, CLI и released inference code авторов (
inference_matanyone2.py,matanyone2/cli.py,matanyone2/inference/inference_core.py)
Локальный контракт KeyFlow Studio подтвержден по текущей реализации:
app/node_graph/specs/matting.pyapp/node_graph/matting_properties_panel.pyapp/node_graph/nodes/matting_controller.pyapp/workers/inference_worker.pyapp/services/model_service.pyapp/node_graph/engine.pyapp/node_graph_dialog.pyapp/i18n.py
Важно:
- данный документ не заменяет оригинальную документацию авторов
- при расхождении приоритет у авторского репозитория и авторского inference/API-кода
- оригинальный репозиторий MatAnyone2 не описывает нодовый интерфейс; имена портов
img,mask,fg,alphaявляются локальным отображением авторской семантики в KeyFlow Studio
В авторском репозитории MatAnyone2 подтвержден не нодовый, а inference-контракт:
- входной
input_path: видеофайл или папка кадров - входной
mask_path: first-frame segmentation mask - optional
ckpt_path: путь к checkpoint/весам MatAnyone2 (CLI--ckpt-path) - runtime-параметры warmup / erode / dilate
- выход
foreground output - выход
alpha output
Уточнение по путям весов в KeyFlow Studio:
- upstream CLI MatAnyone2 может показывать свой локальный default-путь для checkpoint
- локальный runtime KeyFlow Studio не использует project-local fallback-папки как обязательный источник
- в локальной интеграции веса кэшируются в platform app-data models dir (или в
KEYFLOW_MODELS_DIR, если задан)
Для batch / CLI / Python API подтверждено следующее:
- один запуск MatAnyone2 принимает видео или sequence кадров
- один запуск MatAnyone2 принимает одну first-frame segmentation mask
- результаты сохраняются как foreground output и alpha output
- при
save_imageавторский код сохраняет покадровые папкиfgrиpha
Ключевой факт по семантике author output:
- в released inference code авторов
foreground outputсобирается как RGB-композитsource_rgb * alpha + background * (1 - alpha) - в released inference code фоновый цвет для такого
foreground outputзеленый - следовательно, author
foreground outputне является прозрачным RGBA-результатом
Подтверждено частично:
- авторская документация подтверждает режим
video/frames + first-frame mask - авторская документация не вводит понятия нодовых портов,
preview,processed result, downstreamWrite, port typing или локальных правил совместимостиmask/alpha
В авторской документации не подтверждено как базовый публичный контракт:
- отдельный нодовый вход для per-frame correction masks
- полноценный вход в виде независимой mask-sequence той же длины, что и video
- отдельный
processed/RGBAoutput - downstream-правила сохранения в EXR / PNG 16-bit / ProRes 4444
- локальный checker-background режим
Все такие правила ниже относятся только к интеграции KeyFlow Studio.
Локальный нодовый контракт KeyFlow Studio для MatAnyone2:
- вход
imgимеет типimage - вход
maskимеет типmask - выход
fgимеет типimage - выход
alphaимеет типalpha
Локальная семантика портов:
img= исходный RGB image / frame sequencemask= seed-mask / guide-mask для запуска маттинга; это не финальный mattealpha= предсказанный matte / alpha outputfg= RGB-результат с уже подложенным фоном, а не прозрачный foreground
Локальные правила интеграции:
- в графовом движке KeyFlow Studio типы
maskиalphaсчитаются совместимыми для соединений Write.inлокально принимает любой upstream stream, даже если в spec он формально объявлен какimage- локальная UI-настройка
fg_backgroundменяет фон дляfg-выхода междуgreenиchecker - checker-background является только локальным режимом KeyFlow Studio, а не авторским контрактом MatAnyone2
- у ноды MatAnyone2 в текущей интеграции нет отдельного output-порта
processed - у ноды MatAnyone2 в текущей интеграции нет отдельного output-порта
RGBA
Что считается preview в нашем проекте:
- runtime preview в viewer
- runtime preview на ноде Write
fgв случаях, когда нужен быстрый визуальный контроль результата на подложке- alpha, записанный в обычный video-контейнер, если он используется только для просмотра
Что считается production result в нашем проекте:
alpha, когда он сохранен в формат, сохраняющий корректную matte-семантикуfg, только если downstream действительно ожидает baked RGB-result без прозрачности
Что не считается production-safe final processed result:
fg, если downstream ожидает RGBA с alpha-каналом- любой preview-only video от alpha stream
- визуально правдоподобный
fg, ошибочно принятый за transparent foreground
Дополнительное локальное замечание по реализации:
- legacy handler
app/node_graph/nodes/matting_node.pyудален; dual-path исполнения больше не является контрактом - активный run-path текущего приложения для графов с MatAnyone2 идет через
InferenceWorkernode-graph execution и производит потокиfgиalpha - для downstream-семантики authoritative считается только активный worker/service путь
В проекте зафиксирован единый runtime contract в app/runtime_contract.py.
Единая схема входов (RuntimeConfig):
is_video: boolstart_frame: intend_frame: intcompatibility_profile: auto|legacy_intel|apple_siliconcorrection_masks: dict[int, mask](optional)node_graph: {nodes, edges}для graph execution pathfg_write/alpha_write(optional, для write-политик)
Единая схема выходов (RuntimeResult):
status: ok|cancelled|errorcancelled: boolsaved_paths: dict[node_id, path]n_frames: int- optional legacy fallback:
fgr_path,alpha_path
Единая схема progress:
- stage progress нормализуется через
normalize_stage_progress(percent, status_text) - frame progress нормализуется через
normalize_frame_progress(current, total) - диапазон percent всегда
[0..100]
Единая cancel-семантика:
- отмена фиксируется как
status=cancelledиcancelled=true - проверка отмены в orchestration/controller идет через
is_runtime_cancelled(...)
Единая write/preview семантика (GraphStreamPreviewPayload):
semantics=preview_only: кадр валиден только для UI-preview, путь не считается production-safe артефактомsemantics=production_safe: путь можно регистрировать как итог write-output и использовать в downstream- правило для UI:
preview_onlyне должен автоматически становиться persisted final output path
Для MatAnyone2 runtime-контекста используется отдельный namespace ключей статуса:
matting_wait_processingmatting_status_startmatting_status_cancelmatting_status_framematting_status_stoppedmatting_status_donematting_status_error
Правило интеграции:
- SAM-ключи (
sam_*) не используются как primary-ключи в MatAnyone2 status/annotation слое - допускается только fallback на нейтральные ключи
status_*для обратной совместимости
В MatAnyone2 runtime введена явная политика отмены cancel_policy:
immediate: быстрая остановка без сохранения partial outputs
Решение по UX для кнопки Stop:
- Stop в MatAnyone2 трактуется только как
immediate - partial-save/cleanup режимы не применяются для действия кнопки Stop
- UI-статус после Stop:
matting_status_stopped
Engineering-note:
- coordinator для действия Stop принудительно выставляет
cancel_policy=immediate
- Тип:
image - Семантика: исходный RGB-поток, который подается в MatAnyone2 как video / sequence / single image
Можно подключать:
SourceLoad- любой upstream-узел с корректным RGB image output
Нельзя подключать:
alphamask- SAM2 mask
- любой single-channel matte / alpha / guide-mask поток
Важно не путать:
imgэто source RGBimgне является mask inputimgне является alpha input
- Тип:
mask - Семантика: seed / guide mask для запуска маттинга
Что подтверждено по author semantics:
- это first-frame segmentation mask
- это не финальный предсказанный matte
Что является локальным правилом KeyFlow Studio:
- движок разрешает сюда подключать как
mask, так иalpha-потоки - SAM-output может использоваться как допустимый upstream для этого входа
- если на
maskприходит последовательность масок (например, изAlphanode), MatAnyone2 берет только первый кадр как seed-mask; остальные кадры входной mask-sequence игнорируются
Можно подключать:
SAMmaskAlphanode- любой upstream-узел с корректным mask / alpha output
Нельзя подключать:
- исходный RGB
fgcompprocessed- любой полноцветный preview вместо маски
Важно не путать:
- вход
maskэто guide / seed input - вход
maskне равен выходуalpha - подключение
alphaсюда допустимо только как локальная совместимость KeyFlow Studio, а не как author node contract mask-последовательность не является per-frame управляющим входом MatAnyone2 в текущем контракте
Что подтверждено по авторскому контексту:
- базовый режим MatAnyone2: один video / frame sequence + одна first-frame segmentation mask
- растягивание одной seed-mask на всю последовательность является базовым режимом MatAnyone2, а не исключением
Что является контрактом в нашем проекте:
- если
imgэто video / sequence, одна подключеннаяmaskиспользуется как базовый seed для всего run - если
imgэто single image,maskтоже должна быть single image / single mask - отдельный публичный input-порт для полноценной mask-sequence той же длины не предусмотрен
- дополнительные per-frame correction masks могут появляться только через локальный SAM-side-channel KeyFlow Studio
- такие correction masks не меняют базовый публичный контракт ноды MatAnyone2
Важно:
- полноценная независимая mask-sequence как основной публичный режим для MatAnyone2 здесь не документируется как подтвержденный author fact
- если downstream-сценарий требует отдельную маску на каждый кадр как базовый контракт, это уже не базовая семантика текущей MatAnyone2-ноды
- означает: предсказанный alpha matte / matte stream
- базовая семантика: single-channel alpha result
- внутренне может существовать как float alpha; при записи формат вывода определяет точность
Чем этот выход не является:
- не является входной seed-mask
- не является RGB
- не является
fg - не является финальным RGBA-изображением
Как правильно использовать downstream:
- подключать туда, где downstream ожидает matte / alpha
- подключать в
Writeдля сохранения matte - использовать как масочный / alpha stream в локальных цепочках, где допустима mask/alpha-совместимость
- означает: RGB-результат MatAnyone2 с уже подложенным фоном
- в author inference code это RGB-композит исходного изображения через alpha на цветной фон
- в локальной интеграции фон выбирается через
fg_background
Чем этот выход не является:
- не является matte
- не является transparent foreground
- не является RGBA
- не является
processedoutput - не является final alpha-bearing result
Как правильно использовать downstream:
- подключать туда, где downstream ожидает обычный RGB image stream
- использовать для review, editorial, approval, quick preview
- использовать как delivery RGB только если baked background является ожидаемым результатом
Рекомендуется:
EXR, если нужен production-safe matte с максимальной точностьюPNG16-bit, если нужен дисковый matte в image-sequence без EXR
Допустимо:
PNG8-bit, если задача не требует точной matte-градации
Только preview-only:
MP4MOV- другой обычный video-контейнер
Важно не путать:
- video-запись
alphaне превращает его в настоящий alpha-bearing container - для video-кодеков локальная реализация продвигает single-channel alpha в 3-канальный grayscale-preview
- это удобно для просмотра, но это не production matte master
JPGдляalphaиспользовать не следует
Рекомендуется:
PNG, если нужен обычный RGB still / image sequenceEXR, если нужен high-quality RGB output без потерь, но все еще без отдельного alpha-порта в самом файле по контракту этой ноды- video-форматы, если downstream ожидает обычный RGB delivery
Допустимо:
MP4MOVProRes, если нужен качественный RGB-video-output
Важно не путать:
ProRes 4444на одном толькоfg-stream не делает этот поток автоматическиRGBA- если нужен настоящий final RGBA, его нельзя объявлять выходом самой ноды MatAnyone2 без отдельного подтвержденного local contract
- в текущей интеграции у MatAnyone2-ноды нет отдельного production-safe
processedпорта
Preview-only output в текущем проекте:
- runtime thumbnails на Write
- viewer previews
fg, когда он используется только для визуальной проверки на green / checker background- alpha, сохраненный в video-формат только ради просмотра
Production-safe output в текущем проекте:
alphaвEXRalphaвPNG16-bitfgвEXR/PNG, если downstream действительно нужен baked RGB без alpha
- вход
maskи выходalphaэто разные сущности maskэто seed / guide input, а не финальный mattealphaэто matte, а не RGBfgвизуально может выглядеть как вырезанный foreground, но семантически это RGB с уже подложенным фономfgне является mattefgне является RGBAfgне является final processed result с alpha-каналом- у ноды MatAnyone2 нет отдельного
processedoutput в текущем локальном контракте - grayscale-video, записанный из
alpha, не является тем же самым, что файл с настоящим alpha-каналом - возможность подключать
alphaвmaskи возможность вести любой stream вWrite.inэто локальные правила KeyFlow Studio, а не author behavior MatAnyone2
img= исходный RGB / video / frame sequencemask= first-frame seed-mask / guide-maskalpha= предсказанный matte / alpha outputfg= RGB-результат с подложенным фономpreview= viewer / runtime thumbnail / video-preview matteproduction-safe matte=alphaвEXRилиPNG16-bitfinal RGBA= не является прямым output ноды MatAnyone2 в текущей интеграции