本册小节 · 直接定位
  1. 1. 从局部参照到 128 维:SIFT 怎样让局部可比较?
  2. 2. HOG:固定窗口保留怎样的粗位置?
  3. 3. 单图六词计数以后,为什么还需要共同词典?
  4. 4. 固定同一批描述,只补回上下地址
  5. 5. 学会边界之后,新点沿用什么?
  6. 把本段主线连起来
  7. 课堂核对:先预测,再运行
  8. 课程导航

打开传统视觉参考 · 第二讲导读

本册是第二讲的按需历史参考。它解释端到端 CNN 之前和同期的一条路线:先组织局部测量,再形成共同坐标,最后用标签训练分类读出。它不插入 01→03→04→06→07 的主讲阅读链。

想比较“手工表示”和 CNN,先读第 3–5 节的共同词典、空间汇总与分类反馈;想把一个描述子的维数算清,再读第 1–2 节。图中 SIFT、HOG、词袋和二维分类各承担一个接口,不把它们拼成同一套已训练系统。

动手入口:LAB 07 · 空间格、方向桶与传统表示。固定局部描述与词编号,只交换空间位置,观察全局计数与分区计数分别变不变;本册末尾代码可先独立核对地址与向量。

1. 从局部参照到 128 维:SIFT 怎样让局部可比较?

课件与图解:分类器之前,先设计一套更合适的图像表示 · 相机图里,SIFT把哪些局部选作比较起点? · 打开一个局部,看SIFT怎样记录方向与粗位置 · 传统视觉参考总入口

先抓住两个地址:方向桶与空间格。 如果两个地方都出现 45° 梯度,描述子要不要把它们当作同一项?

SIFT教学格:r2c3四个明确方向箭头形成直方图,45度桶位于地址49;相邻r2c4同方向桶位于地址57

跟着一个数走。 方向桶算例 的独立机制格有 4 行×4 列,每格 8 个方向桶,共 128 维。r2c3 内四个梯度的方向是 0°、45°、45°、90°,强度是 1、2、1、2;把同方向强度相加,得到 [1,3,2,0,0,0,0,0]。图中箭头等长,尖端给方向,强度读数值;梯度方向不是轮廓切线。

行列 r、c 从 1 开始,桶 b 从 0 开始。零基拼接地址为 j=((r−1)×4+c−1)×8+b。于是:

空间格 方向 桶 b 拼接地址 j 该项的值
r2c3 45° 1 49 3
r2c4 45° 1 57 1

方向相同,空间格不同,向量地址也不同。 相邻格 r2c4 的完整计票是 [0,1,0,0,0,2,0,0]。这个离散格只展开地址与计票;真实 SIFT 还含空间/方向插值、加权、截断和归一化。

把机制放回相机图。 关键点参照页 为真实像素提取的位置、尺度和主方向建立比较参照,保存记录保留 700 个关键点,图上仅显示子集。局部对应页 对相机图旋转 24°、缩至 0.78 倍后重新提取和匹配:381 对候选中,349 对与已知变换的几何误差不超过 3 像素,主讲显示其中 14 对。描述参照提高可比性,不保证每次匹配成功;349/381 也不是分类准确率。

先预测与核对:遮住表中地址,算出 49 和 57;把 r2c3 的一票搬到相邻格,说明哪里减、哪里增。下一节保持方向统计,却改用固定窗口和规则网格。

2. HOG:固定窗口保留怎样的粗位置?

课件与图解:HOG:固定窗口里的方向统计,保留规则网格

HOG 以固定窗口与规则网格组织方向信息,和每个 SIFT 关键点自己的尺度/方向参照不同。本例窗口宽 64、高 128 像素;每个 cell 为 8×8,所以是 16 行×8 列,不能把宽高和行列倒置。每个 cell 统计 9 个无符号方向桶,相邻 2×2 cells 组成 36 维 block,再归一化、拼接。

block 每次移动 1 个 cell,因此有 15 行×7 列=105 个 block,完整描述为 105×36=3780 维。HOG 可以直接交给分类器,不要求先经过视觉词袋。局部汇总保留 cell 地址,却不保存窗口内每个像素的全部细节。

