Skip to content

Latest commit

 

History

History
460 lines (354 loc) · 23.9 KB

File metadata and controls

460 lines (354 loc) · 23.9 KB

План реализации

1. Что именно строим

На входе — плоское RGB/RGBA-изображение I. На выходе — не просто набор картинок, а редактируемый документ D, который можно снова отрендерить:

input.png
   │
   ▼
analyzer / controller
   │
   ├── text reconstruction
   ├── layer decomposition / matting
   ├── vector & primitive reconstruction
   ├── amodal completion / background recovery
   └── hierarchy & z-order inference
   │
   ▼
document.json + assets/*.png + preview.svg/psd
   │
   ▼
renderer → reconstructed.png
   │
   ▼
verifier → accept / refine / split / merge / retry

Ключевой инвариант: render(D) должен быть близок к I, но сам D должен оставаться удобным для реальных операций: удалить объект, передвинуть его, заменить текст, перекрасить или изменить размер.

Это inverse graphics / design reconstruction. Единственного «правильного» разложения нет: один и тот же растр можно объяснить разными наборами слоёв. Поэтому качество надо измерять не совпадением с историческим PSD, а внешним видом и успешностью последующих edit operations.

2. Почему синтетика полезна, но не закрывает задачу целиком

Синтетический генератор даёт почти бесплатные точные labels:

  • исходные RGBA-слои;
  • видимые и полные (amodal) маски;
  • текст, шрифт и параметры оформления;
  • bounding boxes и transforms;
  • z-order, группы и связи перекрытия;
  • эталон после контролируемого edit replay.

Главная опасность — domain gap. На синтетике слои обычно слишком «правильные»: ровная альфа, известный шрифт, идеальные края. В реальности встречаются JPEG ringing, ресайз, цветовые профили, glow, shadows, antialiasing, blur, текст как часть фотографии, несколько эффектов в одном пикселе и неизвестные шрифты.

Поэтому стратегия данных должна быть смешанной:

  1. процедурная синтетика с полным ground truth;
  2. реальные редактируемые макеты с разрешёнными лицензиями;
  3. flattened/degraded версии этих макетов;
  4. небольшой вручную проверенный real-world benchmark;
  5. hard-negative mining по ошибкам текущей системы.

3. Рекомендуемая архитектура MVP

3.1 Каноническое представление документа

Внутренний формат не должен быть PSD. PSD и SVG — экспортные форматы. Источник правды — versioned JSON scene graph и отдельные assets.

Минимальные типы узлов:

  • group — иерархия, clipping и общий transform;
  • text — строка, font reference, size, weight, line height, alignment, fill, stroke, shadow, transform;
  • raster — RGBA asset, crop, transform, opacity;
  • vector — SVG path или primitive, fill/stroke;
  • effect — на первом этапе только drop shadow и blur;
  • background — solid/gradient/raster.

У каждого узла: id, type, bbox, affine transform, z_index, confidence, provenance и ссылки на parent/children. Provenance нужен, чтобы verifier понимал, каким инструментом узел получен и что можно безопасно повторить.

3.2 Analyzer/controller

Controller получает thumbnail, OCR candidates и состояние scene graph. Он не рисует пиксели, а выбирает действие:

  • выделить text region;
  • извлечь foreground layer;
  • разбить сложный layer рекурсивно;
  • vectorize region;
  • принять region как цельный raster;
  • объединить дубли;
  • остановить разложение.

Первая версия может использовать VLM API со structured JSON. Затем решения контроллера можно дистиллировать в маленькую локальную модель. Важнее состояния и верификация, чем конкретный VLM.

Практический ориентир — ReDesign (2026): иерархическое tree expansion с локальной проверкой каждого шага оказалось устойчивее фиксированного длинного конвейера. Независимые ветки дерева можно выполнять параллельно.

3.3 Text-first reconstruction

Текст нужно извлекать до генеративного разложения: диффузионная модель часто превращает буквы в растровый объект или немного меняет их.

Pipeline:

  1. text detection и recognition;
  2. оценка строки/абзаца, baseline, rotation и reading order;
  3. удаление исходного растра текста с восстановлением подложки;
  4. подбор ближайшего разрешённого шрифта;
  5. оптимизация font size, tracking, line height, color, stroke и shadow через differentiable или black-box rendering loss;
  6. создание настоящего text node.

Стартовая модель: PaddleOCR PP-OCRv6. Для шрифта — собственный retrieval index: рендерим распознанную строку всеми шрифтами из разрешённого каталога, извлекаем embeddings/геометрические признаки, затем дооптимизируем top-k кандидатов по pixel/edge/perceptual loss. FontCLIP можно проверить как feature encoder, но не считать его готовым font identifier.

3.4 Layer proposals и alpha matting

Нужны два разных семейства proposals:

  • design-aware decomposition: LayerD и Qwen-Image-Layered;
  • open-vocabulary object proposals: SAM 3 либо Grounding DINO + SAM 2.

LayerD — быстрый и практически удобный baseline для graphic designs: умеет RGBA layers, SVG/PSD export и основан на BiRefNet. Qwen-Image-Layered полезен как generative proposal model, умеет variable layer count и рекурсивную декомпозицию, но рекомендуемое авторами разрешение — 640, доступны buckets 640 и 1024. Поэтому его результат нельзя просто upscale-нуть и назвать high-res.

SAM-подобная маска — только начальная геометрия. Для волос, полупрозрачности, теней и antialiasing нужен отдельный matting/refinement pass в исходном разрешении. Финальный alpha можно уточнять tile-wise, используя исходное изображение и coarse mask.

3.5 Amodal completion и восстановление фона

После удаления верхнего слоя появляются пиксели, которых не было во входе. Это принципиально неоднозначная генеративная часть.

Для каждого объекта храним отдельно:

  • visible_mask — что действительно видно;
  • amodal_mask — предполагаемая полная форма;
  • rgba_asset — восстановленная текстура объекта;
  • uncertainty map — где модель галлюцинировала скрытый контент.

Baseline:

  1. построить occlusion graph из overlaps и границ;
  2. расширить visible mask до plausible amodal mask;
  3. восстановить texture объекта и background раздельно;
  4. проверить, что recomposite восстанавливает исходные видимые пиксели;
  5. скрытые участки оценивать edit replay, а не reconstruction исходника.

Кандидаты для эксперимента: pix2gestalt как amodal baseline; Qwen-Image-Edit или другая controllable inpainting model для texture/background completion. Выбор production-модели делается только после проверки лицензии, стоимости и работы на собственном benchmark.

3.6 Vector и primitive reconstruction

Не надо vectorize всё подряд. Сначала classifier выбирает представление:

  • фотография/сложная текстура → raster;
  • иконка, плоская иллюстрация, простая форма → vector;
  • текст → text node;
  • градиент/заливка → background/primitive.

Для простых форм сначала fitted primitives: rectangle, rounded rectangle, ellipse, line, polygon, linear/radial gradient. Для сложных плоских областей — VTracer/аналогичный vectorizer с последующей оптимизацией path parameters по rendering loss.

3.7 Verifier и оптимизация композита

После каждого split/merge/extract система рендерит текущую ветку и проверяет:

  • hallucination: появился ли контент, которого не было в parent;
  • redundancy: перекрывают ли children один и тот же контент;
  • coverage: покрывает ли union children parent;
  • reconstruction loss;
  • разумность слоя как объекта для редактирования.

Результат действия: accept, retry, refine, merge, prune или stop.

В конце полезен детерминированный optimization pass: при фиксированной структуре подстроить transforms, opacity, colors, gradient stops, alpha edges и typography, минимизируя multi-scale rendering loss. Это дешевле и надёжнее, чем повторно вызывать большую генеративную модель.

4. Модели и компоненты: стартовая матрица

Подзадача Первый baseline Роль Обучать сразу?
Design decomposition LayerD / BiRefNet Быстрые RGBA proposals, SVG/PSD baseline Только после benchmark
Generative decomposition Qwen-Image-Layered Coarse semantic RGBA layers, recursive split Нет; сначала inference
Object discovery SAM 3 Open-vocabulary instances/masks Нет
Fallback grounding Grounding DINO + SAM 2 Text-guided boxes + precise masks Нет
OCR PaddleOCR PP-OCRv6 Detection/recognition Fine-tune на synthetic typography при необходимости
Font matching Собственный render-and-retrieve + FontCLIP experiment Поиск ближайшего доступного шрифта Да, маленькая domain model возможна
Amodal completion pix2gestalt experiment Full object proposal Позже
Inpainting Qwen-Image-Edit/другая licensed model Background/texture recovery LoRA только после baseline
Vectorization primitive fitting + VTracer Editable shapes Нет
Controller/verifier VLM + deterministic metrics Tree actions и graceful verification Сначала API, затем distillation
High-res refinement Matting/refiner on tiles Альфа и края в native resolution Вероятный первый useful fine-tune

Лицензии фиксируются на уровне каждой версии weights, code и dataset. Сейчас LayerD и Qwen-Image-Layered заявляют Apache-2.0; SAM 3 использует отдельную SAM License, поэтому её условия надо проверить до коммерческого решения.

5. План экспериментов и этапы

Этап 0. Зафиксировать продуктовый контракт — 2–3 дня

Deliverables:

  • JSON schema v0;
  • renderer с round-trip test;
  • 20 ручных acceptance examples;
  • список поддерживаемых layer/effect types;
  • определения coarse и fine decomposition;
  • CLI-контракт: decompose input.png --mode coarse|fine.

Критерий выхода: можно вручную собрать документ, экспортировать SVG и снова получить визуально тот же растр.

Этап 1. Честный baseline без обучения — 1–2 недели

Запустить на одном benchmark:

  • LayerD;
  • Qwen-Image-Layered с 3/4/6/8 layers и recursive mode;
  • OCR-first hybrid;
  • SAM 3 proposals;
  • простое background inpainting;
  • export/re-render/verifier.

Сохранять все промежуточные artifacts, latency, peak VRAM и предполагаемую стоимость. Не выбирать победителя по красивым пяти картинкам.

Критерий выхода: таблица метрик и taxonomy ошибок минимум на 200 изображениях.

Этап 2. Synthetic design factory — 1–2 недели

Сделать детерминированный генератор макетов с manifest и seed. Сначала 100k–1M композиций, но не генерировать весь объём до проверки первых 10k.

Обязательные variations:

  • разные aspect ratios и 512/1024/2048 render targets;
  • русский/английский текст, multiline, rotation, curved text позже;
  • raster photos, cutouts, icons, shapes, gradients;
  • partial occlusions;
  • shadows, stroke, blur, transparency;
  • realistic spacing/alignment и deliberately awkward layouts;
  • JPEG/re-encode/downscale/upscale/noise/color perturbations;
  • unknown-font split и unseen-template split.

Критерий выхода: генератор проходит property tests, а alpha-composite всех GT layers совпадает с clean target с машинной точностью до выбранного renderer.

Этап 3. Первый собственный training — 3–6 недель

Начать не с diffusion transformer, а с наиболее дешёвых измеримых компонентов:

  1. domain fine-tune LayerD/BiRefNet для следующего foreground layer;
  2. классификатор text/vector/raster/effect/background;
  3. high-resolution alpha refiner;
  4. hierarchy/z-order predictor;
  5. font retrieval model.

Curriculum для foreground extractor:

  • 2–4 чистых плоских слоя;
  • больше слоёв и полупрозрачность;
  • тени/blur;
  • degradations;
  • реальные макеты и hard negatives.

Критерий выхода: statistically meaningful improvement не только на synthetic, но и на frozen real-world test set.

Этап 4. Agentic tree decomposition — 2–4 недели

Собрать controller + verifier state machine:

  • coarse analysis root;
  • parallel expansion независимых nodes;
  • локальные accept/retry/prune;
  • budgets по числу model calls и GPU seconds;
  • остановка по editability gain, а не только по pixel loss;
  • кэширование результатов по image/node hash.

Критерий выхода: hybrid превосходит фиксированный serial pipeline по edit replay и не выходит за cost/latency budget.

Этап 5. End-to-end layered model — только если оправдано

Если pipeline упирается именно в несогласованность отдельных RGBA proposals, можно fine-tune end-to-end variable-layer model по архитектуре Qwen:

  • RGBA-VAE;
  • variable-layer diffusion/flow transformer;
  • conditioning на input, layer-count/granularity и scene plan;
  • permutation-aware matching predicted ↔ GT layers;
  • reconstruction + alpha + perceptual + object identity losses;
  • distillation в fewer steps.

Это дорогой этап. Он не заменяет OCR, scene graph, export и edit evaluation.

Этап 6. Production optimization — 2–4 недели

  • dynamic routing: лёгкие designs не отправлять в тяжёлую модель;
  • batching и parallel node expansion;
  • quantization/compilation только после quality baseline;
  • 1024 decomposition + native-resolution matting/refit вместо full diffusion 4K;
  • confidence-driven retries;
  • GPU worker API и job queue;
  • privacy policy, retention и safe image handling;
  • cost dashboard по каждому tool call.

Цель $0.30, потолок $0.50 проверяется end-to-end, включая OCR, VLM, повторные попытки, storage и egress, а не только один diffusion call.

6. Losses для собственного обучения

Нужна permutation-invariant привязка layers. Сначала Hungarian matching по комбинации mask IoU, appearance similarity, type и bbox. После matching:

L = λr * L_recompose
  + λa * L_alpha
  + λrgb * L_layer_rgb
  + λp * LPIPS(render(pred), target)
  + λe * L_edge
  + λm * L_mask
  + λz * L_z_order
  + λt * L_type
  + λc * L_coverage_redundancy
  + λedit * L_edit_replay

Важно: один L_recompose недостаточен. Модель может положить весь исходник в один непрозрачный слой и получить идеальную реконструкцию с нулевой редактируемостью. Нужны coverage/redundancy penalties, type-aware supervision, layer sparsity/granularity policy и edit replay.

7. Железо

Этот MacBook

Подходит для:

  • генератора и renderer;
  • подготовки/валидации датасета;
  • PaddleOCR и лёгких inference runs;
  • LayerD на CPU/MPS, если зависимости совместимы;
  • обучения небольших classifiers/refiners;
  • API, UI и метрик.

Не стоит делать его основной training machine для Qwen-Image-Layered: пример авторов ориентирован на CUDA/bfloat16, а unified 32 GB ограничит размер модели, batch и скорость. Совместимость MPS надо проверять экспериментом, не считать гарантированной.

Рекомендуемое внешнее железо

  • baseline/fine-tune лёгких моделей: 1× NVIDIA 48 GB;
  • Qwen inference/LoRA и high-res experiments: 1× 80 GB либо несколько GPU;
  • full end-to-end fine-tuning: multi-GPU 80 GB class; точная конфигурация только после измерения model/optimizer/activation memory на выбранной архитектуре;
  • dataset: сначала сотни GB, затем планировать TB-scale object storage.

Лучше арендовать GPU для коротких измеримых экспериментов, чем заранее строить дорогой training cluster.

8. Что может убить проект

  1. Неопределённый output. «Сделать как Canva» без scene schema и edit suite.
  2. Оптимизация только PSNR. Один слой-копия входа выигрывает пиксельно.
  3. Только чистая синтетика. Реальные эффекты ломают идеальные masks.
  4. Попытка сделать 4K внутри diffusion. Дорого и часто не нужно; лучше coarse semantics + native-res edge refinement.
  5. Текст после decomposition. Буквы теряются или галлюцинируются.
  6. Один фиксированный number of layers. Granularity зависит от edit intent.
  7. Слепой serial pipeline. Ошибка раннего шага распространяется дальше.
  8. Игнорирование лицензий assets/fonts/weights. Синтетика не означает автоматически безопасные права на исходные изображения и шрифты.
  9. Нет real-world holdout. Улучшения на synthetic benchmark могут быть фиктивными.

9. Предлагаемая структура репозитория после старта кода

canva-like/
├── README.md
├── docs/
│   ├── PLAN.md
│   ├── DATA_AND_EVAL.md
│   └── adr/
├── schemas/
│   └── document.schema.json
├── src/canva_like/
│   ├── controller/
│   ├── decomposition/
│   ├── text/
│   ├── vector/
│   ├── completion/
│   ├── verifier/
│   ├── render/
│   └── export/
├── synthetic/
│   ├── renderer/
│   ├── templates/
│   └── degradations/
├── eval/
│   ├── metrics/
│   ├── edit_replay/
│   └── benchmark_manifest/
├── tests/
├── configs/
└── scripts/

10. Decision gates

Перед каждым дорогим этапом отвечаем числами:

  • Baselines провалились на каком классе изображений?
  • Ошибка вызвана маской, скрытым контентом, типографикой, hierarchy или export?
  • Новый training улучшил frozen real set, а не только synthetic?
  • Увеличение числа слоёв реально улучшает edit replay?
  • Сколько процентов запросов требует тяжёлую generative branch?
  • Вписывается ли p50/p95 стоимость в $0.30/$0.50?

Если на эти вопросы нет ответа, учить следующую большую модель рано.

11. Первоисточники для старта