Bỏ qua nội dung

Theo dõi nhiều đối tượng với Ultralytics YOLO

Ví dụ theo dõi nhiều đố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à loại đối tượng trong khung hình 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à an ninh đế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 trackers phù hợp với phát hiện đối tượng tiêu chuẩn nhưng có thêm giá trị 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 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 cho nhu cầu theo dõi đối tượng của bạn:

  • Hiệu quả: Xử lý luồng video theo thời gian thực mà không làm giảm độ chính xác .
  • Tính linh hoạt: Hỗ trợ nhiều thuật toán và cấu hình theo dõi.
  • Dễ sử dụng: Đơn giản Python API và CLI tùy chọn tích hợp và triển khai nhanh chóng.
  • Khả năng tùy chỉnh: Dễ dàng 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 cụ thể theo miền.



Đồng hồ: Phát hiện và theo dõi đối tượng với Ultralytics YOLO .

Ứng dụng thực tế

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ính năng tổng quan

Ultralytics YOLO mở rộng các tính năng phát hiện đối tượng để cung cấp khả năng 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ừ nhiều thuật toán theo dõi đã thiết lập.
  • Cấu hình theo dõi có thể tùy chỉnh: Tùy 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 nhiều thông số khác nhau.

Bộ 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 truyền tệp cấu hình YAML có liên quan như tracker=tracker_type.yaml:

  • BoT-SORT - Sử dụng botsort.yaml để kích hoạt trình theo dõi này.
  • ByteTrack - Sử dụng bytetrack.yaml để kích hoạt trình theo dõi này.

Công cụ theo dõi mặc định là BoT-SORT.

Theo dõi

Thông tin ngưỡng theo dõi

Nếu điểm tin cậy của đối tượng sẽ thấp, tức là thấp hơn track_high_thresh, khi đó sẽ không có bản nhạc nào được trả về 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 như YOLO11n, YOLO11n-seg và YOLO11n-pose.

Ví dụ

from ultralytics import YOLO

