2、传统人脸检测方法:基于Haar特征的级联分类器(Viola-Jones算法)、HOG特征+SVM、DPM模型

聊到人脸检测,很多人第一反应就是深度学习。但说实话,在深度学习火起来之前,传统方法已经把这个领域玩得很转了。我入行那会儿,Viola-Jones 几乎是人脸检测的代名词,后来 HOG+SVM 在行人检测上大杀四方,DPM 又把部件模型推到了巅峰。今天咱们就把这三板斧掰开揉碎,看看它们到底是怎么工作的。

2.1 基于 Haar 特征的级联分类器(Viola-Jones)

2001 年,Paul Viola 和 Michael Jones 搞出了一个实时人脸检测算法,速度比当时的方法快了几十倍。我第一次在 OpenCV 里跑这个算法时,心里就一个想法:这玩意儿怎么这么快?

2.1.1 Haar 特征:不是像素,是区域对比

Haar 特征说白了就是计算图像中相邻矩形区域的像素和之差。它不关心单个像素值,而是关注明暗变化模式。比如眼睛区域通常比脸颊暗,鼻梁比两侧亮——这些对比关系就是 Haar 特征要捕捉的。

特征类型 形状 典型应用
边缘特征 2 矩形(左右/上下) 检测垂直/水平边缘
线特征 3 矩形(中间亮两边暗) 检测鼻梁、眉骨
中心环绕特征 4 矩形(中心暗四周亮) 检测眼睛区域

嗯,这里要注意:一张 24×24 的窗口里,Haar 特征的数量能到 16 万多个。全算一遍?那肯定不行。Viola-Jones 用了一个叫「积分图」的技巧,让任意矩形区域的像素和计算变成 O(1) 复杂度。我当年手写积分图时踩过一个坑——边界处理没做好,结果特征值全偏了。

积分图核心思想:在位置 (x,y) 处的积分图值等于原图左上角到 (x,y) 区域所有像素之和。计算任意矩形区域的和,只需要查 4 个积分图值做加减法。

2.1.2 AdaBoost:从弱到强的进化

特征太多,但大部分是没用的。AdaBoost 的作用就是从海量特征里挑出最有区分力的那几百个,组合成一个强分类器。它的训练过程很有意思:

  1. 给每个训练样本赋一个初始权重
  2. 每一轮训练一个弱分类器(其实就是单个 Haar 特征 + 阈值)
  3. 计算这个弱分类器的错误率,更新样本权重——分错的样本权重变大
  4. 下一轮重点关注那些难分样本
  5. 最终把 T 轮弱分类器加权组合成强分类器

我曾经在一个项目里试过只用 200 个特征,检测率掉得厉害。后来加到 1000 个特征,效果才稳定下来。这个数量没有固定标准,得根据你的场景调。

2.1.3 级联结构:快速拒绝的艺术

这才是 Viola-Jones 的精髓。级联结构把多个强分类器串起来,前几层用少量特征快速排除掉大部分非人脸区域。你想想看,一张图像里 99% 的区域都不是人脸,如果每个区域都跑一遍完整分类器,那效率得多低?

我的经验:级联的前 1-2 层通常只用 1-2 个特征,就能排除掉 50% 以上的非人脸窗口。后面几层逐渐增加特征数量,处理那些「看起来像人脸」的候选区域。这种「粗筛 + 精判」的思路,后来在很多检测任务里都能看到影子。

级联的层数和每层的特征数怎么定?我记得有一次做嵌入式项目,计算资源有限,我把级联从 20 层砍到 12 层,速度提了 40%,但误检率也翻了一倍。这就是典型的 trade-off。

2.1.4 滑动窗口 + 多尺度检测

实际检测时,算法用一个固定大小的窗口(比如 24×24)在图像上滑动,每个位置都提取 Haar 特征并送入级联分类器。为了检测不同大小的人脸,需要对图像做多尺度缩放——通常每次缩小 1.1 到 1.5 倍,形成一个图像金字塔。

避坑指南:我曾经在低光照条件下用 Viola-Jones 检测人脸,发现漏检率特别高。后来分析发现,Haar 特征对光照变化很敏感。解决办法是在检测前做直方图均衡化,或者用光照归一化预处理。另外,人脸倾斜超过 15 度时,检测效果也会明显下降——因为 Haar 特征本身不具备旋转不变性。

2.2 HOG 特征 + SVM

2005 年,Navneet Dalal 和 Bill Triggs 在 CVPR 上发表了 HOG(方向梯度直方图)用于行人检测。这个方法后来被广泛用到人脸检测上。我个人觉得,HOG 比 Haar 特征更「聪明」——它捕捉的是局部形状信息,而不是简单的明暗对比。

2.2.1 HOG 特征提取流程

HOG 的核心思想是:物体的局部外观和形状,可以通过局部梯度方向的分布来描述。说白了,就是看图像里每个小区域的边缘方向是什么样子的。

  1. 计算梯度:用 [-1,0,1] 和 [-1,0,1]^T 算子计算每个像素的梯度幅值和方向
  2. 划分 cell:把图像分成 8×8 像素的小格子
  3. 统计梯度方向直方图:每个 cell 统计 9 个 bin(0-180 度,每 20 度一个 bin)
  4. block 归一化:把 2×2 个 cell 组成一个 block,在 block 内做 L2 归一化
  5. 串联特征:把所有 block 的特征向量串联起来,得到最终的 HOG 特征

一张 64×128 的行人检测图像,HOG 特征维度大约是 3780 维。我第一次算这个数字时还愣了一下——怎么这么多?后来想想,每个 block 有 4 个 cell × 9 个 bin = 36 维,图像里有 105 个 block,36×105=3780,没毛病。