可核对的像素来自程序 cell(row=4,col=3),即第 5 行第 4 列。其无符号方向约 170.6398°、幅值 0.3616783,线性分给 160° 桶 0.1692689 和循环相邻的 0° 桶 0.1924094,两份之和仍等于幅值。本例使用透明教学变体:cell 硬分配、方向插值、block L2 归一化,未声称逐位复现完整 Dalal–Triggs 检测器。输入行人是生成情境图,梯度由实际像素计算,未训练行人分类器。

先预测与核对:先只给出宽高和 cell 大小,算出行列、block 数与总维数,再核对两份方向票之和。下一问题是:一张图局部数量不固定时,怎样给分类器固定长度的输入?

3. 单图六词计数以后,为什么还需要共同词典?

课件与图解:600个局部描述,最后落进这6个计数 · 词典学习一次,新图像沿用同一套词编号

街景算例实际提取 600 个 SIFT 描述,做单图聚类演示,用 K=6 个中心分配描述,得到词频 [91,65,78,152,113,101],合计 600。中心是描述子空间中的数值向量,代表裁片只是靠近中心的观测,不是中心生成的物体。词编号不是“车轮”“建筑”等语义标签。

这个单图结果说明数量不定的局部怎样汇总为六维计数;要训练跨图像的分类器,还必须保证每一维含义一致。正式流程从训练图像收集局部描述,学习并保存共同中心和编号;新图仅向已保存中心分配,再按相同规则计数。若每张新图各自重新聚类,“第 1 维”可能代表另一种模式,旧分类器无法直接沿用。词典本身可以由数据学习,但本讲分阶段方案中的分类训练不会继续改变已经冻结的词典。

先预测与核对:先相加核对 600,再把两张图的“词 1”和“词 2”互换,说明为何向量长度没变但坐标意义变了。下一节固定词典与描述集合,只改变位置,检查全局计数遗漏了什么。

4. 固定同一批描述,只补回上下地址

课件与图解:传统视觉参考总入口

先预测:下面只交换上下两排,A、B、C 的总数会变吗?能不能由总数恢复原来的布局?

同样16个局部描述交换上下位置,全局计数仍为6,6,4,按上半下半拼接的六维向量发生改变

两图使用同样的 16 个已提取描述、同样的词典归属;这里只改变位置,没有把拼接图重新送入 SIFT。

布局 上半 (A,B,C) 下半 (A,B,C) 全局 (A,B,C)
甲 (5,2,1) (1,4,3) (6,6,4)
乙 (1,4,3) (5,2,1) (6,6,4)

全局汇总丢掉了哪里,区域汇总就补回哪里。 按“上半后下半”的固定顺序拼接,甲变成 (5,2,1,1,4,3),乙变成 (1,4,3,5,2,1)。增加的是粗区域地址,仍没有保存每个描述的精确位置。

先预测与核对:先用手遮住下方向量,分别计数,再运行末尾代码核对。这个两区域构造只检验汇聚如何丢失与补回位置,不是完整空间金字塔算法,也不保证任意图像重排后重新提取的特征都不变。接下来固定这些坐标含义,看看标签怎样选择分类边界。

5. 学会边界之后,新点沿用什么?

课件与图解:表示交给分类器之后,边界怎样学出来? · 传统视觉参考总入口 · 沿着总图,解释训练与新图预测 · 分类错误,能改到哪些测量?

为单独看清分类接口,主讲使用八个手工指定的二维训练点与标签,并实际求解最大间隔分类器。这里的坐标不是从相机图、街景或轮子检测器量出来的。训练得到 w=(1,−1)、b=0,即 s(x)=x₁−x₂,边界为 x₁=x₂。正负标签与训练目标共同约束参数;规则一旦固定,新点只做前向计算。

未参与训练的点 坐标 分数 本例显示
Q1 (3.5,1.5) +2 A
Q2 (1.5,3.5) −2 B
Q3 (2.5,2.5) 0 ?

Q3 恰在边界,本例保留问号;分数 0 不是两类各 50% 的概率。三个查询没有真实测试标签,能够计算预测,却不能据此报告测试准确率。

