2014-10-28 21 views
12

Pracuję w projekcie. Część projektu polega na zintegrowaniu wykrywacza ludzi HOG w OpenCV ze strumieniem kamery.Poprawa dokładności wykrywacz osób OpenCV HOG

Obecnie działa kamera i podstawowy detektor HOG (CPP detectMultiScale ->http://docs.opencv.org/modules/gpu/doc/object_detection.html). Ale nie działa zbyt dobrze ... Odkrycia są bardzo głośne, a algorytm nie jest bardzo dokładny ...

Dlaczego?

Mój obraz z aparatu ma rozdzielczość 640 x 480 pikseli.

Fragment kodu używam to:

std::vector<cv::Rect> found, found_filtered; 
cv::HOGDescriptor hog; 
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); 
hog.detectMultiScale(image, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2); 

Dlaczego nie działa prawidłowo? Jaką potrzebę poprawy dokładności? Czy jest jakiś konkretny rozmiar obrazu?

PS: Czy znasz jakieś precyzyjne algorytmy wykrywania ludzi, szybsze i rozwijane w cpp?

+0

osób na obrazie musi mieć co najmniej rozmiar deskryptora HOG (trochę mniej) i tylko większe osoby zostaną znalezione przez detectMultiScale dodatkowo (afaik). Nie można oczekiwać niemal 100% wskaźnika wykrycia wieprzowych takich ogólnych "obiektów", ale w strumieniu należy wykryć każdą prawdziwą osobę co najmniej raz. możesz spróbować je śledzić i zweryfikować/odrzucić swoje wcześniej wykryte osoby. – Micka

+0

Dzięki za odpowiedź Micka! Czy mówisz: "co najmniej rozmiar deskryptora HOG" ... ale ** Jaki jest ten rozmiar? ** Czy znasz inne możliwości lub istnieje tylko "getDefaultPeopleDetector"? Dziękuję bardzo! – Ricardo

+0

Ta strona internetowa może pomóc: http://www.geocities.ws/talh_davidc/ – SomethingSomething

Odpowiedz

32

Wielkość domyślnego wykrywacza osób to 64x128, co oznacza, że ​​osoby, które chcesz wykryć, muszą mieć conajmniej 64x128. W przypadku rozdzielczości kamery oznacza to, że osoba musi zająć sporo miejsca, zanim zostanie prawidłowo wykryta.

W zależności od konkretnej sytuacji możesz spróbować swoich sił w treningu własnego deskryptora HOG o mniejszym rozmiarze. Możesz spojrzeć na this answer i referenced library, jeśli chcesz wyszkolić własny deskryptor HOG.

dla parametrów:

win_stride: Biorąc obraz wejściowy ma rozmiar 640 x 480, a defaultpeopleDetector ma rozmiar okna 64x128, można dopasować okno Wykrywanie HOG (okno 64x128) wiele razy w obrazie wejściowym. Winstride mówi HOG, aby przesuwał okno wykrywania o określoną kwotę za każdym razem. Jak to działa: Hog umieszcza okno wykrywania w lewym górnym rogu obrazu wejściowego. i przesuwa okno wykrywania za każdym razem przez win_stride.

tak (mały win_stride): enter image description here

lub tak (duży win_stride) enter image description here

Mniejsza winstride powinna poprawić dokładność, ale zmniejsza ponoszeniu, i na odwrót

padding Padding dodaje dodatkową ilość pikseli po każdej stronie obrazu wejściowego. W ten sposób okno detekcji zostanie umieszczone nieco poza obrazem wejściowym. Właśnie z powodu tego wypełnienia HOG może wykryć ludzi znajdujących się bardzo blisko krawędzi obrazu wejściowego.

group_threshold Parametr group_treshold określa wartość, kiedy wykryte części powinny zostać umieszczone w grupie. Niska wartość nie powoduje grupowania wyników, wyższa wartość zapewnia grupowanie wyników, jeśli w oknie wykrywania wykryto wartość progową.(z własnego doświadczenia, nigdy nie musiałem zmieniać domyślnej wartości)

Mam nadzieję, że to trochę dla ciebie sensowne. Pracuję z HOG przez ostatnie kilka tygodni i czytam dużo artykułów, ale straciłem niektóre z referencji, więc nie mogę połączyć twoich stron z tymi informacjami, przepraszam.

+1

Możesz zmienić rozmiar (zwiększyć) swój obraz, aby znaleźć również mniejsze osoby. – Micka

+0

Dziękuję bardzo za odpowiedź Timmynator0! Skąd o tym wiesz? Czy znasz dokumentację dotyczącą tego algorytmu i jego parametrów? Teraz nie interesuje mnie szkolenie mojego własnego deskryptora HOG. Dziękuję bardzo! :) – Ricardo

+0

@Ricardo Zaktualizowałem swoją odpowiedź, aby odzwierciedlić nowe pytanie dotyczące parametrów. Jeśli było to pomocne, proszę oznaczyć moją odpowiedź jako poprawną odpowiedź. – Timmynator0