Object Tracking - Optical Flow

Kategori: Computer Vision , 25 Şubat 2020 , JanFranco


Object Traking, obje takibine giriş yapıyoruz. İlk göreceğimiz algoritma Optical Flow algoritması. Optical Flow algoritması temel olarak iki varsayıma dayanıyor:

1- Hareket eden objenin piksel yoğunluğu aynı kalacak.
2- Haraket eden objenin etrafındaki pikseller de aynı yönde hareket edecek.

Buradan şu sonuçları çıkarabiliriz, eğer piksel yoğunlukları değişiyorsa takip ettiğimiz objeyi kaybedeceğiz. Piksel yoğunluğu bir videoda nasıl değişebilir derseniz, buna en çok sebep olan etmen ışıktır. Ayrıca bir noktayı takip edemeyiz. Takip edeceğimiz nesnenin, objenin etrafındaki piksellerin de hareket etmesi gerekiyor. Arkaplandaki matematiğe giriş yapalım.

Şu zamana kadar 2D yani iki boyutlu resimler üzerinde çalıştık. Yani iki boyutlu grayscale resimler üzerinde çalıştık. Birazdan göstereceğim formüllerde üçüncü bir boyut mevcut. Bu boyut zaman boyutudur. I(x, y, t) pikseli t zamandaki bir pikseli temsil eder. Veya t frame'indeki bir x, y noktasını. I(x, y, t + 1) ise bir sonraki frame'deki veya t + 1 zamandaki pikseli ifade eder. Zaman boyutunu anladık, şimdi formüllere geçelim.

İlk varsayım piksel yoğunluğunun aynı kalmasıydı. Yani (x, y) koordinatlarında bulunan bir pikselin yoğunluğu ile (x + 1, y + 1) koordinatlarında bulunan pikselin (o yönde hareket ettiğini düşünelim) yoğunluğu aynı olacak:



Biliyoruz ki dx, dy ve dt değişimlerdir. Bu formülde sağ tarafa Taylor serisi yaklaşımı uygularsak aşağıdaki formülü elde ederiz:



Terimler:



Yani I(x, y, t), t anında (x, y) noktasında bulunan bir pikseldir ve (u, v) yönünde hareket etmektedir. Bu nedenle I(x, y, t) yaklaşık olarak eşitse I(dI/dx, dI/dy, dt) pikseline, bir hareket söz konusudur. Buradaki temel sorun (u, v) yönünü bilmememizdir. Bunun için Lucas-Kanade methodunu kullanabiliriz. Bu method ise ikinci varsayım olan, obje hareket ediyorsa, objenin etrafındaki pikseller de aynı yöne hareket etmelidire dayanıyor.

Frame üzerinde bir nokta seçilir. Bu frame'ın etrafındaki 9 noktayı (3x3) alırız. Yukarıdaki formülü bu 9 piksel için uygularız. Yani 9 piksel için fx, fy, ft değerlerini bulabiliriz:



Resimleri ben hazırlamadığım için bu tür sorunlar olabiliyor. Burada Vx, Vy formüldeki u ve v değerleridir. q1, q2 şeklinde devam eden değerler ise 3x3'lük patch'de bulunan 9 pikselimiz. Denklemi çözebilmek için bu değerleri bir matrise atalım:



Burada Av = b denklemindeki v matrisini çözümlemeye çalışıyoruz. Lucas-Kanade methodu burada least squares prensibini öneriyor. Av = b denkleminin iki tarafını da Transpose(A) ile çarpalım ve v matrisini çekelim:



Bunu matris formda yazarsak:



Algoritmanın tekrar üstünden geçelim. Belirli noktaları takip edebilmek için noktaların üzerine, nokta merkezde kalacak şekilde, 3x3 bir window koyuyoruz. Veya 3x3 boyutunda bir patch alıyoruz. 9 noktayı da kullanarak yukarıdaki denklemi çözüyoruz, (u, v) vektöründeki u ve v değerlerini buluyoruz. Böylelikle objenin yönününü de bulmuş oluyoruz. Python üzerinden OpenCV kütüphanesini kullanarak bir sonraki yazıda bir örnek yapalım. Bu yazıyı fazla uzatmamak adına kesiyorum.


Sonraki Yazı: Optical Flow on Python
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın