У меня есть кусок кода 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? Большое спасибо.