Dedektörün hafızası yoktur. Ona bir video ver, sana kare kare kutular verir; 400. karedeki oyuncunun 399. karede gördüğü oyuncuyla aynı kişi olduğuna dair hiçbir fikri olmadan. Tek bir ekran görüntüsü için bu yeterli. Zaman içinde olan herhangi bir şey içinse işe yaramaz.
Spor projemizde şut adayı gibi olayları tespit etmek için oyuncuları ve topu takip ediyoruz. Hangi kutunun iki yüz kare boyunca X oyuncusu olduğunu bilmeden “X oyuncusu kaleye doğru hareket etti ve top ayağından çıktı” cümlesini tanımlayamazsın. Savunma tarafında ise gerçek zamanlı hedef takibi ürünün kendisi: takip edilemeyen bir tespit, üzerine aksiyon alamadığın bir tespittir. Zaman içinde kimlik, işin tamamı.

Kendi çizimim.
Tek paragrafta tespitle takip
Bugün pratikte kullanılan neredeyse her takipçi aynı döngüyü izliyor. Mevcut her iz için yeni karede nerede olacağını öngör, genellikle bir Kalman filtresiyle. Sonra öngörüleri yeni tespitlerle eşleştir: her öngörülen kutu ile her tespit edilen kutu arasında IoU hesapla ve atamayı Macar algoritmasıyla çöz. Eşleşen çiftler izlerini günceller. Eşleşmeyen tespitler yeni iz olabilir. Eşleşmeyen izler birkaç kare boyunca salt öngörüyle yaşar, sonra ölür.
Bu SORT ve sonrasında gelen çoğu şeyin altındaki iskelet bu. İlginç soru, her takipçinin güvenmediği tespitlerle ne yaptığı.
İz dediğimiz şey aslında ne
Korumaya çalıştığımız nesne konusunda somut olmakta fayda var. Bir iz, küçük bir durum paketidir: konum, kutu boyutu ve hız tutan bir Kalman durumu, bir tamsayı ID ve bir yaşam döngüsü bayrağı. Yeni bir tespit hemen gerçek bir ize dönüşmez. Önce aday olarak başlar ve sonraki birkaç karede tekrar eşleşerek onaylanması gerekir; tek karelik yanlış alarmların hiçbir zaman ID alamamasını sağlayan şey budur. Eşini kaçıran onaylanmış bir iz de hemen ölmez. Kayıp durumuna geçer, Kalman filtresi onu kör bir şekilde ileri doğru öngörmeye devam eder; ta ki bir tespit onu geri sahiplenene ya da iz tamponu tükenene kadar.
Sonradan ayarlayacağın her parametre bu yaşam döngüsüne oturur. Bir iz gerçek sayılmadan önce kaç onay gerekir. Ölmeden önce kaç kör kare geçer. Bir öngörü ne kadar sürüklenip hâlâ bir tespiti sahiplenebilir. Bu resmi akılda tutunca takipçi konfigürasyonları bir yığın sihirli sayı gibi görünmeyi bırakıyor.
ByteTrack’teki tek fikir
Klasik takipçiler önce bir güven eşiği uygular ve düşük skorlu kutuları çöpe atar. ByteTrack’in içgörüsü şu: bu, tam olarak yanlış veriyi atmaktır. Bir tespit skoru, nesne örtüldüğünde, bulanıklaştığında ya da yarısı kare dışına çıktığında düşer; yani tam da bir izin kaybedilmek üzere olduğu anda. Düşük skorlu kutu çoğu zaman yanlış alarm değildir. Kötü bir kare geçiren senin nesnendir.
Bu yüzden ByteTrack eşleştirmeyi iki geçişte yapar. Önce yüksek güvenli tespitler izlerle normal şekilde eşleşir. Sonra eş bulamayan izler, düşük güvenli kutulara karşı ikinci bir şans alır. Zayıf bir tespit, mevcut bir izi yaşatmaya yeter; oysa yeni bir iz başlatmasına asla izin verilmez.
Bütün numara bu asimetri. Görünüş embedding ağı yok, çalıştırılacak ekstra model yok. Gömülü donanımda bunun önemi büyük: takipçi, zaten çalıştırdığın dedektörün üstüne neredeyse hiçbir yük bindirmiyor.
Nerede ekmeğini çıkarıyor, nerede hâlâ kırılıyor
Futbol bu fikir için kurulmuş bir stres testi. Oyuncular birbirini sürekli örtüyor ve top küçük, hızlı ve hareket bulanıklığında; yani tespit skoru tam da onu kaybetmenin en can yaktığı karelerde düşük. Topun kimliğini şut boyunca koruyan şey o ikinci eşleştirme geçişi ve bizim şut adayı mantığımız o kimliğin sabit kalmasına dayanıyor.
Hâlâ kırılan yer: uzun örtülmeler. Kalman öngörüsü doğrulanmadan geçen her karede bozulur ve bir oyuncu takım arkadaşıyla on karelik yavaş bir çakışmadan sonra yeniden göründüğünde ID’ler yer değiştirebilir. ByteTrack’in görünüş kavramı yok, bu yüzden birbirine benzeyen iki nesnenin yol kesişmesi onun en kötü durumu. Sonraki mantığın kimliğe dayanıyorsa, değerlendirmede sadece takip doğruluğunu değil ID değişimlerini de say.
Vaka: halı sahanın üstünde tek kamera
Bana bunların çoğunu öğreten sistem, amatör futbolu tek bir sabit geniş açılı kameradan izliyor. Pan yok, zoom yok, ikinci açı yok. Bu kısıt aslında bir özellik: maç başına kurulacak bir şey yok, operatör yok; sahanın tamamını gören bir kamera ve ham görüntüyü işaretli maç videosuna, olay bazlı kliplere ve bir özet videoya çeviren bir hat var. Her şey H.264 ile kodlanıyor ki insanlar dosyaları gerçekten oynatabilsin.
Hat, yukarıdaki döngünün ta kendisi. YOLO her karede oyuncuları ve topu tespit ediyor, ByteTrack kimlikleri kareler arasında taşıyor. Kimlikler sabitlendikten sonra akış aşağısındaki her şey basit muhasebeye dönüşüyor.
Takım ayrımı, kimliğin zor bir problemi nasıl ucuzlattığının en sevdiğim örneği. Takımları bir ağla sınıflandırmıyorum. Takip edilen her oyuncuyu kırpıyorum, forma piksellerini alıp renkler üzerinde KMeans çalıştırıyorum: iki küme, iki takım. Tek bir karede bazı kırpımlar mutlaka yanlış çıkar; gölgede kalmış bir forma, üçüncü renkte bir kaleci, üst üste binmiş iki oyuncu. Ama ByteTrack bana yüzlerce kare boyunca aynı ID’yi verdiği için izin tamamı üzerinde oylama yapabiliyorum ve gürültü ortalamada kayboluyor. Kimlik olmasaydı her karedeki her kırpımı sıfırdan sınıflandırıyor ve titremeyle yaşıyor olacaktım.

Kare: projenin gerçek çıktısı.
Olaylar da aynı şekilde çalışıyor. Şut adayı olayı topun yörüngesinden geliyor: topun ardışık takip edilen konumları arasındaki hızı sıçradığında, ona az önce biri vurmuş demektir. O türev ancak konumlar aynı topa aitse var olur ve ikinci eşleştirme geçişinin koruduğu şey de tam olarak bu. Vurulan top hızlıdır ve bulanıktır, tespit skoru düşer ve klasik bir takipçi yörüngeyi en ilginç anında keserdi. Olaya neden gol değil şut adayı dediğimi ayrı bir yazıda anlattım.

Kare: projenin gerçek çıktısı.
Çıktı tarafı bilerek sıkıcı. Sabit ID’ler artı olaylar bana zaman damgaları veriyor, zaman damgaları klipleri veriyor, klipler birleşip özet videoyu oluşturuyor. Maçın tamamı da kutular, ID’ler ve takım renkleri üzerine işlenmiş, işaretli bir video olarak render ediliyor. Çünkü teslim edilen şey bir tensör değil, bir oyuncunun eve dönerken telefonunda açtığı bir dosya. Sistemin geri kalanı proje sayfasında.
Çalıştırmaktan gelen pratik notlar
Takipçi, altındaki dedektör kadar iyidir. Çöp kutu girerse çöp iz çıkar ve hiçbir takipçi parametresi seni kurtarmaz. Emeği önce dedektöre harca.
Sonra üç şeyi ayarla. Yüksek/düşük güven ayrımı, neyin “kötü bir kare” neyin gürültü sayılacağına karar verir. İz tamponu, kaybolan bir izin ne kadar yaşayacağına karar verir ve doğru değer varsayılana değil, senin örtülme sürelerine bağlıdır. Eşleşme eşiği ise bir nesnenin kareler arasında ne kadar uzağa gidebileceğine karar verir ki hızlı spor görüntüsünde bu sandığından daha uzaktır. Ultralytics, ByteTrack’i bir YAML konfigürasyonun arkasında hazır veriyor, yani deney döngüsü kısa. Kullan.
Halı saha sisteminden bir not daha: kendi görüntün üzerinde değerlendir, benchmark sayılarına değil. Yüksek/düşük güven ayrımını değiştirdiğimde fark önce derli toplu bir metrikte görünmedi. Topun ID’sini şut boyunca koruyup korumadığında göründü. Herhangi bir şeyi ayarlamadan önce kutuları ve ID’leri videonun üzerine çizen bir hata ayıklama görünümü kur. Beş dakikalık işaretli görüntü, sana herhangi bir tablodan daha fazlasını söyler.