Перейти к содержанию

Быстрый старт с YOLO

Пример: Полный цикл с YOLOBackend

Этот пример демонстрирует, как YOLOBackend бесшовно интегрируется с трекером и рендерером ядра.

yolo_pipeline.py
import cv2
import numpy as np
from enum import Enum
from ultralytics import YOLO

# 1. Импорт компонентов
from acmenra_cv.instance import DeviceType, TaskType
from acmenra_cv.tracker import Tracker
from acmenra_cv.render import Drawer, Style, Stroke, Fill
from acmenra_yolo import YOLOBackend

# 2. Определение семантических категорий
class CocoClass(Enum):
    PERSON = 0
    CAR = 2

# 3. Инициализация модели и Backend
model = YOLO("yolov8n-seg.pt")  # Используем сегментационную модель

backend = YOLOBackend(
    model=model,
    device=DeviceType.MPS,       # Или CPU, CUDA_0, TENSORRT
    category=CocoClass,
    task_type=TaskType.SEGMENT,
    threshold=0.35,
    iou=0.7,
    imgsz=640,
    refined=True                 # Включаем высококачественные маски
)

# 4. Настройка Трекинга и Рендеринга
tracker = Tracker(id=0, backend=backend, max_length=30)

style = Style(
    palette=[(255, 0, 0), (0, 255, 0), (0, 0, 255)],
    stroke=Stroke(thickness=2, segment=0.1, alpha=0.8),
    fill=Fill(alpha=0.3),
    show=True,
)
drawer = Drawer(style=style)

# 5. Обработка видеопотока
cap = cv2.VideoCapture("video.mp4")

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # Получаем список TrackedObject
    tracked_objects = tracker.track(frame, enable_tracking=True)

    # Визуализируем
    output = drawer.draw_instances(
        frame=frame,
        tracked_objects=tracked_objects,
        is_box=True,
        is_polygon=True,     # Рисуем маски сегментации
        is_trajectory=True,
    )

    cv2.imshow("Acmenra YOLO Pipeline", output)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Доступ к специфичным данным YOLO

Благодаря строгой типизации, вы можете обращаться к специфичным геометрическим примитивам:

result = backend.predict(frame)

for instance in result:
    if instance.polygon is not None:
        print(f"Mask area: {instance.polygon.get_area():.4f}")

    if instance.obb is not None:
        print(f"OBB Angle (yaw): {instance.obb.yaw:.2f}°")