巧用“detector”函数检测人脸及五官--MATLAB

简介: 巧用“detector”函数检测人脸及五官--MATLAB

简介


    人脸检测是人脸分析的首要环节,其处理的问题是确认图像中是否存在人脸,如果存在则对人脸进行定位。人脸检测的应用领域相当广泛,是实现机器智能化的重要步骤之一。


AdaBoost算法是1995年提出的一种快速人脸检测算法,是人脸检测领域里程碑式的进步,这种算法根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高。


本文对影响AdaBoost人脸检测训练算法速度的至关重要的两方面:Haar特征和积分图的概念和理论进行了仔细的阐明。


同时给出了AdaBoost的算法,并深入探讨了其中的一些关键问题——弱学习器的构造、选取等问题。本文还将AdaBoost训练出来的多个强分类器连接在一起,形成同时具备高检测率和低误识率的级联分类器——Haar分类器。最后用Haar分类器实现人脸检测并通过检测五官来检验检测结果。



一. 计算Haar特征


    假设待检测的图片大小为W×H, 矩形特征的大小为 w×h , 则在水平和垂直方向的比例系数为:


X=W/w,Y=H/h


初始化特征个数计数 count=0.


For(m,n)=(1,2,,,X)×(1,2,,,Y)


放大矩形特征到 mw×nh


平移矩形特征 mw×nh


遍历图像的每个像素点,在每个位置计算特征值。

Forx=1, 2,..., W-mw+1
    Fory=1, 2,..., H-nh+1
    计算每点的特征值
    count=count+1
    end
  end
end

这样利用上述方法我们就可以很方便快速地计算出图像上不同种类的矩形特征的个数。




三.巧用 ClassificationModel(官方的分类器模型)


3.1FrontalFaceCART(默认值):


    训练图片大小[20 20];检测直立和向前朝面的面.该模型由弱分类器组成, 基于分类和回归树分析 (cart)。这些分类器使用 haar 特征来编码面部特征。基于块的分类器提供了在面部特征之间建立高阶依赖关系模型的能力。


3.2FrontalFaceLBP


    训练图片大小[24 24];检测直立和向前朝面的面。该模型由弱分类器组成, 基于决策树桩。 这些分类器使用本地二进制模式 (lbp) 来编码面部特征。lbp 功能可以提供抵御照明变化的鲁棒性。


3.3UpperBody:


    训练图片大小[18 22]:检测上身区域, 其定义为头部和肩部区域。此模型使用 haar 功能对头部和肩部区域的详细信息进行编码。因为它在头部周围使用了更多的功能, 所以这种模型对姿势变化 (例如头部旋转) 更可靠。


3.4EyePairBig'/'EyePairSmall:


    训练图片大小:[11 45]/[5 22];检测一双眼睛。'EyePairSmall'训练 "眼类" 模型。 这使得该模型能够检测到'EyePairBig'模型所能检测到的更小的眼睛。


3.5LeftEye'/'RightEye:


    训练图片大小:[12 18];分别检测左眼和右眼。这些模型是由弱分类器, 基于决策树桩。这些分类器使用 haar 功能对详细信息进行编码


3.6LeftEyeCART'/'RightEyeCART:


    训练图片大小:[20 20];分别检测左眼和右眼。构成这些模型的弱分类器是 cart-树。与决策树桩相比, 基于 cart 树的分类器能够更好地建模高阶依赖关系。


3.7ProfileFace:


    训练图片大小:[20 20];检测直立面部轮廓。该模型由弱分类器组成, 基于决策树桩。这些分类器使用 haar 功能对人脸详细信息进行编码。


3.7Mouth:


    训练图片大小[15 25];检测口腔。该模型由弱分类器组成, 基于决策树桩, 利用 haar 特征对口腔细节进行编码。


3.8Nose:


    训练图片大小[15 18];该模型由弱分类器组成, 基于决策树桩, 使用 haar 特征对鼻子细节进行编码。\



四.参数调节


MinSize(最小可检测对象的大小):最小可检测对象的大小, 指定为两个元素向量 [height weight]。对于包含对象的最小大小区域, 以像素为单位设置此属性。


