没有得到什么'空间权重'对于HOG来说

时间:2014-10-13 16:34:55

标签: matlab image-processing computer-vision feature-extraction matlab-cvst

我正在使用HOG进行向日葵检测。我了解HOG目前正在做的大部分内容,但是在最后阶段我还有一些我不理解的事情。 (我正在阅读Mathworks的MATLAB代码)。

让我们假设我们正在使用Dalal-Triggs实现。 (也就是说,8x8像素生成1个单元格,2x2个单元格生成1个块,两个方向上的块重叠率为50%,最后,我们将直方图量化为9个无格式的二进制数。(意思是,0到180度) ))。最后,我们这里的图像是64x128像素。

让我们说我们在第一个街区。该块有4个单元格。我知道我们将按照它们的大小来衡量每个方向的方向。我也明白,我们将通过以块为中心的高斯来进一步加权。

到目前为止一切顺利。

然而,在MATLAB实现中,他们还有一个额外的步骤,即创建一个空间'重量:

enter image description here

如果我们深入研究这个功能,它看起来像这样:

enter image description here

最后,函数' computeLowerHistBin'看起来像这样:

function [x1, b1] = computeLowerHistBin(x, binWidth)
% Bin index
width    = single(binWidth);
invWidth = 1./width;
bin      = floor(x.*invWidth - 0.5);

% Bin center x1
x1 = width * (bin + 0.5);

% add 2 to get to 1-based indexing
b1 = int32(bin + 2);
end

现在,我相信那些空间'在三线性插值部分中稍后使用权重...但我没有得到的只是它们的计算方式,或者该代码背后的逻辑。我完全迷失在这个问题上。

注意:我理解三线性插值的需要,并且(我认为)它是如何工作的。我不明白的是为什么我们需要那些空间权重,以及这里计算背后的逻辑是什么。

感谢。

2 个答案:

答案 0 :(得分:3)

这里的想法是每个像素不仅对其自己的直方图单元有贡献,而且在某种程度上也对相邻单元有贡献。这些贡献的权重不同,具体取决于像素与单元边缘的接近程度。离细胞边缘越近,对相应的相邻细胞的贡献就越大,对自己细胞的贡献就越少。

答案 1 :(得分:2)

此代码预先计算三线性插值的空间权重。看看这里的三线性插值公式:

HOG Trilinear Interpolation of Histogram Bins

你会看到像(x-x1)/ bx,(y-y1)/ by,(1 - (x-x1)/ bx)等等。在代码中,wx1和wy1对应于:

wx1 = (1 - (x-x1)/bx)
wy1 = (1 - (y-y1)/by)

这里,x1和y1是X和Y方向的直方图区间的中心。在1D中描述这些东西更容易。因此,在1D中,值x将落在2个bin中心x1 <= x <1之间。 X2。它与bin(1或2)完全无关。重要的是找出属于x1的x的分数,其余属于x2。使用从x到x​​1的距离并除以箱的宽度给出百分比距离。 1减去那是属于bin 1的分数。因此,如果x == x1,则wx1为1.如果x == x2,则wx1为零,因为x2 - x1 == bx(bin的宽度)。

回到创建4个矩阵的代码只是预先计算HOG块中所有像素的插值所需的所有权重的乘法。这就是为什么它是一个权重矩阵:矩阵中的每个元素,如果是HOG块中的一个像素。

例如,你看一下h(x1,y2,〜)的wieghts等式,你会看到x和y的这两个权重(忽略z分量)。

(1 - (x-x1)/bx) * ((y-y1)/by)

回到代码,使用以下方法为块中的每个像素预先计算此乘法:

weights.x1y2 = (1-wy1)' * wx1;

其中

(1-wy1) == (y - y1)/by

同样的逻辑适用于其他权重矩阵。

对于“computeLowerHistBin”中的代码,它只是在三线性插值方程中找到x1,其中x1 <= x&lt; x2(y1相同)。只要满足x1&lt; = x&lt; x,&lt; = x&lt; x&lt; = x&lt; X2。

例如,“|”指示bin边缘。 “o”是垃圾箱中心。

-20             0              20               40
 |------o-------|-------o-------|-------o-------|
       -10              10              30

如果x = [2 9 11],则下部箱中心x1为[-10 -10 10]。