Skip to content

Lannix/Floor-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Распознование геометрии с изображений плана квартир

Python License

Цель: показать, как вы решаете задачу извлечения архитектурной геометрии из изображения и превращаете её в пригодный для 2D/3D формат.

Что нужно сделать: собрать небольшой прототип, который принимает 3–5 изображений планов (JPG/PNG) и возвращает JSON с базовой структурой.

Описание решения

Решение тестового задания. Для прототипа я выбрал классический пайплайн на основе OpenCV.

Почему выбран этот стек:

  1. OpenCV: Планы этажей имеют четкую геометрическую структуру и контрастные стены (черный/серый на белом). Для выделения таких объектов классические методы работают быстрее нейросетей и не требуют обучения на специфичных данных для этапа MVP.
  2. Скелетизация (Scikit-image): Стены на чертежах имеют толщину. Чтобы превратить их в линии (векторный формат), нужно найти "осевую линию". Скелетизация идеально сводит массив пикселей к графу толщиной в 1 пиксель.
  3. Поиск контуров (преобразование Хафа): Позволяет превратить растровый скелет в набор отрезков $(x1, y1, x2, y2)$, что и требуется в JSON.

Этапы пайплайна:

  1. Бинаризация: Перевод изображения в ч/б. Стены обычно являются самыми массивными темными объектами.
  2. Морфологическая фильтрация: Применение операции OPEN (эрозия + дилатация). Это позволяет "растворить" мелкие детали (размерные линии, текст, стулья) и оставить только толстые монолитные блоки стен.
  3. Скелетизация: Математическое уточнение структуры. Превращает "толстые" стены в линии толщиной в 1 пиксель, сохраняя топологию (перекрестки и углы).
  4. Преобразование Хафа: Аппроксимация пиксельных линий в векторные отрезки.

Модели и инструменты:

  • OpenCV: Основной инструмент для работы с геометрией и матрицами пикселей.
  • Scikit-image: Содержит эффективную реализацию алгоритма скелетизации, которая работает лучше стандартных методов OpenCV.

Слабые места:

  1. Слипшиеся объекты: Если мебель (например, кухонный гарнитур на чертеже 2) примыкает вплотную к стене и имеет ту же заливку, алгоритм может посчитать её частью стены.
  2. Дверные проемы: В классическом CV проемы — это просто "дырки". Для их детекции как "дверей" (дуги) нужны специфические шаблоны или нейросеть.
  3. Масштаб: Без OCR размеров мы получаем координаты в пикселях, а не в метрах.

Что бы я улучшил в следующей итерации:

  1. Использование Deep Learning (YOLOv8-seg / SAM):

    • Обучил бы модель сегментации специально на классах wall, window, door. Это решило бы проблему отделения мебели от стен.
    • Использовал бы Segment Anything Model (SAM) для уточнения масок сложных архитектурных элементов.
  2. Графовая оптимизация: После извлечения векторов нужно "склеивать" близлежащие точки, чтобы стены образовывали замкнутые контуры комнат, а не набор разрозненных палок.

  3. OCR: Добавил бы модуль распознавания цифр. Найденные числа можно сопоставлять с площадями полигонов для автоматической калибровки масштаба (пиксель -> мм).

  4. CubiCasa5k: Это лучший датасет для данной задачи. Обучение на нем позволит распознавать даже "грязные" сканы и наброски от руки.

Использовалась python 3.11

About

Решение тестового задания

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages