Kurduğum her takip hattının altında bir Kalman filtresi var. Spor video projemizdeki oyuncu takipçisi ByteTrack’in içinde bir tane kullanıyor. Savunma tarafında çalıştığım hedef takipçileri de öyle. Buna rağmen çoğu anlatım beş matris ve bir sayfa alt indisle açılıyor ve fikir daha gelmeden okuru kaybediyor.
Fikir tek cümleye sığıyor: bir şeyin nerede olduğuna dair iki tahminin var ve her birine ne kadar güvendiğine göre ikisini harmanlıyorsun. Gerisi defter tutmak.
Şekil: sentetik veri üzerinde kendi çizimim.
İki tahmin, tek harman
Birinci tahmin bir hareket modelinden geliyor. Oyuncu geçen kare buradaysa ve şu hızla gidiyorsa, fizik şimdi aşağı yukarı şurada olması gerektiğini söyler. İkinci tahmin dedektöründen geliyor: bu karedeki bir sınırlayıcı kutu, dedektörlerin ürettiği bütün o titremeyle birlikte.
İki tahmin de yanlış. Soru ne kadar yanlış oldukları ve filtre tam olarak bunu tutuyor: her tahmin için bir belirsizlik. İkisi arasındaki harman ağırlığı Kalman kazancı. Hareket modeli güvenilir gittiyse kazanç tahmine yaslanır. Dedektör kendinden eminse ve hareket varsayımı bozuluyorsa ölçüme yaslanır. Makinenin tamamı bu. Tahmin et, düzelt, tekrarla.
Tahmin: belirsizlik büyür
Kareler arasında filtre, durumu hareket modeliyle ileri iter. Kutu takibinde bu model neredeyse her zaman sabit hız: konum artı hız, bir kare ileri yansıtılmış.
Önemli olan kısım belirsizliğe olan şey: büyür. Dışdeğerleme yapıyorsun ve filtre bu konuda dürüst. Üç kare atla, tahmin edilen konum geniş bir belirsizlik bandıyla gelir ve bu tam olarak doğrudur. Kör gittiği hâlde kendine güvenen bir takipçi, kimlik çalan bir takipçidir.
Düzeltme: ölçüm geri çeker
Bir tespit geldiğinde filtre, tahmini kazanç kadar ona doğru çeker ve belirsizlik küçülür. Gürültülü bir dedektör zayıf çeker. Temiz olanı sert çeker. İki tahmini de asla çöpe atmazsın; filtrenin senin için hesapladığı ağırlıklarla ortalarsın.
Filtrenin kaçan tespitlerde ekmeğini kazandığı yer de burası. Örtülme, hareket bulanıklığı, dedektörün düpedüz başarısız olduğu bir kare: filtre tahmin etmeye devam eder ve iz hayatta kalır. ByteTrack’in düşük güvenli tespitleri eşleştirdiği şey de o hayatta kalan tahmindir. O olmasa her örtülme yeni bir kimlik demek.
Hız bedavaya gelir
Gözden kaçması kolay bir ayrıntı: durum vektörü sadece konumdan ibaret değil. Kutu takibinde genellikle konumu, ölçeği ve bunların hızlarını taşır. Yani filtre sana her karede bir hız kestirimi verir ve bu, tespitlerin farkını alarak kendi hesaplayabileceğin her şeyden çok daha iyidir. Türev almak gürültüyü büyütür. Titrek iki konumun farkını al, kareden kareye çılgınca savrulan bir hız elde edersin. Filtrenin hız durumu ise konumu yumuşatan aynı güven harmanıyla yumuşatılmıştır. Aradaki fark, kullanılabilir bir sinyal ile rastgele sayı üreteci arasındaki farktır. Üstelik bunun için fazladan bir hesap da gerekmiyor; hız zaten durumun içinde ve tahmin adımı onu her karede kendiliğinden güncelliyor.
Ben de bunun kıymetini, hıza gerçek bir iş için ihtiyaç duyana kadar bilmiyordum. Devamı aşağıda.
Modelin şaşırması da bilgidir
Sabit hız bir yalan. Oyuncular aniden döner, durur, hızlanır. Topa vurulur. Bu anların her biri hareket modelini ihlal eder ve filtre elinden gelen tek şeyi yapar: tahmin ölçümden uzağa düşer, aradaki boşluk (filtre dilinde inovasyon) sıçrar ve filtre toparlanana kadar kestirim birkaç kare geriden gelir.
Bu gecikmeyi bir kusur sayıp Q’yu artırarak azaltabilirsin. Ya da sıçramanın kendisinin bir sinyal olduğunu fark edersin. Büyük bir inovasyon, dünyanın az önce modelinin beklemediği bir şey yaptığı anlamına gelir. Bazen bu gürültüdür. Ama birkaç kare boyunca tutarlıysa gerçek bir olay olmuş demektir: yön değişimi, ivmelenme, çarpma. Filtre sadece bir kestirici değil. İç değerlerini de okursan, ucuz bir olay dedektörü. Bu bakış açısını bir kez edinince filtreyle ilişkin değişiyor: ona artık yalnızca pürüzsüz bir iz çizen bir kutu gibi değil, sahnede olup biteni özetleyen küçük bir rapor gibi bakıyorsun.
Matrisler, tek paragrafta
Eksik kalmasın: durum vektörü takip ettiğin şey, F onu bir adım ileri iter, H durumu ölçebildiğin şeye eşler, Q hareket modeline ne kadar güvendiğini söyler, R dedektöre ne kadar güvendiğini. Pratikte Q ile R oranı dışında neredeyse hiçbir şeyi ayarlamazsın. İzlerin hızlı hedeflerin gerisinde kalıyorsa Q çok küçük: filtreye dünya yavaş değişir demişsin, o da inanmış. İzlerin her gürültülü kutuyla birlikte titriyorsa R çok küçük. Gerisi genelde kütüphane varsayılanında kalır ve OpenCV, cv::KalmanFilter ile gayet iyi bir gerçekleme veriyor.
Vaka: tek kamera görüntüsündeki top
Spor video hattı, sahanın tamamını gören tek bir sabit geniş açılı kamerayla çalışıyor. YOLO tespit ediyor, ByteTrack eşliyor ve forma renkleri üzerinde bir KMeans geçişi oyuncuları takımlara ayırıyor. Oyuncular bu hattın baş edilebilir kısmı. Top ise bana Kalman filtresine yeniden saygı duyduran kısım oldu.
Geniş planda top bir avuç piksel. Sahadaki her şeyden hızlı hareket ediyor, her vuruşta bulanıklaşıyor ve maçın hatırı sayılır bir bölümünü bacakların ve gövdelerin arkasında örtülü geçiriyor. Tek kamerayla seni kurtaracak ikinci bir açı da yok. Dedektör bu koşullarda dedektörlerin yaptığını yapıyor: kutular titriyor, uzun aralıklarla kayboluyor ve ara sıra bir çorabı ya da saha çizgisini top sanıyor. Ham top tespitlerini zaman üzerinde çiz, karşına bir yörünge değil bir saçılım çıkar.
Filtre o saçılımı bir yola çeviriyor. Tahmin, topu örtülmelerin içinden taşıyor; düzeltme adımı da gürültülü ölçümlerin kestirimi oradan oraya sürüklemesini engelliyor. İşaretli çıktı videosuna çizilen şey bu yumuşatılmış yörünge ve fark herkesin görebileceği kadar açık: ham tespitler sismograf gibi görünüyor, filtrelenmiş iz fizik gibi. Bu ayrım estetik bir mesele de değil. Titreyen bir yörünge çizgisi, videoyu izleyen antrenörün gözünde bütün sistemin güvenilirliğini düşürüyor; pürüzsüz bir iz ise sistemin topu gerçekten anladığını söylüyor.
Kare: projenin gerçek çıktısı.
Vakanın karşılığını verdiği yer hız durumu. Şut tespiti istiyorduk ve bu problemin dürüst hâli zor. Ama şutun tek bir gür imzası var: topun hızı bir anda sıçrar. Hat bu yüzden filtrelenmiş hız durumunu izliyor ve ani bir sıçramayı şut adayı olarak işaretliyor. Aynı şeyi ham tespitlerden hesaplamak işe yaramıyordu. Kareden kareye farklar, yukarıdaki bölümün öngördüğü gibi, gürültüden ibaretti. Filtrelenmiş hız ise gerçek bir vuruşun temiz biçimde ayrışacağı kadar pürüzsüzdü. Ürünün geri kalanını bu olaylar sürüyor: işaretli maç videosu, olay başına klipler ve bir özet video, hepsi antrenörlerin her yerde oynatabilmesi için H.264 ile kodlanmış.
Bunların hiçbiri sofistike bir filtre gerektirmedi. Standart tahmin ve düzeltme döngüsü, hız taşıyan bir durum vektörü ve ölçümün kötü bir gün geçirdiği anlarda kestirime güvenme cesareti yetti. Filtreyi değiştirmeden, sadece neyi ölçtüğünü ve neye ne kadar güvendiğini netleştirerek bu noktaya gelmek, bana kalırsa bu aracın en güzel yanı.
Sezginin karşılığı
Spor tarafında oyuncular birbirini sürekli örtüyor ve dedektör birkaç saniyede bir kutu düşürüyor. Savunma tarafında takip işi, tespit kanalının işe yarar hiçbir şey vermediği karelerde hedefi tutmak zorunda. İki durumda da Kalman filtresi, bir iz ile bir yığın kopuk tespit arasındaki fark.
Türetmene gerek yok. İz geride kalınca hangi düğmeyi, iz sallanınca hangisini çevireceğini bilmen gerek. Bu iki düğme eder, beş matris değil.