DStruct2Design: Data and Benchmarks for Data Structure Driven Generative Floor Plan Design
Paper • 2407.15723 • Published
YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
A fine-tuned LLM that generates 2D construction floor plans from parametric input matching a ProjectCreate schema — including plot dimensions, setbacks, road side, number of bedrooms/toilets, optional rooms (pooja, study, balcony, parking, basement, stilt), and Vastu preferences.
Given parameters like:
Plot: 15m x 12m rectangular
Setbacks: front=1.5m, rear=1.0m, left=1.0m, right=1.0m
Road side: North
Bedrooms: 3, Toilets: 3
Parking required, Pooja room, Balcony
2 floors (G+1)
City: Delhi
The model outputs a complete JSON floorplan with:
| Component | Value |
|---|---|
| Base Model | Qwen/Qwen2.5-1.5B-Instruct |
| Fine-tuning | LoRA (r=16, alpha=32, dropout=0.05) |
| Target Modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
| Epochs | 5 |
| Batch Size | 4 (accumulation=4) |
| Learning Rate | 1e-4 |
| Max Sequence Length | 4096 |
| Precision | bf16 |
The dataset is synthetically generated to match your ProjectCreate schema.
{
"name": "MyHouse",
"plot_length": 15.0,
"plot_width": 12.0,
"setback_front": 1.5,
"setback_rear": 1.0,
"setback_left": 1.0,
"setback_right": 1.0,
"road_side": "N",
"north_direction": "N",
"num_bedrooms": 3,
"toilets": 3,
"parking": true,
"city": "Delhi",
"vastu_enabled": false,
"road_width_m": 9.0,
"has_pooja": true,
"has_study": false,
"has_balcony": true,
"plot_shape": "rectangular",
"num_floors": 2,
"has_stilt": false,
"has_basement": false,
"municipality": "MCD",
"custom_room_config": null
}
{
"project_name": "MyHouse",
"plot": {
"shape": "rectangular",
"outer_boundary": [[0,0],[15,0],[15,12],[0,12]],
"setbacks": {"front":1.5,"rear":1.0,"left":1.0,"right":1.0},
"buildable_boundary": [[1.5,1.5],[13.5,1.5],[13.5,11],[1.5,11]],
"road_side": "N",
"north_direction": "N",
"plot_length": 15.0,
"plot_width": 12.0
},
"rooms": [
{
"id": "living_1",
"type": "living",
"name": "Living Room",
"floor": "gf",
"polygon": [[1.5,1.5],[8.5,1.5],[8.5,5.5],[1.5,5.5]],
"area_sqm": 24.0,
"dimensions": {"width":7.0,"depth":4.0},
"position": {"x":5.0,"y":3.5}
},
...
],
"doors": [
{"id":"door_main","type":"main_entrance","width":0.9,"from":"outside","to":"living_1","position":[7.5,11.0],"orientation":"horizontal"},
...
],
"windows": [
{"id":"win_living_1","room":"living_1","width":1.2,"height":1.5,"position":[8.5,3.5],"orientation":"vertical"},
...
],
"dimensions": {
"total_built_up_area_sqm": 145.2,
"total_carpet_area_sqm": 128.0,
"ground_floor_area_sqm": 128.0,
"first_floor_area_sqm": 0.0,
"second_floor_area_sqm": 0.0,
"stilt_area_sqm": 0.0,
"basement_area_sqm": 0.0
},
"meta": {
"num_floors": 2,
"has_stilt": false,
"has_basement": false,
"vastu_enabled": false,
"city": "Delhi",
"municipality": "MCD"
}
}
| File | Purpose |
|---|---|
train.py |
Fine-tuning script using TRL SFTTrainer + LoRA |
generate.py |
Inference script — pass parametric input, get JSON floorplan |
generate_synthetic_dataset.py |
Generates the training dataset from the ProjectCreate schema |
README.md |
This file |
pip install datasets
python generate_synthetic_dataset.py
This creates floorplan_synthetic_dataset/ with 5,000 train, 500 val, 500 test examples.
pip install transformers trl torch datasets peft accelerate trackio
export HF_TRAINER_HUB_MODEL_ID="Karthik8nitt/parametric-floorplan-generator"
python train.py
Requires ~16GB VRAM (T4, RTX 3090, A10G). Runtime: 2-4 hours.
python generate.py \
--plot_length 15 --plot_width 12 \
--setback_front 1.5 --setback_rear 1.0 \
--setback_left 1.0 --setback_right 1.0 \
--road_side N --num_bedrooms 3 --toilets 3 \
--parking --has_pooja --has_balcony \
--num_floors 2 --city Delhi
Use custom_room_config to add non-standard rooms:
[
{"type": "gym", "name": "Home Gym", "min_area_sqm": 15, "floor_preference": "ff", "mandatory": true},
{"type": "home_theater", "name": "Theater", "min_area_sqm": 20, "floor_preference": "basement", "mandatory": true}
]
rectangularl_shaped (with cutout_corner, cutout_width, cutout_height)trapezoid (with plot_front_width, plot_rear_width, plot_side_offset)