Skip to content

OptimusFaber/floorplan-detection

Repository files navigation

Floorplan Detection - Детекция и сегментация комнат на архитектурных планах

Проект для автоматической детекции и сегментации стен и комнат на архитектурных планах с использованием Detectron2 и Mask R-CNN.

🎯 Описание проекта

Проект включает два типа моделей:

  1. Detection — детекция стен и комнат (bounding boxes)
  2. Segmentation — сегментация комнат с масками (instance segmentation)

После серии экспериментов с различными подходами (OpenCV, HEAT, MMDetection, YOLOv10), Detectron2 с Mask R-CNN был выбран как наиболее эффективное решение.

⭐ Преимущества решения

  • Высокая точность: стабильная детекция и сегментация
  • Эффективность: низкое потребление ресурсов (< 1GB VRAM)
  • Скорость: быстрый inference (< 15 секунд с тайлингом)
  • Масштабируемость: поддержка больших изображений через тайлинг
  • Гибкость: CLI и FastAPI интерфейсы
  • Конфигурируемость: JSON конфигурационные файлы для разных экспериментов

📋 Содержание

⚡ Быстрый старт

1. Установка

# Создание conda окружения
conda create -n detectron python=3.10
conda activate detectron

# Установка PyTorch с CUDA
conda install pytorch==2.0.1 torchvision==0.15.2 pytorch-cuda=11.8 -c pytorch -c nvidia

# Установка Detectron2
pip install --no-build-isolation 'git+https://github.com/facebookresearch/detectron2.git'

# Установка зависимостей
pip install -r requirements.txt

2. Запуск инференса (CLI)

# Сегментация комнат с масками
python scripts/inference/segmentation_inference.py image.png --confidence 0.5

# С сохранением масок в PNG
python scripts/inference/segmentation_inference.py image.png --save-masks --mask-format png

3. Запуск API сервера

# FastAPI сервер для сегментации
python scripts/inference/segmentation_api.py --port 8001

# Тест через curl
curl -X POST "http://localhost:8001/predict?confidence=0.5" \
  -F "file=@plan.png" -o result.json

🚀 Установка

Требования

  • Python 3.10+
  • CUDA 11.8+ (для GPU)
  • 8GB+ RAM
  • 1GB+ VRAM (для GPU inference)

Подробная установка

# 1. Создание окружения
conda create -n detectron python=3.10
conda activate detectron

# 2. Установка PyTorch
conda install pytorch==2.0.1 torchvision==0.15.2 pytorch-cuda=11.8 -c pytorch -c nvidia

# 3. Установка Detectron2
pip install --no-build-isolation 'git+https://github.com/facebookresearch/detectron2.git'

# 4. Установка зависимостей
pip install -r requirements.txt

Или используйте скрипт установки:

chmod +x setup.sh
./setup.sh

📦 Формат данных

Структура данных

Проект использует COCO формат для аннотаций. Структура директорий:

Data/
├── Detection/                    # Данные для детекции (стены + комнаты)
│   ├── train/
│   │   ├── _annotations.coco.json
│   │   ├── image1.jpg
│   │   ├── image2.jpg
│   │   └── ...
│   └── valid/
│       ├── _annotations.coco.json
│       └── [images]
│
└── Segmentation/                 # Данные для сегментации (только комнаты)
    ├── train/
    │   ├── _annotations.coco.json
    │   └── [images]
    └── valid/
        ├── _annotations.coco.json
        └── [images]

Формат COCO аннотаций

Файл _annotations.coco.json должен содержать:

{
  "info": {...},
  "licenses": [...],
  "images": [
    {
      "id": 1,
      "file_name": "image1.jpg",
      "width": 1024,
      "height": 768
    }
  ],
  "annotations": [
    {
      "id": 1,
      "image_id": 1,
      "category_id": 1,
      "bbox": [x, y, width, height],
      "area": 12345,
      "segmentation": [[x1, y1, x2, y2, ...]],
      "iscrowd": 0
    }
  ],
  "categories": [
    {"id": 1, "name": "room", "supercategory": "rooms"}
  ]
}

Требования к аннотациям

Поле Формат Описание
bbox [x, y, w, h] Bounding box в формате XYWH
segmentation [[x1,y1,x2,y2,...]] Полигон маски (для сегментации)
category_id int ID категории (начиная с 1)
area float Площадь объекта в пикселях

