2dplan2strct / README.md
OsamaMo's picture
Update 2DPlan2Strct model card and inference default
e9802f8 verified
|
Raw History Blame Contribute Delete
7.43 kB
---
language: en
model_name: 2DPlan2Strct
pipeline_tag: object-detection
tags:
- floor-plan
- architecture
- object-detection
- rfdetr
metrics:
- map
license: other
license_name: non-commercial-research-only
license_link: https://huggingface.co/OsamaMo/2dplan2strct/blob/main/USAGE_TERMS.md
---
# 2DPlan2Strct
### From Floor Plan Images to Structured Architectural Understanding
Detect **walls, rooms, doors, and windows** in 2D floor-plan images. Inference runs locally after the weights are downloaded from Hugging Face. It returns a JSON file with detections and an annotated PNG. Walls and rooms are represented by bounding boxes, not segmentation masks.
## Before and after detection
| Before detection | After detection |
| :---: | :---: |
| ![Floor plan before detection](https://huggingface.co/OsamaMo/2dplan2strct/resolve/main/images/before_detection.webp) | ![Same floor plan with detected walls, rooms, doors, and windows highlighted](https://huggingface.co/OsamaMo/2dplan2strct/resolve/main/images/after_detection.png) |
| ![Second floor plan before detection](https://huggingface.co/OsamaMo/2dplan2strct/resolve/main/images/before_rec_2.jpeg) | ![Second floor plan with detected walls, rooms, doors, and windows highlighted](https://huggingface.co/OsamaMo/2dplan2strct/resolve/main/images/after_rec_2.png) |
## Quick start
Use Python 3.10–3.12. In a clean virtual environment, install the requirements and download the inference script:
```bash
python -m pip install "huggingface_hub>=0.25"
hf download OsamaMo/2dplan2strct inference.py requirements.txt --local-dir floorplan-inference
python -m pip install -r floorplan-inference/requirements.txt
python floorplan-inference/inference.py path/to/plan.png --output-dir results/plan
```
The last command downloads and caches the model weights automatically. It writes `results/plan/predictions.json` and `results/plan/annotated.png`. The `--device` option accepts `auto` (default), `cpu`, or `cuda`; `auto` selects CUDA when available. The first run downloads approximately 134 MB of weights.
Raise the confidence threshold to show fewer, stronger predictions:
```bash
python floorplan-inference/inference.py path/to/plan.png --threshold 0.50 --output-dir results/plan
```
The model is hosted on the Hugging Face Hub but is loaded with `rfdetr`. This checkpoint is **not** compatible with Transformers `AutoModel` or `pipeline()`.
## Prediction format
`predictions.json` contains the model ID, input image path, original image width and height, threshold, and a `detections` array. Each detection has:
| Field | Meaning |
| --- | --- |
| `label` | One of `wall`, `room`, `door`, or `window` |
| `score` | Detector confidence from 0 to 1; it is not a calibrated probability |
| `box_xyxy` | `[left, top, right, bottom]` in pixels of the original image |
Detections are sorted from highest to lowest confidence. The annotated PNG keeps the original image size and draws color-coded boxes and labels. The source image is not modified. Overlapping boxes can occur.
## Use in Python
After downloading `inference.py` and installing the requirements, load the model once and reuse it for multiple images:
```python
from inference import FloorPlanDetector, save_prediction
detector = FloorPlanDetector()
result = detector.predict("path/to/plan.png", threshold=0.35)
print(f"Found {len(result['detections'])} objects")
print(result["detections"][:3])
save_prediction(result, "path/to/plan.png", "results/plan")
other_result = detector.predict("path/to/another-plan.jpg", threshold=0.35)
```
Run this snippet from the directory containing the downloaded `inference.py`, or add that directory to your Python path.
## Offline use and reproducible versions
Download the configuration and checkpoint while online, then point the inference script at the local directory:
```bash
hf download OsamaMo/2dplan2strct config.json checkpoint_best_ema.pth --local-dir floorplan-model
python floorplan-inference/inference.py path/to/plan.png --model-dir floorplan-model --output-dir results/plan
```
For a reproducible run, pass a specific Hub commit SHA with `--revision` when using online inference. Use the same revision for any files downloaded separately.
## Evaluation
The published checkpoint is the best EMA checkpoint after epoch 13. The following are **validation** results on 2,964 held-out floor-plan images, as reported by the training run. These are object-detection metrics, not a percentage of floor plans understood correctly or an independent test-set score.
| Metric | Value |
| --- | ---: |
| COCO box mAP@0.5 | 94.52% |
| COCO box mAP@0.5:0.95 | 82.58% |
| F1 | 91.86% |
| Precision | 93.53% |
| Recall | 90.26% |
Scores can change with drawing style, scan quality, and confidence threshold. Inspect detections before using them in a consequential workflow.
## Inference speed
**Measured CPU result for this checkpoint:** On a 1,206 × 1,013 pixel floor plan, the model produced 123 detections at confidence threshold 0.35. On an Intel Xeon Platinum 8488C with two PyTorch CPU threads, median latency was **457.63 ms/image** (about **2.19 images/second**); p95 was **654.66 ms/image**. This used 3 warm-up runs and 20 timed `model.predict()` calls in float32. The RGB image was already loaded; model download, one-time model loading, image-file decoding, and drawing the annotated PNG were outside the timed section.
**GPU reference, not a measurement of this checkpoint:** The [RF-DETR project's published benchmark](https://github.com/roboflow/rf-detr/blob/develop/docs/learn/run/detection.md#pre-trained-checkpoints) reports **4.4 ms/image** for the original RF-DETR Medium at 576 × 576 on an NVIDIA T4 using TensorRT FP16 and batch size 1 (about 227 images/second). This model repository currently provides a PyTorch checkpoint; its actual CUDA latency has not been measured here. The GPU reference uses a different checkpoint and runtime, so it is not a direct CPU-to-GPU speedup comparison.
To measure both devices on your own machine, download `benchmark.py` alongside `inference.py`, then run:
```bash
hf download OsamaMo/2dplan2strct benchmark.py inference.py --local-dir floorplan-inference
python floorplan-inference/benchmark.py path/to/plan.png --device both --warmups 3 --repeats 20
```
The benchmark reports `CUDA: unavailable` when the machine has no CUDA GPU. It synchronizes CUDA before and after each timed call when a GPU is present.
## Model details
- Architecture: RF-DETR Medium, PyTorch checkpoint
- Input: floor-plan image converted to RGB; inference resolution 576 pixels
- Outputs: boxes in `xyxy` image coordinates, class labels, confidence scores
- Classes: `wall`, `room`, `door`, `window`
- Default confidence threshold: `0.35`; tune for your drawings
- Supported use: non-commercial research and evaluation, subject to [usage terms](USAGE_TERMS.md)
## Training setup
The model was trained on an NVIDIA T4 GPU with 16 GB of memory. The reported training duration was 16 hours.
## Download tracking
Hugging Face displays a download count on this model page. The script retrieves `config.json`, which the Hub counts as a model download. The count represents file requests, **not unique people** or model-card readers. To retrieve the current count programmatically:
```python
from huggingface_hub import HfApi
info = HfApi().model_info("OsamaMo/2dplan2strct")
print(info.downloads)
```