Amatör bir futbol maçının tek geniş açı kayıttan alınmış görüntüsünü işleyip oyuncuların gerçekten istediği şeyi döndüren bir hat geliştiriyorum: kendi golünün on beş saniyelik klibi, otomatik kesilmiş.
Görü kısmı zor kısım değil. YOLO oyuncuları ve topu buluyor. ByteTrack kimlikleri kareler arasında sabit tutuyor, böylece yarım saniye örtülen oyuncu geri geldiğinde yeni bir insan olarak sayılmıyor. Forma renginden KMeans iki takımı ayırıyor. Bunların hiçbiri yeni değil ve hepsi çalışıyor.
Zor olan, neyin olay sayılacağına karar vermek.
Olay, görünüşten değil yörüngeden
Golün görsel bir imzası yok. “Gol” anlamına gelen bir piksel deseni bulunmuyor. Güvenilir şekilde var olan şey, topun hareketindeki değişim: vurulduğunda sert hızlanır, görece düz bir hat izler, sonra ya durur ya yön değiştirir ya da kareden çıkar.
Yani dedektör topa bakmıyor. Kareler boyunca takip edilen ağırlık merkezinden hesaplanan topun zamana göre hızına bakıyor ve eşiğin üstündeki ani artışları işaretliyor. Bu sana şutları verir. Ama aynı zamanda uzaklaştırmaları, sert pasları ve ara sıra kötü bir taç atışını da verir; problem tam olarak bu.
Şutu uzaklaştırmadan ayırmak için kalenin nerede olduğunu bilmen gerekir. Kale ağzına göre hareket yönü ayırt edici özelliktir ve geometriyi bir kez elde ettikten sonra ucuzdur.
Elimde olmayan geometri
Örnek görüntüler elde ve gimbalde çekilmişti. Kamera hareket ediyor. Görüntü koordinatlarıyla saha koordinatları arasında sabit bir homografi yok ve karenin “kale” diyebileceğim sabit bir bölgesi yok.
Tahmin edebilirdim. Kale direklerini tespit et, düzlem uydur, kamera hareketini takip et, kare başına warp uygula. Bu tek başına gerçek bir proje ve prodüksiyonda var olmayan bir problemi çözüyor olurdu, çünkü prodüksiyonda kamera duvara vidalanıyor ve hiç hareket etmiyor.
Ben diğerini yaptım. Olay tespiti fonksiyonu bir kale bölgesi parametresi alıyor.
Örnek görüntüde bu parametre yok ve fonksiyon çıktısını şut adayı diye
etiketliyor. Sabit kurulumda bölgeyi bir kez veriyorsun ve aynı kod gol üretiyor.
Etiketin koddan önemli olması
Buradaki kod değişikliği önemsiz: bir opsiyonel argüman ve çıktıda farklı bir dize. Altındaki karar öyle değil.
Alternatif şuydu: hız eşiğini demo klipleri çoğunlukla gol çıkacak şekilde ayarla,
çıktıya gol de ve teslim et. O sürüm daha iyi demo verir. Aynı zamanda mümkün olan
en kötü anda, müşterinin karşısında, ayarın hiç görmediği bir görüntüde patlayan bir
hata moduna sahiptir. Üstelik hatadan kod yazarak çıkamazsın, çünkü ayrımı yapmak
için gereken bilgi girdide hiç yoktu.
Sınırı çıktının içinde adlandırmak üç iş yapıyor. Aşağı akıştaki hiç kimsenin sayıyı olmadığı bir şey sanmasına izin vermiyor. Özelliğin tamamlanması için neyin değişmesi gerektiğini belgeliyor. Ve sabit kamera geldiğinde iş, yeniden yazım değil bir konfigürasyon değeri oluyor.
Neyi farklı yapardım
Kale bölgesi parametresini, sınır belirginleştikten sonra eklemek yerine ilk gün imzaya yazardım. Bir kısıtın geleceğini bildiğin yere baştan boşluk bırakmak, sonradan oymaktan ucuz ve boşluk boşken hiçbir maliyeti yok.
Hattın geri kalanını aynen korurdum: tespit et, takip et, hareketten olay çıkar, olayın etrafından ffmpeg ile kes, tarayıcı dostu H.264’e kodla ve üstüne ince bir Streamlit arayüzü koy ki teknik olmayan biri video atıp klip alabilsin.
Dürüst özet
Uygulamalı bir görü sisteminde mühendisliğin çoğu modelde değil. Girdinin gerçekten içerdiği bilgiye bakarak çıktının neyi iddia etmesine izin verildiğine karar vermekte. Dürüst bir şut adayı, bazen taç atışı olan bir golden daha değerlidir.