feat(plans): semantic floor plan vectorization — Phase 2 (CubiCasa5K) #300

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

Phase 2 — semantic vectorization (after Phase 1 spike #299)

Цель: получить SVG с семантической разметкой комнат (кухня / спальня / ванная / коридор) + двери / окна / стены как отдельные слои. Output напрямую → Shapely Polygons → наш generative engine.

Зависит от

  • Issue #299 (Phase 1 Potrace spike) — финиш с рекомендацией
  • Issue #297, sub-task 22cdomrf_kn_flat_plans table + bulk download планировок (training corpus)

Scope

  1. Self-hosted ML модель — CubiCasa5K pretrained checkpoint (https://github.com/CubiCasa/CubiCasa5k)
  2. Fine-tune на DOM.РФ планировках (~1000-3000 размеченных, manual labelling 1-2 дня + auto-label по cluster'у)
  3. Production pipeline:
    • Скрап planимages → domrf_kn_flat_plans
    • Background job vectorize_plan(plan_id) → CubiCasa parse → SVG + JSON {rooms: [{type, polygon, area_m2}], doors, windows}
    • Сохранить в новую таблицу domrf_kn_flat_plans_vectorized (либо JSONB колонку в domrf_kn_flat_plans)
  4. Quality gate — ручная проверка sample 50 планов, accuracy ≥85% room-type classification
  5. API endpoint GET /api/v1/flats/{ods_id}/plan.svg — отдаёт vector SVG для frontend
  6. Frontend SVG viewer в BestLayoutsBlock / TradeIn — клик по комнате → tooltip с площадью / типом

Stack

  • PyTorch (torch, torchvision) — добавить в backend/pyproject.toml как optional extra [plan-vectorization]
  • CubiCasa5K weights (~200 MB) — хранить в S3 или volume mount
  • Inference: либо в Celery task с GPU (если будет VPS с GPU), либо CPU (медленнее, 5-10 сек/план — терпимо для async)
  • Output schema: GeoJSON FeatureCollection + кастомные properties (room_type, area_m2)

Output schema (предлагаемый)

{
  "type": "FeatureCollection",
  "features": [
    {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [...]},
     "properties": {"layer": "room", "room_type": "kitchen", "area_m2": 12.4}},
    {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [...]},
     "properties": {"layer": "room", "room_type": "bedroom", "area_m2": 14.8}},
    {"type": "Feature", "geometry": {"type": "LineString", "coordinates": [...]},
     "properties": {"layer": "wall"}},
    {"type": "Feature", "geometry": {"type": "Point", "coordinates": [...]},
     "properties": {"layer": "door"}}
  ],
  "metadata": {
    "ods_id": "65136/1/1.4.3",
    "total_area_m2_declared": 36.22,
    "total_area_m2_computed": 35.84,
    "rooms_count": 4,
    "vectorized_at": "2026-05-20T..."
  }
}

Acceptance criteria

  • CubiCasa5K интегрирован, inference работает на CPU (5-10 сек/план)
  • ≥1000 планировок DOM.РФ обработаны и сохранены как GeoJSON в БД
  • Accuracy на test set (50 ручных образцов): room-type ≥85%, room-count ±1
  • API /plan.svg отдаёт valid SVG ≤30 KB
  • Frontend компонент <PlanViewer ods_id={...} /> с zoom + клик по комнате
  • Computed total_area within ±10% от declared (sanity check)

Out of scope

  • 3D BIM (стены с толщиной, высота — отдельная фича)
  • Reverse-training generative engine — это Phase 3
  • Распознавание мебели (DOM.РФ часто рисует иконки кровати/дивана — игнорируем)

Estimated effort

2-4 недели, sequential:

  • Week 1: CubiCasa fine-tune + accuracy validation (1-2k размеченных)
  • Week 2: Production pipeline + API endpoint + storage
  • Week 3-4 (если нужно): frontend viewer + UI polish

References

Связь с generative engine

Output Phase 2 → Shapely Polygons input для services/generative/geometry.py (issues #54-57). После этого Phase 3 может обучать наш generative движок на этом dataset.

Discovered: 2026-05-17 by Ghost.

## Phase 2 — semantic vectorization (after Phase 1 spike #299) **Цель**: получить SVG с **семантической разметкой комнат** (кухня / спальня / ванная / коридор) + двери / окна / стены как отдельные слои. Output напрямую → Shapely Polygons → наш generative engine. ## Зависит от - **Issue #299** (Phase 1 Potrace spike) — финиш с рекомендацией - **Issue #297, sub-task 22c** — `domrf_kn_flat_plans` table + bulk download планировок (training corpus) ## Scope 1. **Self-hosted ML модель** — CubiCasa5K pretrained checkpoint (https://github.com/CubiCasa/CubiCasa5k) 2. **Fine-tune** на DOM.РФ планировках (~1000-3000 размеченных, manual labelling 1-2 дня + auto-label по cluster'у) 3. **Production pipeline**: - Скрап planимages → `domrf_kn_flat_plans` - Background job `vectorize_plan(plan_id)` → CubiCasa parse → SVG + JSON `{rooms: [{type, polygon, area_m2}], doors, windows}` - Сохранить в новую таблицу `domrf_kn_flat_plans_vectorized` (либо JSONB колонку в `domrf_kn_flat_plans`) 4. **Quality gate** — ручная проверка sample 50 планов, accuracy ≥85% room-type classification 5. **API endpoint** `GET /api/v1/flats/{ods_id}/plan.svg` — отдаёт vector SVG для frontend 6. **Frontend SVG viewer** в `BestLayoutsBlock` / TradeIn — клик по комнате → tooltip с площадью / типом ## Stack - PyTorch (`torch`, `torchvision`) — добавить в `backend/pyproject.toml` как optional extra `[plan-vectorization]` - CubiCasa5K weights (~200 MB) — хранить в S3 или volume mount - Inference: либо в Celery task с GPU (если будет VPS с GPU), либо CPU (медленнее, 5-10 сек/план — терпимо для async) - Output schema: GeoJSON FeatureCollection + кастомные properties (`room_type`, `area_m2`) ## Output schema (предлагаемый) ```json { "type": "FeatureCollection", "features": [ {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [...]}, "properties": {"layer": "room", "room_type": "kitchen", "area_m2": 12.4}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [...]}, "properties": {"layer": "room", "room_type": "bedroom", "area_m2": 14.8}}, {"type": "Feature", "geometry": {"type": "LineString", "coordinates": [...]}, "properties": {"layer": "wall"}}, {"type": "Feature", "geometry": {"type": "Point", "coordinates": [...]}, "properties": {"layer": "door"}} ], "metadata": { "ods_id": "65136/1/1.4.3", "total_area_m2_declared": 36.22, "total_area_m2_computed": 35.84, "rooms_count": 4, "vectorized_at": "2026-05-20T..." } } ``` ## Acceptance criteria - [ ] CubiCasa5K интегрирован, inference работает на CPU (5-10 сек/план) - [ ] ≥1000 планировок DOM.РФ обработаны и сохранены как GeoJSON в БД - [ ] Accuracy на test set (50 ручных образцов): room-type ≥85%, room-count ±1 - [ ] API `/plan.svg` отдаёт valid SVG ≤30 KB - [ ] Frontend компонент `<PlanViewer ods_id={...} />` с zoom + клик по комнате - [ ] Computed total_area within ±10% от declared (sanity check) ## Out of scope - ❌ 3D BIM (стены с толщиной, высота — отдельная фича) - ❌ Reverse-training generative engine — это Phase 3 - ❌ Распознавание мебели (DOM.РФ часто рисует иконки кровати/дивана — игнорируем) ## Estimated effort **2-4 недели**, sequential: - Week 1: CubiCasa fine-tune + accuracy validation (1-2k размеченных) - Week 2: Production pipeline + API endpoint + storage - Week 3-4 (если нужно): frontend viewer + UI polish ## References - Phase 1 spike: #299 - Catalog scraper: #297 (sub-task 22c) - CubiCasa5K: https://github.com/CubiCasa/CubiCasa5k - Альтернатива: DeepFloorplan https://github.com/zlzeng/DeepFloorplan ## Связь с generative engine Output Phase 2 → Shapely Polygons input для `services/generative/geometry.py` (issues #54-57). После этого Phase 3 может обучать наш generative движок на этом dataset. Discovered: 2026-05-17 by Ghost.
lekss361 added the
site-finder
enhancement
labels 2026-05-17 14:52:56 +00:00
lekss361 added the
priority/p2
scope/backend
labels 2026-06-17 20:18:08 +00:00
Collaborator

Проверка предпосылок перед стартом (2026-07-05).

Issue заявляет зависимость "Issue #297, sub-task 22c — domrf_kn_flat_plans table + bulk download планировок" как готовую. Прод-проверка показывает — это не так:

  • domrf_kn_flat_plans существует (миграция 114_22c_flat_plans.sql), но 0 строк — ни одной планировки не скачано.
  • extract_flat_plans() в flat_plans.py — задокументированный stub: kn-API flat-table payload НЕ содержит plan_image_url вообще (аудит 2026-05-17), всегда возвращает [].
  • download_plan_image_stub() — буквально raise NotImplementedError до сих пор.
  • Не заведено ни в один Celery beat/worker — модуль ничем не вызывается.

Связка с #299: тот спайк тоже упёрся в это же самое — тестировался на 21 Wikimedia + 10 синтетике, "DOM.РФ недоступен — flat_plans.py заглушка, нужен 22d SSR-скрапер" (комментарий к #299). Рекомендация #299: Phase 2 ML (CubiCasa) пока не требуется — предлагает сначала добить production-wiring Phase 1 (Potrace + input-quality фильтр, ≈3.5-4.5 дня), а Phase 2 отложить.

Хорошая новость: harvesting плашек дешевле, чем в issue описано. Уже есть рабочий, регулярно запускаемый SSR-HTML скрапер тех же самых страниц каталога — domrf_catalog.py / scrape_kn_catalog_objects.py (983k квартир в очереди, 29.4k уже с ценой). Его _TextCollector сейчас сознательно игнорирует <img> (void-tag skip) — там же, на тех же страницах, лежит и планировка. Расширить эту фичу дешевле, чем строить отдельный 22d-скрапер с нуля.

Рекомендация: не начинать Phase 2 (CubiCasa fine-tune) в текущем виде — нет корпуса и собственный спайк советует иное. Следующий реальный шаг — extend domrf_catalog.py на извлечение + скачивание plan_image (S-размер, ~1 день по оценке инфраструктуры), затем прогнать production-wiring Phase 1 Potrace (#299 рекомендация, 3.5-4.5 дня) и только по факту накопленного объёма и по факту "не хватает Potrace" — возвращаться к CubiCasa.

**Проверка предпосылок перед стартом (2026-07-05).** Issue заявляет зависимость "Issue #297, sub-task 22c — `domrf_kn_flat_plans` table + bulk download планировок" как готовую. Прод-проверка показывает — это не так: - `domrf_kn_flat_plans` существует (миграция `114_22c_flat_plans.sql`), но **0 строк** — ни одной планировки не скачано. - `extract_flat_plans()` в `flat_plans.py` — задокументированный stub: kn-API flat-table payload НЕ содержит plan_image_url вообще (аудит 2026-05-17), всегда возвращает `[]`. - `download_plan_image_stub()` — буквально `raise NotImplementedError` до сих пор. - Не заведено ни в один Celery beat/worker — модуль ничем не вызывается. **Связка с #299**: тот спайк тоже упёрся в это же самое — тестировался на 21 Wikimedia + 10 синтетике, "DOM.РФ недоступен — `flat_plans.py` заглушка, нужен 22d SSR-скрапер" (комментарий к #299). Рекомендация #299: **Phase 2 ML (CubiCasa) пока не требуется** — предлагает сначала добить production-wiring Phase 1 (Potrace + input-quality фильтр, ≈3.5-4.5 дня), а Phase 2 отложить. **Хорошая новость**: harvesting плашек дешевле, чем в issue описано. Уже есть рабочий, регулярно запускаемый SSR-HTML скрапер тех же самых страниц каталога — `domrf_catalog.py` / `scrape_kn_catalog_objects.py` (983k квартир в очереди, 29.4k уже с ценой). Его `_TextCollector` сейчас **сознательно** игнорирует `<img>` (void-tag skip) — там же, на тех же страницах, лежит и планировка. Расширить эту фичу дешевле, чем строить отдельный 22d-скрапер с нуля. **Рекомендация**: не начинать Phase 2 (CubiCasa fine-tune) в текущем виде — нет корпуса и собственный спайк советует иное. Следующий реальный шаг — extend `domrf_catalog.py` на извлечение + скачивание plan_image (S-размер, ~1 день по оценке инфраструктуры), затем прогнать production-wiring Phase 1 Potrace (#299 рекомендация, 3.5-4.5 дня) и только по факту накопленного объёма и по факту "не хватает Potrace" — возвращаться к CubiCasa.
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#300
No description provided.