Источники данных

  • Detection: CubiCasa5k — 5000 архитектурных планов
  • Segmentation: Roboflow test-cubi — датасет для сегментации комнат

🎓 Обучение

Обучение модели детекции

# Базовое обучение (использует дефолтные пути Data/Detection/)
python scripts/detection/train.py \
    --num-gpus 1 \
    --batch-size 2 \
    --max-iter 50000

# С конфигурационным файлом (рекомендуется)
python scripts/detection/train.py \
    --config detection_faster_r101_warmupcosine_2cls.json \
    --num-gpus 1 \
    --batch-size 2 \
    --max-iter 50000

# С Early Stopping (рекомендуется)
python scripts/detection/train.py \
    --num-gpus 1 \
    --batch-size 4 \
    --lr 0.0001 \
    --max-iter 50000 \
    --eval-period 5000 \
    --early-stopping-patience 5

# С указанием своих данных
python scripts/detection/train.py \
    --config detection_cascade_r50_warmupcosine_2cls.json \
    --num-gpus 1 \
    --batch-size 4 \
    --lr 0.0001 \
    --max-iter 50000 \
    --eval-period 5000 \
    --early-stopping-patience 5 \
    --train-json /path/to/train/_annotations.coco.json \
    --train-images /path/to/train/ \
    --val-json /path/to/valid/_annotations.coco.json \
    --val-images /path/to/valid/

# Grid Search гиперпараметров (долгий процесс)
python scripts/detection/train.py \
    --num-gpus 1 \
    --hypersearch

Обучение модели сегментации

# Базовое обучение (использует дефолтные пути Data/Segmentation/)
python scripts/segmentation/train.py \
    --num-gpus 1 \
    --batch-size 2 \
    --max-iter 50000

# С указанием своих данных
python scripts/segmentation/train.py \
    --num-gpus 1 \
    --batch-size 4 \
    --lr 0.0001 \
    --max-iter 50000 \
    --eval-period 5000 \
    --train-json /path/to/train/_annotations.coco.json \
    --train-images /path/to/train/ \
    --val-json /path/to/valid/_annotations.coco.json \
    --val-images /path/to/valid/

Конфигурационные файлы

Проект поддерживает JSON конфигурационные файлы для гибкой настройки моделей. Конфигурации находятся в папке configs/.

Формат названий: {тип}_{базовая_конфигурация}_{backbone}_{lr_scheduler}_{классы}.json

Конфигурация Описание Backbone LR Scheduler Классы
detection_cascade_r50_warmupcosine_2cls.jsonБАЗОВЫЙ Cascade R-CNN ResNet-50 FPN Cascade R-CNN R-50 WarmupCosineLR 2 (wall, room)
detection_faster_r101_warmupcosine_2cls.json Faster R-CNN ResNet-101 FPN Faster R-CNN R-101 WarmupCosineLR 2 (wall, room)
detection_faster_r50_warmupcosine_2cls.json Faster R-CNN ResNet-50 FPN Faster R-CNN R-50 WarmupCosineLR 2 (wall, room)
detection_faster_r50_warmupcosine_4cls.json Faster R-CNN с 4 классами Faster R-CNN R-50 WarmupCosineLR 4 (wall, room, door, window)

Базовый конфиг: detection_cascade_r50_warmupcosine_2cls.json (также доступен как default.json)

Использование:

# С конфигурацией
python scripts/detection/train.py --config detection_faster_r101_warmupcosine_2cls.json ...

# Без конфигурации (используется default.json -> detection_cascade_r50_warmupcosine_2cls.json)
python scripts/detection/train.py ...

Структура конфигурационного файла:

{
  "name": "resnet101",
  "description": "Faster R-CNN с ResNet-101",
  "model": {
    "model_zoo_config": "COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml",
    "fallback_config": "COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml",
    "num_classes": 2,
    "device": "cuda"
  },
  "classes": {
    "0": "wall",
    "1": "room"
  },
  "input": {
    "min_size_test": 800,
    "max_size_test": 2000
  },
  "rpn": {
    "pre_nms_topk_test": 3000,
    "post_nms_topk_test": 1000,
    "nms_thresh": 0.7
  },
  "roi_heads": {
    "score_thresh_test": 0.5,
    "pooler_resolution": 14
  },
  "anchor_generator": {
    "aspect_ratios": [[0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0]],
    "sizes": [[8, 16], [16, 32], [32, 64], [64, 128], [128, 256]]
  }
}

