ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DLBP+PCA+SVM人脸识别:局部纹理与全局降维组合方法解析

DLBP+PCA+SVM人脸识别:局部纹理与全局降维组合方法解析 简介一份基于DLBP、PCA与SVM组合算法的人脸识别参考文献适合计算机视觉、模式识别方向的研究生和算法工程师用于理解特征提取与分类器融合在人脸识别中的典型应用。文档针对传统全局特征受姿态、光照影响大、局部特征识别率偏低的问题提出先对分块图像统计高频LBP模式再经PCA降维最后由SVM分类的完整流程。实验在ORL人脸库上验证相比LBPSVM、PCASVM、LBPPCASVM等方法判别能力和鲁棒性更强识别率更高。资源为1个PDF文件压缩包大小793KB内容包含LBP算子原理、DLBP特征提取步骤、PCA降维与SVM分类的公式推导和实验对比可直接作为论文参考或算法设计依据。目前已有226人学习浏览对于需要快速把握局部与全局特征融合思路的读者具有较好参考价值。1. 门禁场景里反复踩坑后再看 DLBPPCASVM 这条组合链路做过人脸识别落地的人都有体会算法选型往往不是瓶颈特征不稳定才是。同一个人的脸上午侧光、下午顶光、戴眼镜、换发型单靠全局特征PCA、ICA这类识别率掉得很快单靠局部特征LBP、Gabor这类又对表情和遮挡敏感。做门禁或考勤这类小样本识别时一个比较务实的路线是把局部纹理特征和全局降维手段串起来先用 DLBP 把 LBP 直方图里出现频率较高的模式挑出来再用 PCA 压维最后交给 SVM 做多分类。这套组合在 ORL 库上的识别率做到了 97.0%比 LBPPCASVM 的 94.5% 高出 2.5 个百分点。识别率提升的关键不在某个单点算法而在于 DLBP 对 LBP 模式做了截断筛选、PCA 做了线性去相关SVM 在小样本分类上有天然优势。这篇博文把这套方法的原理、实现参数和复现时的坑讲清楚适合正在做毕业设计、算法竞赛或小型人脸识别项目的人参考。2. DLBP 特征提取从 LBP 算子到 80% 高频模式筛选2.1 基础 LBP 算子的计算方式局部二值模式LBP最初由 Ojala 等人提出用来度量图像的局部对比度。它的核心操作很简单在一个 n×n 邻域内用中心像素的灰度值做阈值把邻域像素二值化再按位加权求和。以最常见的 3×3 窗口为例中心像素值为 6周围 8 个像素灰度值分别为 6、5、2、1、7、8、9、7从左上角开始顺时针比较大于等于中心值记 1否则记 0得到二进制序列 10001111。按 2 的幂次加权LBP 值 1 16 32 64 128 241。用 Python 实现这个计算过程只需要十几行代码import numpy as np def basic_lbp(image, x, y): 计算 3x3 邻域内单个像素的 LBP 值 image: 灰度图dtypenp.uint8 x, y: 中心像素坐标 center image[y, x] # 按顺时针顺序取 8 个邻域像素 offsets [(-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1)] binary 0 for i, (dy, dx) in enumerate(offsets): neighbor image[y dy, x dx] if neighbor center: binary | (1 i) # 第 i 位设为 1 return binary这段代码里offsets定义了顺时针的邻域偏移顺序1 i把二值位放到对应权重位。注意循环边界问题实际使用时需要对图像边缘做 padding 或直接忽略边界像素。基础 LBP 的输出范围是 0 到 255但这个原始输出的直方图通常很稀疏直接做分类效果并不理想所以工程上几乎不用原始 LBP 值而是用统一模式或旋转不变模式。2.2 圆形邻域、统一模式与旋转不变模式原始 LBP 只覆盖 3×3 邻域无法提取大尺度纹理特征。Ojala 后来把邻域扩展成圆形半径为 R 的圆周上均匀取 P 个采样点。R 和 P 的选择直接影响特征表达能力常见的组合有 P8、R1P8、R2 和 P16、R2。R 越大采样点之间的相关性越小能覆盖的纹理尺度越大但如果 R 太大采样点之间的信息冗余度低反而容易引入噪声。PR输出模式数适用场景81256原始细纹理、边缘细节适合小尺寸人脸82256原始中等尺度纹理抗噪声能力增强16265536原始大尺度纹理但直方图极度稀疏原始 LBP 有个问题当 P8 时输出有 256 种直方图维度高且稀疏。统一模式Uniform Pattern通过统计二进制序列中 0/1 跳变的次数 U 来压缩输出。U≤2 的模式称为统一模式P8 时统一模式只有 58 种再加上一个非统一模式类别总共映射成 59 维。旋转不变模式则是把二进制序列循环右移 i 位取所有移位结果中的最小值这样同一个纹理在不同旋转角度下得到相同的 LBP 值解决旋转敏感问题。旋转不变统一模式进一步结合两者输出的模式数压缩到 P(P−1)3 个。2.3 DLBP 的分块统计与累计 80% 模式筛选DLBPDominant LBP显性局部二值模式的思路和统一模式不同。Liao 在 2009 年注意到统一模式忽略了交叉点、大曲率角点这些判别力很强的模式于是换了个方向先统计整块图像里所有 LBP 模式的出现频率按频率降序排列保留累计频率达到 80% 的模式其余的丢弃。这样做的好处是尽量保留高频的、有判别力的模式同时砍掉长尾稀疏模式降低特征维度。具体操作分三步。第一步把一张 112×92 的人脸图像分成若干块常见做法是分成 4×4 或 7×7 的网格分块数量需要实验确定。第二步对每个分块统计 LBP 直方图按频率排序后累积到 80%只保留这些模式。第三步把所有分块截断后的直方图首尾拼接成一条长向量作为整张人脸的纹理特征。def dlbp_histogram(lbp_map, block_size16, threshold0.8): 对 LBP 图做分块统计保留累计频率达到 threshold 的显性模式 lbp_map: 整张图的 LBP 编码图 block_size: 每个分块的边长 threshold: 累计频率阈值论文取 0.8 h, w lbp_map.shape features [] for y in range(0, h, block_size): for x in range(0, w, block_size): block lbp_map[y:yblock_size, x:xblock_size] hist np.bincount(block.ravel(), minlength256) hist hist / hist.sum() # 归一化为频率 # 按频率降序排列累计到 threshold sorted_idx np.argsort(hist)[::-1] cumsum np.cumsum(hist[sorted_idx]) keep sorted_idx[cumsum threshold] # 只保留显性模式其余置零 truncated np.zeros_like(hist) truncated[keep] hist[keep] features.append(truncated) return np.concatenate(features)这段代码里np.bincount统计每个 LBP 模式的出现次数argsort按频率降序排列cumsum计算累计频率保留累计频率不超过 80% 的模式。注意truncated[keep] hist[keep]这一步保留了原始频率值而不是二值标记目的是让 SVM 在计算距离时能用上频率信息。分块大小是个关键参数分块太小则每个块的样本点少直方图不稳定分块太大则丢失局部性。论文用 3×3 的 LBP 邻域一般建议块大小设为 16×16 到 32×32 之间具体可结合图像尺寸和分块数来定。3. PCA 降维把 DLBP 高维直方图压到 80 维主成分3.1 PCA 的数学原理与计算流程主成分分析PCA是一种线性降维方法目标是在尽量保留原始数据方差的前提下把高维样本投影到低维空间。在人脸识别里PCA 的输入可以是原始像素也可以是前面 DLBP 提取的纹理特征。论文里用的是后者。计算流程分四步先求所有训练样本的均值向量 m再算协方差矩阵 S然后对 S 做特征值分解按特征值从大到小取前 k 个特征向量组成投影矩阵 W最后把每个样本减去均值后乘以 W得到投影系数 Y。协方差矩阵的计算公式为 S (1/n)Σ(xᵢ−m)(xᵢ−m)ᵀ其中 n 是样本数xᵢ 是第 i 个样本的特征向量。特征值 λ₁ ≥ λ₂ ≥ … ≥ λₖ 对应的特征向量就是主成分方向特征值越大表示该方向上的数据方差越大信息量越多。用 Sklearn 实现非常直接from sklearn.decomposition import PCA # X_train: shape (n_samples, n_features)DLBP 提取的纹理特征矩阵 pca PCA(n_components80) # 保留前 80 个主成分 X_train_pca pca.fit_transform(X_train) X_test_pca pca.transform(X_test) # 查看累计方差贡献率判断 80 维是否足够 cumsum_ratio np.cumsum(pca.explained_variance_ratio_) print(f前 80 维累计方差贡献率: {cumsum_ratio[-1]:.4f})fit_transform在训练集上拟合并投影transform用同样的投影矩阵处理测试集这一步不能对测试集单独 fit否则投影方向不一致。explained_variance_ratio_返回每个主成分解释的方差比例累计值可以用来判断降维维度是否合理。3.2 为什么先做 DLBP 再做 PCA而不是直接 PCA直接对原始像素做 PCA 就是经典的 Eigenface 方法但这套方案对光照和姿态变化很敏感因为像素级的全局统计会把光照差异也当成主成分保留下来。而 DLBP 提取的是局部纹理统计量本身已经对光照变化有较强的鲁棒性。在 DLBP 特征上再做 PCA目的不是提取纹理而是解决两个问题一是 DLBP 拼接后的特征维度依然偏高一个 4×4 分块、每块 59 维统一模式特征的维度就是 944 维直接训练 SVM 慢二是 DLBP 各分块直方图之间存在线性相关性PCA 通过正交变换去除了这种冗余让保留下来的特征相互独立。论文里的逻辑是LBP 提取局部纹理PCA 补全全局纹理信息SVM 做分类判别。DLBP 单独使用时会丢失图像的全局纹理结构而 PCA 从所有分块的统计特征里提取出全局的主成分方向两者互补。需要注意这里 PCA 的输入不是原始像素而是纹理特征的向量化表示所以它补全的不是像素层面的全局信息而是特征分布层面的全局相关性。3.3 主成分维度的选择与实验对比PCA 的维度 k 是一个需要调的参数。k 太小会丢失判别信息k 太大则保留了噪声而且 SVM 在高维空间容易过拟合。论文实验里固定 PCA 维数为 80在 ORL 库上效果最好。实际复现时可以用累计方差贡献率来辅助选择累计方差贡献率主成分维度对识别率的影响90%约 40 维特征过于压缩识别率下降明显95%约 60 维识别率接近峰值训练速度快99%约 100 维识别率最高但接近饱和训练时间增加选择维度时我一般会先画一条累计方差贡献率曲线找拐点附近的值再在拐点前后各取几个值做交叉验证。以 ORL 库为例80 维大约覆盖了 90% 以上的方差。主成分维度对最终识别率的影响比想象中大维度不足时 SVM 没有足够的信息撑起分类边界维度太高时又放大了 DLBP 截断后残存的噪声。两者之间的平衡通常要靠实验确定没有统一的最优值。4. SVM 分类层多分类策略与核函数选择4.1 SVM 的最优超平面与对偶问题支持向量机SVM的核心思想是在特征空间中寻找一个最优分类超平面使得两类样本之间的间隔最大化。对线性可分的情况超平面记作 w·x b 0约束条件为 yᵢ(w·xᵢ b) ≥ 1。目标函数是最小化 ||w||²/2这等价于最大化分类间隔 2/||w||。求解这个带约束的二次规划问题需要引入 Lagrange 乘子 αᵢ构造 Lagrange 函数后转化为对偶问题。对偶问题的好处是目标函数只涉及样本间的内积为引入核函数铺平了路。最优分类函数的形式是 f(x) sgn(ΣαᵢyᵢK(xᵢ,x) b)其中 K(xᵢ,x) 是核函数。非线性情况下SVM 通过核函数把输入向量映射到高维特征空间在高维空间里构造线性超平面。对人脸识别这类高维小样本问题SVM 的结构风险最小化原则比经验风险最小化更有优势这也是它比 KNN 分类器更适合做小样本识别的原因。4.2 多分类策略一对多还是一对一标准 SVM 只能处理二分类问题而 ORL 库有 40 个人属于多分类问题。多分类有两种主流策略一对多one-against-all和一对一one-against-one。一对多策略对每个类别构造一个二分类器第 i 个分类器把第 i 类样本作为正样本其余全部作为负样本总共构造 K 个分类器。一对一策略则在任意两类之间构造二分类器总共构造 K(K−1)/2 个分类器最后用投票法决定样本归属。策略分类器数量K40优点缺点一对多40分类器数量少预测速度快每个分类器负样本太多类不平衡严重一对一780每个分类器只用两类样本训练快不平衡问题小分类器数量多预测时需全部跑一遍论文采用了一对一策略原因很直接ORL 库每人只有 10 张图训练样本少一对多方式下每个分类器的负样本是正样本的 39 倍严重类不平衡会让分类边界偏向负类。一对一虽然分类器数量多但每个分类器只接触两类数据训练速度快投票机制也相对稳定。from sklearn.svm import SVC svm SVC(kernellinear, C1.0, decision_function_shapeovo) svm.fit(X_train_pca, y_train) y_pred svm.predict(X_test_pca) from sklearn.metrics import accuracy_score acc accuracy_score(y_test, y_pred) print(fSVM 识别率: {acc:.3f})decision_function_shapeovo显式指定一对一策略Sklearn 内部会构造 K(K−1)/2 个二分类器并做投票。C1.0是默认值C 越小对误分类的惩罚越低边界越平滑C 越大越容易过拟合。人脸特征经过 PCA 降维后通常是近似线性可分的用线性核就够。4.3 核函数选择与参数 C 的影响SVM 的核函数选择直接影响分类边界形状。线性核对 PCA 降维后的特征通常表现不错训练速度快RBF 核能拟合非线性边界但在小样本下容易过拟合而且多了一个 γ 参数要调。GLBP 特征加 PCA 降维这个组合特征的线性可分性已经比较强所以论文实验里用线性核就拿到了 97.0% 的结果。如果换 RBF 核需要额外调 C 和 γ 两个参数训练时间也会显著增加。参数 C 的选择逻辑是C 过大时模型对训练样本的拟合度过高把噪声也学进去了测试集上泛化能力下降C 过小时模型欠拟合分类边界太宽松。复现时可以在 {0.1, 1, 10, 100} 这几个量级上做交叉验证。另外特征缩放对 SVM 的影响很大PCA 投影后的特征各维度方差差异大建议先做标准化否则距离计算会被大尺度维度主导。Sklearn 里可以用StandardScaler或直接在 PCA 时设置whitenTrue。5. ORL 库复现与调参从 94.5% 到 97.0% 的关键细节5.1 ORL 库的实验设置与 baseline 对比ORL 人脸库包含 40 个人的 400 张图像每人 10 张图像尺寸 112×92拍摄条件覆盖了不同视角、不同时间和不同的面部细节长发/短发、微笑/生气。复现时需要在训练集和测试集数目相等的情况下比较。论文在邻域大小 3×3、PCA 维数 80 的条件下对比了多个特征提取方法和分类器的组合特征提取 分类器识别率LBP KNN93.5%LBP SVM94.0%PCA KNN91.5%PCA SVM85.5%LBP PCA SVM94.5%DLBP PCA SVM97.0%注意 PCASVM 只有 85.5%比 PCAKNN 还低不少这说明直接对原始像素做 PCA 后SVM 的分类边界并不适合这种高维投影特征。而 DLBP 把 LBP 直方图截断后再接 PCASVM识别率比 LBPPCASVM 还高 2.5 个百分点说明排除低频长尾模式确实对分类器有帮助。5.2 训练样本数量对识别率的影响对比实验中训练样本分别取每人前 5、6、7 张图共 200、240、280 张剩余图像做测试。识别率随训练样本数增加呈上升趋势且 DLBPPCASVM 在每个样本数量档位上都高于 LBPPCASVM。训练样本从 5 张增加到 7 张时DLBPPCASVM 的提升幅度比 LBPPCASVM 更明显说明 DLBP 截断后的特征在小样本下更容易学到稳定的分类边界。复现时建议按 5:5、6:4、7:3 三组比例做对比每组随机打乱多次取平均避免单次划分带来的偏差。5.3 复现时的几个坑复现这套流程最容易出问题的地方是分块数不匹配、PCA 维度和特征拼接顺序不一致。分块数不同会导致特征向量长度不同比如 4×4 分块加 59 维统一模式特征单张图特征长度是 16×599447×7 分块则是 49×592891。PCA 的 n_components 要小于训练样本数否则协方差矩阵奇异。SVM 的 C 值默认 1.0 在多数情况下可用但配合标准化之后效果会更好。参数论文取值推荐调参范围说明LBP 邻域3×33×3 或 5×5邻域越大纹理尺度越大但直方图更稀疏DLBP 累计频率80%70% ~ 90%阈值太高失去截断意义太低丢判别信息PCA 维度8060 ~ 120看累计方差贡献率拐点附近找最优SVM 核函数线性核linear / rbf线性核优先RBF 需调 C 和 γSVM 多分类策略一对一ovo / ovr小样本多用 ovo类多时 ovr 更快最后一个细节LBP 特征拼接顺序要和训练测试保持一致。如果训练时按行优先拼接分块直方图测试时也必须按行优先否则 SVM 拿到的特征顺序错位识别率会断崖式下降。做归一化时要在训练集上计算均值和方差再用同样的参数处理测试集不能整个数据集一起 fit否则会引入测试集的信息泄漏识别率虚高。训练样本随机打乱后固定随机种子能保证实验可复现。本文还有配套的精品资源点击获取
返回列表