HOG:在对比度归一化步骤中做了什么?

时间:2015-09-05 20:48:11

标签: computer-vision

根据HOG过程,如文章人体检测的定向梯度直方图(见下面的链接)所述,对比度归一化步骤在分箱和加权投票后完成。

我不明白 - 如果我已经计算过细胞'加权梯度,图像对比度的归一化现在如何帮助我?

据我了解,对比度归一化是在原始图像上进行的,而对于计算渐变,我已经计算了ORIGINAL图像的X,Y导数。所以,如果我将对比度标准化并希望它生效,我应该再次计算所有内容。

有什么我不太懂的东西吗?

我应该将细胞标准化吗?值?

HOG中的标准化无论如何都不是关于对比度,而是关于直方​​图值(每个箱中的细胞计数)?

链接到论文: http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf

1 个答案:

答案 0 :(得分:12)

通过对每个块的局部直方图进行归一化来实现对比度归一化。

这里详细解释了整个HOG提取过程:http://www.geocities.ws/talh_davidc/#cst_extract

当您对块直方图进行标准化时,如果直方图确实包含每个方向的幅度之和,则实际上会对此块中的对比度进行标准化。

术语"直方图"这里很混乱,因为你不计算有多少像素有方向k ,而是你总和这些像素的大小。因此,您可以在计算块的向量之后,甚至在计算整个向量之后对对比度进行标准化,假设您知道向量中的哪些索引开始一个块并且块结束。

由于我的理解,算法的步骤对我来说有95%的成功率:

  1. 定义以下参数(在此示例中,参数类似于人类检测纸张的HOG):

    • 以像素为单位的像素大小(例如6x6)
    • 单元格中的块大小(例如3x3 ==>表示以像素为单位的18x18)
    • 块重叠率(例如50%==>意味着块宽度和块高度都必须是偶数。在这个例子中,它满足,因为单元宽度和单元高度是偶数(6像素),使块宽和高度也均匀)
    • 检测窗口大小。尺寸必须可以通过块大小的一半来分割而没有余数(因此可以将块精确地放置在50%重叠内)。例如,块宽度是18个像素,因此窗口宽度必须是9的乘法(例如9,18,27,36 ......)。窗口高度相同。在我们的示例中,窗口宽度为63像素,窗口高度为126像素。
  2. 计算渐变:

    • 使用卷积与向量[-1 0 1]
    • 计算X差异
    • 使用卷积与上述矢量的转置计算Y差值
    • 使用 sqrt(diffX ^ 2 + diffY ^ 2)
    • 计算每个像素的渐变幅度
    • 使用 atan(diffY / diffX)计算每个像素的渐变方向。请注意, atan 将返回 -90 90 之间的值,而您可能希望 0 之间的值和的 180 即可。所以只需翻转所有负值,加上 +180 度。请注意,在HOG for Human Detection中,它们使用无符号方向(0到180之间)。如果您想使用已签名的路线,您应该多付出一些努力:如果diffX和diffY为正,您的 atan 值将介于 0 90 <之间/ strong> - 保持原样。如果diffX和diffY为负,那么您将获得相同范围的可能值 - 此处添加+180,因此方向将翻转到另一侧。如果diffX为正且diffY为负,您将获得 -90 0 之间的值 - 保持不变(如果需要,可以添加+360)正)。如果diffY为正且diffX为负,则您再次获得相同的范围,因此添加+180,将方向翻转到另一侧。
    • &#34;滨&#34;方向。例如,9个无符号分箱: 0-20,20-40,...,160-180 。您可以通过将每个值除以20来轻松实现这一目标并对结果进行分层。您的新分箱路线将介于 0 8 之间。
  3. 使用原始矩阵的副本分别对每个块执行操作(因为某些块重叠,我们不想破坏它们的数据):

    • 拆分为单元格
    • 对于每个单元格,创建一个包含9个成员的向量(每个单元格一个)。对于bin中的每个索引,设置具有该方向的所有像素的所有大小的总和。我们在一个单元格中有6x6像素。因此,例如,如果2个像素的方向为0而第一个的幅度为0.231且第二个的幅度为0.13,则应在向量中的索引0中写入值0.361(= 0.231 + 0.13)。
    • 将块中所有单元格的所有向量连接成一个大向量。此向量大小当然应 NUMBER_OF_BINS * NUMBER_OF_CELLS_IN_BLOCK 。在我们的示例中,它是 9 *(3 * 3)= 81
    • 现在,规范化此向量。使用 k = sqrt(v [0] ^ 2 + v [1] ^ 2 + ... + v [n] ^ 2 + eps ^ 2)(我使用eps = 1)。计算 k 后,将矢量中的每个值除以 k - 这样你的矢量就会被标准化。
  4. 创建最终矢量:

    • 将所有块的所有向量连接成1个大向量。在我的例子中,这个向量的大小是6318