February 4

🎥 Умное видеонаблюдение: слежение за пересечением желтой линии на станциях с помощью YOLO и преобразования Хафа

🔍 Введение

На станциях общественного транспорта и в других зонах повышенного риска важно контролировать соблюдение границ безопасности. Желтая линия на платформе – это не просто разметка, а важный элемент предотвращения аварийных ситуаций. Однако люди часто игнорируют это предупреждение.

В этой статье мы рассмотрим, как можно использовать YOLO (You Only Look Once) и преобразование Хафа для создания интеллектуальной системы видеонаблюдения, способной отслеживать и предупреждать о пересечении желтой линии. Это решение может быть применено в транспорте, промышленных объектах и системах безопасности.

Железнодорожная станция с людьми

🧠 Как работает система?

💡 YOLO11 — распознает людей, приближающихся к платформе.
📏 Преобразование Хафа — определяет и отслеживает желтую линию.
⚠️ Если человек пересекает линию — система активирует сигнализацию.

🎯 В результате:
✔️ Безопасность пассажиров повышается.
✔️ Операторы получают точные уведомления.
✔️ Возможность интеграции с камерами видеонаблюдения.

1️⃣ Обнаружение людей с помощью YOLO

Почему YOLO?
YOLO (You Only Look Once) – это одна из самых быстрых и точных нейросетевых моделей для детекции объектов. Она анализирует весь кадр сразу, а не обрабатывает его частями, как это делают старые алгоритмы вроде R-CNN.

📌 Как работает YOLO?

  1. Картинка или видео разбивается на сеть ячеек (обычно 13x13, 19x19 и т.д.).
  2. Каждая ячейка отвечает за обнаружение объектов внутри нее.
  3. YOLO предсказывает границы объектов (bounding boxes) и относит их к определенному классу (например, «человек», «автомобиль», «поезд»).
  4. Система фильтрует пересекающиеся боксы, оставляя только самые вероятные (Non-Maximum Suppression, NMS).

Прежде импортируем библиотеки

pip install ultralytics opencv-python numpy matplotlib

📌 Кода для обнаружения людей с YOLO

from ultralytics import YOLO
import cv2
from google.colab.patches import cv2_imshow

# Загружаем YOLO-модель
model = YOLO("yolo11n.pt")

# Загружаем изображение с платформы
image = cv2.imread("platform.jpg")

# Запускаем детекцию
results = model(image)

# Рисуем bounding boxes
for result in results:
    boxes = result.boxes
    for box in boxes:
        x1, y1, x2, y2 = map(int, box.xyxy[0])  # Получаем координаты рамки
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 3)  # Зеленая рамка

# Показываем изображение в Google Colab
cv2_imshow(image)
Детекция людей

На выходе получаем изображение, где люди выделены зелеными рамками.

2️⃣ Обнаружение желтой линии с преобразованием Хафа

Почему преобразование Хафа?
Преобразование Хафа – это классический метод в компьютерном зрении для нахождения линий на изображениях. Он используется в системах распознавания дорожной разметки, автопилотах, а также при обработке спутниковых снимков.

📌 Как работает алгоритм?

  1. Изображение преобразуется в оттенки серого (или в HSV, если работаем с цветом).
  2. Выделяем только желтые пиксели (так мы найдем разметку).
  3. Применяем оператор Canny для поиска границ.
  4. Используем преобразование Хафа для выделения прямых линий.

📌 Код для поиска желтой линии

import cv2 import numpy as np from google.colab.patches import cv2_imshow # Для Google Colab

# Загружаем изображение image = cv2.imread("platform.jpg") if image is None: print("❌ Ошибка: изображение не загружено! Проверьте путь к файлу.") exit()

# Переводим в HSV и выделяем желтый цвет frame_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) yellow_light = np.array([20, 140, 200], np.uint8) yellow_dark = np.array([35, 255, 255], np.uint8) mask_yellow = cv2.inRange(frame_hsv, yellow_light, yellow_dark)

# Выявляем границы edges = cv2.Canny(mask_yellow, 50, 150) cv2_imshow(edges) # Показываем границы (если они не видны, поменяйте пороги)

# Применяем преобразование Хафа lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50, minLineLength=50, maxLineGap=5)

