【问题标题】:HOG: What is done in the contrast-normalization step?HOG:在对比度归一化步骤中做了什么?
【发布时间】:2015-12-01 18:16:56
【问题描述】:

根据 HOG 过程,如论文Histogram of Oriented Gradients for Human Detection(见下面的链接)中所述,对比度归一化步骤是在分箱和加权投票之后完成的。 p>

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

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

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

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

HOG 中的归一化是否与对比度无关,而是与直方图值(每个 bin 中的单元格计数)有关?

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

【问题讨论】:

标签: computer-vision


【解决方案1】:

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

完整的 HOG 提取过程在这里有很好的解释:http://www.geocities.ws/talh_davidc/#cst_extract

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

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

由于我的理解,算法的步骤 - 以 95% 的成功率对我有用:

  1. 定义以下参数(在本例中,参数类似于 HOG for Human Detection 论文):

    • 以像素为单位的像元大小(例如 6x6)
    • 以单元格为单位的块大小(例如 3x3 ==> 表示以像素为单位的大小为 18x18)
    • 块重叠率(eg 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 将返回 -9090 之间的值,而您可能需要 0180。因此,只需将所有负值添加到 +180 度即可翻转。请注意,在用于人体检测的 HOG 中,它们使用无符号方向(0 到 180 之间)。如果你想使用有符号的方向,你应该多花点功夫:如果 diffX 和 diffY 是正数,你的 atan 值将介于 090 - 保持原样。如果 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

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2022-11-05
    • 2019-09-08
    • 2012-09-06
    相关资源
    最近更新 更多