2014-09-01 2 views
2

У меня есть кусок кода MATLAB, который занимает 91x91 патч пикселей из изображения и яблок HOG для извлечения его векторов признаков. Я хотел бы переписать функцию в Python. Некоторое время я пытался изо всех сил пытаться выяснить, как получить одинаковые возвращаемые значения HOG в Python, как это было в MATLAB, но так и не удалось. Я буду очень благодарен, если вы сможете оказать любую помощь.Почему Python's Hog output (scikit-image) отличается от Hog (vlfeat) MATLAB?

Библиотека VLFeat (http://www.vlfeat.org/overview/hog.html) используется в коде MATLAB, и я использую scikit-изображение в Python (http://scikit-image.org/docs/dev/api/skimage.feature.html?highlight=peak_local_max#skimage.feature.hog).

В Matlab вход «im2single (patch)» представляет собой массив 91 * 91, а возвращаемый тип данных Hog составляет 4 * 4 * 16. HoG применяется с использованием размера ячейки 23 и количества ориентация 4.

 hog = vl_hog(im2single(patch),23, 'variant', 'dalaltriggs', 'numOrientations',4) ; 

Возвращенный данные 4 * 4 * 16 одноместных, которые могут быть отображены в виде:

 val(:,:,1) = 

    0   0   0   0 
    0   0   0   0 
    0 0.2000 0.2000 0.0083 
    0 0.2000 0.2000 0.0317 

    .... 

    val(:,:,16) = 

    0   0   0   0 
    0   0   0   0 
    0   0 0.0526 0.0142 
    0   0 0.2000 0.2000 

Тогда результат уплощена в 256 * 1 вектор признаков в вручную. Подводя итог, в патче пикселов 91 * 91 выделяется вектор-особенность 256 * 1. Теперь я хочу получить тот же результат в Python.

В моем коде Python, я попытался применить HOG с одинаковым размером ячейки и количество orientations.The размер блока установлен в положение (1,1)

tc = hog(repatch, orientations=4, pixels_per_cell=(23,23), cells_per_block= (1,1), visualise=False, normalise=False) 

Я приложил размер патча 92 * 92, поэтому размер патча является целым числом, кратным размеру ячейки. Входной массив теперь называется «repatch». Тем не менее, выходной сигнал «дц» представляет собой 64 * 1 массив (градиент гистограммы сплющена к вектору признака)

tc.shape 

    (64,) 

Затем я посмотрел в исходный код Skimage,

orientation_histogram = np.zeros((n_cellsy, n_cellsx, orientations)) 
    orientation_histogram.shape 
    (4, 4, 4) 

Здесь n_cellsx is: количество ячеек в x и n_cellsy: количество ячеек в y. Похоже, что выход Hog сильно связан с размером ориентировочной_истограммы.

Фактический размер Hog возвращаемые оценивается определяется:

normalised_blocks = np.zeros((n_blocksy, n_blocksx,by, bx, orientations)) 

Где n_blocksy, n_blocksy вычисляются:

n_blocksx = (n_cellsx - bx) + 1 
    n_blocksy = (n_cellsy - by) + 1 

n_cellsx является: число клеток в х, значение который здесь 4, так и n_cellsy; bx, by cell_per_block, который равен (1,1); ориентаций в этом случае 4.

Похоже, что размер возвращаемого значения (normalised_blocks) рассчитывается на 4 * 4 * 1 * 1 * 4 (n_blocksy * n_blocksx * по * BX * ориентации)

Я попытался изменить блок но все равно не может получить то, что ожидалось ... (в то время как размер блока равен (2,2), возвращаемое значение представляет собой массив 144 * 1)

Может ли кто-нибудь помочь ... Как я могу получить то же самое Выход свиней как в Matlab? Большое спасибо.

ответ

1

Библиотека VLFeat делает что-то другое по сравнению с scikit-image.Библиотека VLFeat возвращает 9 (количество ориентации) контрастно-чувствительных, 18 контрастных и 4 измерения, которые фиксируют общую энергию градиента в квадратных блоках (содержит четыре ячейки). Таким образом, он выводит 31 размер на ячейку. Однако процедура scikit-image отличается от того, что я думаю, что вы хорошо понимаете ее.

К моему опыту, если вы хотите найти тот же вектор HoG, используя scikit-image и MATLAB, вы определенно должны поместить cells_per_block= (2,2) для scikit-image.

Смежные вопросы