улучше производительность 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}")