Kterou aplikaci bych měl použít k uspořádání nábytku?

Ahoj všichni! Jsme tým Smart vision v Domkliku a našim klientům nabízíme různé nástroje, které jim pomohou vybrat si bydlení tak, aby bylo co nejpohodlnější. Jedním z těchto nástrojů je automatické uspořádání nábytku, aby si naši uživatelé mohli prohlédnout prostorový byt se zařízením a lépe porozumět velikosti místnosti. Program je zatím dostupný v testovacím okruhu v rámci ekosystému Domklik. Tento algoritmus nepovažujeme za nástroj pro ideální uspořádání nábytku, pouze pomáhá klientovi v uspořádání nábytku pro další práci s ním. Existuje mnoho článků o řešení tohoto problému: pomocí GAN, který generuje barevnou plochu na půdorysu pro umístění nábytku; používání klasických metod založených na souboru pravidel; nebo pomocí vzácnějších metod grafů. Všechny stávající metody však spojuje skutečnost, že buď nejsou implementovány (nebo jsou v uzavřeném přístupu), nebo nezohledňují například okna a dveře, stejně jako typ místnosti (obývací pokoj, ložnice, dětský pokoj, kuchyň, koupelna atd.). Snažili jsme se těchto nedostatků v našem nástroji zbavit.
S čím musíte pracovat?
- Typy pokojů: chodba, obývací pokoj, ložnice atd.
- Sada bodů pro každý typ ve dvourozměrném souřadnicovém systému: bod[x,y].
- Objekty nábytku jako ID, které spojuje 2D a 3D objekt.
- A podrobný manuál od designérů se sadou nábytku pro každý typ místnosti, v závislosti na ploše místností.
První otázka, která vyvstala: s jakými předměty nábytku budeme pracovat, dvourozměrné nebo trojrozměrné? A druhý, zásadnější: jak vyřešíme problém pomocí metod hlubokého učení nebo metod založených na pravidlech (někdo by řekl, že jde o shluk if-s)? Rozhodli jsme se použít 2D objekty SVG, protože se s nimi snadněji pracuje, jsou reprezentovány řadou bodů a zabírají mnohem méně paměti k jejich uložení. A při odpovědi na druhou otázku jsme použili radu „Pokud nemůžete použít mřížky, je lepší je nepoužívat“ a rozhodli se spokojit s metodou založenou na pravidlech, i když do budoucna nevylučovali možnost použití metod založených na strojovém učení.
Struktura algoritmu
- Vybíráme místnost pro rozmístění nábytku.
- Rozdělíme to na podprostory – podmíněné sektory pro uspořádání nábytku.
- Nacházíme průsečíky oken a dveří s podprostory, abychom pochopili, ke kterému z nich patří, protože v budoucnu by nábytek neměl tyto otvory zakrývat.
- Do místnosti přidáme nábytek; standardně je umístěn uprostřed.
- Poté nábytek rozmístíme po podprostorech a vypočítáme jeho souřadnice vzhledem k podprostorům. Rozházíme „hltavě“: vezmeme jeden předmět, najdeme pro něj podprostor a přesuneme ho do něj, vezmeme další a tak dále pro každý předmět. Zároveň zohledňujeme okna a dveře, aby je nábytek nezakrýval
- Přesouváme nábytek směrem ke stěnám hlavní místnosti, nevěnujeme pozornost podprostorům.
- Uspořádejme závislé předměty: nábytek, jehož umístění závisí na jiném objektu, například nočním stolku.
- Hledáme kolize mezi předměty a okny a dveřmi.
- Pokud nedochází ke kolizím, pak ponecháme dosavadní uspořádání nábytku; pokud existují, řešíme je vzájemným posunutím objektů.
Nyní se podívejme na klíčové fáze algoritmu.
Rozdělení místnosti na podprostory
Rozdělíme na čtverce a určitě je očíslujeme. Mimochodem, také jsme uvažovali o rozdělení pomocí algoritmu pro rozdělení binárního prostoru, který používal John Carmack v enginu DOOM.

Výběr podprostoru pro nábytek
Obdrželi jsme očíslované schéma pro rozdělení místnosti na podprostory:

V závislosti na typu místnosti a její ploše se předpokládá použití unikátní sestavy nábytku. Informace o jeho dalším umístění čerpáme z manuálu projektantů (děkujeme jim za podrobný dokument). Máme také řadu pravidel, podle kterých by měly být určité druhy nábytku umístěny v místnosti vůči sobě. Například pohovka v obývacím pokoji by měla být naproti televizi ve vzdálenosti alespoň 700 mm. Připomínám, že je třeba vzít v úvahu dveře a okna, aby je nábytek nezakrýval.
Nyní máme informace o podprostorech, typech nábytku a umístění oken a dveří vzhledem k podprostorům. Můžeme vytvořit několik scénářů pro uspořádání nábytku v podprostoru v závislosti na umístění dveří a oken. Například:

