全书导航
大模型之路:从图灵、感知机到 ChatGPT · 卷 2

第 11 章:机器如何看见边缘:HOG、SIFT 与早期视觉

本章问题:在深度学习之前,机器如何识别图像?


11.1 机器没有眼睛

对一个人来说,看一眼照片就能说出"这是一只猫"——这个动作快到你不会觉得它需要"思考"。你甚至不需要努力——猫的形象直接出现在你的意识里。

但对机器来说,这个动作极端困难。

因为机器接收到的不是"一只猫",而是一个数字矩阵——也许是 800×600 个像素,每个像素三个颜色通道(红、绿、蓝)。总共 800×600×3 = 1,440,000 个数字。这 144 万个数字代表的就是一张照片的全部原始信息。

从这 144 万个数字里,机器要判断出"猫"。而猫在这张照片里可能是任何姿势——蹲着、跳着、只露出半张脸、被窗帘遮住一半。光线可能从正面来,也可能从背面来变成剪影。猫可能是黑猫在白墙前,也可能是白猫在雪地里——像素值完全不同,但在人眼里都是"猫"。

这就是计算机视觉的核心困难:像素和意义之间的距离太远了。 像素值会随光照、角度、遮挡、背景发生剧烈变化,但语义("这是一只猫")保持稳定。如何从混乱的像素中提取出稳定的信息——这就是特征工程的视觉版本。


11.2 第一步:找到边缘

在你能认出一只猫之前,你首先得知道它的轮廓在哪里——猫和背景的分界线。

这个直觉让"边缘检测"成为了计算机视觉中最古老的问题之一。边缘是一个图像中像素值剧烈变化的地方——从猫的深色皮毛到浅色墙壁,像素值会有一个跳跃。找到这些跳跃,就找到了轮廓。

最早的边缘检测器和这个直觉一样朴素——算一个像素和邻居像素之间的差值。差值大=边缘。但很快研究人员发现这种朴素的差值对噪声极其敏感——图像传感器的微小波动就会制造出一堆假的"边缘"。

1986 年,约翰·坎尼提出了一个叫 Canny 边缘检测器的方法。它做了几件聪明的事:先对图像做平滑(压掉噪点),再算梯度(找变化最陡的方向),再用非极大值抑制(只保留梯度最陡处的边缘,去掉同一方向上较弱的边缘),最后用双阈值保留强边缘、丢弃弱边缘。输出是一张干净的"边缘图",黑底白线,物体的轮廓被清晰地勾勒出来。

Canny 边缘检测器成为了早期视觉的事实标准,到今天仍然是许多图像处理管线中的第一步。

但边缘只是轮廓。一堆边缘不能告诉你轮廓里面的东西是什么。一只猫和一把椅子的边缘图可能看起来很相似——都是弯曲的线段和拐角。你需要更多的信息。


11.3 从边缘到角点:找到"有意思"的点

边缘告诉你边界在哪里,但它本身包含的信息不够。一张图像里有几千条边缘,大多数对你的任务(找到猫)没有帮助——比如背景中的窗帘边缘和地板纹路的边缘。

你需要找到**"有信息量"的点**:那些在不同方向上都发生变化的位置。它们是图像中"最不像邻居"的点——角点、斑点、纹理变化处。

检测角点的经典方法是 1988 年提出的 Harris 角点检测器。它的核心算了一件事——在图像上滑动一个小窗口,看窗口内的像素变化:如果你往各个方向移动窗口,窗口内的像素都不怎么变→这是平坦区域(没用)。如果你沿一个方向移动,像素大变,但沿另一个方向移动,像素不变→这是边缘(有点用但不独特)。如果你往任何方向移动,像素都大变→这就是角点(非常有信息量)。

角点之所以"有信息量",是因为它们在不同的图像中更容易被匹配。同一个物体的同一个角点——比如猫的右耳朵尖——无论光照怎么变、背景怎么换,只要你能在两张图片里都找到它,你就有了一个锚点。用多个这样的锚点,你就能认出"这是同一个物体的两张不同照片"。

角点是局部信息,但它们极其鲁棒。


11.4 SIFT:让特征摆脱尺度依赖