# Load an official or custom model
model = YOLO("yolo11n.pt")  # Load an official Detect model
model = YOLO("yolo11n-seg.pt")  # Load an official Segment model
model = YOLO("yolo11n-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("https://youtu.be/LNwODJXcvt4", show=True)  # Tracking with default tracker
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml")  # with ByteTrack
# Perform tracking with various models using the command line interface
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4"  # Official Detect model
yolo track model=yolo11n-seg.pt source="https://youtu.be/LNwODJXcvt4"  # Official Segment model
yolo track model=yolo11n-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, tính năng theo dõi có sẵn cho tất cả các mô hình Detect, Segment và Pose chạy trên video hoặc nguồn phát trực tuyến.

Cấu hình

Thông tin ngưỡng theo dõi

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

Theo dõi các đố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, iou, Và show. Để biết thêm cấu hình, hãy tham khảo Dự đoán trang mẫu.

Ví dụ

from ultralytics import YOLO

# Configure the tracking parameters and run the tracker
model = YOLO("yolo11n.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=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show

Lựa chọn 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. Để thực hiện việc 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/người theo dõi và sửa đổi bất kỳ cấu hình nào (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("yolo11n.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=yolo11n.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 trang ultralytics /cfg/trackers .

Python Ví dụ

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

Đây là một Python kịch bản sử dụng MởCV (cv2) Và YOLO11 để chạy theo dõi đối tượng trên khung video. Tập lệnh này vẫn giả định rằng 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 hình tiếp theo trong chuỗi và mong đợi các dấu vết từ hình ảnh trước đó trong hình ảnh hiện tại.

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

import cv2

from ultralytics import YOLO

# Load the YOLO11 model
model = YOLO("yolo11n.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 YOLO11 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("YOLO11 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 từng khung hình của video, trực quan hóa kết quả và hiển thị chúng trong một cửa sổ. Có thể thoát khỏi vòng lặp bằng cách nhấn 'q'.

Vẽ đường đi theo thời gian

Việc trực quan hóa các dấu vết của vật thể trên các khung hình liên tiếp có thể cung cấp những hiểu biết có giá trị về các mẫu chuyển động và hành vi của các vật thể được phát hiện trong video. Với Ultralytics YOLO11 , việc vạch ra những đường đi 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 YOLO11 khả năng theo dõi của để vẽ biểu đồ 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 bao gồm việc mở 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 biểu diễn các đường đi mà các đối tượng được theo dõi đi theo.

Vẽ các đường dẫn trên nhiều khung hình video

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# Load the YOLO11 model
model = YOLO("yolo11n.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 YOLO11 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("YOLO11 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 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 nhiều phiên bản của trình theo dõi đồng thờ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 tham số này và chứa vòng lặp theo dõi chính. Hàm này đọc từng khung hình video, chạy trình theo dõi và hiển thị kết quả.

Có hai mô hình khác nhau được sử dụng trong ví dụ này: yolo11n.ptyolo11n-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 khi chương trình chính kết thúc. Sau đó, chúng tôi bắt đầu các luồng bằng start() và sử dụng join() để luồng chính chờ cho đến khi cả hai luồng theo dõi hoàn tất.

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 lại bằng cách sử dụng cv2.destroyAllWindows().

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

import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # local video, 0 for webcam


def run_tracker_in_thread(model_name, filename):
    """
    Run YOLO tracker in its own thread for concurrent processing.

    Args:
        model_name (str): The YOLO11 model object.
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
    """
    model = YOLO(model_name)
    results = model.track(filename, save=True, stream=True)
    for r in results:
        pass


# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
    thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
    tracker_threads.append(thread)
    thread.start()

# Wait for all tracker threads to finish
for thread in tracker_threads:
    thread.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 video và mô hình hơn bằng cách tạo thêm luồng và áp dụng cùng một phương pháp.

Đóng góp các công cụ theo dõi mới

Bạn có thành thạo trong việc theo dõi nhiều đố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 mục Theo dõi của chúng tôi trong ultralytics /cfg/trackers ! Các ứng dụng và giải pháp thực tế của bạn có thể vô cùng hữu ích đối với người dùng làm nhiệm vụ theo dõi.

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 khung, bổ sung thêm một lớp chức năng và tiện ích 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 để biết 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 mong chờ những gì bạn mang lại!

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

CÂU HỎI THƯỜNG GẶP

Theo dõi nhiều đối tượng là gì và hoạt động như thế nào Ultralytics YOLO ủng hộ nó?

Theo dõi nhiều đối tượng trong phân tích video bao gồm cả việc xác định đối tượng và duy trì ID duy nhất cho mỗi đối tượng được phát hiện trên các khung hình video. Ultralytics YOLO hỗ trợ điều này bằng cách cung cấp theo dõi thời gian thực cùng với ID đối tượng, tạo điều kiện cho các tác vụ như giám sát an ninh và phân tích thể thao. Hệ thống sử dụng các trình theo dõi như BoT-SORT và ByteTrack, có thể được cấu hình thông qua các tệp YAML.

Làm thế nào để cấu hình một trình theo dõi tùy chỉnh cho Ultralytics YOLO ?

Bạn có thể cấu hình trình theo dõi tùy chỉnh bằng cách sao chép tệp cấu hình trình theo dõi hiện có (ví dụ: custom_tracker.yaml) từ Ultralytics thư mục cấu hình theo dõi và sửa đổi các thông số khi cần thiết, ngoại trừ tracker_type. Sử dụng tệp này trong mô hình theo dõi của bạn như sau:

Ví dụ

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml")
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'

Làm thế nào tôi có thể chạy theo dõi đối tượng trên nhiều luồng video cùng lúc?

Để chạy theo dõi đối tượng trên nhiều luồng video cùng lúc, bạn có thể sử dụng Python 'S threading module. Mỗi luồng sẽ xử lý một luồng video riêng biệt. Sau đây là ví dụ về cách bạn có thể thiết lập điều này:

Theo dõi đa luồng

import threading

import cv2

from ultralytics import YOLO

# Define model names and video sources
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"]
SOURCES = ["path/to/video.mp4", "0"]  # local video, 0 for webcam


def run_tracker_in_thread(model_name, filename):
    """
    Run YOLO tracker in its own thread for concurrent processing.

    Args:
        model_name (str): The YOLO11 model object.
        filename (str): The path to the video file or the identifier for the webcam/external camera source.
    """
    model = YOLO(model_name)
    results = model.track(filename, save=True, stream=True)
    for r in results:
        pass


# Create and start tracker threads using a for loop
tracker_threads = []
for video_file, model_name in zip(SOURCES, MODEL_NAMES):
    thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True)
    tracker_threads.append(thread)
    thread.start()

# Wait for all tracker threads to finish
for thread in tracker_threads:
    thread.join()

# Clean up and close windows
cv2.destroyAllWindows()

Các ứng dụng thực tế của việc theo dõi nhiều đối tượng là gì? Ultralytics YOLO ?

Theo dõi nhiều đối tượng với Ultralytics YOLO có nhiều ứng dụng, bao gồm:

  • Giao thông: Theo dõi phương tiện để quản lý giao thông và lái xe tự động.
  • Bán lẻ: Theo dõi mọi người để phân tích và bảo mật trong cửa hàng.
  • Nuôi trồng thủy sản: Theo dõi cá để giám sát môi trường nước.

Những ứng dụng này được hưởng lợi từ Ultralytics YOLO khả năng xử lý video có tốc độ khung hình cao theo thời gian thực.

Làm thế nào tôi có thể hình dung các đường đi của đối tượng trên nhiều khung hình video với Ultralytics YOLO ?

Để hình dung các đường đi của đối tượng trên nhiều khung hình video, bạn có thể sử dụng YOLO các tính năng theo dõi của mô hình cùng với OpenCV để vẽ đường đi của các đối tượng được phát hiện. Sau đây là một ví dụ về tập lệnh chứng minh điều này:

Vẽ các đường dẫn trên nhiều khung hình video

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo11n.pt")
video_path = "path/to/video.mp4"
cap = cv2.VideoCapture(video_path)
track_history = defaultdict(lambda: [])

while cap.isOpened():
    success, frame = cap.read()
    if success:
        results = model.track(frame, persist=True)
        boxes = results[0].boxes.xywh.cpu()
        track_ids = results[0].boxes.id.int().cpu().tolist()
        annotated_frame = results[0].plot()
        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)))
            if len(track) > 30:
                track.pop(0)
            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
        cv2.imshow("YOLO11 Tracking", annotated_frame)
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break
cap.release()
cv2.destroyAllWindows()

Tập lệnh này sẽ vẽ các đường theo dõi hiển thị đường di chuyển của các đối tượng được theo dõi theo thời gian.

📅 Được tạo ra cách đây 1 năm ✏️ Đã cập nhật cách đây 2 tháng

Bình luận