Díky školní geometrii! Použili jsme kompozice paralelních translace na orientovaný vektor. Co k tomu potřebujeme?
Podívejme se na příklad stěhování běžné obdélníkové pohovky. Chceme jej přesunout ze středu místnosti, kde standardně skončil, do pro něj vybraného podprostoru (buňky). Pohovku si představíme jako ohraničující rámeček – čtyři body ve dvourozměrném prostoru se souřadnicemi x, y – a najdeme jeho střed, tedy těžiště pohovky. Vezmeme vybraný podprostor – to je také množina bodů, ve většině případů tvoří obdélník – a najdeme jeho střed. Nyní máme dva centroidy, divany a podprostory. Z nich získáme směrovaný vektor z pohovky do podprostoru a provedeme paralelní přenos do vektoru.
Takto přesuneme objekty do středu podprostorů a natočíme je. Zpočátku je veškerý nábytek orientován směrem mínus podél osy y a po prvním pohybu předmětu se nábytek otočí „zády“ ke stěně.

Nyní musíte pohovku přesunout ke stěně. Zjistíme minimální vzdálenost od něj k hlavnímu prostoru (části místnosti, která není rozdělena na podprostory), na výstupu získáme dva body: jeden na hranici pohovky, druhý na hranici prostoru. Pak znovu paralelní přenos do vektoru a tak dále s veškerým nábytkem.

Problém je ale v tom, že pokud předměty umístíme do podprostorů a jednou je přesuneme k nejbližším stěnám, pak se mohou snadno vzájemně protínat, například pohovka se šatní skříní. Je dobré, že všechny objekty jsou prezentovány jako ohraničující rámeček a pomocí knihovny můžeme snadno najít průsečíky urostlý, který předtím vytvořil polygon z bbox a použil metodu průniku. Při umisťování předmětů také bereme v úvahu:
- regulovaná šířka průchodu mezi nábytkem;
- rozměry nábytku vzhledem k ploše místnosti;
- nábytek by neměl zakrývat okna a dveře.
Uspořádání závislých objektů
Zvažte příklad s nočním stolkem a postelí. Po přemístění postele na její konečné místo je třeba vedle ní umístit noční stolek. Samotná postel se nachází v určitém podprostoru. Můžeme vybrat sousední volné buňky a umístit tam noční stolek, ten pak přesunout k posteli (podle výše popsaného postupu pouze vzhledem k posteli samotné) a ještě jednou posunout noční stolek, nyní k nejbližší stěně, takže že těsně přiléhá ke stěně a čelu postele.
Zvládání kolizí nábytkových předmětů, dveří a oken
Začněme klasifikací dveří a oken v konkrétní místnosti. Například obývací pokoj může mít tři typy dveří a jeden typ oken:
- vstupní dveře, obvykle se nacházejí mezi chodbou a pokojem;
- vnitřní dveře vedoucí do dalších místností;
- balkonové dveře.
Po analýze velkého množství rozvržení jsme identifikovali vzor v místě: balkónové dveře jsou obvykle umístěny naproti vchodu a vnitřní dveře jsou umístěny v „kolmých“ stěnách.

Když tedy přepažujeme hlavní prostor, zohledňujeme umístění dveří a oken vzhledem k těmto podprostorům, čímž eliminujeme riziko umístění nábytkových předmětů, které budou blokovat dveře a okna. Ale to nestačí, museli jsme přidat další kolo kolizní kontroly po uspořádání nábytku v místnosti. Najdeme průsečíky objektů s dveřmi a okny a posouváme je, dokud průsečíky nezmizí; a pokud to není možné, pak objekt jednoduše smažeme. Po otestování tohoto přístupu jsme si uvědomili, že „stoly“ jsou obvykle odstraněny a „skříně“ přesunuty.

Výsledek
Takže, co nakonec získáte? U vchodu obdržíte sadu nábytku reprezentovanou body a ID objektů a také místnosti, které se liší funkčností. Na výstupu algoritmu získáme ID objektů nábytku s aktualizovanými body, které jsou umístěny vzhledem k místnosti. Poté algoritmus spojí nábytek podle ID s jeho trojrozměrnou reprezentací a přidá jej do trojrozměrného modelu místnosti vytvořeného z výkresu bytu.


PS
Není to tak dávno, co Nvidia vydala svůj algoritmus automatické umisťování nábytku do trojrozměrného prostoru na bázi neuronových sítí, které vypadá velmi cool, ale nepočítá s okny a dveřmi a nenabízí předem natrénované modely.