Подробнее: configs/README.md

Параметры обучения

Параметр Описание По умолчанию
--config JSON конфигурационный файл (из configs/) default.json
--num-gpus Количество GPU 1
--batch-size Размер батча 2
--lr Learning rate 0.0001
--max-iter Макс. итераций 50000
--eval-period Период валидации 5000
--early-stopping-patience Early stopping patience (0=выкл) 0
--hypersearch Включить grid search гиперпараметров False
--output-dir Директория результатов auto
--train-json Путь к train аннотациям Data/{type}/train/
--val-json Путь к valid аннотациям Data/{type}/valid/

Новые возможности обучения

Early Stopping

Автоматически останавливает обучение при переобучении:

--early-stopping-patience 5  # Остановка после 5 eval периодов без улучшения

Grid Search гиперпараметров

Автоматический поиск лучших параметров:

--hypersearch  # Перебирает комбинации LR, batch size, max iter

Оптимизации

  • ✅ Автоматическое чтение классов из JSON
  • ✅ Кэширование файлов (ускорение загрузки в 10-100 раз)
  • ✅ Прогресс-бары для загрузки данных
  • ✅ Автоматическое логирование гиперпараметров

Подробнее: docs/TRAINING_ADVANCED.md

Результаты обучения

После обучения результаты сохраняются в:

output/
├── detection/
│   └── train_1/
│       ├── model_final.pth      # Финальная модель
│       ├── model_best.pth       # Лучшая модель (по AP)
│       ├── metrics.json         # Метрики обучения
│       └── events.out.tfevents* # TensorBoard логи
└── segmentation/
    └── train_1/
        └── ...

Просмотр метрик в TensorBoard:

tensorboard --logdir output/

🔧 Fine-tuning (дообучение на новых данных)

Когда использовать fine-tuning?

Fine-tuning эффективен когда:

  • ✅ У вас есть 5-100 аннотированных изображений нового типа
  • ✅ Новые изображения качественно отличаются от обучающей выборки (другой стиль, разрешение)
  • ✅ Нужен быстрый результат без полного переобучения (30 минут вместо 8 часов)
  • ✅ Основная модель работает неплохо, но есть специфичные ошибки

Fine-tuning НЕ эффективен когда:

  • ❌ Всего 1-3 изображения (высокий риск переобучения)
  • ❌ Новые изображения типичны для датасета (лучше добавить в train)
  • ❌ Модель вообще плохо работает на новых данных (нужно полное переобучение)

Fine-tuning модели детекции

# Fine-tuning на малых данных (5-20 изображений)
python scripts/detection/finetune.py \
    --model-path ./output/detection/train_1/model_best.pth \
    --train-json ./Data/NewData/train/_annotations.coco.json \
    --train-images ./Data/NewData/train/ \
    --val-json ./Data/NewData/valid/_annotations.coco.json \
    --val-images ./Data/NewData/valid/ \
    --lr 0.00001 \
    --max-iter 1500 \
    --batch-size 1 \
    --freeze-backbone-iters 500

# Fine-tuning на средних данных (20-100 изображений)
python scripts/detection/finetune.py \
    --model-path ./output/detection/train_1/model_best.pth \
    --train-json ./Data/NewData/train/_annotations.coco.json \
    --train-images ./Data/NewData/train/ \
    --val-json ./Data/NewData/valid/_annotations.coco.json \
    --val-images ./Data/NewData/valid/ \
    --lr 0.00005 \
    --max-iter 3000 \
    --batch-size 2

Fine-tuning модели сегментации

# Fine-tuning на малых данных (5-20 изображений)
python scripts/segmentation/finetune.py \
    --model-path ./output/segmentation/train_1/model_best.pth \
    --train-json ./Data/NewData/train/_annotations.coco.json \
    --train-images ./Data/NewData/train/ \
    --val-json ./Data/NewData/valid/_annotations.coco.json \
    --val-images ./Data/NewData/valid/ \
    --lr 0.00001 \
    --max-iter 1500 \
    --batch-size 1 \
    --freeze-backbone-iters 500

