Цель: показать, как вы решаете задачу извлечения архитектурной геометрии из изображения и превращаете её в пригодный для 2D/3D формат.
Что нужно сделать: собрать небольшой прототип, который принимает 3–5 изображений планов (JPG/PNG) и возвращает JSON с базовой структурой.
Решение тестового задания. Для прототипа я выбрал классический пайплайн на основе OpenCV.
- OpenCV: Планы этажей имеют четкую геометрическую структуру и контрастные стены (черный/серый на белом). Для выделения таких объектов классические методы работают быстрее нейросетей и не требуют обучения на специфичных данных для этапа MVP.
- Скелетизация (Scikit-image): Стены на чертежах имеют толщину. Чтобы превратить их в линии (векторный формат), нужно найти "осевую линию". Скелетизация идеально сводит массив пикселей к графу толщиной в 1 пиксель.
-
Поиск контуров (преобразование Хафа): Позволяет превратить растровый скелет в набор отрезков
$(x1, y1, x2, y2)$ , что и требуется в JSON.
- Бинаризация: Перевод изображения в ч/б. Стены обычно являются самыми массивными темными объектами.
- Морфологическая фильтрация: Применение операции
OPEN(эрозия + дилатация). Это позволяет "растворить" мелкие детали (размерные линии, текст, стулья) и оставить только толстые монолитные блоки стен. - Скелетизация: Математическое уточнение структуры. Превращает "толстые" стены в линии толщиной в 1 пиксель, сохраняя топологию (перекрестки и углы).
- Преобразование Хафа: Аппроксимация пиксельных линий в векторные отрезки.
- OpenCV: Основной инструмент для работы с геометрией и матрицами пикселей.
- Scikit-image: Содержит эффективную реализацию алгоритма скелетизации, которая работает лучше стандартных методов OpenCV.
- Слипшиеся объекты: Если мебель (например, кухонный гарнитур на чертеже 2) примыкает вплотную к стене и имеет ту же заливку, алгоритм может посчитать её частью стены.
- Дверные проемы: В классическом CV проемы — это просто "дырки". Для их детекции как "дверей" (дуги) нужны специфические шаблоны или нейросеть.
- Масштаб: Без OCR размеров мы получаем координаты в пикселях, а не в метрах.
-
Использование Deep Learning (YOLOv8-seg / SAM):
- Обучил бы модель сегментации специально на классах
wall,window,door. Это решило бы проблему отделения мебели от стен. - Использовал бы Segment Anything Model (SAM) для уточнения масок сложных архитектурных элементов.
- Обучил бы модель сегментации специально на классах
-
Графовая оптимизация: После извлечения векторов нужно "склеивать" близлежащие точки, чтобы стены образовывали замкнутые контуры комнат, а не набор разрозненных палок.
-
OCR: Добавил бы модуль распознавания цифр. Найденные числа можно сопоставлять с площадями полигонов для автоматической калибровки масштаба (пиксель -> мм).
-
CubiCasa5k: Это лучший датасет для данной задачи. Обучение на нем позволит распознавать даже "грязные" сканы и наброски от руки.
Использовалась python 3.11