基于RealAdaBoost算法的MATLAB人脸检测系统
项目介绍
本项目是一个深度定制的计算机视觉应用,基于MATLAB环境完整复现了RealAdaBoost(Real Adaptive Boosting)算法用于人脸检测。不同于传统的Discrete AdaBoost,RealAdaBoost利用特征值的统计概率分布输出连续的置信度,从而实现了更精准的分类效果。
系统采用单一脚本架构,集成了数据合成、特征提取、模型训练、多尺度检测及后处理全流程。代码设计注重独立性,内置了合成数据生成机制,无需外部数据集即可演示完整的人脸检测逻辑,非常适合用于算法原理研究、教学演示及作为轻量级检测系统的原型。
功能特性
- 独立的运行环境:程序内置训练数据和测试数据的合成生成器,无需额外的正负样本图片文件即可直接运行。
- 高效的特征提取:采用积分图(Integral Image)技术,将Haar-like特征计算复杂度降至常数级,极大提升了训练和检测速度。
- RealAdaBoost 核心算法:实现了基于直方图统计的强分类器训练。通过计算正负样本在特征空间的概率分布,动态构建弱分类器,并利用迭代权重更新机制组合出高精度的强分类器。
- 多尺度滑动窗口检测:支持图像金字塔扫描,能够在不同尺度下利用滑动窗口遍历图像,识别不同大小的目标。
- 非极大值抑制(NMS):包含后处理模块,能够对检测出的多个重叠候选框进行筛选,通过IoU(交并比)逻辑保留最佳检测结果。
- 可视化展示:提供直观的检测结果可视化,在图像上绘制目标边界框及对应的置信度得分。
系统要求
- MATLAB R2016b 或更高版本
- Image Processing Toolbox(用于图像处理和显示)
使用方法
- 在MATLAB环境中打开 main.m 文件。
- 直接运行该脚本。
- 程序将依次执行参数初始化、合成数据生成、特征预计算、模型训练、测试图像生成及目标检测。
- 运行结束后,系统将弹出一个窗口显示最终的人脸检测结果,并在控制台输出训练过程中的迭代信息和Loss值。
代码实现逻辑详解
main.m 文件包含了完整的主控逻辑和算法子函数,其核心流程如下:
1. 系统初始化与参数配置
程序首先定义了全局参数,包括样本窗口大小(24x24像素)、正负样本数量(各100个)、弱分类器迭代次数(T=20)、直方图分箱数(8个Bins)以及候选Haar特征池的大小(500个)。
2. 数据准备与特征库构建
程序调用辅助逻辑生成合成训练数据,确保代码可独立运行。随后,系统生成随机的Haar特征原型。为了加速训练,程序预先计算所有训练样本的特征矩阵,避免在迭代过程中重复计算积分图。
3. RealAdaBoost 训练流程
这是系统的核心部分。训练过程通过T轮迭代构建强分类器:
- 直方图统计:对于每一个特征,根据当前样本权重,统计其在正负样本上的分布概率。
- 弱分类器构建:将特征值离散化为若干区间(Bins),计算每个区间的输出值 h(x)。h(x) 基于对数似然比公式计算,代表该特征值属于人脸的置信度。
- 最佳特征选择:通过最小化指数损失函数(Z值,近似Bhattacharyya系数),从特征池中选出当前轮次区分能力最强的特征。
- 权重更新:根据选中弱分类器的表现,增加被错误分类(或难以区分)样本的权重,降低易区分样本的权重,迫使下一轮训练关注难例。
4. 目标检测
训练完成后,系统生成合成测试图像。检测过程采用
滑动窗口结合
图像金字塔策略:
- 积分图加速:对每一层缩放后的图像计算积分图。
- 级联判决:在每个窗口位置,线性累加所有弱分类器的输出得分。如果总得分超过预设阈值(代码中设定为0.5),则判定为目标。
- 坐标映射:将缩放后的检测框坐标还原回原始图像坐标系。
5. 后处理(NMS)
检测阶段通常会产生多个重叠的候选框。非极大值抑制模块会根据分类得分对候选框进行排序,并基于位置重叠度(IoU)剔除冗余的窗口,仅保留得分最高的目标框。
关键函数与算法细节
以下是 main.m 中各函数的具体功能分析:
trainRealAdaBoost
这是算法的核心引擎。
- 输入:预计算的特征矩阵、标签、Haar特征定义及配置参数。
- 逻辑:初始化均匀权重分布。在每一轮迭代中,遍历所有未被选中的特征。对于每个特征,使用
linspace 进行等宽分箱,计算每个箱内的正负样本权重和。利用平滑后的概率比计算弱分类器输出 $h(x)$。 - 输出:包含T个弱分类器的结构体,每个弱分类器包含特征索引、分箱边界(edges)、各箱的输出值(binValues)以及具体的几何定义。
precomputeFeatureMatrix
为了提升训练效率,该函数在训练前一次性计算所有样本在所有随机特征上的数值。它首先将所有样本转化为积分图,然后根据Haar特征的定义快速计算矩形区域的差分和。
generateHaarFeatures
生成随机的Haar-like特征描述符。代码支持三种特征类型:
- 水平二矩形(左亮右暗):用于检测边缘。
- 垂直二矩形(上亮下暗):用于检测边缘。
- 水平三矩形(中间亮两边暗):用于检测线性结构(如眼睛区域)。
函数随机生成特征的位置(x, y)和尺寸(w, h),并保存其结构定义和权重符号。
computeHaarValue
利用积分图原理计算单个Haar特征的值。通过查找积分图中特定坐标的值,利用 $A+D-(B+C)$ 的公式在常数时间内计算出任意矩形区域的像素和,并根据特征类型进行加权求和。
visualObjectDetection
实现了检测器的运行时逻辑。它构建了一个图像金字塔(缩放因子1.2),在每个尺度上进行步长为4像素的滑动窗口扫描。在每个窗口位置,它调用训练好的模型,通过查表法(lookup table)获取每个弱分类器的得分并累加,实现快速判决。
nonMaximaSuppression
处理检测结果的冗余。代码首先根据检测得分降序排列所有候选框,然后计算候选框的面积与重叠区域。通过迭代逻辑,保留当前最高分的框,并抑制与之重叠面积超过阈值(IoU > 0.3)的其他框,最终输出精简后的目标列表。
computeIntegralImage
基础图像处理工具函数。输入灰度图像,输出对应的积分图。具体实现为先沿行累加,再沿列累加,并在左侧和上侧进行零填充(padding),以简化边界处的计算逻辑。