Ultralytics YOLO27: Bekleme listesine katıl.
Get Started
Üretimde Ultralytics YOLO·Takip Et ve İş Hatları Oluştur·Ders 5/9
Dersorta düzey

ByteTrack, BoT-SORT ve TrackTrack ile Nesneleri Takip Et

Her nesneye kareler boyunca kararlı bir kimlik ver, bir takipçi seç ve eşiklerini algılayıcına göre ayarla.

Her sayım, bekleme süresi ve hız tahmini tek bir soruya bağlıdır: Bu karedeki 17 numaralı kimlik, önceki karedeki 17 numaralı kimlikle aynı nesne mi? Yaklaşık 30 yayanın bulunduğu aynı 62 karelik klipte ve aynı algılayıcıyla ByteTrack 32 kimlik, varsayılan TrackTrack ise 9 kimlik buldu. Takipçiyi seçmek ve ayarlamak modelin bir parçasıdır; yanlış seçim, sonraki tüm sayıları fark ettirmeden bozar.

Sonuç

Tek bir videoda üç takipçi çalıştır, kimlik sayılarını algılayıcının güven değerleriyle açıkla, bir iş hattında box.id kullan ve eşleşmeyen bir takipçiyi ayarlanmış bir YAML ile düzelt.

Hızlı Başlangıç
Nasıl ilerleyeceğini zaten biliyorsan, işte kısa sürüm.
  1. model.track(source, stream=True, tracker="bytetrack.yaml"); her kutu kararlı bir id alır.

  2. Kareleri kendin mi veriyorsun? Kimliklerin çağrılar arasında devam etmesi için persist=True parametresini geçir; her kamera için bir takipçi kullan.

  3. Varsayılan tracktrack.yaml'dır; ByteTrack hızlı ve toleranslıdır; BoT-SORT ise kamera hareketi telafisi ekler, ReID isteğe bağlıdır.

  4. Kimlik sayısı çok azsa algılayıcı güven değerlerini ölç ve kopyaladığın YAML'da new_track_thresh ile track_high_thresh değerlerini düşür.

Uygulamalı

Bir Takipçi Ne Katar?#

