Почему вывод Python Hog (scikit-image) отличается от вывода MATLAB Hog (vlfeat)?
У меня есть фрагмент кода MATLAB, который берет фрагмент изображения размером 91x91 пикселей и HOG яблок, чтобы извлечь его векторные векторы. Я хотел бы переписать функцию в Python. Некоторое время я пытался выяснить, как получить те же возвращаемые значения HOG в Python, как в 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).
В Matlab вход 'im2single(patch)' представляет собой массив 91*91, в то время как возвращаемый тип данных Hog равен 4*4*16 single.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 с тем же размером ячейки и количеством ориентаций. Размер блока установлен в (1,1)
tc = hog(repatch, orientations=4, pixels_per_cell=(23,23), cells_per_block= (1,1), visualise=False, normalise=False)
Я добавил размер патча к 92*92, так что размер патча - целое число, кратное размеру ячейки. Входной массив теперь называется "repatch". Однако выходные данные 'tc' представляют собой массив 64*1 (гистограммы градиента сглаживаются к вектору признаков)
tc.shape
(64,)
Затем я посмотрел в исходный код Skimage,
orientation_histogram = np.zeros((n_cellsy, n_cellsx, orientations))
orientation_histogram.shape
(4, 4, 4)
Здесь n_cellsx: количество ячеек в x, а n_cellsy: количество ячеек в y. Похоже, что выход Hog тесно связан с измерением direction_histogram.
Фактическое измерение возвращенного значения 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: число ячеек в x, значение которого здесь равно 4, то есть n_cellsy; bx, by is cell_per_block, который равен (1,1); ориентации 4 в этом случае.
Кажется, что размер возвращаемого значения (normalised_blocks) вычисляется как 4*4*1*1*4 (n_blocksy * n_blocksx * с помощью * bx * ориентаций)
Я пытался изменить размер блока, но все еще не могу получить то, что ожидал... (хотя размер блока равен (2,2), возвращаемое значение - массив 144*1)
Может ли кто-нибудь помочь, пожалуйста... Как я могу получить тот же вывод Hog, как в Matlab? Большое спасибо.
1 ответ
Библиотека VLFeat делает что-то другое по сравнению с scikit-image. Библиотека VLFeat возвращает 9 (число ориентаций) нечувствительных к контрасту, 18 чувствительных к контрасту и 4 измерения, которые фиксируют общую энергию градиента в квадратных блоках (содержит четыре ячейки). Таким образом, он выводит 31 размер на ячейку. Однако процедура scikit-image отличается, и я думаю, вы хорошо ее понимаете.
По моему опыту, если вы хотите найти один и тот же вектор HoG, используя scikit-image и MATLAB, вы определенно должны поставить cells_per_block= (2,2)
для scikit-изображения.