返回

HOG 特征

Histogram of Oriented Gradient - 方向梯度直方图
第三章 / 机器学习方法
参数面板

点击 Lena 图选择一个 8×8 cell,或用方向键移动;当前页面只追踪当前 cell 的梯度幅值、方向 bin、直方图和 block 归一化证据。

当前 cell

原图按 8×8 像素划分为 32×32 个 cell。点击原图可选择一个 cell。

cell (8, 8)
当前窗口特征维度
34,596

31×31 blocks × 2×2 cells/block × 9 bins

窗口定位辅助操作
用方向键或下方 4 个按钮移动当前窗口;也可以直接点击原图或结果图跳转。
当前像素 (64, 64)265 / 1024
方向
概念说明

HOG 把窗口变成什么

HOG 将窗口中的边缘方向分布编码为固定长度特征。图源:scikit-image HOG 示例
任务

当直接把检测窗口的原始灰度交给分类器时,窗口大小或亮度一变化,向量就失去可比性;我们需要把窗口里的边缘结构抽成稳定描述。

思路

常用办法是把窗口分成若干 ,在每个 cell 里按梯度方向投票得到直方图,再把相邻 cell 拼成 。这样生成的固定长度向量保留物体轮廓,又对光照变化不那么敏感。

观察

拖动窗口到不同位置,对比 cell 直方图和 block 归一化前后的变化;注意梯度方向在哪里投票变多,以及 block 大小改变时哪些区域被合并。

方向键移动 cell / 点击原图或 HOG 图切换 cell当前结果像素 (64, 64)
265 / 1024
Lena 原图256×256
红框为当前 8×8 cell,可点击切换
HOG 统计
265 / 1024
HOG cell/block 可视化768×768
白框为当前 cell,灰框为所属 block,可点击切换
输入 cell

原图第 65-72 行, 第 65-72 列。

梯度计算
M 梯度幅值
0.3
0.0
0.0
0.3
0.6
0.7
0.7
0.6
0.3
0.0
0.0
0.5
0.5
0.0
0.0
0.1
0.3
0.0
0.0
0.5
0.5
0.0
0.0
0.1
0.5
0.6
0.6
0.6
0.4
0.1
0.1
0.1
0.5
0.6
0.6
0.5
0.2
0.1
0.1
0.1
0.3
0.0
0.0
0.1
0.1
0.0
0.0
0.1
0.3
0.0
0.0
0.1
0.1
0.0
0.0
0.1
0.3
0.1
0.1
0.1
0.1
0.1
0.1
0.1
bin 投票
方向 bin
8
4
4
1
3
4
4
4
8
4
4
8
8
4
4
8
8
4
4
8
8
4
4
8
5
4
4
2
1
4
4
7
3
4
4
4
3
4
4
7
0
4
4
0
0
4
4
8
0
4
4
0
0
4
4
8
1
4
4
7
7
4
4
7
当前 cell 直方图
0
1.1
1
1.0
2
0.6
3
1.3
4
5.5
5
0.5
6
0.0
7
0.6
8
3.1
所属 block
(8,8)
Σ=13.8
(9,8)
Σ=4.8
(8,9)
Σ=4.0
(9,9)
Σ=4.6

HOG 要解决什么问题

目标检测不能只记住原始像素值。光照、颜色和纹理一变,同一个物体的像素会明显变化; 但物体的轮廓、边缘走向和局部形状通常更稳定。 HOG 把一个图像窗口转换成“边缘方向分布向量”,让后续分类器读取这条向量来判断窗口里是否有目标。

具体一点:先框出一个候选窗口,例如人、车或标志所在的小区域;HOG 把这个窗口变成一串边缘方向数字; 分类器只回答“这个窗口像不像要找的目标”。把窗口从左到右、从上到下扫完整张图,就能找出目标可能出现的位置。

当前 cell 的真实 HOG 计算

选中 cell (8, 8),先对其中每个像素计算 Sobel 梯度, 再按方向 bin 累加梯度幅值,最后把所属 block 内的 cell 直方图串联并归一化。

当前页面为教学演示,采用硬投票(每个像素只投入最近的一个方向 bin)和固定左上角 block 策略; 标准 HOG 还会对相邻 bin 做线性插值、使用 L2-Hys 归一化,并让 block 以 stride 滑动重叠。

每柱角度:20.0°

代表像素代入

代表像素选取当前 cell 内梯度幅值最大的像素,便于观察方向投票如何发生。

像素 (69, 64) 的 Sobel 梯度
Kx=[-101-202-101] Ky=[-1-2-1000121] Gx= Σkx,ky{-1,0,1} I(x+kx,y+ky) ·Kx[ky+1][kx+1] =-1·0.54+1·0.54-2·0.36+2·0.36-1·0.36+1·0.36 =0.00 Gy= Σkx,ky{-1,0,1} I(x+kx,y+ky) ·Ky[ky+1][kx+1] =-1·0.54-2·0.54-1·0.54+1·0.36+2·0.36+1·0.36 =-0.74
这里使用未归一化的 Sobel 核近似梯度,Gx、Gy 数值来自当前 Lena 图的 3×3 邻域加权求和。
梯度幅值
M=Gx2+Gy2 =0.002+-0.742 =0.74
梯度幅值作为投票权重,边缘越强,对直方图贡献越大。
方向落入的 bin
bin = floor( θ180/nBins ) = floor( 90.0180/9 ) = floor( 90.020.0 ) =4
nbins=9 时,每个方向柱覆盖 20.0°。