角点有一个大问题:它们对尺度变化非常敏感。

同一只猫,在近距离照片中猫耳朵可能占 200 个像素,在远距离照片中可能只占 20 个像素。传统角点检测器会在这两幅尺度不同的图里找到完全不同的点——你没法匹配它们。

1999 年,大卫·洛威发表了一篇后来成为计算机视觉领域引用量最高之一的论文——SIFT(尺度不变特征变换)。SIFT 要解决的核心问题是:如何描述一个图像特征,使它对尺度、旋转、光照甚至部分遮挡保持不变。

SIFT 的做法在数学上很精妙,但直觉上可以这样理解:

首先,SIFT 不只在原始图像尺度上找特征——它把图像不断地"缩小"(模糊后降采样),形成一组不同尺度的图像金字塔。在这个金字塔的所有尺度上都找特征点,然后只保留那些在所有尺度上都稳定的特征。

其次,对每个特征点,SIFT 不只记"这里有一个角点",而是记一段复杂的描述子——基于特征周围区域的梯度方向分布。这个描述子是按照特征点的"主方向"来旋转对齐的——所以无论图片怎么旋转,描述子相对特征点的方向保持不变。

最后,描述子本身被归一化——所以光照的明暗变化(加一个常数或乘一个倍数)对最终的特征影响很小。

用一个比喻:你在城市里找一个特定的路口。你不会描述它是"一个十字路口"——所有十字路口都长这样。你会说:"它有一个红色的六边形邮筒在西北角,旁边是一条斜坡往下走的窄巷,对面是一个有一棵歪脖树的咖啡馆。"这个"丰富的局部描述"在面对不同光线、不同角度、不同季节的照片时仍然能让你认出同一个路口。SIFT 做的就是同样的事——为图像中的每个关键点生成一个足够丰富的"局部签名"。

SIFT 在物体识别、图像拼接、3D 重建等任务中都极其成功,专利被广泛授权。它的影响超出了视觉领域——它证明了:手工设计的特征如果能抓住"不变性",就可以在复杂现实视觉任务上达到实用水平。


11.5 HOG:用梯度方向做"形状指纹"

SIFT 描述的是"关键点"周围的局部特征。但在有些任务中,你不需要找稀疏的关键点——你更在意整个物体的外形轮廓。

行人检测就是这样一个问题。从车的角度,人可能穿着任意颜色的衣服、可能带包、可能戴帽子——颜色和纹理极其多变。但人的轮廓是相对稳定的:竖长的身形、头和肩膀的 T 型结构、两条腿分开。

2005 年,Dalal 和 Triggs 提出了 HOG(方向梯度直方图)。HOG 的想法是:不关注像素的颜色值,只关注像素变化的方向,然后按局部区块统计这些方向的分布。

直觉版:把图像切成很多小格子。在每个格子里,统计边缘的方向分布——这个格子里主要是竖边(|)还是横边(—)还是斜边(/)(\)?然后把这些小格子的方向统计组合起来,形成整个图像区域的"形状指纹"。这个指纹不关心颜色、不关心纹理图案,它只看:物体的轮廓大概是什么形状的。

HOG 加上 SVM 分类器,在行人检测上达到了当时最好的水平,成为了很多自动驾驶和监控系统的标准方案。

HOG 和 SIFT 的共同思想是:丢弃颜色和纹理,保留形状和方向信息,换取对光照和外观变化的鲁棒性。 这个策略非常有效——但它也意味着,如果两类物体的区别主要在于颜色(比如区分一个红苹果和一个青苹果),这些特征就会失败。手工特征的设计永远是"为了什么任务牺牲什么信息"的取舍。


11.6 传统视觉流水线:一砖一瓦往上叠

SIFT、HOG 和 Canny 边缘检测不是一个孤立的技术——它们是一个更大的视觉处理"流水线"的组成部件。

传统计算机视觉的典型流水线是这样的:

  1. 预处理:去噪、归一化、调整尺寸。
  2. 特征提取:Canny → 找出边缘;Harris → 找出角点;SIFT/HOG → 提取鲁棒特征描述子。
  3. 编码/聚合:把一张图里成百上千个局部特征聚合成一个全局表示(比如"词袋模型"——把所有 SIFT 描述子聚类成一组"视觉词汇",然后对一张图统计各个"词"出现的频率)。
  4. 分类器:把这个全局表示喂给 SVM 或随机森林。

