Bỏ để qua phần nội dung

Theo dõi đa đối tượng với Ultralytics YOLO

Ví dụ theo dõi đa đối tượng

Theo dõi đối tượng trong lĩnh vực phân tích video là một nhiệm vụ quan trọng không chỉ xác định vị trí và lớp đối tượng trong khung mà còn duy trì ID duy nhất cho mỗi đối tượng được phát hiện khi video tiến triển. Các ứng dụng là vô hạn — từ giám sát và bảo mật đến phân tích thể thao theo thời gian thực.

Tại sao chọn Ultralytics YOLO để theo dõi đối tượng?

Đầu ra từ Ultralytics trình theo dõi phù hợp với phát hiện đối tượng tiêu chuẩn nhưng có giá trị gia tăng của ID đối tượng. Điều này giúp dễ dàng theo dõi các đối tượng trong luồng video và thực hiện các phân tích tiếp theo. Đây là lý do tại sao bạn nên cân nhắc sử dụng Ultralytics YOLO Đối với nhu cầu theo dõi đối tượng của bạn:

  • Hiệu quả: Xử lý luồng video trong thời gian thực mà không ảnh hưởng đến độ chính xác.
  • Linh hoạt: Hỗ trợ nhiều thuật toán và cấu hình theo dõi.
  • Dễ sử dụng: Giản dị Python API và CLI các tùy chọn để tích hợp và triển khai nhanh chóng.
  • Khả năng tùy chỉnh: Dễ sử dụng với đào tạo tùy chỉnh YOLO mô hình, cho phép tích hợp vào các ứng dụng miền cụ thể.



Xem: Phát hiện và theo dõi đối tượng với Ultralytics YOLOv8.

Ứng dụng trong thế giới thực

Giao thông vận tải Bán lẻ Nuôi trồng thủy sản
Theo dõi xe Theo dõi mọi người Theo dõi cá
Theo dõi xe Theo dõi mọi người Theo dõi cá

Tổng quan về các tính năng

Ultralytics YOLO Mở rộng các tính năng phát hiện đối tượng của nó để cung cấp theo dõi đối tượng mạnh mẽ và linh hoạt:

  • Theo dõi thời gian thực: Theo dõi liền mạch các đối tượng trong video có tốc độ khung hình cao.
  • Hỗ trợ nhiều trình theo dõi: Chọn từ một loạt các thuật toán theo dõi đã được thiết lập.
  • Cấu hình trình theo dõi có thể tùy chỉnh: Điều chỉnh thuật toán theo dõi để đáp ứng các yêu cầu cụ thể bằng cách điều chỉnh các thông số khác nhau.

Trình theo dõi có sẵn

Ultralytics YOLO Hỗ trợ các thuật toán theo dõi sau. Chúng có thể được kích hoạt bằng cách chuyển tệp cấu hình YAML có liên quan, chẳng hạn như tracker=tracker_type.yaml:

  • BoT-SORT -Dùng botsort.yaml để bật trình theo dõi này.
  • ByteTrack -Dùng bytetrack.yaml để bật trình theo dõi này.

Trình theo dõi mặc định là BoT-SORT.

Theo dõi

Thông tin ngưỡng trình theo dõi

Nếu điểm tin cậy đối tượng sẽ thấp, tức là thấp hơn track_high_thresh, sau đó sẽ không có bản nhạc nào được trả lại và cập nhật thành công.

Để chạy trình theo dõi trên các luồng video, hãy sử dụng mô hình Phát hiện, Phân đoạn hoặc Tư thế đã được đào tạo, chẳng hạn như YOLOv8n, YOLOv8n-seg và YOLOv8n-tư thế.

Ví dụ

from ultralytics import YOLO

# Load an official or custom model
model = YOLO('yolov8n.pt')  # Load an official Detect model
model = YOLO('yolov8n-seg.pt')  # Load an official Segment model
model = YOLO('yolov8n-pose.pt')  # Load an official Pose model
model = YOLO('path/to/best.pt')  # Load a custom trained model

# Perform tracking with the model
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True)  # Tracking with default tracker
results = model.track(source="https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # Tracking with ByteTrack tracker
# Perform tracking with various models using the command line interface
yolo track model=yolov8n.pt source="https://youtu.be/LNwODJXcvt4"  # Official Detect model
yolo track model=yolov8n-seg.pt source="https://youtu.be/LNwODJXcvt4"  # Official Segment model
yolo track model=yolov8n-pose.pt source="https://youtu.be/LNwODJXcvt4"  # Official Pose model
yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4"  # Custom trained model

# Track using ByteTrack tracker
yolo track model=path/to/best.pt tracker="bytetrack.yaml"

Như có thể thấy trong cách sử dụng ở trên, theo dõi có sẵn cho tất cả các mô hình Phát hiện, Phân đoạn và Tư thế chạy trên video hoặc các nguồn phát trực tuyến.

Cấu hình

Thông tin ngưỡng trình theo dõi

Nếu điểm tin cậy đối tượng sẽ thấp, tức là thấp hơn track_high_thresh, sau đó sẽ không có bản nhạc nào được trả lại và cập nhật thành công.

Theo dõi đối số

Cấu hình theo dõi chia sẻ các thuộc tính với chế độ Dự đoán, chẳng hạn như conf, ioushow. Để biết thêm cấu hình, hãy tham khảo Dự đoán trang mô hình.

Ví dụ

from ultralytics import YOLO

# Configure the tracking parameters and run the tracker
model = YOLO('yolov8n.pt')
results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True)
# Configure tracking parameters and run the tracker using the command line interface
yolo track model=yolov8n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show

