Daniil commited on
Commit
d2ab6f5
·
1 Parent(s): 42955e2

Add application files

Browse files
Files changed (4) hide show
  1. README.md +95 -1
  2. app.py +101 -0
  3. model.pt +3 -0
  4. requirements.txt +4 -0
README.md CHANGED
@@ -11,4 +11,98 @@ license: apache-2.0
11
  short_description: Получение координат углов на изображениях планов помещений
12
  ---
13
 
14
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  short_description: Получение координат углов на изображениях планов помещений
12
  ---
13
 
14
+ # Plan Points - Детекция комнат по плану помещения
15
+
16
+ ## Описание проекта
17
+
18
+ **Plan Points** — это проект, который преобразует планы помещений в координаты опорных точек (углов). С использованием предобученной модели YOLO и Gradio, приложение позволяет:
19
+ - Загружать изображение плана помещения
20
+ - Выполнять детекцию объектов класса "room"
21
+ - Выводить аннотированное изображение с наложенными полигонами
22
+ - Отображать список координат углов для каждой обнаруженной комнаты
23
+
24
+ ## Особенности
25
+
26
+ - **Детекция комнат:** Использование модели YOLO для выявления помещений на плане.
27
+ - **Упрощение полигона:** Оптимизация набора точек для выделения действительных углов комнат.
28
+ - **Gradio-интерфейс:** Удобное веб-приложение для демонстрации работы модели.
29
+ - **Интеграция с Hugging Face Spaces:** Легкое развертывание проекта в облаке.
30
+
31
+ ## Быстрый старт
32
+
33
+ ## Локальный запуск с использованием Docker
34
+
35
+ Для запуска приложения локально через Docker выполните следующие шаги:
36
+
37
+ 1. **Убедитесь, что у вас установлен Docker.**
38
+
39
+ 2. **Скачайте Docker-образ:**
40
+
41
+ ```bash
42
+ docker pull danielnru/plan_points
43
+ ```
44
+
45
+ 3. **Запустите контейнер:**
46
+
47
+ Если у вас доступен GPU, используйте команду:
48
+ ```bash
49
+ docker run --gpus all -p 7860:7860 danielnru/plan_points
50
+ ```
51
+
52
+ Если GPU не используется, запустите контейнер так:
53
+ ```bash
54
+ docker run -p 7860:7860 danielnru/plan_points
55
+ ```
56
+
57
+ 4. **Откройте приложение в браузере:**
58
+
59
+ После успешного запуска контейнера откройте браузер и перейдите по адресу:
60
+ ```
61
+ http://localhost:7860
62
+ ```
63
+ Здесь вы сможете воспользоваться Gradio-интерфейсом для загрузки изображений и получения результатов детекции комнат.
64
+
65
+ ### Развертывание на Hugging Face Spaces
66
+
67
+ Проект уже настроен для работы на Hugging Face Spaces. Для развертывания:
68
+ 1. Клонируйте репозиторий:
69
+ ```bash
70
+ git clone https://huggingface.co/spaces/DanielNRU/plan_points
71
+ ```
72
+ 2. Добавьте или обновите файл `app.py` и `requirements.txt` (если необходимо).
73
+ 3. Разместите файл `model.pt` в корневой директории.
74
+ 4. Закоммитьте и запушьте изменения:
75
+ ```bash
76
+ git add .
77
+ git commit -m "Обновление приложения"
78
+ git push
79
+ ```
80
+ После сборки ваш Space будет доступен по соответствующему URL.
81
+
82
+ ## Структура проекта
83
+
84
+ ```
85
+ .
86
+ ├── app.py # Основное приложение Gradio
87
+ ├── model.pt # Файл весов модели YOLO
88
+ ├── requirements.txt # Зависимости Python
89
+ └── README.md # Описание проекта
90
+ ```
91
+
92
+ ## Зависимости
93
+
94
+ Проект использует следующие Python-библиотеки:
95
+ - **gradio** – для создания веб-интерфейса
96
+ - **opencv-python-headless** – для работы с изображениями
97
+ - **numpy** – для математических операций
98
+ - **ultralytics** – для работы с моделью YOLO
99
+ - **torch** и **torchvision** – для работы с deep learning моделями
100
+
101
+ Все зависимости перечислены в файле [requirements.txt](requirements.txt).
102
+
103
+ ## Контакты
104
+
105
+ **Разработчик:**
106
+ Мельник Даниил Владимирович
107
+ [GitHub: DanielNRU](https://github.com/DanielNRU)
108
+ [Hugging Face: DanielNRU](https://huggingface.co/DanielNRU)
app.py ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import cv2
3
+ import numpy as np
4
+ import gradio as gr
5
+ from ultralytics import YOLO
6
+
7
+ def simplify_polygon(points, tol_ratio=0.02):
8
+ """
9
+ Упрощает полигон с помощью аппроксимации по Перу.
10
+
11
+ Параметры:
12
+ points (np.ndarray): Исходный набор точек полигона (Nx2).
13
+ tol_ratio (float): Коэффициент допуска для аппроксимации.
14
+
15
+ Возвращает:
16
+ np.ndarray: Упрощённый набор точек полигона.
17
+ """
18
+ pts = points.reshape((-1, 1, 2)).astype(np.float32)
19
+ perimeter = cv2.arcLength(pts, True)
20
+ epsilon = tol_ratio * perimeter
21
+ approx = cv2.approxPolyDP(pts, epsilon, True)
22
+ return approx.reshape(-1, 2)
23
+
24
+ # Загружаем модель YOLO (файл model.pt должен находиться в корневой директории Space)
25
+ model_path = os.path.join(os.getcwd(), "model.pt")
26
+ model12 = YOLO(model_path)
27
+
28
+ def process_image(image):
29
+ """
30
+ Обрабатывает изображение:
31
+ - Выполняет предсказание модели YOLO для детекции комнат.
32
+ - Рисует упрощённые полигоны (с углами) для объектов класса 'room' (id = 2).
33
+ - Формирует текст со списком координат углов.
34
+
35
+ Параметры:
36
+ image (np.ndarray): Исходное изображение.
37
+
38
+ Возвращает:
39
+ annotated_img (np.ndarray): Изображение с нанесёнными аннотациями.
40
+ coord_text (str): Текст с координатами углов.
41
+ """
42
+ pred_results = list(model12.predict(source=image, imgsz=640))
43
+ if len(pred_results) == 0:
44
+ return image, "Ошибка: предсказания не получены."
45
+
46
+ pred = pred_results[0]
47
+ if pred.masks is None or pred.boxes is None:
48
+ return image, "На изображении объекты не обнаружены."
49
+
50
+ # Преобразуем исходное изображение в RGB для корректного отображения
51
+ orig_img = pred.orig_img
52
+ if orig_img.shape[2] == 3:
53
+ original_rgb = cv2.cvtColor(orig_img.copy(), cv2.COLOR_BGR2RGB)
54
+ else:
55
+ original_rgb = orig_img.copy()
56
+ annotated_img = original_rgb.copy()
57
+
58
+ # Извлекаем полигоны и классы
59
+ polygons = pred.masks.xy
60
+ class_ids = pred.boxes.cls.cpu().numpy()
61
+
62
+ coordinates_list = []
63
+ for idx, polygon in enumerate(polygons):
64
+ class_id = int(class_ids[idx])
65
+ if class_id == 2: # Обрабатываем только объекты класса "room"
66
+ poly_np = np.array(polygon, dtype=np.float32)
67
+ simplified_poly = simplify_polygon(poly_np, tol_ratio=0.005)
68
+ coordinates_list.append({
69
+ "object": idx + 1,
70
+ "class": class_id,
71
+ "coordinates": [(float(pt[0]), float(pt[1])) for pt in simplified_poly]
72
+ })
73
+ cv2.polylines(annotated_img, [simplified_poly.astype(np.int32)], isClosed=True, color=(0, 255, 0), thickness=2)
74
+ for point in simplified_poly:
75
+ cv2.circle(annotated_img, (int(point[0]), int(point[1])), 3, (255, 0, 0), -1)
76
+
77
+ if coordinates_list:
78
+ coord_text = ""
79
+ for item in coordinates_list:
80
+ coord_text += f"Координаты углов в комнате №: {item['object']}\n"
81
+ for coord in item['coordinates']:
82
+ coord_text += f"({coord[0]:.2f}, {coord[1]:.2f})\n"
83
+ coord_text += "-" * 30 + "\n"
84
+ else:
85
+ coord_text = "На изображении не обнаружены комнаты."
86
+
87
+ return annotated_img, coord_text
88
+
89
+ # Создаем Gradio-интерфейс
90
+ iface = gr.Interface(
91
+ fn=process_image,
92
+ inputs=gr.Image(type="numpy", label="Исходное изображение"),
93
+ outputs=[
94
+ gr.Image(type="numpy", label="Изображение с обнаруженными комнатами"),
95
+ gr.Textbox(label="Координаты углов комнат", lines=10)
96
+ ],
97
+ title="Детекция комнат с использованием YOLO и Gradio",
98
+ description="Загрузите изображение для детекции комнат и отображения углов."
99
+ )
100
+
101
+ iface.launch()
model.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d9a000df42bfa514abacd6278a7f23e6eeb156013c1dc35e6da6f5dcca3274de
3
+ size 20493853
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio==4.44.1
2
+ numpy==1.24.4
3
+ ultralytics==8.3.78
4
+ opencv-python-headless==4.10.0.84