1. Face Detection
1.1 Challenge
- 滑动窗口:上万次的位置/尺度评估
- 一个百万的像素有 10^6个像素,而面部候选位置的数量级也差不够
- 人脸出现频率很低:每张图0-10个
- 为了提高效率,要尽量减少花费在非活动的窗口上
- 对于百万像素,为了避免每幅图像中都有假阳性,我们的假阳性率必须低于 $10^{-6}$
1.2 Viola-Jones
1.2.1 矩阵特征和积分图
弱分类器(Haar):4种矩形滤波(包含黑色和白色区域),特征值=白色区域之和$-$黑色区域之和
积分图: 积分图上任意一点 $(x,y)$ 的值是原图中该点左上角所有像素之和。
- 优势:一旦计算好积分图,任意大小的矩形区域内的像素和只需要读取矩形四个角的积分图数值,进行 3次加减运算 即可得到。这使得特征计算速度与区域大小无关,极快。
1.2.2 特征选择和分类
如何利用 AdaBoost (Adaptive Boosting) 算法将成千上万个简单的“弱分类器”组合成一个强大的“强分类器”。
图片分为三个部分,分别对应算法的三个关键步骤。以下是逐层解析:
1.2.2.1 定义弱分类器
这一步定义了算法最基本的积木——弱分类器 $h_j(x)$。
背景: 之前提到的 Haar 特征(矩形特征)有成千上万个(比如 24x24 窗口里有 160,000 个)。
弱分类器的逻辑: 每一个弱分类器只盯着一个特定的特征($f_j$)看。
它计算该特征在图像上的值 $f_j(x)$。
它设定一个阈值 (Threshold, $\theta_j$)。
判断公式:
$$h_j(x) = \begin{cases} 1 & \text{if } f_j(x) > \theta_j \ 0 & \text{otherwise} \end{cases}$$
如果特征值超过阈值,就认为是人脸(1),否则不是(0)。
为什么叫“弱”? 因为只靠这一个特征(比如“眼睛比额头黑”),它的判断能力很差,只比瞎猜好一点点。
1.2.2.2 训练与选择
这是 AdaBoost 算法的核心循环。它的目的是在每一轮中挑出当前最有用的那个弱分类器。
选择最强特征 (Select best filter):
- 算法会遍历所有可能的特征,计算它们在当前样本权重下的加权误差 ($\epsilon_j$)。
- 公式: $\epsilon_j = \sum_i w_i |h_j(x_i) - y_i|$
- 它会选出误差 $\epsilon_t$ 最小的那个特征及其对应的分类器 $h_t$。
更新样本权重 (Reweight examples):
这是 AdaBoost 的精髓。选好一个分类器后,我们需要为下一轮做准备。
核心思想: 对于当前分类器已经分对的样本,我们减少它们的权重(关注度);对于分错的样本,我们保持或相对增加它们的权重。这样,下一个分类器就会被迫去解决那些“难啃的骨头”。
公式解读:
$$w_{t+1,i} \leftarrow w_{t,i}\beta_t^{1-|h_t(x_i)-y_i|}$$
这里 $\beta_t = \frac{\epsilon_t}{1-\epsilon_t} < 1$。
- 如果分对了(指数为 1),权重乘以 $\beta_t$(变小)。
- 如果分错了(指数为 0),权重不变(相对变大)。
1.2.2.3 构建强分类器
“4. The final strong classifier is”
经过 $T$ 轮训练后,我们选出了 $T$ 个最佳的弱分类器。现在要把它们合并起来。
加权投票 (Weighted Voting):
并不是每个弱分类器的话语权都一样。如果你在训练时错误率低,你的话语权就大。
- 话语权权重 ($\alpha_t$): $\alpha_t = \log \frac{1}{\beta_t}$。错误率 $\epsilon$ 越低,$\beta$ 越小,$\alpha$ 就越大。
最终决策公式:
$$H(x) = \begin{cases} 1 & \sum_{t=1}^T \alpha_t h_t(x) > \frac{1}{2} \sum_{t=1}^T \alpha_t \ 0 & \text{otherwise} \end{cases}$$
也就是:让所有弱分类器投票,票数要乘以它们的话语权。如果加权后的总票数超过了总权重的一半,就最终判定为“是人脸”。
1.2.3 级联结构
即便有了积分图和 Boosting,如果对图像中每一个滑动窗口都计算几百个特征还是很慢,因为图像中绝大部分区域都是背景(非人脸)
- 设计理念:尽快拒绝非人脸窗口 。
- 级联工作原理:
- 将强分类器串联成多个阶段 (Stage 1, Stage 2, … Stage N)。
- Stage 1:非常简单(可能只有 1-2 个特征),计算极快。它的阈值设置得很宽松,能通过几乎所有的人脸,但能剔除 50% 的明显非人脸背景。
- 后续 Stage:越来越复杂,特征越来越多。
- 结果:
- 如果一个窗口在 Stage 1 被判定为“非人脸”,直接拒绝 (Reject),不再进行后续计算。
- 只有极少数像人脸的复杂窗口会通过所有阶段。
- 如果级联有 10 层,每层检测率 0.99,误报率 0.3。最终的总检测率为 $0.99 ^{10}\approx 0.9$,而误报率降低到 $0.3^{10} \approx 6 \times 10^{-6}$
2. Pedestrian Detection
2.1 Dalal-Triggs
行人检测(Pedestrian Detection)主要介绍的是 2005 年提出的经典算法:Dalal-Triggs 算法。
这个算法在计算机视觉历史上具有里程碑意义,它证明了使用梯度统计特征可以非常有效地检测具有特定形状的物体(如站立的人)。
2.1.1 核心算法:Dalal-Triggs (CVPR 2005)
课件中提到的核心方法是 HOG + Linear SVM。这一组合在当年显著提升了行人检测的准确率。
2.1.2 核心特征:HOG
HOG (Histograms of Oriented Gradients) 是该方法的灵魂 。
- 设计原理:行人的外观和形状可以通过局部梯度的分布(边缘的方向和强度)来很好地描述,即使不知道具体的边缘位置。
- 计算细节 :
- 检测窗口:固定大小为 64x128 像素。
- 细胞单元 (Cell):将图像分割成 8x8 像素的小方格。
- 梯度投票:在每个 Cell 内,计算每个像素的梯度方向,并投到一个 9 个区间的直方图(Bin)中。这捕捉了局部的形状信息。
- 块归一化 (Block Normalization):为了消除光照和对比度的影响,将几个 Cell 组合成一个 Block (16x16 像素),在 Block 范围内进行归一化。
- 重叠 (Overlapping):Block 之间是有重叠的,这增加了描述的冗余度和鲁棒性。
- 特征维度:一个 64x128 的窗口最终会生成一个长度为 3780 维的特征向量。
2.1.3 分类器:线性 SVM
- 提取出 HOG 特征后,课件 指出使用 线性 SVM (支持向量机) 对窗口进行打分。
- 模板可视化 :SVM 学习到的其实是一个“行人模板”(Template)。Slide 54 中间那个看起来像是一个模糊发光的“鬼影”图片,就是 SVM 学习到的权重可视化。如果图像区域的梯度分布与这个模板匹配,得分就会很高。
2.1.4 检测流程
- 滑动窗口与多尺度 (Sliding Window & Multi-scale):
- 在图像的不同位置和不同缩放尺度(HOG Pyramid)上,截取 64x128 的窗口。
- 特征提取:
- 计算每个窗口内的 HOG 特征。
- 分类评分:
- 用训练好的线性 SVM 分类器计算得分。
- 非极大值抑制 (Non-maxima Suppression, NMS):
- 由于滑动窗口会在同一个行人周围产生多个重叠的高分框,NMS 的作用是去除重叠的框,只保留得分最高的那一个,从而得到最终的检测结果。
2.1.5 特点与局限
- 优点 :
- 对于非刚性但有固定朝向的物体(如站立、行走的行人)效果非常好。
- HOG 特征对光照变化和微小的几何形变有很好的抵抗力。
- 局限性:
- 计算量依然很大(需要遍历所有窗口)。
- 对于姿态变化极大(如躺着的人)或严重遮挡的情况,检测效果会下降。
- 与人脸检测(Viola-Jones)相比,HOG 特征计算更复杂,速度较慢,但描述能力更强。
总的来说,这份课件中的行人检测展示了**“精心设计的手工特征 (HOG)”与“强分类器 (SVM)”**结合的经典范式。
2.2 改进方案
2.2.1 优势与问题
优势
- 简单有效:对于刚性(Rigid)或具有典型朝向的物体(比如正脸、站立的行人),这种居于外观描述的方法非常有效
- 易于实现:只需设计好特征(如HOG),然后训练一个分类器即可
局限性
- 计算复杂度极高 :
- 如果要在不同位置、不同比例、不同长宽比下搜索,一张图片可能需要评估 3000万次!
- 随着物体类别增加,计算成本线性增加。
- 无法处理形变 (Deformation) :
- 猫、狗这类动物姿态万千(跳跃、睡觉、奔跑),它们没有固定的 2D 形状。
- 传统的滑动窗口假设物体像一个刚性的“砖块”,无法适应这些变化。
- 丢失上下文 (Context Lost) :
- 分类器只盯着一个小窗口看,不知道周围是街道还是天空,容易产生误判。
- 遮挡问题 :
- 由于依赖全局特征,如果物体被遮住了一半,整体特征就会大变,导致检测失败。
2.2.2 DPM模型
核心理念
- 化零为整:将物体拆解为若干个部件(Part)
- 弹簧模型:模型根据根滤波器(Root filter)和若干个部件滤波器
- 允许移动:部件相对于根位置是可以移动的,这种移动有一定代价,只要部件不拉的太远,都被认为是一个物体
意义:这使得检测器能适应人体的各种动作,不再死板地要求人必须像“兵马俑”一样站的笔直
2.2.3 Object Proposals
为了解决滑动窗口计算量太大的问题,引入了 Object Proposals(物体候选框) 的概念。
- 核心理念 :
- 不要在整张图上漫无目的地做几百万次分类。
- 先用一种通用的、类别无关的方法,快速找出图像中“像是一个物体”的区域(Proposals)。
- 然后只把这些少量的区域(比如 1000-2000 个)送给分类器去判断“这是什么”。
- 如何判断“像不像物体” (Objectness) :
- 利用图像本身的低级特征,不需要训练复杂的分类器:
- 显著性 (Saliency):这块区域是不是很吸睛?
- 颜色对比度 (Color Contrast):这块区域颜色是不是和周围不一样?
- 边缘密度 (Edge Density):这块区域纹理是不是很丰富?
- 超像素跨度 (Superpixel straddling):物体通常拥有闭合的边界。
- 利用图像本身的低级特征,不需要训练复杂的分类器:
- 意义:这极大地缩小了搜索空间,从几百万次计算减少到几千次,是后来 R-CNN 等早期深度学习目标检测算法的基础思路。