2013-04-08 19 views
6

Więc pisałem własne kody dla HoG i jego wariantu do pracy z obrazami głębi. Jednak utknąłem z testowaniem mojego wyszkolonego SVM w części okna detekcji.Jak zaimplementować algorytm lepszego przesuwanego okna?

Wszystko, co zrobiłem teraz, to najpierw stworzyć piramidę obrazu z oryginalnego obrazu i uruchomić okno przesuwne o rozmiarze 64x128 z lewego górnego rogu do prawego dolnego rogu.

Oto przechwytywania wideo z nim: http://youtu.be/3cNFOd7Aigc

Teraz problemem jest to, że jestem coraz więcej fałszywych alarmów, niż się spodziewałem.

Czy istnieje sposób, aby usunąć wszystkie fałszywe alarmy (oprócz treningu z większą liczbą obrazów)? Do tej pory mogę uzyskać "wynik" z SVM, który jest odległością do samego marginesu. Jak mogę tego użyć, aby wykorzystać moje wyniki?

Czy ktoś ma jakiś wgląd we wdrażanie dobrego algorytmu przesuwnego okna?

Odpowiedz

7

Co można zrobić, to dodać etap przetwarzania, aby znaleźć lokalnie najsilniejszą odpowiedź z maszyny SVM. Pozwól mi wyjaśnić.

Co pojawiasz się robi teraz:

dla każdego okna przesuwnego W, rekord category[W] = SVM.hardDecision(W)

Ciężka decyzja oznacza, że ​​zwraca wartość logiczną lub liczbę całkowitą, a za 2-kategorii klasyfikacja mogła napisać tak:

hardDecision(W) = bool(softDecision(W) > 0) 

Od kiedy wspomniałeś OpenCV, w CvSVM::predict należy ustawić wartość: returnDFVal true:

returnDFVal - Określa typ zwracanej wartości. Jeśli true, a problem jest klasyfikacją 2-klasową, to metoda zwraca wartość funkcji decyzyjnej, która jest odległością podpisaną od marginesu, w przeciwnym razie funkcja zwraca etykietę klasy (klasyfikację) lub szacowaną wartość funkcji (regresję).

z the documentation.

Co można zrobić, to:

  1. dla każdego okna przesuwnego W, rekord score[W] = SVM.softDecision(W)
  2. dla każdego W, obliczyć i rekord:
    • neighbors = max(score[W_left], score[W_right], score[W_up], score[W_bottom])
    • local[W] = score[W] > neighbors
    • powerful[W] = score[W] > threshold.
  3. dla każdego W, masz pozytywne czy local[W] && powerful[W]

Ponieważ klasyfikator będzie miał pozytywną odpowiedź dla okien ściereczką (w przestrzeni i/lub wygląd) do swojej prawdziwej pozytywny, idea jest nagrać muzykę do każdego okna, a następnie zachować tylko pozytywy, które

  • są lokalnie maksymalny wynik (większe, że jej sąsiedzi) ->local
  • są wystarczająco silne ->powerful

Można ustawić próg na 0 i dostosować ją aż do uzyskania satysfakcjonujących wyników. Lub możesz go skalibrować automatycznie za pomocą zestawu treningowego.

+0

Świetna odpowiedź, ale mam jeszcze kilka pytań, jeśli ty lub ktoś inny nie ma nic przeciwko. Jak używać tego razem z przestrzenią skali? Czy traktuję wykryte okno w innej skali jako tylko kolejny sąsiad? A jak wchodzi w grę Non Maximal Suppression? W każdym razie, wciąż, dziękuję za jasną odpowiedź. –

+2

Dobre pytanie o skale! W rzeczywistości możesz uwzględnić skalę w sąsiedztwie (w lewo/w prawo/w górę/w dół/w mniejszym/większym), ale zależy to w dużej mierze od danych i celu końcowego - czy otrzymujesz wiele fałszywych alarmów o wielu skalach? Niestety metoda prób i błędów jest najlepszą praktyczną metodologią w dziedzinie widzenia komputerowego. O nie-maksymalnym tłumieniu, cóż, co opisałem, jest formą nie-maksymalnego tłumienia (zachowujesz tylko lokalne maksima). – Antoine