İçeriğe geç

Çoklu Nesne Takibi ile Ultralytics YOLO

Çoklu nesne izleme örnekleri

Video analitiği alanında nesne takibi, yalnızca çerçeve içindeki nesnelerin konumunu ve sınıfını tanımlamakla kalmayıp aynı zamanda video ilerledikçe algılanan her nesne için benzersiz bir kimlik sağlayan kritik bir görevdir. Gözetim ve güvenlikten gerçek zamanlı spor analitiğine kadar uzanan uygulamalar sınırsızdır.

Neden Nesne Takibi için Ultralytics YOLO adresini seçmelisiniz?

Ultralytics izleyicilerinden elde edilen çıktı standart nesne algılama ile tutarlıdır ancak nesne kimliklerinin katma değerine sahiptir. Bu, video akışlarındaki nesneleri izlemeyi ve ardından analiz gerçekleştirmeyi kolaylaştırır. Nesne izleme ihtiyaçlarınız için neden Ultralytics YOLO adresini kullanmayı düşünmeniz gerektiğini açıklıyoruz:

  • Verimlilik: Doğruluktan ödün vermeden video akışlarını gerçek zamanlı olarak işleyin.
  • Esneklik: Çoklu izleme algoritmalarını ve konfigürasyonlarını destekler.
  • Kullanım Kolaylığı: Hızlı entegrasyon ve dağıtım için basit Python API ve CLI seçenekleri.
  • Özelleştirilebilirlik: Özel eğitimli YOLO modelleri ile kullanımı kolaydır ve alana özgü uygulamalara entegrasyon sağlar.



İzle: Ultralytics YOLOv8 ile Nesne Tespiti ve Takibi .

Gerçek Dünya Uygulamaları

Ulaşım Perakende Akuakültür
Araç Takip Kişi Takibi Balık Takibi
Araç Takip Kişi Takibi Balık Takibi

Bir Bakışta Özellikler

Ultralytics YOLO sağlam ve çok yönlü nesne takibi sağlamak için nesne algılama özelliklerini genişletir:

  • Gerçek Zamanlı İzleme: Yüksek kare hızlı videolardaki nesneleri sorunsuzca izleyin.
  • Çoklu İzleyici Desteği: Çeşitli yerleşik izleme algoritmaları arasından seçim yapın.
  • Özelleştirilebilir İzleyici Yapılandırmaları: Çeşitli parametreleri ayarlayarak izleme algoritmasını özel gereksinimleri karşılayacak şekilde uyarlayın.

Mevcut İzleyiciler

Ultralytics YOLO aşağıdaki izleme algoritmalarını destekler. Bunlar, aşağıdaki gibi ilgili YAML yapılandırma dosyası geçirilerek etkinleştirilebilir tracker=tracker_type.yaml:

  • BoT-SORT - Kullanım botsort.yaml bu izleyiciyi etkinleştirmek için.
  • ByteTrack - Kullanım bytetrack.yaml bu izleyiciyi etkinleştirmek için.

Varsayılan izleyici BoT-SORT'tur.

Takip

İzleyici Eşik Bilgileri

Nesne güven puanı düşük olacaksa, yani track_high_threshbu durumda başarılı bir şekilde döndürülen ve güncellenen hiçbir parça olmayacaktır.

İzleyiciyi video akışları üzerinde çalıştırmak için YOLOv8n, YOLOv8n-seg ve YOLOv8n-pose gibi eğitimli bir Algılama, Segment veya Poz modeli kullanın.

Örnek

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"

Yukarıdaki kullanımda görülebileceği gibi, videolar veya akış kaynakları üzerinde çalıştırılan tüm Detect, Segment ve Pose modelleri için izleme mevcuttur.

Konfigürasyon

İzleyici Eşik Bilgileri

Nesne güven puanı düşük olacaksa, yani track_high_threshbu durumda başarılı bir şekilde döndürülen ve güncellenen hiçbir parça olmayacaktır.

Argümanların İzlenmesi

İzleme yapılandırması, Tahmin modu ile aşağıdaki gibi özellikleri paylaşır conf, iouve show. Daha fazla konfigürasyon için bkz. Tahmin Et Model sayfası.

Örnek

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

İzleyici Seçimi

Ultralytics ayrıca değiştirilmiş bir izleyici yapılandırma dosyası kullanmanıza da olanak tanır. Bunu yapmak için, bir izleyici yapılandırma dosyasının bir kopyasını oluşturmanız yeterlidir (örn, custom_tracker.yaml) dan ultralytics/cfg/trackers ve herhangi bir konfigürasyonu değiştirin (hariç tracker_type) ihtiyaçlarınıza göre.

Örnek

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'

İzleme argümanlarının kapsamlı bir listesi için ultralytics/cfg/trackers sayfasına bakın.

Python Örnekler

Devam Eden İzler Döngüsü

İşte OpenCV kullanan bir Python betiği (cv2) ve YOLOv8 adreslerini kullanarak video kareleri üzerinde nesne izlemeyi çalıştırabilirsiniz. Bu betik hala gerekli paketleri zaten yüklediğinizi varsayar (opencv-python ve ultralytics). Bu persist=True argümanı, izleyiciye geçerli görüntünün veya karenin bir dizinin sonraki görüntüsü olduğunu ve geçerli görüntüde önceki görüntüden izler beklemesini söyler.

