VJ算法MATLAB
Vision.CascadeObjectDetector
1.描述
级联对象检测器使用Viola-Jones算法来检测人的面部,鼻子,眼睛,嘴巴或上半身。还可以使用Image Labeler训练自定义分类器以与此System对象一起使用。
要检测图像中的面部特征或上半身:
- 创建vision.CascadeObjectDetector对象并设置其属性。
- 使用参数调用对象,就好像它是一个函数一样。
2.创建
2.1 句法&描述
detector = vision.CascadeobjecDectector
使用Viola-Jones算法创建一个检测器来检测对象。
detector = vision.CascadeObjectDetector(model)
创建一个检测器,配置为检测由输入字符向量定义的对象 model。
detector = vision.CascadeObjectDetector(XMLFILE)
创建一个检测器并将其配置为使用XMLFILE输入指定的自定义分类模型。
detector = vision.CascadeObjectDetector(Name,Value)
使用一个或多个名称 - 值对设置属性。将每个属性名称括在引号中。
2.2 Properties
除非另有说明,否则属性是不可用的,这意味着在调用对象后无法更改其值。当您调用它们时,对象会锁定,并且该 release功能会解锁它们。
2.2.1 Classification Model-训练级联分类模型
训练的级联分类模型,指定为字符向量。该ClassificationModel属性控制要检测的对象类型。默认情况下,检测器配置为检测面。
可以将此字符向量设置为包含自定义分类模型的XML文件,或者下面列出的有效模型字符向量之一。
可以使用该trainCascadeObjectDetector功能训练自定义分类模型。
该函数可以使用类Haar特征,定向梯度直方图(HOG)或局部二元模式(LBP)来训练模型。
分类模型 | 用于训练模型的图像尺寸 | 型号说明 |
---|---|---|
‘FrontalFaceCART’(默认) | [20 20] | 检测直立和前向的面部。该模型由弱分类器组成,基于分类和回归树分析(CART)。这些分类器使用Haar功能来编码面部特征。基于CART的分类器提供了模拟面部特征之间的高阶依赖性的能力。 |
‘FrontalFaceLBP’ | [24 24] | 检测直立和前向的面部。该模型由弱分类器组成,基于决策树桩。这些分类器使用局部二进制模式(LBP)来编码面部特征。LBP功能可以提供抵抗照明变化的稳健性。 |
‘UpperBody’ | [18 22] | 检测上身区域,定义为头肩区域。该模型使用Haar特征来编码头部和肩部区域的细节。因为它在头部周围使用了更多的特征,所以该模型对于姿势变化(例如头部旋转/倾斜)更加鲁棒。 |
‘EyePairBig’ ‘EyePairSmall’ | [11 45] [5 22] | 检测一双眼睛。该’EyePairSmall’模型是使用较小的图像训练。这使模型能够检测到比’EyePairBig’模型检测到的更小的眼睛。 |
‘LeftEye’ ‘RightEye’ | [12月18日] | 分别检测左眼和右眼。这些模型由弱分类器组成,基于决策树桩。这些分类器使用Haar功能来编码细节。 |
‘LeftEyeCART’ ‘RightEyeCART’ | [20 20] | 分别检测左眼和右眼。构成这些模型的弱分类器是CART树。与决策树桩相比,基于CART树的分类器能够更好地模拟高阶依赖性。 |
‘ProfileFace’ | [20 20] | 检测直立面部轮廓。该模型由弱分类器组成,基于决策树桩。这些分类器使用Haar功能对面部细节进行编码。 |
‘Mouth’ | [15 25] | 检测嘴巴。该模型由弱分类器组成,基于决策树桩,使用Haar功能对嘴部细节进行编码。 |
‘Nose’ | [15 18] | 该模型由弱分类器组成,基于决策树桩,使用Haar功能对鼻子细节进行编码。 |
2.22 MinSize-最小可检测对象的大小 | [ ] 双元素向量
最小可检测对象的大小,指定为双元素向量[高度 宽度]。为包含对象的最小大小区域设置此属性(以像素为单位)。该值必须大于或等于用于训练模型的图像大小。在处理图像之前知道最小对象大小时,使用此属性可缩短计算时间。如果未指定此属性的值,则检测器会将其设置为用于训练分类模型的图像的大小。
2.23 MaxSize-最大可检测对象的大小 | [ ] 双元素向量
最大可检测对象的大小,指定为双元素向量[ 高度 宽度 ]。指定要检测的最大对象的大小(以像素为单位)。在处理图像之前知道最大对象大小时,使用此属性可缩短计算时间。如果未指定此属性的值,则检测器会将其设置为size(I)。
2.24 ScaleFactor-缩放多尺度对象检测 | 1.1 纯量
缩放多尺度对象检测,指定为大于的值 1.0001。比例因子递增地缩放MinSize和之间的检测分辨率MaxSize。可以使用以下方法将比例因子设置为理想值:
size(I)/(size(I)-0.5)
检测器以两者之间的增量缩放搜索区域,MinSize并MaxSize使用以下关系:
搜索区域 = round((trainingsize)*(ScaleFactor^N))
N是当前增量,大于零的整数,训练大小是用于训练分类模型的图像大小。
2.25MergeThreshold-检测阈值 | 4 整数
检测阈值,指定为整数。阈值定义了在对象周围存在多个检测的区域中声明最终检测所需的标准。合并满足阈值的共同定位检测的组被合并以在目标对象周围产生一个边界框。增加该阈值可以通过要求在多尺度检测阶段期间多次检测目标对象来帮助抑制错误检测。将此属性设置为时 0,将返回所有检测,而不执行阈值处理或合并操作。此属性是可调的。
###UseRoI-使用感兴趣的区域 | false (default)
使用感兴趣的区域,指定为false或 false。将此属性设置true为检测输入图像中感兴趣的矩形区域内的对象。
3.用法
3.1句法
bbox=detector(I)
返回M -by-4矩阵,bbox定义 包含检测到的对象的M个边界框。检测器对输入图像执行多尺度物体检测I。
bbox=detector(I,roi)
检测由指定的矩形搜索区域内的对象 roi。将’UseROI’属性设置 true为使用此语法。
3.2输入参数
3.2.1 I-输入图像 | 灰度/真彩色(RGB)
3.2.2 model-分类模型 | FrontalFaceCART
/character string
分类模型,指定为字符向量。的 model输入描述对象的检测的类型。有几个有效的model字符向量,例如’ FrontalFaceCART’,’ UpperBody’和’ ProfileFace’。
3.2.3 XMLFILE-自定义分类模型
自定义分类模型,指定为XML文件。在 XMLFILE可以使用创建trainCascadeObjectDetector函数或OpenCV的(开源计算机视觉)的训练功能。
3.2.4 ROI-矩形感兴趣区域 |四元素向量
图像中的矩形感兴趣区域I,指定为四元素矢量,[ x y width height ]。
3.3 输出参数
3.3.1 bbox-检测 | M-by-4矩阵
检测,作为M -by-4元素矩阵返回。输出矩阵的每一行包含一个四元素向量,[ x y width height ],以像素为单位指定边界框的左上角和大小。
3.3.2对象功能
要使用对象函数,请将System对象指定为第一个输入参数。
step | 运行System对象算法 |
---|---|
release | 释放资源并允许更改System对象属性值和输入特征 |
reset | 重置System对象的内部状态 |
4. Example
4.1 使用正面人脸分类模型检测图像中的人脸
% Create a face detector object.
`faceDetector = vision.CascadeObjectDetector;`
% Read the input image.
I = imread('visionteam.jpg');
%Detect faces.
bboxes = faceDetector(I);
%Annotate detected faces.
IFaces = insertObjectAnnotation(I,'rectangle',bboxes,'Face');
figure
imshow(IFaces)
title('Detected faces');
4.2 利用上体分类模型检测图像中的上体
%Create a body detector object and set properties.
bodyDetector = vision.CascadeObjectDetector('UpperBody');
bodyDetector.MinSize = [60 60];
bodyDetector.MergeThreshold = 10;
%Read input image and detect upper body.
I2 = imread('visionteam.jpg');
bboxBody = bodyDetector(I2);
Annotate detected upper bodies.
IBody = insertObjectAnnotation(I2,'rectangle',bboxBody,'Upper Body');
figure
imshow(IBody)
title('Detected upper bodies');