分类器(模式识别)
目标检测方法最初由Paul Viola [Viola01]提出,并由Rainer Lienhart [Lienhart02]对这一方法
进行了改善. 首先,利用样本(大约几百幅样本图片)的 harr 特征进行分类器训练,得到一个级
联的boosted分类器。训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如人
脸或汽车等),反例样本指其它任意图片,所有的样本图片都被归一化为同样的尺寸大小(例如,
20x20)
分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。检测
到目标区域(汽车或人脸)分类器输出为1,否则输出为0。为了检测整副图像,可以在图像中
移动搜
索窗口,检测每一个位置来确定可能的目标。 为了搜索不同大小的目标物体,分类器被设计为可以
进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。所以,为了在图像中检测未知大小的目
标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。
分类器中的级联是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依
次通过每一级分类器, 这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分
类器检测的区域即为目标区域。 目前支持这种分类器的boosting技术有四种: Discrete
Adaboost, Real Adaboost, Gentle Adaboost and Logitboost"boosted" 即指级联分类器的
每一
层都可以从中选取一个boosting算法(权重投票),并利用基础分类器的自我训练得到。基础分类器
是至少有两个叶结点的决策树分类器。 Haar特征是基础分类器的输入,主要描述如下。目前的算法
主要利用下面的Harr特征。
 
每个特定分类器所使用的特征用形状、感兴趣区域中的位置以及比例系数(这里的比例系数跟检测
时候采用的比例系数是不一样的,尽管最后会取两个系数的乘积值)来定义。例如在第三行特征
(2c)的情况下,响应计算为复盖全部特征整个矩形框(包括两个白矩形框和一个黑矩形框)象素
的和减去黑矩形框内象素和的三倍 。每个矩形框内的象素和都可以通过积分图象很快的计算出来
(察看下面和对cvIntegral的描述).
通过HaarFaceDetect 的演示版可以察看目标检测的工作情况。
下面只是检测部分的参考手册。 haartraining是它的一个单独的应用,可以用来对系列样本训练级
联的 boosted分类器。详细察看opencv/apps/haartraining
 
CvHaarFeature, CvHaarClassifier, CvHaarStageClassifier, CvHaarClassifierCascade
Boosted Haar 分类器结构
#define CV_HAAR_FEATURE_MAX  3
/* 一个 harr 特征由 23 个具有相应权重的矩形组成a haar feature consists of 2-3
rectangles with appropriate weights */
typedef struct CvHaarFeature
{
    int  tilted;  /* 0 means up-right feature, 1 means 45--rotated feature */
   
    /* 2-3 rectangles with weights of opposite signs and
      with absolute values inversely proportional to the areas of the rectangles.
      if rect[2].weight !=0, then
      the feature consists of 3 rectangles, otherwise it consists of 2 */
    struct
    {
        CvRect r;
        float weight;
    } rect[CV_HAAR_FEATURE_MAX];
}
CvHaarFeature;
/* a single tree classifier (stump in the simplest case) that returns the response for
the feature
  at the particular image location (i.e. pixel sum over subrectangles of the window)
and gives out
  a value depending on the responce */
typedef struct CvHaarClassifier
{
    int count;  /* number of nodes in the decision tree */
    /* these are "parallel" arrays. Every index i
      corresponds to a node of the decision tree (root has 0-th index).
      left[i] - index of the left child (or negated index if the left child is a leaf)
      right[i] - index of the right child (or negated index if the right child is a
leaf)
      threshold[i] - branch threshold. if feature responce is <= threshold, left
branch
                      is chosen, otherwise right branch is chosed.
      alpha[i] - output value correponding to the leaf. */
    CvHaarFeature* haar_feature;
    float* threshold;
    int* left;
    int* right;
    float* alpha;
rectangle函数opencv}
CvHaarClassifier;
/* a boosted battery of classifiers(=stage classifier):
  the stage classifier returns 1
  if the sum of the classifiers' responces
  is greater than threshold and 0 otherwise */
typedef struct CvHaarStageClassifier
{
    int  count;  /* number of classifiers in the battery */
    float threshold; /* threshold for the boosted classifier */
    CvHaarClassifier* classifier; /* array of classifiers */
    /* these fields are used for organizing trees of stage classifiers,
      rather than just stright cascades */
    int next;
    int child;
    int parent;
}
CvHaarStageClassifier;
typedef struct CvHidHaarClassifierCascade CvHidHaarClassifierCascade;
/
* cascade or tree of stage classifiers */
typedef struct CvHaarClassifierCascade
{
    int  flags; /* signature */
    int  count; /* number of stages */
    CvSize orig_window_size; /* original object size (the cascade is trained for) */
    /* these two parameters are set by cvSetImagesForHaarClassifierCascade */
    CvSize real_window_size; /* current object size */
    double scale; /* current scale */
    CvHaarStageClassifier* stage_classifier; /* array of stage classifiers */
    CvHidHaarClassifierCascade* hid_cascade; /* hidden optimized representation of the
cascade,
                                                created by
cvSetImagesForHaarClassifierCascade */
}
CvHaarClassifierCascade;
所有的结构都代表一个级联boosted Haar分类器。级联有下面的等级结构:
Cascade:
Stage1:
Classifier11:
Feature11
Classifier12:
Feature12
...
Stage2:
Classifier21:
Feature21
...
...
整个等级可以手工构建,也可以利用函数cvLoadHaarClassifierCascade从已有的磁盘文件或嵌入式
基中导入。
cvLoadHaarClassifierCascade
从文件中装载训练好的级联分类器或者从OpenCV中嵌入的分类器数据库中导入
CvHaarClassifierCascade* cvLoadHaarClassifierCascade(
                        const char* directory,
                        CvSize orig_window_size );
directory
训练好的级联分类器的路径
orig_window_size
级联分类器训练中采用的检测目标的尺寸。因为这个信息没有在级联分类器中存储,所有要单独指

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。