Lựa chọn trình theo dõi

Ultralytics Cũng cho phép bạn sử dụng tệp cấu hình trình theo dõi đã sửa đổi. Để làm điều này, chỉ cần tạo một bản sao của tệp cấu hình trình theo dõi (ví dụ: custom_tracker.yaml) từ ultralytics/cfg/trình theo dõi và sửa đổi bất kỳ cấu hình nào (ngoại trừ tracker_type) theo nhu cầu của bạn.

Ví dụ

from ultralytics import YOLO

# Load the model and run the tracker with a custom configuration file
model = YOLO('yolov8n.pt')
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker='custom_tracker.yaml')
# Load the model and run the tracker with a custom configuration file using the command line interface
yolo track model=yolov8n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

Để biết danh sách đầy đủ các đối số theo dõi, hãy tham khảo ultralytics/cfg/trackers trang.

Python Ví dụ

Vòng lặp theo dõi liên tục

Đây là một Python script sử dụng OpenCV (cv2) và YOLOv8 để chạy theo dõi đối tượng trên khung video. Tập lệnh này vẫn giả định bạn đã cài đặt các gói cần thiết (opencv-pythonultralytics). Các persist=True Đối số cho trình theo dõi biết rằng hình ảnh hoặc khung hình hiện tại là hình ảnh hoặc khung tiếp theo trong một chuỗi và mong đợi các bản nhạc từ hình ảnh trước đó trong hình ảnh hiện tại.

Phát trực tuyến theo vòng lặp với tính năng theo dõi

import cv2
from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO('yolov8n.pt')

# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLOv8 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True)

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Display the annotated frame
        cv2.imshow("YOLOv8 Tracking", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

Xin lưu ý sự thay đổi từ model(frame) đến model.track(frame), cho phép theo dõi đối tượng thay vì phát hiện đơn giản. Tập lệnh sửa đổi này sẽ chạy trình theo dõi trên mỗi khung hình của video, trực quan hóa kết quả và hiển thị chúng trong cửa sổ. Vòng lặp có thể được thoát ra bằng cách nhấn 'q'.

Vẽ các bản nhạc theo thời gian

Trực quan hóa các dấu vết đối tượng trên các khung hình liên tiếp có thể cung cấp thông tin chi tiết có giá trị về các kiểu chuyển động và hành vi của các đối tượng được phát hiện trong video. Với Ultralytics YOLOv8, vẽ các bản nhạc này là một quá trình liền mạch và hiệu quả.

Trong ví dụ sau, chúng tôi trình bày cách sử dụng YOLOv8Khả năng theo dõi của nó để vẽ chuyển động của các đối tượng được phát hiện trên nhiều khung hình video. Tập lệnh này liên quan đến việc mở một tệp video, đọc từng khung hình và sử dụng YOLO mô hình để xác định và theo dõi các đối tượng khác nhau. Bằng cách giữ lại các điểm trung tâm của các hộp giới hạn được phát hiện và kết nối chúng, chúng ta có thể vẽ các đường đại diện cho các đường dẫn theo sau các đối tượng được theo dõi.

Vẽ các bản nhạc trên nhiều khung hình video

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Load the YOLOv8 model
model = YOLO('yolov8n.pt')

# Open the video file
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)