# Fine-tuning на средних данных (20-100 изображений)
python scripts/segmentation/finetune.py \
    --model-path ./output/segmentation/train_1/model_best.pth \
    --train-json ./Data/NewData/train/_annotations.coco.json \
    --train-images ./Data/NewData/train/ \
    --val-json ./Data/NewData/valid/_annotations.coco.json \
    --val-images ./Data/NewData/valid/ \
    --lr 0.00005 \
    --max-iter 3000 \
    --batch-size 2

Параметры fine-tuning

Параметр Описание Рекомендуемые значения
--model-path Путь к обученной модели output/{type}/train_N/model_best.pth
--lr Learning rate (НИЗКИЙ!) 0.00001-0.00005 (в 10-20 раз меньше)
--max-iter Количество итераций 1000-5000 (меньше чем при обучении)
--batch-size Размер батча 1-2 (маленький для малых данных)
--eval-period Период валидации 100-500 (частая валидация)
--freeze-backbone-iters Заморозка backbone 0-500 (500 для малых данных)

Отслеживание переобучения

ВАЖНО: При fine-tuning на малых данных высок риск переобучения!

# Запустите TensorBoard для мониторинга
tensorboard --logdir output/

# Следите за графиками:
# ✅ Хорошо:        train loss и val loss падают вместе
# ⚠️  Переобучение:  train loss падает, val loss растёт
# 🛑 STOP:          если val loss растёт 3+ валидации подряд

Результаты fine-tuning

output/
├── detection/
│   └── finetune_1/
│       ├── model_best_finetuned.pth  # Лучшая модель после fine-tuning
│       ├── model_final.pth           # Финальная модель
│       ├── finetune_params.json      # Параметры fine-tuning
│       └── events.out.tfevents*      # TensorBoard логи
└── segmentation/
    └── finetune_1/
        └── ...

💻 Инференс

CLI инференс

Сегментация комнат (с масками)

# Базовый запуск (тайлинг определяется автоматически)
python scripts/inference/segmentation/inference.py image.png

# С настройками модели
python scripts/inference/segmentation/inference.py image.png \
    --model-path ./output/segmentation/train_1/model_best.pth \
    --confidence 0.5 \
    --output-dir ./results \
    --save-masks \
    --mask-format png

# Форматы масок: png, rle (COCO), polygon
python scripts/inference/segmentation/inference.py image.png --mask-format rle

# Управление тайлингом
# Принудительно включить тайлинг с настройками
python scripts/inference/segmentation/inference.py large_image.png \
    --use-tiling true \
    --tile-size 2048 \
    --overlap 512

# Отключить тайлинг (обработать изображение целиком)
python scripts/inference/segmentation/inference.py small_image.png \
    --no-tiling

Детекция стен и комнат

# Автоматический режим (рекомендуется)
# Автоматически выбирает режим по размеру изображения
python scripts/detection/predict.py image.png

# Режим FULL: обработка без тайлинга (для небольших изображений)
python scripts/detection/predict.py image.png --mode full \
    --room-threshold 0.7 \
    --wall-threshold 0.3

# Режим TILED: тайлинг для всех объектов (стены и комнаты)
python scripts/detection/predict.py image.png --mode tiled \
    --tile-size 2048 \
    --overlap 512 \
    --room-threshold 0.85 \
    --wall-threshold 0.5

# Режим HYBRID: комбинированный подход (стены через тайлинг, комнаты целиком)
python scripts/detection/predict.py image.png --mode hybrid \
    --tile-size 1024 \
    --overlap 256 \
    --room-threshold 0.67 \
    --wall-threshold 0.4

# Без визуализации (только JSON)
python scripts/detection/predict.py image.png --no-visualize

# Без сохранения JSON
python scripts/detection/predict.py image.png --no-json

# Создание scratch версии (белый фон, черные стены, заштрихованные комнаты)
# Функция draw_scratch доступна в коде, можно добавить флаг --draw-scratch

Параметры CLI для детекции