2.2.2 SVM 分类器

HOG 特征提取出来后,用线性 SVM 做分类。SVM 的目标是找到一个超平面,把正负样本分开,同时让间隔最大化。为什么用线性 SVM 而不是核 SVM?说白了,HOG 特征维度高、样本量大,线性 SVM 训练快、泛化能力也不错。

关键参数:SVM 的 C 值控制着对误分类的惩罚力度。C 越大,训练集上的分类越准,但容易过拟合。我一般从 C=0.1 开始调,用交叉验证选最优值。另外,HOG 的 cell 大小和 block 大小对检测效果影响很大——cell 太小特征太细,容易受噪声干扰;cell 太大又丢失细节。8×8 是个比较稳妥的起点。

2.2.3 HOG vs Haar:谁更胜一筹?

对比维度 Haar 特征 + 级联 HOG + SVM
特征本质 区域明暗对比 局部梯度方向分布
光照鲁棒性 较差 较好(归一化后)
旋转鲁棒性 差 差(需多角度训练)
检测速度 极快(级联加速) 较慢(特征计算量大)
训练速度 慢(特征选择耗时长) 快(直接提取特征训练)
典型应用 实时人脸检测 行人检测、通用目标检测

我在实际项目中用过 HOG+SVM 做正面人脸检测,效果比 Viola-Jones 好一些,尤其是光照变化大的场景。但速度确实慢,在手机上跑不起来。所以选哪个,得看你的场景是重速度还是重精度。

2.3 DPM 模型(可变形部件模型)

2008 年,Pedro Felzenszwalb 提出了 DPM(Deformable Parts Model),连续三年拿下 PASCAL VOC 检测冠军。DPM 的思路很优雅:一个目标可以看成是由多个部件组成的,部件之间可以有相对位置变化。比如人脸,可以分解成眼睛、鼻子、嘴巴等部件,这些部件的位置关系不是固定的——有的人眼睛间距大,有的人鼻子高——但整体上有一个「可变形」的约束。

2.3.1 DPM 的核心结构

DPM 模型包含两部分:

  • 根滤波器(Root Filter):覆盖整个目标,分辨率较低,负责粗定位
  • 部件滤波器(Part Filters):覆盖目标的各个部件,分辨率是根滤波器的 2 倍,负责精确定位
  • 变形模型(Deformation Model):描述部件相对于根位置的偏移代价

检测时,DPM 在图像金字塔的每一层上滑动根滤波器,找到候选区域后,再在对应位置搜索部件滤波器。最终得分 = 根滤波器得分 + 部件滤波器得分 - 变形惩罚项。

我的理解:DPM 本质上是一个「弹簧模型」。每个部件通过弹簧连接到根位置,弹簧的弹性系数就是变形代价。部件偏离理想位置越远,惩罚越大。这种设计让 DPM 能容忍一定程度的目标形变,但又不会让部件乱跑。

2.3.2 训练与检测流程

DPM 的训练用的是 Latent SVM——因为部件的位置在训练时是未知的(隐变量)。训练过程需要迭代:先初始化根滤波器,然后用根滤波器检测出部件的大致位置,再更新部件滤波器和变形模型,如此反复。

检测流程相对直观:

  1. 构建图像金字塔
  2. 在每一层上计算 HOG 特征(DPM 也用 HOG 特征)
  3. 用根滤波器做卷积,得到根响应图
  4. 在根响应图的峰值位置,用部件滤波器做卷积
  5. 结合变形惩罚项,计算最终得分
  6. 对得分图做非极大值抑制(NMS),得到最终检测框

避坑指南:DPM 的检测速度是硬伤。我记得有一次在服务器上跑 DPM 人脸检测,一张 640×480 的图像要 2-3 秒。后来用了模型压缩和特征缓存,才降到 0.5 秒左右。另外,DPM 的部件数量需要根据目标复杂度来定——人脸用 3-5 个部件就够了,但如果是人体检测,可能需要 8-10 个部件。

2.4 三种方法对比总结

说了这么多,咱们用一张表把三种方法的核心差异理清楚:

方法 特征 分类器 速度 精度 形变鲁棒性
Viola-Jones Haar 特征 AdaBoost + 级联 极快 中等 差
HOG+SVM HOG 特征 线性 SVM 中等 较高 中等
DPM HOG 特征(多尺度) Latent SVM 慢 高 好

这三种方法代表了传统目标检测的三个里程碑。Viola-Jones 解决了「实时」问题,HOG+SVM 解决了「特征表达」问题,DPM 解决了「形变建模」问题。虽然现在深度学习已经全面超越了它们,但这些思想——积分图、级联加速、梯度直方图、部件模型——至今仍在很多领域发光发热。

传统人脸检测方法演进与核心流程 Viola-Jones 算法 Haar 特征提取 积分图加速计算 AdaBoost 特征选择 级联分类器快速拒绝 输出:人脸/非人脸 HOG + SVM 计算梯度幅值/方向 Cell 内统计直方图 Block 归一化 串联为 HOG 特征向量 线性 SVM 分类 DPM 模型 根滤波器粗定位 部件滤波器精定位 变形模型计算偏移 Latent SVM 训练 NMS 输出检测框 核心演进逻辑: Viola-Jones 解决实时性 → HOG+SVM 提升特征表达能力 → DPM 引入部件变形建模 三者均基于滑动窗口 + 图像金字塔,为深度学习时代的检测器奠定了方法论基础