cvTrimWeights函数详细解读

原创 2015年07月10日 15:35:06

cvTrimWeights的源码在opencv的cvboost.cpp文件之中,具体内容和部分注释如下所

/*
 *cvTrimWeights
 *作用:对小于一定阈值的权重剔除,因为权重较小的样本对训练结果影响很小,剔除后,这样在训练样本时可以缩短训练时间
 */
CV_BOOST_IMPL
CvMat* cvTrimWeights( CvMat* weights,//训练样本的权重矩阵
                      CvMat* idx,    //训练样本的索引序列矩阵
                      float factor ) //剔除小权重的样本后剩余样本的比例,根据这个参数来计算需要剔除较小样本的阈值
{
    CvMat* ptr = 0;

    CV_FUNCNAME( "cvTrimWeights" );
    __BEGIN__;
    int i, index, num;
    float sum_weights;
    uchar* wdata;
    size_t wstep;
    int wnum;
    float threshold;
    int count;
    float* sorted_weights;

    CV_ASSERT( CV_MAT_TYPE( weights->type ) == CV_32FC1 );

    ptr = idx;
    sorted_weights = NULL;

    if( factor > 0.0F && factor < 1.0F )
    {
        size_t data_size;

        CV_MAT2VEC( *weights, wdata, wstep, wnum );
        num = ( idx == NULL ) ? wnum : MAX( idx->rows, idx->cols );

        data_size = num * sizeof( *sorted_weights );
        sorted_weights = (float*) cvAlloc( data_size );
        memset( sorted_weights, 0, data_size );

        sum_weights = 0.0F;
        for( i = 0; i < num; i++ )
        {
            index = icvGetIdxAt( idx, i );//将矩阵idx中第i个位置上的样本序列取出
            sorted_weights[i] = *((float*) (wdata + index * wstep));//取出idx第i个位置上的权重
            sum_weights += sorted_weights[i];//样本的权重和
        }

        icvSort_32f( sorted_weights, num, 0 );//对样本排序

        sum_weights *= (1.0F - factor);      //根据训练样本总的权重和factor来计算需要剔除的小权重训练样本的权重和

        i = -1;
        do { sum_weights -= sorted_weights[++i]; }//对排序后的样本从最小的小权重的样本开始减去,直到while中条件结束
        while( sum_weights > 0.0F && i < (num - 1) );

        threshold = sorted_weights[i];      
       /*跳出do-while循环后,把没有被剔除权重的样本中,最小权重的那个样本的权重赋给threshold。对外表现为:凡是样本的权重小于
        这个阈值,就直接剔除*/

        while( i > 0 && sorted_weights[i-1] == threshold ) i--;//剔除小权重的样本后,再对原来剔除的那部分中等于阈值的样本捡回来,挺人性化的哈

        if( i > 0 || ( idx != NULL && CV_MAT_TYPE( idx->type ) != CV_32FC1 ) )
        {
            CV_CALL( ptr = cvCreateMat( 1, num - i, CV_32FC1 ) );
            count = 0;
            for( i = 0; i < num; i++ )
            {
                index = icvGetIdxAt( idx, i );
                if( *((float*) (wdata + index * wstep)) >= threshold )//只对阈值>threshold的权重操作
                {
                    CV_MAT_ELEM( *ptr, float, 0, count ) = (float) index;
                    count++;
                }
            }

            assert( count == ptr->cols );
        }
        cvFree( &sorted_weights );
    }

    __END__;

    return ptr;     //只返回权重大于阈值的样本
}




OpenCV中Adaboost训练的经验总结

关于使用OpenCV训练Adaboost的经验总结,互相交流,有不对的地方请指教!
  • xidianzhimeng
  • xidianzhimeng
  • 2014年12月25日 16:21
  • 18192

OpenCV3.0 决策树的使用

决策树(Decision Tree)在OpenCV3.0中的使用
  • u012288873
  • u012288873
  • 2016年03月03日 23:07
  • 3052

正式使用opencv里的训练和检测 - opencv_createsamples、opencv_traincascade-2.4.11版本

直接教你怎么用opencv的训练器,以及怎么检测
  • wuxiaoyao12
  • wuxiaoyao12
  • 2014年09月12日 14:06
  • 31633

ORB原理与Opencv源码解析

Opencv ORB 图像特征
  • haoliliang88
  • haoliliang88
  • 2016年07月06日 17:45
  • 2488

OpenCV自学笔记28. Canny 源码解析

OpenCV Canny 源码注释与分析       1986年,John F.Canny 完善了边缘检测理论,Canny算法以此命名。     Canny 算法的步骤:     1. 使用滤波器...
  • u010429424
  • u010429424
  • 2016年07月09日 13:35
  • 5321

opencv中CalcOpticalFlowPyrLK实现的光流法理解

更多细节请查看论文“PyramidalImplementation of the Lucas Kanade Feature  Tracker Description of the algorithm”...
  • AP1005834
  • AP1005834
  • 2016年04月23日 15:57
  • 8167

详细解读Jquery中Ajax的各个函数

一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,...
  • yesz12358
  • yesz12358
  • 2016年09月22日 11:51
  • 185

select函数详细解读

在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核:       •我们所关心的文件描述符       •对每个描述符,我们所关心的...
  • as82984895ok
  • as82984895ok
  • 2016年07月26日 22:50
  • 170

memset函数详细解读

需要的头文件    or 编辑本段函数原型   void *memset(void *s, int ch, unsigned n);memest原型 (please type "man mem...
  • rxm1989
  • rxm1989
  • 2014年09月25日 13:24
  • 295

详细解读Jquery各Ajax函数:

详细解读Jquery各Ajax函数: $.get(),$.post(),$.ajax(),$.getJSON() 详细解读Jquery各Ajax函数: $.get(),$.post(),$...
  • skymyxvincent
  • skymyxvincent
  • 2016年10月23日 13:40
  • 86
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cvTrimWeights函数详细解读
举报原因:
原因补充:

(最多只允许输入30个字)