# Store the track history
track_history = defaultdict(lambda: [])

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLOv8 tracking on the frame, persisting tracks between frames
        results = model.track(frame, persist=True)

        # Get the boxes and track IDs
        boxes = results[0].boxes.xywh.cpu()
        track_ids = results[0].boxes.id.int().cpu().tolist()

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Plot the tracks
        for box, track_id in zip(boxes, track_ids):
            x, y, w, h = box
            track = track_history[track_id]
            track.append((float(x), float(y)))  # x, y center point
            if len(track) > 30:  # retain 90 tracks for 90 frames
                track.pop(0)

            # Draw the tracking lines
            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        # Display the annotated frame
        cv2.imshow("YOLOv8 Tracking", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

Theo dõi đa luồng

Theo dõi đa luồng cung cấp khả năng chạy theo dõi đối tượng trên nhiều luồng video cùng một lúc. Điều này đặc biệt hữu ích khi xử lý nhiều đầu vào video, chẳng hạn như từ nhiều camera giám sát, nơi xử lý đồng thời có thể nâng cao đáng kể hiệu quả và hiệu suất.

Trong cung cấp Python kịch bản, chúng tôi sử dụng Python's threading mô-đun để chạy đồng thời nhiều phiên bản của trình theo dõi. Mỗi luồng chịu trách nhiệm chạy trình theo dõi trên một tệp video và tất cả các luồng chạy đồng thời trong nền.

Để đảm bảo rằng mỗi luồng nhận được các tham số chính xác (tệp video, mô hình sử dụng và chỉ mục tệp), chúng tôi xác định một hàm run_tracker_in_thread chấp nhận các thông số này và chứa vòng lặp theo dõi chính. Chức năng này đọc từng khung hình video, chạy trình theo dõi và hiển thị kết quả.

Hai mô hình khác nhau được sử dụng trong ví dụ này: yolov8n.ptyolov8n-seg.pt, mỗi đối tượng theo dõi trong một tệp video khác nhau. Các tệp video được chỉ định trong video_file1video_file2.

Các daemon=True tham số trong threading.Thread có nghĩa là các luồng này sẽ được đóng ngay sau khi chương trình chính kết thúc. Sau đó, chúng tôi bắt đầu các chủ đề với start() và sử dụng join() để làm cho luồng chính đợi cho đến khi cả hai luồng trình theo dõi kết thúc.

Cuối cùng, sau khi tất cả các luồng đã hoàn thành nhiệm vụ của chúng, các cửa sổ hiển thị kết quả sẽ được đóng bằng cách sử dụng cv2.destroyAllWindows().

Phát trực tuyến theo vòng lặp với tính năng theo dõi

import threading
import cv2
from ultralytics import YOLO


def run_tracker_in_thread(filename, model, file_index):
    """
    Runs a video file or webcam stream concurrently with the YOLOv8 model using threading.

    This function captures video frames from a given file or camera source and utilizes the YOLOv8 model for object
    tracking. The function runs in its own thread for concurrent processing.

    Args:
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
        model (obj): The YOLOv8 model object.
        file_index (int): An index to uniquely identify the file being processed, used for display purposes.

    Note:
        Press 'q' to quit the video display window.
    """
    video = cv2.VideoCapture(filename)  # Read the video file

    while True:
        ret, frame = video.read()  # Read the video frames

        # Exit the loop if no more frames in either video
        if not ret:
            break

        # Track objects in frames if available
        results = model.track(frame, persist=True)
        res_plotted = results[0].plot()
        cv2.imshow(f"Tracking_Stream_{file_index}", res_plotted)

        key = cv2.waitKey(1)
        if key == ord('q'):
            break

    # Release video sources
    video.release()


# Load the models
model1 = YOLO('yolov8n.pt')
model2 = YOLO('yolov8n-seg.pt')

# Define the video files for the trackers
video_file1 = "path/to/video1.mp4"  # Path to video file, 0 for webcam
video_file2 = 0  # Path to video file, 0 for webcam, 1 for external camera

# Create the tracker threads
tracker_thread1 = threading.Thread(target=run_tracker_in_thread, args=(video_file1, model1, 1), daemon=True)
tracker_thread2 = threading.Thread(target=run_tracker_in_thread, args=(video_file2, model2, 2), daemon=True)

# Start the tracker threads
tracker_thread1.start()
tracker_thread2.start()

# Wait for the tracker threads to finish
tracker_thread1.join()
tracker_thread2.join()

# Clean up and close windows
cv2.destroyAllWindows()

Ví dụ này có thể dễ dàng được mở rộng để xử lý nhiều tệp và mô hình video hơn bằng cách tạo nhiều luồng hơn và áp dụng cùng một phương pháp.

Đóng góp trình theo dõi mới

Bạn có thành thạo theo dõi đa đối tượng và đã triển khai hoặc điều chỉnh thành công thuật toán theo dõi với Ultralytics YOLO? Chúng tôi mời bạn đóng góp vào phần Trình theo dõi của chúng tôi trong ultralytics/cfg/trackers! Các ứng dụng và giải pháp trong thế giới thực của bạn có thể là vô giá đối với người dùng làm việc theo dõi các tác vụ.

Bằng cách đóng góp vào phần này, bạn giúp mở rộng phạm vi các giải pháp theo dõi có sẵn trong Ultralytics YOLO framework, thêm một lớp chức năng và tiện ích khác cho cộng đồng.

Để bắt đầu đóng góp của bạn, vui lòng tham khảo Hướng dẫn đóng góp của chúng tôi để được hướng dẫn toàn diện về cách gửi Yêu cầu kéo (PR) 🛠️ . Chúng tôi rất vui khi thấy những gì bạn mang đến cho bàn!

Cùng nhau, hãy nâng cao khả năng theo dõi của Ultralytics YOLO 🙏 hệ sinh thái !



Đã tạo 2023-11-12, Cập nhật 2024-04-26
Tác giả: glenn-jocher (11)

Ý kiến