Параметр Описание По умолчанию
--mode Режим работы: full, tiled, hybrid, auto auto
--api-url URL API эндпоинта http://localhost:8000/predict
--room-threshold Порог уверенности для комнат 0.7
--wall-threshold Порог уверенности для стен 0.3
--tile-size Размер тайла (для режимов tiled/hybrid) 1024
--overlap Перекрытие между тайлами 256
--nms-iou Порог IoU для NMS (для режимов tiled/hybrid) 0.3
--min-box-area Минимальная площадь бокса 100
--output-path Путь для сохранения визуализации auto
--no-json Не сохранять результаты в JSON False
--no-visualize Не создавать визуализацию False
--auto-threshold Порог размера для авто-режима 1024

Режимы работы

  • auto (по умолчанию): Автоматически выбирает режим по размеру изображения

    • Изображения ≤ 1024px → full
    • Изображения > 1024px → hybrid
  • full: Обработка без тайлинга (для небольших изображений)

    • Быстро
    • Подходит для изображений до 1024x1024
  • tiled: Тайлинг для всех объектов (стены и комнаты)

    • Точнее для больших изображений
    • Дольше по времени
  • hybrid: Комбинированный подход

    • Стены через тайлинг (точнее для длинных стен)
    • Комнаты на полном изображении (лучше для больших комнат)
    • Оптимальный баланс скорости и точности

Тайлинг

Автоматический режим (по умолчанию):

  • Тайлинг включается автоматически для изображений > 1024x1024
  • Для меньших изображений обработка целиком

Ручное управление:

# Принудительно включить тайлинг
--use-tiling True

# Принудительно отключить тайлинг
--no-tiling

# Настройка параметров тайлинга
--tile-size 2048    # Размер тайла (256-4096)
--overlap 512       # Перекрытие (0-512)

Формат вывода

{
  "rooms": [
    {
      "id": 0,
      "bbox": {"x1": 100, "y1": 200, "x2": 300, "y2": 400, "width": 200, "height": 200},
      "confidence": 0.95,
      "class_name": "room",
      "area_pixels": 35000,
      "mask_path": "image_masks/room_000.png"
    }
  ],
  "stats": {
    "total_rooms": 5,
    "image_size": {"width": 1024, "height": 768},
    "used_tiling": false
  }
}

🌐 API

FastAPI сервер для сегментации

Запуск сервера

# Запуск на порту 8001
python scripts/inference/segmentation/api.py --port 8001

# С указанием модели
python scripts/inference/segmentation/api.py \
    --model-path ./output/segmentation/train_1/model_best.pth \
    --host 0.0.0.0 \
    --port 8001

FastAPI сервер для детекции

Запуск сервера

# Запуск на порту 8000 (использует default.json)
python scripts/detection/api.py

# С конфигурационным файлом
python scripts/detection/api.py \
    --config detection_faster_r101_warmupcosine_2cls.json \
    --host 0.0.0.0 \
    --port 8000

# С указанием модели и конфигурации
python scripts/detection/api.py \
    --config detection_cascade_r50_warmupcosine_2cls.json \
    --model-path ./output/detection/train_1/model_best.pth \
    --host 0.0.0.0 \
    --port 8000

# Через переменные окружения
CONFIG_PATH=detection_faster_r101_warmupcosine_2cls.json MODEL_PATH=./weights/model_best.pth python scripts/detection/api.py

Endpoints

Endpoint Метод Описание
/ GET Информация об API
/health GET Проверка здоровья
/model_info GET Детальная информация о модели (backbone, классы, конфигурация)
/predict POST Детекция одного изображения
/predict_batch POST Batch детекция нескольких изображений

Примеры использования

Python:

import requests

# Детекция изображения с общим порогом
with open("plan.png", "rb") as f:
    response = requests.post(
        "http://localhost:8000/predict",
        files={"file": f},
        params={"confidence": 0.5}
    )

result = response.json()
print(f"Найдено детекций: {result['stats']['total_detections']}")
print(f"  Стены: {result['stats']['num_walls']}")
print(f"  Комнаты: {result['stats']['num_rooms']}")

# Детекция с индивидуальными порогами для классов
with open("plan.png", "rb") as f:
    response = requests.post(
        "http://localhost:8000/predict",
        files={"file": f},
        params={
            "confidence": 0.5,
            "wall_confidence": 0.3,
            "room_confidence": 0.7
        }
    )

result = response.json()
for wall in result['walls']:
    print(f"  Wall: {wall['confidence']:.2f}")