İzleme ile for döngüsü akışı

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()

Lütfen şu değişikliğe dikkat edin model(frame) için model.track(frame)basit algılama yerine nesne izlemeyi etkinleştirir. Bu değiştirilmiş komut dosyası, videonun her karesinde izleyiciyi çalıştıracak, sonuçları görselleştirecek ve bir pencerede görüntüleyecektir. Döngüden 'q' tuşuna basılarak çıkılabilir.

İzleri Zaman İçinde Çizme

Ardışık kareler üzerindeki nesne izlerini görselleştirmek, bir videodaki algılanan nesnelerin hareket kalıpları ve davranışları hakkında değerli bilgiler sağlayabilir. Ultralytics YOLOv8 ile bu izleri çizmek sorunsuz ve verimli bir süreçtir.

Aşağıdaki örnekte, tespit edilen nesnelerin hareketini birden fazla video karesi boyunca çizmek için YOLOv8'un izleme yeteneklerinin nasıl kullanılacağını gösteriyoruz. Bu komut dosyası bir video dosyasını açmayı, kare kare okumayı ve çeşitli nesneleri tanımlamak ve izlemek için YOLO modelini kullanmayı içerir. Tespit edilen sınırlayıcı kutuların merkez noktalarını koruyarak ve bunları birleştirerek, izlenen nesneler tarafından izlenen yolları temsil eden çizgiler çizebiliriz.

Birden fazla video karesi üzerinde izleri çizme

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()

Çok İş Parçacıklı İzleme

Çok iş parçacıklı izleme, nesne izlemeyi aynı anda birden fazla video akışı üzerinde çalıştırma olanağı sağlar. Bu özellikle, eş zamanlı işlemenin verimliliği ve performansı büyük ölçüde artırabileceği birden fazla güvenlik kamerası gibi birden fazla video girişini işlerken kullanışlıdır.

Sağlanan Python betiğinde, Python'in threading modülünü kullanarak izleyicinin birden fazla örneğini eşzamanlı olarak çalıştırabilirsiniz. Her iş parçacığı izleyiciyi bir video dosyası üzerinde çalıştırmaktan sorumludur ve tüm iş parçacıkları arka planda aynı anda çalışır.

Her iş parçacığının doğru parametreleri (video dosyası, kullanılacak model ve dosya indeksi) almasını sağlamak için bir fonksiyon tanımlıyoruz run_tracker_in_thread bu parametreleri kabul eder ve ana izleme döngüsünü içerir. Bu işlev videoyu kare kare okur, izleyiciyi çalıştırır ve sonuçları görüntüler.

Bu örnekte iki farklı model kullanılmıştır: yolov8n.pt ve yolov8n-seg.pther biri farklı bir video dosyasındaki nesneleri izler. Video dosyaları şurada belirtilir video_file1 ve video_file2.

Bu daemon=True içinde parametre threading.Thread ana program biter bitmez bu iş parçacıklarının kapatılacağı anlamına gelir. Daha sonra iş parçacıklarını şu şekilde başlatırız start() ve kullanın join() ana iş parçacığının her iki izleyici iş parçacığının işi bitene kadar beklemesini sağlamak için.

Son olarak, tüm iş parçacıkları görevlerini tamamladıktan sonra, sonuçları görüntüleyen pencereler cv2.destroyAllWindows().

İzleme ile for döngüsü akışı

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()

Bu örnek, daha fazla iş parçacığı oluşturarak ve aynı metodolojiyi uygulayarak daha fazla video dosyası ve modeli işlemek için kolayca genişletilebilir.

Yeni İzleyicilere Katkıda Bulunun

Çoklu nesne izleme konusunda uzman mısınız ve Ultralytics YOLO ile bir izleme algoritmasını başarıyla uyguladınız veya uyarladınız mı? Sizi ultralytics/cfg/trackers adresindeki İzleyiciler bölümümüze katkıda bulunmaya davet ediyoruz! Gerçek dünyadaki uygulamalarınız ve çözümleriniz, izleme görevleri üzerinde çalışan kullanıcılar için çok değerli olabilir.

Bu bölüme katkıda bulunarak, Ultralytics YOLO çerçevesinde mevcut izleme çözümlerinin kapsamını genişletmeye yardımcı olur, topluluk için başka bir işlevsellik ve fayda katmanı eklersiniz.

Katkınızı başlatmak için lütfen 🛠️ adresinde bir Çekme İsteği (PR) göndermeye ilişkin kapsamlı talimatlar için Katkıda Bulunma Kılavuzumuza bakın. Masaya ne getireceğinizi görmek için heyecanlıyız!

Birlikte Ultralytics YOLO ekosisteminin izleme yeteneklerini geliştirelim 🙏!



Oluşturuldu 2023-11-12, Güncellendi 2024-04-26
Yazarlar: glenn-jocher (11)

Yorumlar