回到传统总流程:训练图像提供词典学习的描述,标签训练分类器;应用时固定词典编号、统计方法和分类器权重。区域统计决定哪些粗位置信息被保留。各前端可能曾独立学习,但在这里的分类训练中已经冻结,最终分类损失主要改变读出。

先预测与核对:手算三个新点,再沿总图各说一句“训练改什么”“新图沿用什么”“上下交换在哪一步可见”。核对:最后的问题不是“传统方法有没有学习”,而是“当前类别错误能反馈到哪里”。共同词典已经从无类别标签的描述子中学习,分类器也从标签学习。新的问题是:分类错误能否一路反馈到提取图像信息的前端?端到端 CNN 保留人工选择的局部与共享结构,同时让类别损失调整前面的核权重。

把本段主线连起来

课件与图解:本段起点;逐页入口见上方各节。

用同一条链复述:局部参照使描述更可比较;共同词典使不同图像的坐标含义一致;区域地址补回粗位置;带标签的训练选择分类边界。然后指出:本讲分阶段方案中,最终分类损失没有继续修改已冻结的前端。

相机对应、HOG、单图六词、固定描述重排与二维 SVM 各有自己的证据范围。不要把 349 对几何一致匹配、600 个词分配或三个查询分数写成同一个系统的图像分类性能。更多可复查操作见 LAB 07 · 空间格、方向桶与传统表示。

来源沿用主讲:Lowe · SIFT、Dalal 与 Triggs · HOG、Sivic 与 Zisserman · 视觉词、Lazebnik 等 · 空间组织。

课堂核对:先预测,再运行

课件与图解:本段起点;逐页入口见上方各节。

下面只核对构造的描述子地址、固定描述集合的汇总与既有二维分类规则。代码不提取新图像特征,不训练新的分类器。先写出索引 49 的来源、区域交换后的两个向量,以及 Q3 的显示。

查看代码 · 单元 17
# 教学构造;r/c一基,方向桶b和向量地址零基。
bins = [0]*8
for direction, magnitude in [(0, 1), (45, 2), (45, 1), (90, 2)]:
    bins[direction//45] += magnitude
r, c, b = 2, 3, 1
j = ((r-1)*4+c-1)*8+b
assert bins == [1, 3, 2, 0, 0, 0, 0, 0] and j == 49
assert ((2-1)*4+4-1)*8+1 == 57
print('r2c3方向计票:', bins, '45度地址:', j, '值:', bins[b])

word_counts = [91, 65, 78, 152, 113, 101]
assert sum(word_counts) == 600
upper, lower = (5, 2, 1), (1, 4, 3)
global_a = tuple(a+b for a, b in zip(upper, lower))
global_b = tuple(a+b for a, b in zip(lower, upper))
regional_a, regional_b = upper+lower, lower+upper
assert global_a == global_b == (6, 6, 4)
assert regional_a != regional_b
print('全局:', global_a, global_b)
print('区域:', regional_a, regional_b)

queries = [(3.5, 1.5), (1.5, 3.5), (2.5, 2.5)]
scores = [x1-x2 for x1, x2 in queries]
labels = ['?' if abs(s)<1e-8 else ('A' if s>0 else 'B') for s in scores]
assert scores == [2, -2, 0] and labels == ['A', 'B', '?']
print('新点分数:', scores, '本例显示:', labels)
print('没有查询真标签,因此这里不计算准确率。')

课件与图解:本段起点;逐页入口见上方各节。

运行后修改一项:保持词编号与描述集合,只交换上下区域;再对照“全局不变、区域改变”的预测。若想讨论重新提取图像后的结果,必须到 LAB 07 · 空间格、方向桶与传统表示 明确另设实验,不能沿用当前固定描述的前提。离开本册时,用一句话说明 CNN 要把哪条反馈路径继续向前延伸。

课程导航

第二讲导读与完整索引 · 回到 CLS 03 · 端到端 CNN

在 Deepnote 返回 CLS 00 · 第二讲导读。静态课件链接返回对应主题;需保留原 Slides 停点时,请在新标签页打开材料。

回到主讲继续判断