Почему вывод 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-изображения.

Другие вопросы по тегам