我有一段MATLAB代码,它从图像中提取91x91的像素补丁,并使用苹果HOG来提取其特征向量。我想用Python重写函数。我已经挣扎了一段时间,试图找出如何在Python中获得与在MATLAB中相同的HOG返回值,但失败了。如果你能提供任何帮助,我将不胜感激。
MATLAB代码中使用了VLFeat库(http://www.vlfeat.org/overview/hog.html),我在Python中使用了scikit-image (http://scikit-image.org/docs/dev/api/skimage.feature.html?highlight=peak_local_max#skimage.feature.hog)。
在Matlab中,输入‘im2single( single.HoG )’是一个91*91的数组,而返回的Hog数据类型是4* 4 *16补丁是使用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‘。然而,输出'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中的单元格数量。看起来猪的输出与orientation_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方向是:x中的单元格数量,这里的值是4,所以n_cellsy也是;bx,by是cells_per_block,它是(1,1);在这种情况下方向是4。
返回值的大小(normalised_blocks)好像是按4*4*1*1*4 (n_blocksy * n_blocksx * by * bx * orientations)计算的
我试着改变块的大小,但仍然不能得到我所期望的…(当块大小为(2,2)时,返回值为144*1数组)
有人能帮帮忙吗..。如何获得与Matlab中相同的Hog输出?非常感谢。
发布于 2016-07-22 06:19:32
与scikit image相比,VLFeat库做了一些不同的事情。VLFeat库返回9(方向数)对比度不敏感,18个对比度敏感和4个维度,这些维度捕获正方形块(包含四个单元)中的总体梯度能量。因此,它输出每个单元格31个维度。然而,scikit image过程是不同的,我想你对它有很好的理解。
根据我的经验,如果你想使用scikit image和MATLAB找到相同的HoG向量,你至少应该为scikit image设置cells_per_block= (2,2)。
https://stackoverflow.com/questions/25602247
复制相似问题