根据HOG流程,如论文中所述用于人体检测的定向梯度直方图(参见下面的链接),对比归一化步骤是在分箱和加权投票之后完成的。
我不明白 - 如果我已经计算了细胞的加权梯度,那么图像对比度的归一化现在对我有什么帮助?
据我了解,对比度归一化是在原始图像上完成的,而为了计算梯度,我已经计算了原始图像的 X,Y 导数。因此,如果我标准化对比度并且希望它生效,我应该重新计算所有内容。
有什么我不太明白的吗?
我应该标准化单元格的值吗?
HOG 中的归一化是否与对比度无关,而是与直方图值(每个箱中的细胞计数)有关?
论文链接:http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf
对比度归一化是通过每个块的局部直方图的归一化来实现的。
整个 HOG 提取过程在这里得到了很好的解释:http://www.geocities.ws/talh_davidc/#cst_extract http://www.geocities.ws/talh_davidc/#cst_extract
当您标准化块直方图时,如果您的直方图确实包含每个方向的幅度总和,则实际上您标准化了该块中的对比度。
术语“直方图”在这里很令人困惑,因为您没有计算有多少像素方向k,而是对这些像素的大小求和。因此,您可以在计算块的向量之后,甚至在计算整个向量之后,对对比度进行归一化,假设您知道块在向量中的哪些索引开始和结束。
根据我的理解,算法的步骤对我来说是有效的,成功率为 95%:
-
定义以下参数(在本例中,参数类似于用于人体检测的 HOG 论文):
- 以像素为单位的像元大小(例如 6x6)
- 以单元格为单位的块大小(例如 3x3 ==> 表示以像素为单位为 18x18)
- 块重叠率(例如50%==>意味着块宽度和块高度(以像素为单位)必须是偶数。在本例中满足,因为单元格宽度和单元格高度是偶数(6像素),使得块宽度而且身高也均匀)
- 检测窗口大小。大小必须可以除以块大小的一半而没有余数(因此可以将块精确地放置在其中并具有 50% 的重叠)。例如,块宽度为 18 个像素,因此窗口宽度必须是 9 的乘积(例如 9、18、27、36...)。窗户高度相同。在我们的示例中,窗口宽度为 63 像素,窗口高度为 126 像素。
-
计算梯度:
- 使用向量 [-1 0 1] 卷积计算 X 差异
- 使用卷积与上述向量的转置计算 Y 差异
- 使用以下方法计算每个像素中的梯度幅度sqrt(diffX^2 + diffY^2)
- 使用以下方法计算每个像素的梯度方向atan(diffY / diffX)。注意atan将返回介于-90 and 90,而您可能需要之间的值0 and 180。所以就flip将所有负值相加+180度。请注意,在用于人体检测的 HOG 中,它们使用无符号方向(0 到 180 之间)。如果你想使用带符号的方向,你应该多做一点努力:如果 diffX 和 diffY 是正数,你的atan值将介于0 and 90- 保持原样。如果 diffX 和 diffY 为负值,您将再次获得相同范围的可能值 - 此处添加 +180,因此方向会翻转到另一侧。如果 diffX 为正且 diffY 为负,您将得到介于-90 and 0- 保持不变(如果你想要正值,可以添加+360)。如果 diffY 为正且 diffX 为负,您将再次获得相同的范围,因此添加 +180,以将方向翻转到另一侧。
- “Bin”指示。例如,9 个未签名的 bin:0-20、20-40、...、160-180。您可以通过将每个值除以 20 并将结果取整来轻松实现这一点。您的新分档路线将介于0 and 8.
-
使用原始矩阵的副本分别对每个块进行操作(因为有些块是重叠的,我们不想破坏它们的数据):
- 拆分为单元格
- 对于每个单元格,创建一个包含 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- 因此你的向量将被标准化。
-
创建最终向量:
- 将所有块的所有向量连接成 1 个大向量。在我的例子中,这个向量的大小是 6318
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)