feat(plans): vectorize DOM.РФ floor plans — Phase 1 Potrace spike (P0) #299

Closed
opened 2026-05-17 14:52:12 +00:00 by lekss361 · 1 comment
Owner

Severity: P0 — exploration spike

Цель: получить SVG-векторные планировки квартир (вместо растровых JPG/PNG) для:

  1. UI каталога планировок в Site Finder / TradeIn Estimator — бесконечный zoom, лёгкие файлы (~10× меньше), поддержка тёмных/светлых тем
  2. PDF отчёты (WeasyPrint — issue #56) — векторные плашки не пикселят при печати
  3. Foundation для Phase 2 (семантическая векторизация через CubiCasa5K — комнаты/двери/окна → Shapely → наш generative engine)

Phase 1 scope (этот spike) — 1-2 дня

Только контурная векторизация через Potrace (open source, mature, ~5 строк pipeline):

  1. Скачать sample 10-30 планировок DOM.РФ (из issue #297 sub-task 22c, либо вручную)
  2. Pipeline: PNG/JPG → grayscale → bitmap (.pbm) → potrace -s → SVG paths
  3. Сравнить визуально оригинал vs SVG — qualitative оценка читаемости
  4. Замерить compression ratio (SVG bytes / PNG bytes)
  5. Решить — годится ли Potrace «as is» (без semantic парсинга комнат) для UI каталога планировок
  6. Output spike: code/patterns/Plan_Vectorization_Spike_May17.md в vault с примерами + рекомендацией

Stack для spike

  • Python (uv add) — pillow, potrace-python или subprocess potrace
  • Сравнение: оригинал и SVG side-by-side через playwright screenshot
  • Никакого ML / production wiring — это spike

Out of scope (Phase 2-3)

  • ML-векторизация (CubiCasa5K / DeepFloorplan) — это Phase 2, отдельный issue
  • Семантика комнат (кухня/спальня/ванная) — Phase 2
  • Reverse-training generative engine — Phase 3
  • Frontend SVG viewer — будет после Phase 2

Acceptance criteria

  • 10-30 sample планировок векторизованы через Potrace
  • SVG читаемы (контуры стен видны, основные комнаты различимы) для ≥80% sample
  • Compression ratio задокументирован (ожидаем 5-20× от raster)
  • Spike doc в vault code/patterns/Plan_Vectorization_Spike_May17.md с:
    • 5-10 примеров (raster → SVG side-by-side)
    • Метрики compression
    • Рекомендация: Phase 1 production-ready / нужна Phase 2 / отказ
    • Time estimate для production-wiring (если ОК)

Dependencies

  • Issue #297, sub-task 22cdomrf_kn_flat_plans scraper и таблица для plan_image_url. Без него негде брать массовые планировки. Но для spike достаточно 10-30 вручную скачанных.

Связь с generative engine

Output Phase 2 (semantic SVG с полигонами комнат) → напрямую загружается в backend/app/services/generative/geometry.py (Shapely Polygons) — связь с issues #54-57. Spike Phase 1 не использует, но обосновывает инвестицию в Phase 2.

References

Estimated effort

1-2 дня spike. Если результат ОК — Phase 1 production-wiring (применить ко всем planимages при скрапе 22c) — ещё 1 день. Phase 2 (CubiCasa) — отдельная задача 2-4 недели.

Discovered: 2026-05-17 в ходе DOM.РФ field audit by Ghost.

## Severity: P0 — exploration spike **Цель**: получить SVG-векторные планировки квартир (вместо растровых JPG/PNG) для: 1. UI каталога планировок в Site Finder / TradeIn Estimator — бесконечный zoom, лёгкие файлы (~10× меньше), поддержка тёмных/светлых тем 2. PDF отчёты (WeasyPrint — issue #56) — векторные плашки не пикселят при печати 3. Foundation для Phase 2 (семантическая векторизация через CubiCasa5K — комнаты/двери/окна → Shapely → наш generative engine) ## Phase 1 scope (этот spike) — 1-2 дня Только контурная векторизация через **Potrace** (open source, mature, ~5 строк pipeline): 1. Скачать sample 10-30 планировок DOM.РФ (из issue #297 sub-task 22c, либо вручную) 2. Pipeline: PNG/JPG → grayscale → bitmap (.pbm) → `potrace -s` → SVG paths 3. Сравнить визуально оригинал vs SVG — qualitative оценка читаемости 4. Замерить compression ratio (SVG bytes / PNG bytes) 5. Решить — годится ли Potrace «as is» (без semantic парсинга комнат) для UI каталога планировок 6. Output spike: `code/patterns/Plan_Vectorization_Spike_May17.md` в vault с примерами + рекомендацией ### Stack для spike - Python (uv add) — `pillow`, `potrace-python` или subprocess `potrace` - Сравнение: оригинал и SVG side-by-side через playwright screenshot - Никакого ML / production wiring — это spike ## Out of scope (Phase 2-3) - ❌ ML-векторизация (CubiCasa5K / DeepFloorplan) — это Phase 2, отдельный issue - ❌ Семантика комнат (кухня/спальня/ванная) — Phase 2 - ❌ Reverse-training generative engine — Phase 3 - ❌ Frontend SVG viewer — будет после Phase 2 ## Acceptance criteria - [ ] 10-30 sample планировок векторизованы через Potrace - [ ] SVG читаемы (контуры стен видны, основные комнаты различимы) для ≥80% sample - [ ] Compression ratio задокументирован (ожидаем 5-20× от raster) - [ ] Spike doc в vault `code/patterns/Plan_Vectorization_Spike_May17.md` с: - 5-10 примеров (raster → SVG side-by-side) - Метрики compression - Рекомендация: Phase 1 production-ready / нужна Phase 2 / отказ - Time estimate для production-wiring (если ОК) ## Dependencies - **Issue #297, sub-task 22c** — `domrf_kn_flat_plans` scraper и таблица для plan_image_url. Без него негде брать массовые планировки. Но для spike достаточно 10-30 вручную скачанных. ## Связь с generative engine Output Phase 2 (semantic SVG с полигонами комнат) → напрямую загружается в `backend/app/services/generative/geometry.py` (Shapely Polygons) — связь с issues #54-57. Spike Phase 1 не использует, но обосновывает инвестицию в Phase 2. ## References - vault `audits/DomRF_Flat_Page_Fields_Audit_May17.md` — где живут планировки на DOM.РФ - vault `code/patterns/TradeIn_Estimator_Brief_May17.md` — TradeIn потребитель плашек - vault [[SiteFinder_FixList_May17]] — sub-task 22c (plan scraper) - Potrace: https://potrace.sourceforge.net (mature, GPL-compatible, 30+ лет) - CubiCasa5K (для Phase 2): https://github.com/CubiCasa/CubiCasa5k ## Estimated effort **1-2 дня spike**. Если результат ОК — Phase 1 production-wiring (применить ко всем planимages при скрапе 22c) — ещё 1 день. Phase 2 (CubiCasa) — отдельная задача 2-4 недели. Discovered: 2026-05-17 в ходе DOM.РФ field audit by Ghost.
lekss361 added the
site-finder
enhancement
labels 2026-05-17 14:52:12 +00:00
Collaborator

Spike выполнен (PR #1663).

  • Pipeline: backend/scripts/spike_plan_vectorize.py (Potrace 1.16 + librsvg).
  • 31 sample (21 real Wikimedia + 10 синтетика; DOM.РФ недоступен — flat_plans.py заглушка, нужен 22d SSR-скрапер).
  • Compression median 1.29×; читаемость 87% (100% на чистом line-art); tracing-IoU ~0.91.

Рекомендация: Phase 1 production-ready для чистого line-art при input-quality фильтре (отсев 3D-рендеров/фото → raster fallback) + Otsu-порог + despeckle + рендер на белом. Phase 2 ML (CubiCasa) пока не требуется. Wiring ≈ 3.5–4.5 дн.

Оговорка: % и compression надо пере-подтвердить на реальных DOM.РФ-планировках, когда появится 22d-скрапер.

Spike-doc → vault inbox/2026-06-17-1815-plan-vectorization-spike-299.md. Закрываю как spike (production-wiring — отдельная задача).

**Spike выполнен** ✅ (PR #1663). - Pipeline: `backend/scripts/spike_plan_vectorize.py` (Potrace 1.16 + librsvg). - 31 sample (21 real Wikimedia + 10 синтетика; DOM.РФ недоступен — `flat_plans.py` заглушка, нужен 22d SSR-скрапер). - Compression median **1.29×**; читаемость **87%** (100% на чистом line-art); tracing-IoU ~0.91. **Рекомендация:** Phase 1 production-ready для чистого line-art **при input-quality фильтре** (отсев 3D-рендеров/фото → raster fallback) + Otsu-порог + despeckle + рендер на белом. **Phase 2 ML (CubiCasa) пока не требуется.** Wiring ≈ 3.5–4.5 дн. **Оговорка:** % и compression надо пере-подтвердить на реальных DOM.РФ-планировках, когда появится 22d-скрапер. Spike-doc → vault `inbox/2026-06-17-1815-plan-vectorization-spike-299.md`. Закрываю как spike (production-wiring — отдельная задача).
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#299
No description provided.