这个流水线的每一步都是人设计的,每一步都有理论保证,每一步都经过了多年的工程验证。整个过程像一个精密的、手工打造的机械手表。

它确实能工作。在受控的、光照均匀的、背景干净的条件下,传统视觉流水线可以稳定地识别物体、检测行人、匹配图像。但它有一个致命弱点:每一层的信息压缩都是单向的。 如果在预处理时丢掉了某些信息(比如因为去噪而模糊掉了一些微弱的纹理),后面的特征提取和分类永远无法恢复这些信息。传统视觉是一条"只减不加"的单行道。


11.7 本章小实验:用眼睛提取 HOG

找一张人物照片和一张椅子照片。

不要看整个物体——把目光聚焦在一个小格子里(比如 20×20 像素的区域)。在这个格子里,你看到的是:

  • 主要的边缘是竖着的还是横着的?还是斜的?
  • 如果你用箭头把每条边缘的方向画出来,这些箭头大致指向同一个方向(这个格子可能在物体的轮廓边上),还是指向四面八方(这个格子可能落在物体内部没什么纹理的地方,或者在一个有杂乱纹理的背景里)?

用自己的眼睛做这个分析的要点是意识到:你认出一个物体,不是靠"这个像素是 RGB(127, 85, 203)",而是靠大量的局部方向线索组合在一起产生的一个整体印象。

现在换一种视角看同一张照片:如果只给你看这张照片每个 20×20 格子的方向统计(HOG 的中间输出),而不给你看原始照片,你能猜出照片里大概有什么吗?

你能猜出"有一个人形物体",但你分不清是男人还是女人,是真人还是雕像,是这个人的脸朝左还是朝右。因为 HOG 丢弃了颜色、纹理和精细轮廓——而这些东西对于区分"衣服的颜色"来说无关紧要,但对于区分"是不是真人"和"是谁"来说,恰恰是需要的。

这就是手工特征的取舍:为了某个目标牺牲另一些信息。 而你不知道哪些被牺牲的信息在下一个任务里会突然变得至关重要。


11.8 本章地图

text
问题:在深度学习之前,机器如何识别图像?方法:人工设计特征检测器——从像素→边缘(Canny)→角点(Harris)→尺度不变特征(SIFT)→形状描述子(HOG)→聚合编码→分类(SVM)。突破:SIFT 和 HOG 证明,手工设计的特征可以在尺度、旋转、光照变化的条件下稳定工作,达到实用水平。局限:每一步都是单向的信息压缩,丢失的信息无法恢复。整个流水线依赖人预判"什么信息有用"——而这种预判在不同任务间往往不通用。今天:CNN 直接端到端地学习"从像素到语义"的映射,取代了手工设计的特征流水线。但 SIFT/HOG 背后的不变性思想——尺度不变、旋转不变、光照不变——仍然是深度学习架构设计中反复出现的设计原则。

11.9 本章结语:最后的精密机械

SIFT 和 HOG 是计算机视觉在"手工年代"的巅峰。

它们极其精巧——这些检测器和数学框架背后的智力投入是巨大的。它们也真的能工作——在很多受控场景下,它们的表现甚至接近后来深度学习的水平。

但它们也代表了一种终点——手工设计特征的"最后一英里"。在这些精密的零件被组装进传统视觉流水线之后,人们已经很难再把它们往前推一步了。不是因为聪明才智不够,而是因为手工设计的本质局限开始显露:你无法为每一类信息设计特征;你只能在取舍中定义一套固定的"看世界的规则"。

而深度学习做的,正是扔掉这些固定的规则,让机器自己去学"该看什么"。

但在迈出那一步之前,AI 还需要经历另一次寒冬,以及一次硬件的革命。

下一章,我们聊第二次低谷与暗中的积累。

SECTION §02 · ENGAGE

Discussion

留言区 · GitHub-powered comments via Giscus