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 的作用就是从海量特征里挑出最有区分力的那几百个,组合成一个强分类器。它的训练过程很有意思:
- 给每个训练样本赋一个初始权重
- 每一轮训练一个弱分类器(其实就是单个 Haar 特征 + 阈值)
- 计算这个弱分类器的错误率,更新样本权重——分错的样本权重变大
- 下一轮重点关注那些难分样本
- 最终把 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,0,1] 和 [-1,0,1]^T 算子计算每个像素的梯度幅值和方向
- 划分 cell:把图像分成 8×8 像素的小格子
- 统计梯度方向直方图:每个 cell 统计 9 个 bin(0-180 度,每 20 度一个 bin)
- block 归一化:把 2×2 个 cell 组成一个 block,在 block 内做 L2 归一化
- 串联特征:把所有 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——因为部件的位置在训练时是未知的(隐变量)。训练过程需要迭代:先初始化根滤波器,然后用根滤波器检测出部件的大致位置,再更新部件滤波器和变形模型,如此反复。
检测流程相对直观:
- 构建图像金字塔
- 在每一层上计算 HOG 特征(DPM 也用 HOG 特征)
- 用根滤波器做卷积,得到根响应图
- 在根响应图的峰值位置,用部件滤波器做卷积
- 结合变形惩罚项,计算最终得分
- 对得分图做非极大值抑制(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 解决了「形变建模」问题。虽然现在深度学习已经全面超越了它们,但这些思想——积分图、级联加速、梯度直方图、部件模型——至今仍在很多领域发光发热。