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

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,不断的对样本进行分类,每次分类后,主要关注错误的样本,计算本次分类的权重,然后将错误的样本进行下一次的分类器学习,如此类推。

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

AdaBoost算法

Boosting在OpenCV中实现训练图像组

CvBoostParams

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

默认值如下:

CvBoostParams::CvBoostParams()
{
    boost_type = CvBoost::REAL;
    weak_count = 100;
    weight_trim_rate = 0.95;
    cv_folds = 0;
    max_depth = 1;
}

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

CvBoostParams params(CvBoost::DISCRETE,100,0.95,0,1);

CvBoostParams::train

void boosting_train(vector<Mat> mats,vector<int> response,int class_count=2)
{
    CvBoost boost; //使用默认值
    if(mats.size()!=0)
    {
        int total=mats[0].cols*mats[0].rows;
        Mat mat=Mat(total,mats.size(),CV_64FC1);
        for(int i=0;i<mats.size();i++)
        {
            Mat col_tmp=mat.col(i);
            mats[i].reshape(1,total).col(0).convertTo(col_tmp,CV_64FC1,1/255.);
        }
        Mat resp=Mat(mats.size(),1,CV_64FC1);
        for(int i=0;i<response.size();i++)
        {
            resp.at(i,0)=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

时间: 2024-08-12 14:14:23

Boosting从原理到实现图像数组的训练的相关文章

python图像数组操作与灰度变换

Python图像数组操作与灰度变换 使用python以及numpy通过直接操作图像数组完成一系列基本的图像处理 numpy简介: NumPy是一个非常有名的 Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量.矩阵.图像等)以及线性代数函数. 数组对象可以实现数组中重要的操作,比如矩阵乘积.转置.解方程系统.向量乘积和归一化.这为图像变形.对变化进行建模.图像分类.图像聚类等提供了基础. 在上一篇python基本图像操作中,当载入图像时,通过调用 array()

图像灰度变换及图像数组操作

Python图像灰度变换及图像数组操作 作者:MingChaoSun 字体:[增加 减小] 类型:转载 时间:2016-01-27我要评论 这篇文章主要介绍了Python图像灰度变换及图像数组操作的相关资料,需要的朋友可以参考下 使用python以及numpy通过直接操作图像数组完成一系列基本的图像处理 numpy简介: NumPy是一个非常有名的 Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量.矩阵.图像等)以及线性代数函数. 数组对象可以实现数组中重要的操

集成学习之Boosting —— AdaBoost原理

集成学习之Boosting -- AdaBoost原理 集成学习之Boosting -- AdaBoost实现 集成学习大致可分为两大类:Bagging和Boosting.Bagging一般使用强学习器,其个体学习器之间不存在强依赖关系,容易并行.Boosting则使用弱分类器,其个体学习器之间存在强依赖关系,是一种序列化方法.Bagging主要关注降低方差,而Boosting主要关注降低偏差.Boosting是一族算法,其主要目标为将弱学习器"提升"为强学习器,大部分Boosting

【机器学习】Bagging与Boosting算法原理小结

集成学习(Ensemble Larning)本身不是一个单独的机器学习算法,是通过构建并结合多个机器学习器来完成学习任务的思想.通常的集成学习的方法指的是同质个体学习器.同质个体学习器使用最多的模型是CART决策树和神经网络.按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是Boosting系列算法:第二个是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是Bagging和随机森林(Rando

C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7,2,3,1,6,8,4}; int i=0,j=0; int n = sizeof(a)/4; //外循环n-1轮 for(i=0;i<n-1;i++){ int pos = i;//始终指向最小的位置 for(j=i+1;j<n;j++){ if(a[j]<a[pos]){ pos = j

深度原理与框架-图像超分辨重构-tensorlayer

图像超分辨重构的原理,输入一张像素点少,像素较低的图像, 输出一张像素点多,像素较高的图像 而在作者的文章中,作者使用downsample_up, 使用imresize(img, []) 将图像的像素从原理的384,384降低到96, 96, 从而构造出高水平的图像和低水平的图像 作者使用了三个部分构成网络, 第一部分是生成网络,用于进行图片的生成,使用了16层的残差网络,最后的输出结果为tf.nn.tanh(),即为-1, 1, 因为图像进行了-1,1的预处理 第二部分是判别网络, 用于进行图

opencv 图像变换原理详解 图像平移 图像旋转 图像缩放

常见的2D图像变换从原理上讲主要包括基于2×3矩阵的仿射变换和基于3×3矩阵透视变换. 仿射变换 原理 基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换: 如果写成矩阵的形式,就是: 作如下定义: 矩阵T(2×3)就称为仿射变换的变换矩阵,R为线性变换矩阵,t为平移矩阵,简单来说,仿射变换就是线性变换+平移.变换后直线依然是直线,平行线依然是平行线,直线间的相对位置关系不变,因此非共线的三个对应点便可确定唯一的一个仿射变换,线性变换4个自由度+平移2

算法原理与实践(数组和字符串)

Array & String 大纲 1. 入门题 string match 2. Array 中 HashTable 的应用 3. C/C++ 中的 string 4. 例题分析 part 1 入门题 在 source(母串)中,寻找 target(子串) 是否出现. /* Returns the position of the first occurrence of string target in string source, or -1 if target is not part of s

相似图像搜索从训练到服务全过程

最近完成了一个以图搜图的项目,项目总共用时三个多月.记录一下项目中用到机器学习的地方,以及各种踩过的坑.总的来说,项目分为一下几个部分: 一.训练目标函数 1.    设定基础模型 2.    添加新层 3.    冻结 base 层 4.    编译模型 5.    训练 6.    保存模型 二.特征提取 三.创建索引 四.构建服务 1.flask 开发 2.Gunicorn 异步,增加服务稳健性 3.Supervisor 部署监控服务 五.总结 一.训练目标函数 项目是在预训练模型 vgg