2015-02-08 12 views
10

Zastanawiam się, czy ktoś wie, dlaczego nie ma dokumentacji dla HOGDescriptors w powiązaniach Python OpenCV.OpenCV HOGDescrypter Python

Może ja po prostu brakowało im, ale tylko kod znalazłem wśród nich jest ten wątek: Get HOG image features from OpenCV + Python?

Jeśli przewinąć w tym wątku, kod ten znajduje się tam:

import cv2 
hog = cv2.HOGDescriptor() 
im = cv2.imread(sample) 
h = hog.compute(im) 

Testowałem to i działa - więc powiązania Python istnieją, tylko dokumentacja nie. Zastanawiałem się, czy ktoś wie, dlaczego dokumentacja powiązań Pythona dla HOG jest tak trudna do znalezienia/nieistniejąca. Czy ktoś wie, czy istnieje samouczek, który można przeczytać w dowolnym miejscu na temat HOG (zwłaszcza poprzez Wiązania Python)? Jestem nowy w HOG i chciałbym zobaczyć kilka przykładów tego, jak OpenCV robi coś, zanim zacznę pisać własne rzeczy.

Odpowiedz

17

1. Get wbudowana dokumentacja: następującą komendę w konsoli Pythona pomoże Ci poznać struktury klasowej HOGDescriptor:

import cv2 help(cv2.HOGDescriptor())

2. Przykładowy kod: Oto urywek kod zainicjowania cv2.HOGDescriptor z zastosowaniem różnych parametrów (warunki użytych tutaj standardowe warunki, które są dobrze zdefiniowane w dokumentacji OpenCV here):

import cv2 
image = cv2.imread("test.jpg",0) 
winSize = (64,64) 
blockSize = (16,16) 
blockStride = (8,8) 
cellSize = (8,8) 
nbins = 9 
derivAperture = 1 
winSigma = 4. 
histogramNormType = 0 
L2HysThreshold = 2.0000000000000001e-01 
gammaCorrection = 0 
nlevels = 64 
hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins,derivAperture,winSigma, 
         histogramNormType,L2HysThreshold,gammaCorrection,nlevels) 
#compute(img[, winStride[, padding[, locations]]]) -> descriptors 
winStride = (8,8) 
padding = (8,8) 
locations = ((10,20),) 
hist = hog.compute(image,winStride,padding,locations) 

3. fakcie: Otrzymany deskryptor Hog będzie miał wymiar jako: 9 orientacje X (bloki cztery narożne, które się 1 normalizacji + 6x4 bloków na krawędziach, które się 2 normalizations + bloków 6x6, które się 4 normalizations) = 1764. jak podałem tylko jedną lokalizację dla hog.compute().

4. Inny sposób zainicjować HOGDescriptor:
Jeszcze jeden sposób, aby zainicjować jest z pliku xml, który zawiera wszystkie wartości parametrów:

hog = cv2.HOGDescriptor("hog.xml") 

aby uzyskać plik xml można zrobić następujące:

hog = cv2.HOGDescriptor() 
hog.save("hog.xml") 

i edycję odpowiednich wartości parametrów w pliku xML.

+0

Czy dokumentacja jest nadal dokładna tutaj http://docs.opencv.org/2.4/modules/gpu/doc/object_detection.html gdzie jest napisane, że może używać tylko bloków i komórek o domyślnym rozmiarze? – mobcdi

+0

jest to świetna implementacja HOG, ponieważ ma możliwość nadawania lokalizacji. ale jak mogę to wizualizować? Czuję, że bez wizualizacji jest czarna skrzynka i parametry nie mogą być odpowiednio zmodyfikowane. – Roxanne

3

Zastanawiam się tak samo. Prawie żadna dokumentacja nie może być znaleziona dla OpenCV HOGDescriptor, innego niż źródłowy kod cpp.

Scikit-obraz ma dobry przykład stronę na wyodrębnianie i ilustrujący funkcję HOG. Stanowi alternatywę do eksploracji HOG. Jest to udokumentowane here.

Jednak jest jedna rzecz, aby podkreślić temat realizacji wieprz scikit-obrazu. Jego kod Python dla hog function nie implementuje weighted vote dla binningu z orientacją histogramu, ale wykonuje tylko proste binning na podstawie wartości wielkości przypadającej na który bin. Zobacz jego hog_histogram function. Nie jest to zgodne z dokumentami Dalala i Triggsa.

W rzeczywistości odkryłem, że wykrywanie obiektów oparte na implementacji HOG przez OpenCV jest dokładniejsze niż w przypadku api z obrazu scikit. Ma to sens, ponieważ ważony głos jest ważny. Przez rzutowanie ważonych głosów na kosze, zmiana histogramu jest znacznie zmniejszana, gdy wielkość gradientu spada na lub wokół granicy. Chris McCormick napisał bardzo wnikliwe blog na wieprz, w którym orientacja binning jest jasno opisany jako

Dla każdego wektora gradientu, to wkład do histogramu oblicza się według wielkości wektora (a więc silniejsze gradienty mieć większy wpływ na histogramie). Podzieliliśmy wkład między dwa najbliższe pojemniki. Na przykład, jeśli wektor gradientu ma kąt 85 stopni, to dodajemy 1/4 jego wielkości do kosza wyśrodkowanego na 70 stopni, a 3/4 jego wielkości do kosza wyśrodkowanego na 90.

Uważam, że intencją podzielenia wkładu jest zminimalizowanie problemu gradientów, które znajdują się na granicy między dwoma pojemnikami. W przeciwnym razie, gdyby silny gradient znajdował się bezpośrednio na krawędzi pojemnika, niewielka zmiana kąta nachylenia (który przesuwa gradient do następnego pojemnika) może mieć duży wpływ na histogram.

więc używać OpenCV obliczyć wieprza, jeśli to możliwe (nie wykopali w swoim kodzie, a nie masz ochoty robić tak, ale przypuszczam sposób OpenCV w realizacji wieprz jest bardziej odpowiednie). Nie tylko znalazłem poprawę w dokładności wykrywania, ale także działa szybciej. W porównaniu z kodem scikit-image ze świetnymi komentarzami, jego dokumentacja prawie nie istnieje. Jednak nadal możliwe jest, że wersja OpenCV działa w praktyce - jest to kwestia przekazania właściwego parametru dla rozmiaru okna, rozmiaru komórki, rozmiaru bloku, kroku bloku, liczby orientacji itd. Inne parametry, które właśnie przeszły z domyślnym ustawieniem.