当前 cell 的矩阵展开

原始灰度
0.47
0.47
0.47
0.47
0.36
0.36
0.36
0.36
0.47
0.47
0.47
0.47
0.36
0.36
0.36
0.36
0.47
0.47
0.47
0.47
0.36
0.36
0.36
0.36
0.47
0.47
0.47
0.47
0.36
0.36
0.36
0.36
0.32
0.32
0.32
0.32
0.34
0.34
0.34
0.34
0.32
0.32
0.32
0.32
0.34
0.34
0.34
0.34
0.32
0.32
0.32
0.32
0.34
0.34
0.34
0.34
0.32
0.32
0.32
0.32
0.34
0.34
0.34
0.34
Gx 水平梯度
0.28
0.00
0.00
-0.28
-0.28
0.00
0.00
-0.06
0.28
0.00
0.00
-0.46
-0.46
0.00
0.00
0.11
0.28
0.00
0.00
-0.46
-0.46
0.00
0.00
0.11
0.13
0.00
0.00
-0.32
-0.32
0.00
0.00
0.11
-0.19
0.00
0.00
-0.04
-0.04
0.00
0.00
0.11
-0.34
0.00
0.00
0.10
0.10
0.00
0.00
0.11
-0.34
0.00
0.00
0.10
0.10
0.00
0.00
0.11
-0.23
0.00
0.00
0.10
0.10
0.00
0.00
0.11
Gy 垂直梯度
-0.01
-0.01
-0.01
-0.19
-0.56
-0.74
-0.74
-0.57
-0.00
0.00
0.00
0.00
0.00
-0.00
-0.00
-0.00
-0.00
0.00
0.00
0.00
0.00
-0.00
-0.00
-0.00
-0.47
-0.62
-0.62
-0.48
-0.20
-0.06
-0.06
-0.06
-0.47
-0.62
-0.62
-0.48
-0.20
-0.06
-0.06
-0.06
-0.00
0.00
0.00
0.00
0.00
-0.00
-0.00
-0.00
-0.00
0.00
0.00
0.00
0.00
-0.00
-0.00
-0.00
-0.16
-0.05
-0.05
-0.06
-0.06
-0.06
-0.06
-0.06
bin 编号
8
4
4
1
3
4
4
4
8
4
4
8
8
4
4
8
8
4
4
8
8
4
4
8
5
4
4
2
1
4
4
7
3
4
4
4
3
4
4
7
0
4
4
0
0
4
4
8
0
4
4
0
0
4
4
8
1
4
4
7
7
4
4
7

block 归一化

当前 block 从 cell (8, 8) 开始, 覆盖 2×2 个 cell。先串联这些 cell 的方向直方图,再做 L2 归一化。
当前页面为演示,把当前 cell 固定分配到包含它的最左上角 block;若 cell 靠近图像边界,block 会自动贴近边缘。 标准 HOG 中 block 会以 stride 滑动,一个 cell 可能参与多个重叠 block 的归一化。
(8,8)
Σ=13.8
(9,8)
Σ=4.8
(8,9)
Σ=4.0
(9,9)
Σ=4.6
归一化向量摘要
向量长度:36, L2 范数:7.638
0.14
0.13
0.08
0.17
0.73
0.06
0.00
0.08
0.41
0.09
0.01
0.10
0.03
0.15
0.00
0.00
0.13
0.12
0.09
0.00
0.00
0.00
0.13
0.00

这个描述子能做什么

从当前 Lena 选区看,红框 cell 负责统计一个小区域的边缘方向;灰框 block 负责把相邻 cell 合成更稳定的小向量; 整个检测窗口再把所有 block 向量接成一条长描述子。分类器读取的是这条描述子,而不是直接读取原始像素。

当前 cell:局部方向统计

cell (8, 8) 内的每个像素先计算梯度, 再投票到 9 个方向柱中,形成当前这张方向直方图。

当前 block:稳定的小向量

灰框 block 覆盖 2×2 个 cell,把这些直方图串联后归一化, 得到长度为 36 的 block 向量。

检测窗口:一条长描述子

当前窗口共有 961 个 block,全部按扫描顺序拼接后, 得到 34,596 维窗口描述子,作为分类器输入。

从当前 block 到窗口描述子
vblock = normalize([h1,,h4]) R36 dim(vblock) =2×2×9 =36 xwindow = concat(v1,,v961) dim(xwindow) =961×2×2×9 =34596
分类器检测流水线会继续展开滑动窗口、分类器判别和候选框筛选。