YOLOv8 + LM Studio Vision: Гибридная система компьютерного зрения

Python Computer Vision LLM Integration

Для создания интеллектуальных систем видеонаблюдения недостаточно использовать лишь детекцию объектов. Настоящий прорыв происходит при интеграции классических алгоритмов компьютерного зрения, таких как 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. 1. Захват кадра: Чтение изображения с камеры или файла через OpenCV.
  2. 2. Детекция (YOLO): Запуск модели YOLO на кадре. Получение массива bounding box'ов и меток классов.
  3. 3. Визуализация: Нанесение рамок и текста на изображение для оператора.
  4. 4. Контекстуализация (Prompting): Формирование промпта, включающего текстовое описание объектов и само изображение в формате Base64.
  5. 5. Генерация (LLM): Отправка запроса в LM Studio и получение ответа модели, содержащего анализ ситуации.

Ключевые компоненты кода

main_script.py
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}