Wdrażałem adaptację algorytmu wykrywania twarzy Violi-Jonesa . Technika ta polega na umieszczeniu w obrazie podramki o wymiarach 24x24 pikseli, a następnie umieszczeniu wewnątrz niej prostokątnych elementów w każdym położeniu o każdym możliwym rozmiarze.
Te elementy mogą składać się z dwóch, trzech lub czterech prostokątów. Przedstawiono następujący przykład.
Twierdzą, że wyczerpujący zestaw to ponad 180 tysięcy (sekcja 2):
Biorąc pod uwagę, że podstawowa rozdzielczość detektora to 24x24, wyczerpujący zestaw cech prostokąta jest dość duży, ponad 180 000. Zwróć uwagę, że w przeciwieństwie do podstawy Haar, zestaw elementów prostokąta jest zbyt kompletny.
Poniższe stwierdzenia nie są wyraźnie podane w artykule, więc są to założenia z mojej strony:
- Istnieją tylko 2 obiekty dwuprostokątne, 2 elementy trójprostokątne i 1 element czterokątny. Logika tego polega na tym, że obserwujemy różnicę między podświetlonymi prostokątami, a nie wyraźnie kolor, luminancję czy cokolwiek w tym rodzaju.
- Nie możemy zdefiniować elementu typu A jako bloku 1x1 piksela; musi mieć co najmniej 1 x 2 piksele. Ponadto typ D musi mieć co najmniej 2 x 2 piksele i ta zasada obowiązuje odpowiednio do innych funkcji.
- Nie możemy zdefiniować elementu typu A jako bloku 1 x 3 piksele, ponieważ środkowy piksel nie może być podzielony na partycje, a odjęcie go od siebie jest identyczne jak w bloku 1 x 2 piksele; ten typ elementu jest definiowany tylko dla parzystych szerokości. Ponadto szerokość cechy typu C musi być podzielna przez 3 i ta zasada obowiązuje odpowiednio do innych cech.
- Nie możemy zdefiniować funkcję o szerokości i / lub wysokości 0. Dlatego iterate x i y do 24 minus wielkość funkcji.
Na podstawie tych założeń policzyłem wyczerpujący zestaw:
const int frameSize = 24;
const int features = 5;
// All five feature types:
const int feature[features][2] = {{2,1}, {1,2}, {3,1}, {1,3}, {2,2}};
int count = 0;
// Each feature:
for (int i = 0; i < features; i++) {
int sizeX = feature[i][0];
int sizeY = feature[i][1];
// Each position:
for (int x = 0; x <= frameSize-sizeX; x++) {
for (int y = 0; y <= frameSize-sizeY; y++) {
// Each size fitting within the frameSize:
for (int width = sizeX; width <= frameSize-x; width+=sizeX) {
for (int height = sizeY; height <= frameSize-y; height+=sizeY) {
count++;
}
}
}
}
}
Wynik to 162.336 .
Jedynym sposobem, w jaki znalazłem przybliżenie „ponad 180 000”, o których mówią Viola i Jones, jest porzucenie założenia nr 4 i wprowadzenie błędów w kodzie. Wymaga to odpowiednio zmiany czterech wierszy na:
for (int width = 0; width < frameSize-x; width+=sizeX)
for (int height = 0; height < frameSize-y; height+=sizeY)
Wynik to 180 625 . (Zwróć uwagę, że skutecznie zapobiegnie to kiedykolwiek dotykaniu elementów prawej i / lub dolnej części ramy pomocniczej).
Teraz oczywiście pytanie: czy popełnili błąd w swojej implementacji? Czy rozważenie cech o powierzchni zerowej ma sens? A może źle to widzę?
źródło
x < size
ma związek z założeniem nr 4: chcę, aby funkcja pozostała w ramie pomocniczej, ale miała wymiar co najmniej 1x1. A jeśli chodzi o to, czy wymiar elementu nie powinien wystawać poza ramę pomocniczą, cóż, być może to też jest założenie.x < size - 1
, więc nie ma zysku.Odpowiedzi:
Po bliższym przyjrzeniu się, twój kod wydaje mi się poprawny; co sprawia, że można się zastanawiać, czy pierwotni autorzy mieli osobny błąd. Chyba ktoś powinien przyjrzeć się, jak implementuje to OpenCV!
Niemniej jednak jedną z sugestii, aby ułatwić zrozumienie, jest odwrócenie kolejności pętli for , przechodząc najpierw przez wszystkie rozmiary, a następnie przechodząc przez możliwe lokalizacje dla danego rozmiaru:
z takimi samymi wynikami, jak poprzedni
162336
Aby to zweryfikować, przetestowałem przypadek okna 4x4 i ręcznie sprawdziłem wszystkie przypadki (łatwe do policzenia, ponieważ kształty 1x2 / 2x1 i 1x3 / 3x1 są takie same tylko obrócone o 90 stopni):
źródło
wszystko. W dokumentach Violi i Jonesa wciąż jest pewne zamieszanie.
W ich artykule CVPR'01 jest to wyraźnie stwierdzone
W artykule IJCV'04 jest powiedziane dokładnie to samo. W sumie 4 funkcje . Ale co dziwne, tym razem stwierdzili, że wyczerpujący zestaw funkcji to 45396! Wydaje się, że nie jest to ostateczna wersja, ale tutaj chyba wprowadzono tam dodatkowe ograniczenia, takie jak min_width, min_height, szerokość / wysokość, a nawet położenie.
Zauważ, że oba artykuły można pobrać z jego strony internetowej .
źródło
Ponieważ nie przeczytałem całego artykułu, sformułowanie twojego cytatu mnie zaskakuje
„Zestaw funkcji prostokąta jest zbyt kompletny” „Wyczerpujący zestaw”
brzmi to dla mnie jak konfiguracja, w której oczekuję, że autor artykułu wyjaśni, w jaki sposób zmniejszają przestrzeń wyszukiwania do bardziej efektywnego zestawu, na przykład pozbywając się trywialnych przypadków, takich jak prostokąty z zerem powierzchnia.
edytuj: lub używając jakiegoś algorytmu uczenia maszynowego, jak sugeruje streszczenie. Wyczerpujący zestaw implikuje wszystkie możliwości, nie tylko te „rozsądne”.
źródło
Nie ma gwarancji, że którykolwiek autor jakiegokolwiek artykułu jest poprawny we wszystkich swoich założeniach i ustaleniach. Jeśli uważasz, że założenie nr 4 jest słuszne, zachowaj to założenie i wypróbuj swoją teorię. Możesz odnieść większy sukces niż pierwotni autorzy.
źródło
Całkiem dobra obserwacja, ale mogą domyślnie zerować ramkę 24x24 lub "przepełnić" i zacząć używać pierwszych pikseli, gdy wyjdzie poza granice, jak w przypadku przesunięć obrotowych, lub jak powiedział Breton, mogą uznać niektóre funkcje za "trywialne" a następnie odrzuć je za pomocą AdaBoost.
Ponadto napisałem wersje Twojego kodu w Pythonie i Matlabie, dzięki czemu mogę sam przetestować kod (łatwiejszy do debugowania i śledzenia), więc zamieszczam je tutaj, jeśli ktoś uzna je kiedyś za przydatne.
Pyton:
Matlab:
źródło
W swoim oryginalnym artykule z 2001 roku stwierdzili tylko, że używane są trzy rodzaje funkcji:
Również
Ponieważ każdy rodzaj ma dwie orientacje, rozsądnie jest założyć, że używają łącznie 6 cech (przynajmniej do obliczenia całkowitej liczby cech): 2 elementy dwuprostokątne, 2 obiekty trójprostokątne i 2 obiekty czterokątne. Przy takim założeniu rzeczywiście istnieje ponad 180 000 funkcji:
Jeśli upuścisz jeden typ funkcji z czterema prostokątami (co wydaje się mieć miejsce w ich późniejszej publikacji), to całkowita liczba obiektów wyniesie 162336.
źródło