该值必须大于或等于用于训练模型的图像大小。当您在处理图像之前知道最小对象大小时, 使用此属性可以减少计算时间。 如果不指定此属性的值, 探测器会将其设置为用于训练分类模型的图像的大小。



MaxSize(最大可检测对象的大小):最大可检测对象的大小, 指定为两个元素向量 [height weight]。指定要检测的最大对象的大小 (以像素为单位)。


当您在处理图像之前知道最大对象大小时, 使用此属性可以减少计算时间。如果不为此属性指定值, 探测器会将其指定为size(IMG).



ScaleFactor(用于多尺度对象检测的缩放):用于多尺度对象检测的缩放, 指定为大于1.0001的值。比例因子以增量MinSize缩放 minsize 和MaxSize之间的检测分辨率。


您可以使用以下方法将比例因子设置为理想值:  size(IMG)/(size(IMG)-0.5)。 探测器使用以下关系以 "MinSize" 和MaxSize之间的增量缩放搜索区域:                     搜索区域= round(训练图片大小) * (ScaleFactor)^n))



MergeThreshold(检测阈值):检测阈值, 指定为整数。阈值定义在对象周围有多个检测的区域中声明最终检测所需的条件。


合并满足阈值的共置检测组, 以在目标对象周围生成一个边界框。通过要求在多尺度检测阶段多次检测目标对象, 提高此阈值可能有助于抑制错误检测。将此属性设置为0, 将返回所有检测, 而不执行阈值或合并操作。此属性是可调整的。


UseROI(使用感兴趣的区域):使用感兴趣的区域, 指定为true或false。将此属性设置为true可检测输入图像中感兴趣的矩形区域内的对象。



检测示例


image.png

代码附录:

img=imread('F:\smile.png');
imshow(img);title('Original IMG');
detector = vision.CascadeObjectDetector;
%% 测试1:FrontalFaceCART
   bboxes=step(detector,img);
   FrontalFaceCART=insertObjectAnnotation(img,'rectangle',bboxes,'Face');
   figure(1);imshow(FrontalFaceCART);title('FrontalFaceCART');
%% 测试2:FrontalFaceLBP
    release(detector);
    detector.ClassificationModel='FrontalFaceLBP';
    bboxes=step(detector,img);
    FrontalFaceLBP=insertObjectAnnotation(img,'rectangle',bboxes,'Face');
    figure(2);imshow(FrontalFaceLBP);title('FrontalFaceLBP');
%% 测试3:UpperBody
    release(detector);
    detector.ClassificationModel='UpperBody';
    detector.MergeThreshold=3;%适当增加合并阈值
    bboxes=step(detector,img);
    UpperBody=insertObjectAnnotation(img,'rectangle',bboxes,'UpperBody');
    figure(3);imshow(UpperBody);title('UpperBody');
    detector.MergeThreshold=4;%恢复合并阈值
%% 测试4:EyePairBig/EyePairSmall
    release(detector);
    detector.ClassificationModel='EyePairBig';
    bboxes=step(detector,img);
    EyePairBig=insertObjectAnnotation(img,'rectangle',bboxes,'Eyes');
    figure(4);subplot(211);imshow(EyePairBig);title('EyePairBig');
    release(detector);
    detector.ClassificationModel='EyePairSmall';
    bboxes=step(detector,img);
    EyePairSmall=insertObjectAnnotation(img,'rectangle',bboxes,'Eyes');
    figure(4);subplot(212);imshow(EyePairSmall);title('EyePairSmall');
%% 测试5:LeftEye/RightEye   
    release(detector);
    detector.ClassificationModel='LeftEye';
    detector.MergeThreshold=10;%适当增加合并阈值
    bboxes=step(detector,img);
    LeftEye=insertObjectAnnotation(img,'rectangle',bboxes,'LeftEye');
    figure(5);subplot(211);imshow(LeftEye);title('LeftEye');
    release(detector);
    detector.ClassificationModel='RightEye';
    bboxes=step(detector,img);
    RightEye=insertObjectAnnotation(img,'rectangle',bboxes,'RightEye');
    figure(5);subplot(212);imshow(RightEye);title('RightEye');    
    detector.MergeThreshold=4;%恢复合并阈值