Ultralytics YOLO ile otoyol trafiğinin takibi: her otomobil, otobüs ve kamyon numaralı bir kimliği (otomobil #12, otobüs #21, kamyon #16) korur ve yakın geçmişte izlediği yol boyunca renkli bir çizgi bırakır

Bu karedeki etiketler ve izler, takipçinin ürettiği çıktılardır. Her kimlik bir izdir; gerçek bir nesneye ilişkin bir varsayımdır ve iz, o nesnenin yakın geçmişidir. Takipçi her karede bir Kalman filtresi kullanarak her izin nerede olması gerektiğini tahmin eder, ardından yeni algılamaları bu tahminlerle kutu örtüşmesine (ve isteğe bağlı olarak görünüme) göre eşleştirir:

track_buffer kare boyunca eşleşmeyen izler silinir. Mekanizmanın tamamı budur ve sonraki her şeyi eşik değerleri belirler.

Bir Takipçi Seç#

Takip modu altı takipçiyle birlikte gelir: BoT-SORT, ByteTrack, OC-SORT, Deep OC-SORT, FastTracker ve TrackTrack (tracker parametresini geçirmezsen varsayılan). Çoğu ihtiyacı üçü karşılar:

Takip algoritmasıEşleştirme ölçütleri (varsayılan yapılandırma)Şu durumlarda tercih et
ByteTrackHareket ve kutu örtüşmesine ek olarak, düşük güvenli kutuları kurtaran ikinci bir eşleştirme geçişiSabit kameralar, küçük veya kararsız algılayıcılar; işlem hacmi önemliyse
BoT-SORTByteTrack tarzı eşleştirme ve kamera hareketi telafisi (gmc_method: sparseOptFlow)Hareketli veya sarsılan kameralar; kalabalıklar ve uzun süreli örtülmeler için with_reid: True değerini ayarla
TrackTrackÇoklu ölçüt maliyeti (kutu şekli, güven, açı), iz farkındalıklı başlatma, kamera hareketi telafisiGüçlü ve iyi eğitilmiş bir modelden gelen yüksek güvenli algılamalar

BoT-SORT'un görünüm eşleştirmesi (yeniden kimlik belirleme) varsayılan olarak kapalıdır; model: auto ile açıldığında algılayıcının kendi özelliklerini yeniden kullanır, bu nedenle etkinleştirmek çok az ek yük getirir.

Tek Bir Klipte Takipçileri Karşılaştır#

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"

for tracker in ("bytetrack.yaml", "botsort.yaml", "tracktrack.yaml"):
    ids, frames = set(), 0
    for r in model.track(video, stream=True, tracker=tracker, classes=[0], verbose=False):
        frames += 1
        if r.boxes.is_track:
            ids.update(r.boxes.id.int().tolist())
    print(f"{tracker:16s} {frames} frames, {len(ids)} unique person IDs")
bytetrack.yaml   62 frames, 32 unique person IDs
botsort.yaml     62 frames, 33 unique person IDs
tracktrack.yaml  62 frames, 9 unique person IDs

Klipte yaklaşık 30 kişi, yukarıdan görülen bir meydanı geçiyor; bu nedenle ByteTrack ve BoT-SORT gerçek sayıya yakın sonuç veriyor. TrackTrack bozuk değil: yalnızca new_track_thresh: 0.7 üzerindeki izleri başlatıyor ve ilk eşleştirmeyi track_high_thresh: 0.6 üzerinde yapıyor; oysa YOLO26n'nin bu klipteki kişi güven değerlerinin medyanı 0,53 ve algılamaların yalnızca %17'si 0,7'ye ulaşıyor. Çoğu kişiye hiçbir zaman kimlik verilmiyor. Karar kuralı: herhangi bir sayıya güvenmeden önce takipçi eşiklerini algılayıcının güven dağılımıyla karşılaştır.

Bir İş Hattında Kimlikleri Kullan#

from collections import defaultdict

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"

counts = defaultdict(set)
for r in model.track(video, stream=True, tracker="bytetrack.yaml", verbose=False):
    if not r.boxes.is_track:  # no confirmed tracks in this frame yet
        continue
    for cls, tid in zip(r.boxes.cls.int().tolist(), r.boxes.id.int().tolist()):
        counts[r.names[cls]].add(tid)

for cls, ids in counts.items():
    print(f"{cls}: {len(ids)} unique objects")
person: 32 unique objects

Sınıf başına bir küme, her kimliği kaç karede görünürse görünsün yalnızca bir kez sayar; böylece sonuç algılama değil, nesne sayısı olur. stream=True, videonun tamamını bellekte tutmak yerine sonuçları her seferinde bir kare için üretir. Bölge sayımı, ısı haritaları ve mesafe hesaplama, bu döngünün üzerine eklenen ince katmanlardır.

Kendin Okuduğun Kareleri Takip Et#

Bir yol veya URL verdiğinde takipçi durumunu senin yerine yönetir. Kareler kendi kod çözücünden, web kamerandan ya da RTSP kamerandan geliyorsa her çağrının aynı diziyi sürdürmesi için persist=True parametresini geçir (Tahmin modu belgelerinde tüm kaynak türleri listelenir):

import cv2

from ultralytics import YOLO
from ultralytics.utils.downloads import safe_download

model = YOLO("yolo26n.pt")
video = safe_download("https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4")
cap = cv2.VideoCapture(str(video))  # or 0 for a webcam, or an rtsp:// URL

seen = set()
while True:
    ok, frame = cap.read()
    if not ok:
        break
    r = model.track(frame, persist=True, tracker="bytetrack.yaml", classes=[0], verbose=False)[0]
    if r.boxes.is_track:
        seen.update(r.boxes.id.int().tolist())  # your logic: dwell time, trajectories, alerts
cap.release()
print(f"{len(seen)} unique IDs")
32 unique IDs

Yolu parametre olarak vermekle aynı sonucu alırsın; çünkü persist=True 62 çağrının tamamında tek bir takipçiyi çalışır durumda tuttu.

Takipçiyi Algılayıcına Göre Ayarla#

Paketle birlikte gelen bir yapılandırmayı kopyala, algılayıcına uymayan eşikleri düşür ve yeni dosyayı geçir:

from pathlib import Path

from ultralytics import YOLO
from ultralytics.utils import ROOT

cfg = (ROOT / "cfg/trackers/tracktrack.yaml").read_text()  # packaged defaults
for old, new in (
    ("track_high_thresh: 0.6", "track_high_thresh: 0.3"),
    ("track_low_thresh: 0.25", "track_low_thresh: 0.1"),
    ("new_track_thresh: 0.7", "new_track_thresh: 0.35"),
):
    cfg = cfg.replace(old, new)
Path("tracktrack_tuned.yaml").write_text(cfg)

model = YOLO("yolo26n.pt")
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"
for tracker in ("tracktrack.yaml", "tracktrack_tuned.yaml"):
    ids = set()
    for r in model.track(video, stream=True, tracker=tracker, classes=[0], verbose=False):
        if r.boxes.is_track:
            ids.update(r.boxes.id.int().tolist())
    print(f"{tracker:22s} {len(ids)} unique person IDs")
tracktrack.yaml        9 unique person IDs
tracktrack_tuned.yaml  27 unique person IDs

Eşikleri algılayıcının medyan güven değerinin hemen altına çekmek, TrackTrack'in kimlik sayısını 9'dan 27'ye çıkardı ve elle yapılan sayımın yakınına getirdi. Her takipçinin ortak ayarları:

AyarByteTrack varsayılanıŞu durumlarda yükseltŞu durumlarda düşür
track_high_thresh0.25İlk eşleştirmede zayıf algılamaları yok sayDüşük güvenli algılayıcıyı takip et
new_track_thresh0.25Kısa ömürlü hatalı izleri azaltBelirsiz nesneler için iz başlat
track_buffer30 kareDaha uzun süreli örtülmelerde izleri koruKadrajdan çıkan nesnelerin kimliklerini daha erken boşa çıkar
match_thresh0.8Daha esnek eşleştir (hızlı hareket, sıçrayan kutular)Daha katı eşleştir (kalabalıklar)

Yaygın Hatalar#

Dedektörün güven eşiğinin üzerindeki eşikler

Belirti: Özellikle küçük bir modelle nesne sayısına kıyasla çok daha az ID var. Çözüm: Tespit güveninin medyanını yazdır (çözüme bak) ve new_track_thresh ile track_high_thresh değerlerini bu medyanın hemen altına ayarla.

persist seçeneğini unutma veya paylaşma

Belirti: model.track(frame) işlevini kendin çağırdığında her karede ID'ler sıfırlanıyor veya iki kamera tek bir modele görüntü verdiğinde ID'ler nesneler arasında geçiş yapıyor. Çözüm: Tek bir akışın ardışık kareleri için persist=True değerini aktar ve her kameraya kendi model örneğini ver (veya her akış için bir izleyici tutan .streams kaynağını kullan).

Yavaş nesnelerde ID titremesi

Belirti: Park hâlindeki bir arabanın ID'si birkaç karede bir değişiyor. Çözüm: İzleyici, eski izlerle eşleştirmek yerine yeni izler başlatıyor. Önce dedektörün o nesne için güven değerini kontrol et, ardından match_thresh ve track_buffer değerlerini yükselt.

Dene

Kendi alanından 30–60 saniyelik bir video al ve bir sınıftaki nesneleri elle say. Üzerinde compare_trackers.py çalıştır, çözüm betiğiyle algılayıcının güven değerlerini ölç ve kimlik sayısını elle yaptığın sayıya yaklaştıracak şekilde bir takipçi YAML'ını ayarla. Şu sütunları içeren bir tablo hazırla: takipçi, benzersiz kimlik sayısı, elle sayım.

Tamamlanma ölçütü
Aşağıdakilerin tümü doğru olduğunda dersi tamamlamış olursun.
  • Aynı videoda ByteTrack, BoT-SORT ve TrackTrack için benzersiz kimlik sayıların ile elle yaptığın sayım hazır.

  • En düşük sayıyı, takipçinin eşiklerini ve algılayıcının medyan güven değerini kullanarak açıklayabilirsin.

  • Ayarlanmış bir takipçi YAML'ı, sayımı çalıştırmadan önce öngördüğün yönde değiştirdi.

Çözümü göster

Önce algılayıcının güven değerlerini ölç, ardından eşikleri bu değerlerin hemen altına ayarla:

import torch

from ultralytics import YOLO

model = YOLO("yolo26n.pt")
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/solutions_ci_demo.mp4"
conf = torch.cat([r.boxes.conf for r in model.predict(video, stream=True, classes=[0], verbose=False)])
print(f"median {conf.median():.2f}, share >= 0.7: {(conf >= 0.7).float().mean():.0%}")
median 0.53, share >= 0.7: 17%

Meydan klibinin tablosunda şu değerler yer alıyor: ByteTrack 32, BoT-SORT 33, TrackTrack 9, ayarlanmış TrackTrack 27, elle sayım yaklaşık 30. Algılamaların yalnızca %17'si TrackTrack'in new_track_thresh: 0.7 değerini aşıyor; bu nedenle değeri 0,35'e düşürmek (track_high_thresh: 0.3 ile) doğru çözüm. Bu sabit, tepeden bakan kamera için yalın ByteTrack daha basit bir tercih.

Sırada ne var

Kararlı kimliklerle sonraki derste bunların üzerine en yaygın üretim iş hatlarını kuracağız: sayımlar, bölgeler, ısı haritaları ve hızlar.

İlerlemeni kaydetmek için giriş yap