# Проверяем, найдены ли линии if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] cv2.line(image, (x1, y1), (x2, y2), (0, 255, 255), 3) # Желтая линия else: print("⚠️ Линии не найдены! Попробуйте изменить параметры.")

cv2_imshow(image) # Показываем итоговое изображение

Желтая линия на рисунке

В результате получаем четкую желтую линию на платформе.

3️⃣ Обнаружение пересечения линии человеком

Теперь мы объединяем данные из YOLO и Хафа, чтобы понять, пересекает ли человек линию.

📌 Как это работает?

  1. Находим линию (координаты y).
  2. Находим нижнюю точку bounding box человека (y2).
  3. Сравниваем координаты:
    • Если y2 > y_lineчеловек пересек линию (нарушение).
    • Если y2 < y_lineчеловек стоит безопасно.

📌 Кода

import cv2 import numpy as np from ultralytics import YOLO from google.colab.patches import cv2_imshow # Для Google Colab

# Загружаем модель YOLO model = YOLO("yolov8n.pt")

# Загружаем изображение image = cv2.imread("frame_yellow_line_900.png") if image is None: print("❌ Ошибка: изображение не загружено! Проверьте путь к файлу.") exit()

# Обнаружение людей с YOLO results = model(image) detected_boxes = results[0].boxes # Извлекаем bounding boxes

# Переводим изображение в HSV и выделяем желтый цвет frame_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) yellow_light = np.array([20, 140, 200], np.uint8) yellow_dark = np.array([35, 255, 255], np.uint8) mask_yellow = cv2.inRange(frame_hsv, yellow_light, yellow_dark)

# Выявляем границы желтой линии edges = cv2.Canny(mask_yellow, 50, 150) cv2_imshow(edges) # Показываем границы (если линии не видны, поменяйте пороги)

# Применяем преобразование Хафа lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50, minLineLength=50, maxLineGap=5)

# Проверяем, найдены ли линии if lines is not None: for line in lines: x1, y1, x2, y2 = line[0] slope = (y2 - y1) / (x2 - x1) if x2 != x1 else float("inf") # Наклон линии intercept = y1 - slope * x1 # Смещение cv2.line(image, (x1, y1), (x2, y2), (0, 255, 255), 3) # Рисуем желтую линию else: print("⚠️ Желтая линия не найдена! Попробуйте изменить параметры.")

# Проверяем, пересекает ли человек желтую линию for box in detected_boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) # Координаты рамки человека

# Определяем точку пересечения x_person = (y2 - intercept) / slope if slope != float("inf") else x1

# Если человек зашел за линию - тревога! if x2 > x_person: color = (0, 0, 255) # Красная рамка - нарушение print("⚠️ Человек пересек желтую линию!") else: color = (0, 255, 0) # Зеленая рамка - все в порядке

cv2.rectangle(image, (x1, y1), (x2, y2), color, 3)

# Показываем итоговое изображение cv2_imshow(image)

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

Люди за линией подсвечиваются красным, а те, кто стоит безопасно – зеленым.

4️⃣ Дальнейшее улучшение системы

💡 Как сделать систему еще лучше?
🔹 Добавить звуковое оповещение – если человек пересекает линию, включать звуковой сигнал.
🔹 Отправлять уведомления – система может автоматически передавать данные операторам станции.
🔹 Добавить тепловые карты – для анализа поведения пассажиров и улучшения безопасности.
🔹 Оптимизировать YOLO – использовать модель YOLOv8, которая работает быстрее и точнее.

анализа видео: определение пересечения желтой линии людьми в реальном времени

Попробуйте реализовать этот проект самостоятельно и сравните результаты с другими методами, код Google Colab! 🎓🚀

📌 Итог

🔹 Мы создали умную систему видеонаблюдения, которая:
Обнаруживает людей с помощью YOLO
Определяет желтую линию с помощью Хафа
Отслеживает пересечение в реальном времени

🚀 Это можно использовать для:
✔️ Железнодорожных станций 🚆
✔️ Метро 🚇
✔️ Промышленных объектов 🏭

💡 Возможности для доработки безграничны! Можно подключить IoT-устройства, камеры с ИИ и облачные базы данных.

Если статья была полезной — делитесь и комментируйте! 📢🔥

📢 Подписывайтесь, чтобы не пропустить новые материалы!
🔹 Teletype.in – блог о машинном обучении
🔹 Телеграм-канал – свежие новости и обсуждения