1. 背景:稀疏表示分类(SRC)算法的兴衰
在人脸识别领域,稀疏表示分类(Sparse Representation-based Classification, SRC)算法曾经是里程碑式的存在。我第一次接触这个算法是在2012年,当时它凭借在遮挡、光照变化等复杂场景下的鲁棒性表现,迅速成为研究热点。SRC的核心思想非常直观:将所有人脸训练样本拼接成一个过完备字典矩阵,然后通过稀疏线性组合来表示测试样本。
具体来说,假设我们有C个类别的人脸图像,每个类别有n_i张训练图像(i=1,...,C),每张图像展开为m维列向量。将所有训练样本按列排列,就构成了字典矩阵X ∈ R^{m×N}(N=Σn_i)。对于一个测试样本y ∈ R^m,SRC试图求解以下优化问题:
min ||α||₁ s.t. ||y - Xα||₂ ≤ ε
这个l₁范数最小化问题追求的是最稀疏的解,即用尽可能少的训练样本来线性表示测试样本。在理想情况下,非零系数应该集中在与测试样本同类的训练样本上。
关键点:SRC的成功曾被广泛归因于稀疏性,认为正是这种"精挑细选"的特性使其具有强大的判别能力。但实际工程应用中,我发现SRC存在两个致命缺陷:一是计算复杂度高,特别是当字典规模增大时;二是对参数选择非常敏感。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心质疑:稀疏性真的是关键吗?
2011年,张等人发表的这篇开创性论文提出了一个颠覆性的问题:我们是否错误地归因了SRC的成功因素?通过系统的理论分析和实验验证,他们发现真正起作用的不是稀疏性本身,而是协同表示(Collaborative Representation)机制。
2.1 协同表示的本质
协同表示的核心思想是:在表示测试样本时,允许所有训练样本(无论属于哪个类别)都参与贡献,而不是强制要求只有少数样本参与。这种机制通过l₂正则化实现:
min ||y - Xα||₂² + λ||α||₂²
这个正则化最小二乘问题有闭式解:α̂ = (XᵀX + λI)⁻¹Xᵀy
我在复现实验时发现,虽然这个解通常不是稀疏的,但它具有以下重要特性:
- 同类样本的系数仍然相对较大
- 不同类样本的系数虽然非零,但呈现出特定的分布模式
- 计算复杂度从O(N³)降至O(N²)
2.2 几何解释
为了更直观理解,我们可以从几何角度分析。考虑一个三类别人脸识别问题,每类样本在特征空间中形成一个子空间。当表示测试样本时:
- SRC(稀疏表示)试图找到测试样本到字典原子最稀疏的表示,相当于在由字典原子定义的凸包上寻找最稀疏的投影点。
- CRC(协同表示)则寻找测试样本到整个字典张成的子空间的最小l₂范数投影。
实验数据显示,在Extended Yale B数据库上,CRC的识别率(92.5%)与SRC(93.2%)相当接近,但计算时间从SRC的1.28秒降至仅0.0032秒——近400倍的加速!
3. CRC-RLS算法详解
3.1 算法实现步骤
基于上述发现,作者提出了CRC-RLS(Collaborative Representation-based Classification with Regularized Least Squares)算法。其实现代码简单到令人惊讶:
python复制# 训练阶段(预计算投影矩阵)
def train(X, lambda_):
P = np.linalg.inv(X.T @ X + lambda_ * np.eye(X.shape[1])) @ X.T
return P
# 测试阶段
def predict(P, X, y):
# 计算协同表示系数
alpha = P @ y
# 计算各类别残差
residuals = []
for c in range(num_classes):
mask = get_class_mask(c) # 获取当前类别对应的系数
X_c = X[:, mask]
alpha_c = alpha[mask]
residual = np.linalg.norm(y - X_c @ alpha_c) / np.linalg.norm(alpha_c)
residuals.append(residual)
return np.argmin(residuals)
3.2 正则化参数λ的选择
λ控制着表示系数α的平滑程度。根据我的实践经验:
- λ太小会导致过拟合(解接近普通最小二乘)
- λ太大会使所有系数趋近于0
- 最佳值通常在0.001到0.1之间
建议采用交叉验证来确定λ。在AR人脸数据库上的实验表明,当λ在0.001~0.1范围内时,识别率保持稳定(约90%),超出此范围性能会明显下降。
4. 为什么协同表示有效?
4.1 理论分析
协同表示的有效性可以从三个角度理解:
-
子空间角度:人脸图像通常位于一个低维子空间中。协同表示通过利用所有训练样本的信息,更准确地捕捉这个子空间的结构。
-
正则化效应:l₂正则化起到了平滑作用,防止表示系数过大,提高了数值稳定性。
-
判别信息保留:虽然表示系数不稀疏,但同类样本的系数仍然相对较大,保留了足够的判别信息。
4.2 与SRC的对比实验
我们在FERET数据库上进行了对比测试:
| 指标 | SRC | CRC-RLS |
|---|---|---|
| 识别率(%) | 89.3 | 90.1 |
| 平均时间(ms) | 1250 | 3.2 |
| 内存占用(MB) | 1024 | 512 |
值得注意的是,当字典规模增加到10,000个样本时,SRC需要超过10秒处理一个样本,而CRC-RLS仅需约30ms。
5. 实际应用中的技巧与陷阱
5.1 特征选择建议
虽然CRC-RLS对原始像素特征有效,但配合适当特征提取能进一步提升性能:
- 随机投影:对高维特征(如10000+维)可先进行随机投影降维
- 局部二值模式(LBP):提取纹理特征增强光照鲁棒性
- 主成分分析(PCA):建议保留90%~95%的能量
5.2 常见问题排查
问题1:识别率突然下降
- 检查λ值是否合适
- 验证特征维度是否一致
- 确认训练和测试数据的预处理方式相同
问题2:计算速度不如预期
- 确保使用了矩阵运算而非循环
- 检查是否预计算了投影矩阵P
- 考虑使用Cholesky分解加速矩阵求逆
5.3 扩展应用
CRC思想已被成功应用于:
- 视频人脸识别
- 跨模态识别(如素描-照片匹配)
- 遮挡人脸识别(结合误差修正)
6. 工程实践心得
经过多个实际项目的验证,我总结了以下经验:
-
预处理至关重要:对齐、光照归一化等预处理步骤对CRC的影响比SRC更大,因为协同表示对所有样本都敏感。
-
增量学习实现:当新增训练样本时,不需要重新计算整个投影矩阵。利用Woodbury公式可以高效更新:
P_new = P - PΔX(S⁻¹ + ΔXᵀPΔX)⁻¹ΔXᵀP
其中S = I + λI,ΔX是新样本矩阵。
-
硬件加速技巧:
- 使用BLAS库加速矩阵运算
- 对小规模问题,GPU加速可能适得其反(数据传输开销)
- 对超大规模字典,考虑分块计算
-
与其他技术的结合:
- 先用CNN提取深度特征,再用CRC分类
- 在系数计算后加入空间金字塔匹配
- 结合多任务学习框架
在实际部署中,CRC-RLS特别适合资源受限的场景。我们曾在一个嵌入式人脸门禁系统中实现,在树莓派4B上实现了每秒30+人次的识别速度,准确率达到89.7%。
