「検出器」機能を巧みに使用して、顔や顔の特徴を検出します--MATLAB

一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加した初日です。クリックしてイベントの詳細をご覧ください

序章

    顔検出は顔分析の主要な部分であり、それが扱う問題は、画像に顔があるかどうかを確認し、ある場合はその顔を見つけることです。顔検出には幅広い用途があり、機械知能を実現するための重要なステップの1つです。AdaBoostアルゴリズムは、1995年に提案された高速顔検出アルゴリズムであり、顔検出の分野における画期的な進歩です。このアルゴリズムは、弱い学習のフィードバックに基づいて仮定のエラー率を適応的に調整し、効率が低下しないようにします。検出精度が大幅に向上しました。このホワイトペーパーでは、AdaBoost顔検出トレーニングアルゴリズムの速度に影響を与える2つの重要な側面であるHaar機能と積分グラフの概念と理論を注意深く説明します。同時に、AdaBoostのアルゴリズムが与えられ、弱い学習者の構築や選択などのいくつかの重要な問題が詳細に説明されています。この論文はまた、AdaBoostによって訓練された複数の強力な分類器を接続して、高い検出率と低い誤認識率を同時に備えたカスケード分類器を形成します-Haar分類器。最後に、Haar分類器を使用して顔検出を実現し、顔の特徴を検出して検出結果を確認します。

1.Haar特徴を計算する

    検出する画像のサイズをW×H、長方形の特徴のサイズをw×hとすると、水平方向と垂直方向のスケール係数は次のようになります
。X= W / w、Y = H/h
初期化特徴カウントカウント=0。
(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
这样利用上述方法我们就可以很方便快速地计算出图像上不同种类的矩形特征的个数。

三.巧用 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とMaxSizeの間の検出解像度をMinSizeの増分でスケーリングします。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