Object Tracking - BOOSTING Tracker

Kategori: Computer Vision , 07 Mart 2020 , JanFranco


Object tracking başlığı altında Optical Flow, Meanshift ve Camshift algoritmalarını görmüştük. Optical Flow algoritması hareketin yönünü tespit ediyordu. Bunun için her piksele bakıyordu. Meanshift ve camshift algoritmalarında ise bir yoğunluk hesabı vardı. Yani en yoğun piksel topluluğunu araştırıyordu algoritma. Tabi bunun için de tüm resme bakılıyordu. Şimdi ve bundan sonra göreceğimiz algoritmalardaki mantık biraz daha farklı. Yeni göreceğimiz algoritmalarda takip edilecek objeyi biz söyleyeceğiz, algoritma ise takip edecek. Yani tüm resimde hareketli bir obje aranması yerine bir objenin takip edilmesini söyleyeceğiz.

BOOSTING Tracker algoritması, makine öğrenmesindeki ensemble algoritmalarından Ada Boosting algoritmasının canlı hali gibi düşünülebilir. Ada Boosting algoritmasını ayrı bir yazıda anlatacağım. Belki de çoktan yazmışımdır. Bu yazıları önceden hazırlayıp, web siteme sonradan koyuyorum. Yazıları eklerken bazen sıraya dikkat etmiyorum. Biraz kısaca bahsedeyim, öncelikle Ada Boosting algoritması tek başına bir makine öğrenmesi algoritması değildir. Arkaplanda decision tree algoritmasını çalıştırır. Algoritma veri kümesini test - train şeklinde ayırır ve sınıflandırıcıyı çalıştırır. Decision tree algoritmasını görmüştük. Verileri iki boyutlu düzlemde hayal edersek, sınıflandırmayı dikdörtgenler çizerek yapıyordu. İlk adımda yani ilk eğitimde, hatalı tahmin edilen verilerin katsayısı artırılır. İkinci adımda katsayısı artırılan verilerin olduğu kısma daha çok ağırlık verilerek tekrar bir sınıflandırma yapılır. Yine yanlış tahmin edilen verilerin katsayısı artılır ve bu şekilde gider. En son adımda ise tüm adımlarda oluşturulan dikdörgenlerdeki ağırlıklar toplanır. Son en başarılı sınıflandırma bu ağırlıklar ile tekrar yapılır. Dediğim gibi daha ayrıntılı bir şekilde, arkasındaki matematiği de anlatarak bir yazı hazırlayacağım. Şimdilik bu şekilde bilelim.

BOOSTING Tracker algoritmasında ilk adım olarak bir obje seçiyoruz. Seçtiğimiz obje pozitif resim oluyor. Seçtiğimiz obje dışındaki tüm bölgeler negatif resim oluyor. t anında bunu yaptık ve bir sonraki frame olan t + 1 zamandaki frame'e geçiyoruz. Seçtiğimiz objenin sola kaydığını düşünelim. Resim taranıyor, her bir patch, window, daha önceden seçtiğimiz obje ile ve arkaplan objeleriyle karşılaştırılıyor. Burada bir confidence map çıkartılıyor. Bu maptaki en doğru kısmı buluyoruz ve yeni objemizi seçiyoruz. Yani objeyi takip etmiş olduk. Yeni objemiz de bizim için bir pozitif resim. Tracker'ı güncelliyoruz. Ada boost algoritmasındaki gibi pozitif - negatif resimlerin ağırlıkları değişmiş oluyor. Her bir adımda algoritma daha iyiye gidiyor gibi düşünebiliriz. Tabi frameleri okurken yüksek kayıplar olabilir. Artık çok tercih edilen bir algoritma değildir. Burada anlattığım adımlar ile ilgili bir görsel görelim, orjinal makaleden alınmıştır:

boosting object tracking

Python üzerinde OpenCV ile kodlanmasını görelim. Klasik videomuzu kullanacağız. Ancak path'i silip 0 yazarak kameraya bağlanabilirsiniz. Video için ise önceki yazılara bakabilirsiniz linkini bırakmıştım. Kütüphaneizi import edelim, videomuyuzu alalım ve tracker objemizi oluşturalım:


import cv2

tracker = cv2.TrackerBoosting_create()
cap = cv2.VideoCapture('../data/traffic.mp4')
cv2.selectROI methodu ile videodan aldığımız ilk framede bir obje seçiyoruz. Mouse ile bir dikdörtgen çizip Enter veya Space tuşuna basıyoruz. Daha sonra init methodu ile algoritmaya seçtiğimiz objeyi gönderiyoruz:


_, frame = cap.read()
roi = cv2.selectROI(frame, False)
ret = tracker.init(frame, roi)
Her zamanki gibi bir döngü açıyoruz, frameleri okuyoruz. Her bir framede algoritmayı update methodu ile güncelliyoruz. Yeni koordinatlar ile dikdörtgeni çiziyoruz:


while True:
    _, frame = cap.read()
    success, roi = tracker.update(frame)
    (x, y, w, h) = tuple(map(int, roi))
    if success:
        p1 = (x, y)
        p2 = (x + w, y + h)
        cv2.rectangle(frame, p1, p2, (0, 255, 0), 3)
    else:
        cv2.putText(frame, "Failure to Detect Tracking!!", (100, 200), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)

    cv2.imshow('BOOSTING Tracker', frame)
    k = cv2.waitKey(1) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()
>>

boosting object tracking

boosting object tracking


Sonraki Yazı: Object Tracking - MIL Tracker
Yorumlar

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