天天看点

Boosting从原理到实现图像数组的训练Boosting原理Boosting在OpenCV中实现训练图像组

Boosting原理

众做周知,boosting就是所谓的有多个弱分类器组成一个强分类器。而什么叫做弱分类学习和什么时候需要使用弱分类学习呢?

弱分类学习

弱分类学习:识别一组概念的正确率仅比随机猜的概率高一点。

同理,当需要分类的训练组具有上述特点时,可以优先考虑使用boosting算法。

Boosting的重要历史事件

  1. Kearns & Valiant (1984) : Boosting由来
  2. Kearns & Valiant (1989) : 证明了弱学习器和强学习器的等价问题。
  3. Schapire (1989) : 第一个提出了一个可证明的多项式事件的Boosting算法。
  4. Schapire ( 1993) : 第一次把Boosting算法思想用于实际应用(OCR)。
  5. Freund & Schapire (1995) : AdaBoost算法。

Boosting的原理

为了训练一系列弱分类器h1,h2,..hT,不断的对样本进行分类,每次分类后,主要关注错误的样本,计算本次分类的权重,然后将错误的样本进行下一次的分类器学习,如此类推。

最终将所有弱分类器组合起来:

Boosting从原理到实现图像数组的训练Boosting原理Boosting在OpenCV中实现训练图像组

AdaBoost算法

Boosting从原理到实现图像数组的训练Boosting原理Boosting在OpenCV中实现训练图像组

Boosting在OpenCV中实现训练图像组

CvBoostParams

这个类主要是对Boosting的设定,例如设定使用哪种boosting和一些训练的参数,本身是有默认值的,所以如果不设定的话,可以直接使用默认值。

默认值如下:

CvBoostParams::CvBoostParams()
{
    boost_type = CvBoost::REAL;
    weak_count = ;
    weight_trim_rate = ;
    cv_folds = ;
    max_depth = ;
}
           

如果需要设定,则设定方法如下:

CvBoostParams params(CvBoost::DISCRETE,,,,);
           

CvBoostParams::train

void boosting_train(vector<Mat> mats,vector<int> response,int class_count=)
{
    CvBoost boost; //使用默认值
    if(mats.size()!=)
    {
        int total=mats[].cols*mats[].rows;
        Mat mat=Mat(total,mats.size(),CV_64FC1);
        for(int i=;i<mats.size();i++)
        {
            Mat col_tmp=mat.col(i);
            mats[i].reshape(,total).col().convertTo(col_tmp,CV_64FC1,/);
        }
        Mat resp=Mat(mats.size(),,CV_64FC1);
        for(int i=;i<response.size();i++)
        {
            resp.at(i,)=response[i];
        }
        boost.train(mat.t(),CV_ROW_SAMPLE,resp);
    }
    //为了使效果更好,可以样本数换成样本数乘以分类的数,即mats.size()换成mats.size()*class_count
}
           

参考文档:http://docs.opencv.org/modules/ml/doc/boosting.html

转载请注明出处:http://blog.csdn.net/luoyun614/article/details/44254269

继续阅读