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

HOG: What is done in the contrast-normalization step?

根据HOG过程,如论文Histogram of Oriented Gradients for Human Detection(参见下文link)中所述,对比度归一化步骤在之后完成装箱和加权投票。

我有点不明白 - 如果我已经计算了细胞的加权梯度,图像对比度的归一化现在对我有什么帮助?

据我了解,对比度归一化是在原始图像上完成的,而为了计算梯度,我已经计算了原始图像的 X、Y 导数。所以,如果我标准化对比度并希望它生效,我应该重新计算所有内容。

有什么地方我不太明白吗?

我应该标准化单元格的值吗?

HOG 中的标准化不是关于对比度,而是关于直方​​图值(每个 bin 中的细胞计数)吗?

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

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

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

当您对块直方图进行归一化时,如果您的直方图确实包含每个方向的幅度总和,则实际上是对该块中的对比度进行了归一化。

术语 "histogram" 在这里令人困惑,因为您没有计算有多少像素具有 方向 k,而是计算这些像素的大小。因此,您可以在计算块的向量之后甚至在计算整个向量之后对对比度进行归一化,假设您知道向量中的哪个索引是块开始和块结束。

根据我的理解算法的步骤 - 对我有用,成功率为 95%:

  1. 定义如下参数(在这个例子中,参数就像HOG for Human Detection paper):

    • 以像素为单位的单元格大小(例如 6x6)
    • 单元格中的块大小(例如 3x3 ==> 表示以像素为单位为 18x18)
    • 块重叠率(例如50% ==> 表示块宽度和块高度的像素必须是偶数。在这个例子中满足,因为单元格宽度和单元格高度是偶数(6像素) , 使块的宽度和高度也均匀)
    • 检测window尺寸。该大小必须可以被块大小的一半整除而没有余数(因此可以准确地将块放置在 50% 重叠的范围内)。例如,块宽度为 18 像素,因此 windows 宽度必须是 9 的倍数(例如 9、18、27、36,...)。 window 高度相同。在我们的示例中,window 宽度为 63 像素,window 高度为 126 像素。
  2. 计算梯度:

    • 使用与向量 [-1 0 1] 的卷积计算 X 差值
    • 使用卷积与上述向量的转置计算 Y 差值
    • 使用 sqrt(diffX^2 + diffY^2)
    • 计算每个像素的梯度幅度
    • 使用 atan(diffY / diffX) 计算每个像素的梯度方向。请注意,atan 将 return 值介于 -9090 之间,而您可能会想要 0180 之间的值。所以只需 翻转 所有负值,方法是将它们添加 +180 度。请注意,在用于人体检测的 HOG 中,它们使用无符号方向(0 到 180 之间)。如果你想使用符号方向,你应该多做一点努力:如果 diffX 和 diffY 是正数,你的 atan 值将在 0 之间90 - 保持原样。如果 diffX 和 diffY 为负,您将再次获得相同范围的可能值 - 在这里,添加 +180,因此方向翻转到另一侧。如果 diffX 为正且 diffY 为负,您将获得 -900 之间的值 - 保持相同(您可以添加 +360如果你想要它是积极的)。如果 diffY 为正且 diffX 为负,您将再次获得相同的范围,因此添加 +180,将方向翻转到另一侧。
    • "Bin"方向。例如,9 个无符号 bin:0-20、20-40、...、160-180。您可以通过将每个值除以 20 并对结果取底来轻松实现这一目标。您的新合并方向将介于 08.
    • 之间
  3. 分别对每个块做,使用原始矩阵的副本(因为有些块是重叠的,我们不想破坏它们的数据):

    • 拆分为单元格
    • 为每个单元格创建一个包含 9 个成员的向量(每个 bin 一个)。对于 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