увелич производительность кода и качество трекинга import os
import cv2
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSort
import torch
import numpy as np

# Определение текущей директории
current_dir = os.getcwd()

# Проверка доступности GPU
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f"Используемое устройство: {device}")

# Путь к видеофайлу
video_path = 'test.mp4'

# Проверка наличия видеофайла
if not os.path.exists(video_path):
    raise FileNotFoundError(f"Видео файл не найден: {video_path}")

# Загрузка модели YOLOv8 с указанием устройства
model = YOLO('yolov8n.pt').to(device)

# Инициализация трекера Deep SORT с моделью внешнего вида
tracker = DeepSort(
    max_age=30,
    nn_budget=70,
    embedder='mobilenet',  # Используйте 'mobilenet' или 'osnet_ain_x1_0'
    half=True,
    bgr=True,
    embedder_gpu=(device == 'cuda')
)

# Открытие видеофайла
cap = cv2.VideoCapture(video_path)

if not cap.isOpened():
    raise IOError(f"Не удается открыть видео файл: {video_path}")

# Получение параметров видео
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# Вычисление центра экрана
screen_center = (width / 2, height / 2)

# Путь для сохранения выходного видео
output_dir = os.path.join(current_dir, 'results')
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, 'output.mp4')

# Настройка записи видео
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

print("Начинаю обработку видео...")

# Словарь для хранения предыдущих позиций объектов
previous_positions = {}

while True:
    ret, frame = cap.read()
    if not ret:
        print("Видео завершено или не может быть прочитано.")
        break

    # Перенос кадра на нужное устройство и выполнение детекции с помощью модели YOLOv8
    results = model(frame, device=device)

    # Обработка выходных данных модели
    detections = []
    for result in results:
        for box in result.boxes:
            # Извлечение координат в формате [x1, y1, x2, y2]
            x1, y1, x2, y2 = box.xyxy[0].cpu().numpy()
            confidence = box.conf[0].item()
            class_id = int(box.cls[0].item())

            if confidence > 0.8:
                # Передача координат в формате [x1, y1, x2, y2] для Deep SORT
                detections.append((
                    [x1, y1, x2, y2],
                    confidence,
                    class_id
                ))

    # Обновление трекера
    tracks = tracker.update_tracks(detections, frame=frame)

    # Отрисовка результатов и вычисление смещений
    for track in tracks:
        if not track.is_confirmed():
            continue
        track_id = track.track_id
        ltrb = track.to_ltrb()
        x1, y1, x2, y2 = map(int, ltrb)

        # Вычисление центра объекта
        object_center = ((x1 + x2) / 2, (y1 + y2) / 2)

        # Вычисление смещения относительно центра экрана
        displacement_x = object_center[0] - screen_center[0]
        displacement_y = object_center[1] - screen_center[1]

        # Вычисление смещения от предыдущего положения
        if track_id in previous_positions:
            prev_pos = previous_positions[track_id]
            movement_x = object_center[0] - prev_pos[0]
            movement_y = object_center[1] - prev_pos[1]

            # Определение направления движения
            direction_x = 'вправо' if movement_x > 0 else 'влево' if movement_x < 0 else 'не движется по X'
            direction_y = 'вниз' if movement_y > 0 else 'вверх' if movement_y < 0 else 'не движется по Y'

            # Модуль смещения
            shift_x = abs(movement_x)
            shift_y = abs(movement_y)

            # Вывод информации в консоль
            print(f"Объект ID: {track_id}")
            print(f" - Смещение относительно центра экрана: по X: {displacement_x:.2f}px, по Y: {displacement_y:.2f}px")
            print(f" - Движение: {direction_x} на {shift_x:.2f}px, {direction_y} на {shift_y:.2f}px")

        # Обновление предыдущей позиции
        previous_positions[track_id] = object_center

        # Отрисовка прямоугольника и ID на кадре
        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
        cv2.putText(frame, f'ID: {track_id}', (x1, y1 - 10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # Запись кадра в выходное видео
    out.write(frame)

    # Отображение кадра
    cv2.imshow('YOLOv8 + Deep SORT', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        print("Обработка видео прервана пользователем.")
        break

# Освобождение ресурсов
cap.release()
out.release()
cv2.destroyAllWindows()

print(f"Обработка завершена. Сохранённый файл: {output_path}")