%% 测试6:LeftEyeCART/RightEyeCART   
    release(detector);
    detector.ClassificationModel='LeftEyeCART';
    bboxes=step(detector,img);
    LeftEyeCART=insertObjectAnnotation(img,'rectangle',bboxes,'LeftEye');
    figure(6);subplot(211);imshow(LeftEyeCART);title('LeftEye');
    release(detector);
    detector.ClassificationModel='RightEyeCART';
    bboxes=step(detector,img);
    RightEyeCART=insertObjectAnnotation(img,'rectangle',bboxes,'RightEye');
    figure(6);subplot(212);imshow(RightEyeCART);title('RightEye');   
%% 测试7:ProfileFace   
    release(detector);
    detector.ClassificationModel='ProfileFace';
    bboxes=step(detector,img);
    ProfileFace=insertObjectAnnotation(img,'rectangle',bboxes,'Face');
    figure(7);imshow(ProfileFace);title('ProfileFace');
%% 测试8:Mouth  
    release(detector);
    detector.ClassificationModel='Mouth';
    detector.MergeThreshold=100;%增加合并阈值
    bboxes=step(detector,img);
    Mouth=insertObjectAnnotation(img,'rectangle',bboxes,'Mouth');
    figure(8);imshow(Mouth);title('Mouth'); 
    detector.MergeThreshold=4;
%% 测试9:Nose
    release(detector);
    detector.ClassificationModel='Nose';
    detector.MergeThreshold=10;;%增加合并阈值
    bboxes=step(detector,img);
    Nose=insertObjectAnnotation(img,'rectangle',bboxes,'Nose');
    figure(9);imshow(Nose);title('Nose');




相关文章
|
7月前
|
传感器 机器学习/深度学习 数据采集
【数据驱动】【航空航天结构的高效损伤检测技术】一种数据驱动的结构健康监测(SHM)方法,用于进行原位评估结构健康状态,即损伤位置和程度,在其中利用了选定位置的引导式兰姆波响应(Matlab代码实现)
【数据驱动】【航空航天结构的高效损伤检测技术】一种数据驱动的结构健康监测(SHM)方法,用于进行原位评估结构健康状态,即损伤位置和程度,在其中利用了选定位置的引导式兰姆波响应(Matlab代码实现)
210 1
|
7月前
|
机器学习/深度学习 编解码 算法
【GUI】通过Hough变换在SEM显微图像上检测滑移线研究(Matlab代码实现)
【GUI】通过Hough变换在SEM显微图像上检测滑移线研究(Matlab代码实现)
264 0
|
6月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
7月前
|
机器学习/深度学习 算法
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
211 5
|
7月前
|
机器学习/深度学习 传感器 算法
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
323 5
|
7月前
|
数据采集 新能源 调度
【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)
【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)
328 4
|
7月前
|
Serverless Python
【三变量联合分布函数copula】利用AIC BIC确定单变量最优拟合函数、利用AIC确定三变量联合最优copula函数、计算联合概率(Matlab代码实现)
【三变量联合分布函数copula】利用AIC BIC确定单变量最优拟合函数、利用AIC确定三变量联合最优copula函数、计算联合概率(Matlab代码实现)
461 4
|
7月前
|
存储 编解码 并行计算
【快速傅里叶变换FFT、窗函数法、希尔伯特-黄变换、小波变换】电力系统同步相量计算研究(Matlab代码实现)
【快速傅里叶变换FFT、窗函数法、希尔伯特-黄变换、小波变换】电力系统同步相量计算研究(Matlab代码实现)
249 6
|
7月前
|
传感器 机器学习/深度学习 编解码
使用显著性检测的可见光和红外图像的两尺度图像融合(Matlab代码实现)
使用显著性检测的可见光和红外图像的两尺度图像融合(Matlab代码实现)
239 3
|
7月前
|
机器学习/深度学习 传感器 算法
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
262 1

热门文章

最新文章