# Получение информации о модели
response = requests.get("http://localhost:8000/model_info")
model_info = response.json()
print(f"Модель: {model_info['model_type']}")
print(f"Backbone: {model_info['backbone']}")
print(f"Классы: {model_info['classes']}")

cURL:

# Получить JSON с результатами (общий порог)
curl -X POST "http://localhost:8000/predict?confidence=0.5" \
  -F "file=@plan.png" \
  -o result.json

# С индивидуальными порогами для классов
curl -X POST "http://localhost:8000/predict?confidence=0.5&wall_confidence=0.3&room_confidence=0.7" \
  -F "file=@plan.png" \
  -o result.json

# Получить информацию о модели
curl -X GET "http://localhost:8000/model_info" \
  -o model_info.json

# Batch обработка нескольких изображений
curl -X POST "http://localhost:8000/predict_batch?confidence=0.5" \
  -F "files=@plan1.png" \
  -F "files=@plan2.png" \
  -o batch_result.json

Параметры API

Параметр Тип Описание По умолчанию
confidence float Общий порог уверенности (0.0-1.0) 0.5
wall_confidence float Порог для стен (опционально, переопределяет общий) None
room_confidence float Порог для комнат (опционально, переопределяет общий) None
door_confidence float Порог для дверей (для 4-классных моделей) None
window_confidence float Порог для окон (для 4-классных моделей) None

Автоматическое определение модели

API автоматически определяет архитектуру модели (ResNet-50 или ResNet-101) следующими способами:

  1. Через config.yaml - проверяет файл config.yaml рядом с моделью и читает DEPTH в RESNETS
  2. Через state_dict - анализирует ключи в checkpoint (например, res4.6, res4.22 для ResNet-101)
  3. По размеру файла - fallback метод (ResNet-50 обычно ~300MB, ResNet-101 ~600MB)

Это позволяет автоматически загружать правильную конфигурацию без явного указания.

Swagger документация

После запуска сервера документация доступна по адресу:

  • Swagger UI: http://localhost:8000/docs
  • ReDoc: http://localhost:8000/redoc

📁 Структура проекта

floorplan-detection/
├── README.md                        # Документация
├── requirements.txt                 # Зависимости
├── setup.sh                         # Скрипт установки
│
├── Data/                            # Данные (COCO формат)
│   ├── Detection/
│   │   ├── train/
│   │   │   ├── _annotations.coco.json
│   │   │   └── [images]
│   │   └── valid/
│   └── Segmentation/
│       ├── train/
│       └── valid/
│
├── configs/                         # Конфигурационные файлы
│   ├── default.json                 # Символическая ссылка на базовый конфиг
│   ├── detection_cascade_r50_warmupcosine_2cls.json  # ⭐ Базовый конфиг
│   ├── detection_faster_r101_warmupcosine_2cls.json  # ResNet-101 конфигурация
│   ├── detection_faster_r50_warmupcosine_2cls.json   # Faster R-CNN R-50
│   ├── detection_faster_r50_warmupcosine_4cls.json   # 4 класса конфигурация
│   └── README.md                    # Документация конфигураций
│
├── scripts/                         # Скрипты
│   ├── detection/                   # Детекция (стены + комнаты)
│   │   ├── api.py                   # FastAPI сервер с поддержкой конфигов и автоопределением ResNet-50/101
│   │   ├── predict.py               # Универсальный скрипт предсказания (режимы: full, tiled, hybrid)
│   │   ├── register_detection_dataset.py
│   │   └── train.py                 # Обучение с поддержкой конфигов
│   │
│   ├── segmentation/                # Сегментация (комнаты)
│   │   ├── register_dataset.py
│   │   └── train.py
│   │
│   ├── inference/                   # Инференс
│   │   └── segmentation/            # Инференс сегментации
│   │       ├── api.py               # FastAPI сервер сегментации
│   │       └── inference.py         # CLI для сегментации
│   │
│   └── utils/                       # Утилиты
│       └── tensorboard_hook.py
│
├── docs/                            # Документация
│   └── DATASET.md
│
├── examples/                        # Примеры результатов
│   ├── plan_example-1.png
│   ├── plan_example-1_hybrid.png
│   └── plan_example-1_tiled.png
│
├── weights/                         # Веса моделей
│   └── README.md
│
└── output/                          # Результаты обучения
    ├── detection/
    │   └── train_N/
    └── segmentation/
        └── train_N/

