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

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

简介

    人脸检测是人脸分析的首要环节,其处理的问题是确认图像中是否存在人脸,如果存在则对人脸进行定位。人脸检测的应用领域相当广泛,是实现机器智能化的重要步骤之一。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');
复制代码

猜你喜欢

转载自juejin.im/post/7081568261036310559