Для создания интеллектуальных систем видеонаблюдения недостаточно использовать лишь детекцию объектов. Настоящий прорыв происходит при интеграции классических алгоритмов компьютерного зрения, таких как YOLO (You Only Look Once), с большими языковыми моделями, способными к логическому мышлению и анализу контекста.
Архитектура гибридной системы
YOLOv8 (Восприятие)
Отвечает за обработку видеопотока в реальном времени. Выявляет объекты на изображении и выдает их координаты, классы и уверенность (bounding boxes). Работает быстро (30+ FPS).
LM Studio (Разум)
Локальная LLM с поддержкой Vision. Принимает кадр и список объектов от YOLO, анализирует ситуацию ("есть ли опасность?") и выдает вербальное решение или совет по действию (VLA).
Промпт-инжиниринг
Связующее звено. Формирование структурированного текста описания объектов и текстового запроса к модели, который направляет LLM на поиск скрытых угроз или аномалий.
Техническая реализация
В основе решения лежит библиотека ultralytics, которая предоставляет высокоуровневый интерфейс для YOLOv8.
Подготовка окружения
pip install ultralytics requests opencv-python numpy
Установка необходимых зависимостей
Алгоритм работы системы
- 1. Захват кадра: Чтение изображения с камеры или файла через OpenCV.
- 2. Детекция (YOLO): Запуск модели YOLO на кадре. Получение массива bounding box'ов и меток классов.
- 3. Визуализация: Нанесение рамок и текста на изображение для оператора.
- 4. Контекстуализация (Prompting): Формирование промпта, включающего текстовое описание объектов и само изображение в формате Base64.
- 5. Генерация (LLM): Отправка запроса в LM Studio и получение ответа модели, содержащего анализ ситуации.
Ключевые компоненты кода
import cv2
import base64
import requests
from ultralytics import YOLO
LM_STUDIO_URL = "http://localhost:1234/v1/chat/completions"
MODEL_NAME = "llava-v1.5-7b" # Модель с поддержкой Vision
yolo_model = YOLO('yolov8n.pt') # Быстрая модель nano
def encode_image(frame):
_, buffer = cv2.imencode('.jpg', frame)
return base64.b64encode(buffer).decode('utf-8')
def get_vla_decision(frame, detections):
base64_image = encode_image(frame)
description = "На сцене обнаружены следующие объекты:\n"
for d in detections:
description += f"- {d['label']} с координатами {d['box']}\n"
prompt = f"""{description}