planparser / README.md
Ann-Grabetski's picture
Readme done 2
52b2c45
|
Raw
History Blame Contribute Delete
5.74 kB
metadata
sdk: docker
app_port: 7860

🧩 planparser

Architectural plan elements detection на базе Ultralytics YOLO с удобным Gradio UI и FastAPI API.

Python Ultralytics Gradio FastAPI Docker HuggingFace


✨ Что это

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

Готовая веб-версия без локальной установки:

Hugging Face Spaces


🧠 Архитектура

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.