📊 Результаты

Метрики

Метрика Detection Segmentation
VRAM < 1GB < 1GB
Inference (тайлинг) < 15 сек < 15 сек
Поддержка больших изображений

Примеры визуализации

Оригинал Сегментация
Original Segmentation

🔧 Конфигурация

Конфигурационные файлы

Проект поддерживает гибкую систему конфигураций через JSON файлы в папке configs/. Это позволяет легко переключаться между различными экспериментами:

  • Разные backbone: ResNet-50, ResNet-101, Cascade R-CNN
  • Разные anchor sizes: оптимизированные для стен и комнат
  • Разные классы: 2 класса (стены, комнаты) или 4 класса (+ двери, окна)
  • Разные разрешения: настройка входного разрешения изображений

Расположение: floorplan-detection/configs/

Использование:

# При обучении
python scripts/detection/train.py --config resnet101.json ...

# При запуске API
python scripts/detection/api.py --config resnet101.json

Доступные конфигурации:

  • detection_cascade_r50_warmupcosine_2cls.json ⭐ - базовая (Cascade R-CNN ResNet-50, 2 класса)
  • detection_faster_r101_warmupcosine_2cls.json - Faster R-CNN ResNet-101 (2 класса)
  • detection_faster_r50_warmupcosine_2cls.json - Faster R-CNN ResNet-50 (2 класса)
  • detection_faster_r50_warmupcosine_4cls.json - Faster R-CNN ResNet-50 (4 класса: стены, комнаты, двери, окна)

Базовый конфиг: detection_cascade_r50_warmupcosine_2cls.json (также доступен как default.json)

Подробнее: configs/README.md

Базовые настройки

По умолчанию модель использует:

  • Detection: COCO-Detection/cascade_rcnn_R_50_FPN_3x.yaml
  • Segmentation: COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml

Основные параметры:

  • Backbone: ResNet-50 с FPN (можно изменить через конфиг)
  • Pre-training: COCO
  • Входной размер: адаптивный (через тайлинг)

📊 Сравнение версий train.py

В проекте есть две версии скрипта обучения:

floorplan-detection/scripts/detection/train.py (основная версия)

Особенности:

  • Поддержка конфигурационных JSON файлов (--config)
  • Early Stopping Hook - автоматическая остановка при переобучении
  • Grid Search гиперпараметров (--hypersearch)
  • Гибкая система конфигурации - можно менять backbone, anchors, классы через JSON
  • Автоматическое определение NUM_CLASSES из metadata или конфига
  • Поддержка разных режимов обучения (обычное, grid search)
  • Расширенное логирование и сохранение гиперпараметров
  • 📏 926 строк кода - более функциональная версия

Использование:

python scripts/detection/train.py --config resnet101.json --early-stopping-patience 5

floorplan-detection-new/train.py (упрощенная версия)

Особенности:

  • Улучшенные настройки по умолчанию (anchor sizes, resolution, etc.)
  • Cosine LR scheduler с warmup - лучшая сходимость
  • Multi-scale training - обучение на разных разрешениях
  • Увеличенное количество proposals (3000 vs 1000)
  • Увеличенное разрешение ROI pooling (14×14 vs 7×7)
  • Нет поддержки конфигурационных файлов - настройки захардкожены
  • Нет Early Stopping - нужно вручную следить за переобучением
  • Нет Grid Search - нет автоматического поиска гиперпараметров
  • 📏 426 строк кода - более простая версия

Использование:

python train.py --model-config "COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml"

Рекомендации

  • Используйте floorplan-detection/scripts/detection/train.py для:

    • Экспериментов с разными конфигурациями
    • Автоматического поиска лучших гиперпараметров
    • Обучения с Early Stopping
    • Гибкой настройки через JSON конфиги
  • Используйте floorplan-detection-new/train.py для:

    • Быстрого обучения с улучшенными настройками по умолчанию
    • Когда нужны конкретные оптимизации (multi-scale, cosine LR)
    • Когда не нужна гибкость конфигураций

🔗 Ссылки

📄 Лицензия

Проект использует Detectron2 (Apache 2.0) и другие open-source библиотеки.

🤝 Contributing

Это исследовательский проект. Для вопросов и предложений создавайте issues.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages