我正在使用 HOG 进行向日葵检测。我了解 HOG 现在正在做的大部分事情,但在最后阶段有一些我不明白的事情。 (我正在阅读 Mathworks 的 MATLAB 代码)。
让我们假设我们正在使用 Dalal-Triggs 实现。 (也就是说,8x8 像素构成 1 个单元,2x2 个单元构成 1 个块,块在两个方向上以 50% 重叠,最后,我们将直方图量化为 9 个 bin,无符号。(意思是,从 0 到 180 度))。最后,我们这里的图像是 64x128 像素。
假设我们在第一个街区。该块有 4 个单元格。我知道我们将根据每个方向的大小对它们的方向进行加权。我也知道我们将通过以块为中心的高斯进一步加权。
到现在为止还挺好。
然而,在 MATLAB 实现中,他们有一个额外的步骤,即他们创建一个“空间”权重:
如果我们深入研究这个函数,它看起来像这样:
最后,函数“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
现在,我相信这些“空间”权重将在稍后的三线性插值部分中使用……但我不明白的是它们的计算方式或该代码背后的逻辑。我完全迷失在这个问题上。
注意:我理解三线性插值的必要性,以及(我认为)它是如何工作的。我不明白的是为什么我们需要这些“空间权重”,以及它们计算背后的逻辑是什么。
谢谢。
最佳答案
此代码预先计算三线性插值的空间权重。看看这里的三线性插值方程:
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 方向的直方图 bin 的中心。在 1D 中描述这些东西更容易。因此,在 1D 中,值 x 将落在 2 个 bin 中心 x1
回到创建 4 个矩阵的代码只是预先计算了 HOG 块中所有像素的插值所需的权重的所有乘法。这就是为什么它是权重矩阵的原因:矩阵中的每个元素都对应于 HOG 块中的一个像素。
例如,您查看 h(x1, y2, ~) 的权重方程,您将看到 x 和 y 的这两个权重(忽略 z 分量)。
(1 - (x-x1)/bx) * ((y-y1)/by)
回到代码,这个乘法是为块中的每个像素预先计算的:
weights.x1y2 = (1-wy1)' * wx1;
在哪里
(1-wy1) == (y - y1)/by
相同的逻辑适用于其他权重矩阵。
至于“computeLowerHistBin”中的代码,它只是在三线性插值方程中找到x1,其中x1
例如,“|”表示 bin 边缘。 “o”是 bin 中心。
-20 0 20 40
|------o-------|-------o-------|-------o-------|
-10 10 30
如果 x = [2 9 11],下 bin 中心 x1 是 [-10 -10 10]。
关于matlab - 没有得到 HOG 的 'spatial weights' 是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26344764/