Spaces:
Sleeping
Sleeping
metadata
sdk: docker
app_port: 7860
🧩 planparser
Architectural plan elements detection на базе Ultralytics YOLO с удобным Gradio UI и FastAPI API.
✨ Что это
planparser берет изображение плана, прогоняет через YOLO и показывает результат в удобном UI:
- 🖼️ изображение с bbox и подписями классов
- 📋 таблицу-спецификацию (Element, Qty)
- ⬇️ CSV файл для скачивания (element_schedule.csv)
- 🧾 raw detections в JSON (class_id, class_name, confidence, xyxy)
- ⏱️ время обработки
🍬 Фичи
- 🖼️ Upload изображения + Examples
- 🧠 выбор модели из списка
- ⚡ Auto-run или ручной Submit
- 🖍️ отрисовка bbox + нормализованные названия классов
- 📋 element schedule в таблице (Element, Qty)
- ⬇️ экспорт schedule в CSV
- 📦 raw detections в JSON (в Accordion)
- 🧰 FastAPI inference API
- 🐳 контейнеризация и запуск через Docker
- 🤗 доступ к уже развернутому приложению на HF Spaces
🤗 Web app
Готовая веб-версия без локальной установки:
🧠 Архитектура
flowchart LR
A[Gradio UI] -->|POST image + weights_path| B[FastAPI /predict]
B --> C[Ultralytics YOLO]
C --> B
B -->|detections JSON| A
A --> D[Render bbox + labels]
A --> E[Element schedule table]
A --> F[CSV export]
A --> G[Raw detections accordion]
🗂️ Структура проекта
planparser/
app.py # Gradio UI клиент
api.py # FastAPI инференс сервер
src/
examples/ # примеры картинок (опционально)
models/ # веса *.pt (опционально)
.env # конфиг
🚀 Быстрый старт
Установка:
git clone https://github.com/anngrrr/planparser.git
cd planparser
uv sync
⚙️ Конфиг (.env)
Минимум:
API_URL="http://127.0.0.1:8000"
MODEL_DIR="src/models"
MODEL_1="yolo11l_custom.pt"
MODEL_2="custom.pt"
EXAMPLES_DIR="src/examples"
Таблица:
| Переменная | Зачем |
|---|---|
API_URL |
адрес FastAPI для UI |
MODEL_DIR |
папка с весами |
MODEL_1, MODEL_2 |
имена файлов *.pt |
EXAMPLES_DIR |
папка примеров для UI |
🏃 Запуск локально
1) Поднять API
uv run uvicorn planparser.api:app --host 0.0.0.0 --port 8000
2) Поднять UI
uv run gradio planparser/app.py
Открыть:
- API:
http://127.0.0.1:8000 - UI:
http://127.0.0.1:7860
🔌 API
GET /health
Ответ:
{"ok": true}
POST /predict
Form-data:
file: изображениеweights_path: путь к.ptфайлу весов (должен существовать на стороне API)
Пример ответа:
{
"detections": [
{
"class_id": 1,
"class_name": "door",
"confidence": 0.87,
"xyxy": [12.3, 45.6, 78.9, 120.1]
}
]
}
🧩 Модели
Локальные веса
Положи .pt в MODEL_DIR и укажи в .env:
MODEL_DIR="src/models"
MODEL_1="yolo11n.pt"
MODEL_2="yolo11l.pt"
Как выбираются веса
Веса выбираются в UI и передаются в API как weights_path.
UI:
- берет
MODEL_DIR - собирает список доступных моделей из
.env(MODEL_1,MODEL_2) - отображает их в Dropdown
API:
- принимает
weights_path - проверяет что это существующий
.ptфайл - кэширует загруженные модели по абсолютному пути (чтобы повторно не грузить веса)
🐳 Docker
Build
docker build -t planparser .
Run
docker run --rm \
-p 7860:7860 -p 8000:8000 \
--env-file .env \
-v "$(pwd)/src/models:/app/src/models" \
-v "$(pwd)/src/examples:/app/src/examples" \
planparser
🧪 Трейнинг (если надо)
Минимальный пример (Ultralytics):
yolo detect train model=yolo11n.pt data=src/data/data.yaml imgsz=640 epochs=50
📎 Датасеты и лицензии
Dataset
Используется датасет Floorplan details Fork, лицензия CC BY 4.0
Ultralytics YOLO
Ultralytics YOLO распространяется по AGPL-3.0
❤️ Credits
- Ultralytics YOLO
- Gradio
- FastAPI
- Hugging Face
📜 License
Смотри файл LICENSE.