🎥 Умное видеонаблюдение: слежение за пересечением желтой линии на станциях с помощью YOLO и преобразования Хафа
🔍 Введение
На станциях общественного транспорта и в других зонах повышенного риска важно контролировать соблюдение границ безопасности. Желтая линия на платформе – это не просто разметка, а важный элемент предотвращения аварийных ситуаций. Однако люди часто игнорируют это предупреждение.
В этой статье мы рассмотрим, как можно использовать YOLO (You Only Look Once) и преобразование Хафа для создания интеллектуальной системы видеонаблюдения, способной отслеживать и предупреждать о пересечении желтой линии. Это решение может быть применено в транспорте, промышленных объектах и системах безопасности.
🧠 Как работает система?
💡 YOLO11 — распознает людей, приближающихся к платформе.
📏 Преобразование Хафа — определяет и отслеживает желтую линию.
⚠️ Если человек пересекает линию — система активирует сигнализацию.
🎯 В результате:
✔️ Безопасность пассажиров повышается.
✔️ Операторы получают точные уведомления.
✔️ Возможность интеграции с камерами видеонаблюдения.
1️⃣ Обнаружение людей с помощью YOLO
Почему YOLO?
YOLO (You Only Look Once) – это одна из самых быстрых и точных нейросетевых моделей для детекции объектов. Она анализирует весь кадр сразу, а не обрабатывает его частями, как это делают старые алгоритмы вроде R-CNN.
- Картинка или видео разбивается на сеть ячеек (обычно 13x13, 19x19 и т.д.).
- Каждая ячейка отвечает за обнаружение объектов внутри нее.
- YOLO предсказывает границы объектов (bounding boxes) и относит их к определенному классу (например, «человек», «автомобиль», «поезд»).
- Система фильтрует пересекающиеся боксы, оставляя только самые вероятные (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️⃣ Обнаружение желтой линии с преобразованием Хафа
Почему преобразование Хафа?
Преобразование Хафа – это классический метод в компьютерном зрении для нахождения линий на изображениях. Он используется в системах распознавания дорожной разметки, автопилотах, а также при обработке спутниковых снимков.
- Изображение преобразуется в оттенки серого (или в HSV, если работаем с цветом).
- Выделяем только желтые пиксели (так мы найдем разметку).
- Применяем оператор Canny для поиска границ.
- Используем преобразование Хафа для выделения прямых линий.
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 и Хафа, чтобы понять, пересекает ли человек линию.
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 – блог о машинном обучении
🔹 Телеграм-канал – свежие новости и обсуждения