900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Opencv学习笔记 - OpenCV 4机器学习算法简介

Opencv学习笔记 - OpenCV 4机器学习算法简介

时间:2018-06-26 12:12:33

相关推荐

Opencv学习笔记 - OpenCV 4机器学习算法简介

在机器学习中,一些比较流行方法的包括:支持向量机(SVM)、人工神经网络(ANN)、聚类、k-最近邻、决策树和深度学习。OpenCV支持并实现几乎所有这些方法,并有详细的文档说明(包含在Main modules的ml. Machine Learning模块中)。

一、OpenCV 4 机器学习算法

机器学习的大致任务类型,回归、分类、聚类、异常检测。

OpenCV实现了其中的八种机器学习算法,所有这些算法都继承自StatModel类,这八种算法是:

·人工神经网络

·决策树,用于分类任务

·期望最大化,用于聚类任务

·k-最近邻,用于分类任务

·逻辑回归,分类

·朴素贝叶斯分类器

·支持向量机,分类或回归

·随机梯度下降SVM

1、机器学习模块中的算法

2、OpenCV 4 机器学习的类层次结构

cv::ml::StatModel 的继承图

StatModel类是所有机器学习算法的基类,它提供预测和所有读写功能,这些功能对于保存和读取机器学习参数和训练数据非常重要。

StatModel是诸如SVM或ANN等所有机器学习类(除了深度学习方法之外)的基类。StatModel基本上是一个虚拟类,它定义了两个最重要的函数:train和predict。train方法是负责使用训练数据集学习模型参数的主要方法。它有以下三种可能的调用方式:

Train函数

具有以下参数:

·TrainData:训练数据可以从TrainData类加载或创建。该类是OpenCV 3中的新增功能,可以帮助开发人员从机器学习算法中创建和提取训练数据。这样做是因为不同的算法需要不同类型的阵列结构用于训练和预测,例如ANN算法。

·samples:一系列训练阵列样本,例如采用机器学习算法所需格式的训练数据。

·layout:ROW_SAMPLE(训练样本是矩阵行)或COL_SAMPLE(训练样本是矩阵列)。

·responses:与样本数据相关的响应向量。

·flags:由每个方法定义的可选标志。

最后一个训练方法创建并训练一个_TP类类型的模型。被接受的唯一类是不带参数或带所有默认参数值实现静态创建方法的类。

predict方法

更简单,只有一个可能的调用:

该预测函数具有以下参数:

·samples:用于预测模型结果的输入样本可以包含任意数量的数据,无论是单个还是多个。

·results:每个输入行样本的结果(由先前训练的模型的算法计算)。

·flags:这些可选标志与模型有关。某些模型(如Boost)由SVM StatModel::RAW_OUTPUT标志识别,这使得该方法可以返回原始结果(总和),而不是类标签。StatModel类为其他非常有用的方法提供接口:

·isTrained(),如果模型是训练过的,则返回true

·isClassifier(),如果模型是分类器,则返回true,如果是回归,则返回false

·getVarCount()返回训练样本中的变量数

·save(const string&filename)将模型保存在指定的文件中

·Ptr<_Tp>load(const string&filename)从指定的文件中加载<indexentrycontent=“StatModel class: Ptr load (const string & filename)”>模型,例如-Ptr<SVM>svm=StatModel::load(“my_svm_model.xml”)

·calcError(const Ptr<TrainData>&data,bool test,OutputArray resp)从测试数据计算错误,其中数据是训练数据。如果test参数为true,则该方法从测试数据子集计算错误;如果为false,则该方法计算所有训练数据的错误。resp是可选的输出结果。

二、OpenCV源码

1、源码路径

opencv\modules\ml\src

2、源码代码

这里仅展示期望最大化部分代码,其余代码见opencv源码上面的路径

bool trainM(InputArray samples,InputArray _probs0,OutputArray logLikelihoods,OutputArray labels,OutputArray probs) CV_OVERRIDE{Mat samplesMat = samples.getMat();Mat probs0 = _probs0.getMat();setTrainData(START_M_STEP, samplesMat, !_probs0.empty() ? &probs0 : 0, 0, 0, 0);return doTrain(START_M_STEP, logLikelihoods, labels, probs);}float predict(InputArray _inputs, OutputArray _outputs, int) const CV_OVERRIDE{bool needprobs = _outputs.needed();Mat samples = _inputs.getMat(), probs, probsrow;int ptype = CV_64F;float firstres = 0.f;int i, nsamples = samples.rows;if( needprobs ){if( _outputs.fixedType() )ptype = _outputs.type();_outputs.create(samples.rows, nclusters, ptype);probs = _outputs.getMat();}elsensamples = std::min(nsamples, 1);for( i = 0; i < nsamples; i++ ){if( needprobs )probsrow = probs.row(i);Vec2d res = computeProbabilities(samples.row(i), needprobs ? &probsrow : 0, ptype);if( i == 0 )firstres = (float)res[1];}return firstres;}Vec2d predict2(InputArray _sample, OutputArray _probs) const CV_OVERRIDE{int ptype = CV_64F;Mat sample = _sample.getMat();CV_Assert(isTrained());CV_Assert(!sample.empty());if(sample.type() != CV_64FC1){Mat tmp;sample.convertTo(tmp, CV_64FC1);sample = tmp;}sample = sample.reshape(1, 1);Mat probs;if( _probs.needed() ){if( _probs.fixedType() )ptype = _probs.type();_probs.create(1, nclusters, ptype);probs = _probs.getMat();}return computeProbabilities(sample, !probs.empty() ? &probs : 0, ptype);}

三、应用示例

Opencv学习笔记 - 使用opencvsharp和期望最大化_坐望云起的博客-CSDN博客期望最大化的受欢迎程度在很大程度上是因为它是从观察中学习参数的有效且稳健的程序。然而,通常可用于训练概率模型的唯一数据是不完整的。例如,在医学诊断中可能会出现缺失值,其中患者病史通常包括有限的一组测试的结果。或者,在基因表达聚类中,数据不完整源于在概率模型中有意省略基因到簇的分配。期望最大化算法能够在数据不完整的概率模型中进行参数估计。期望最大化算法(Expectation Maximization),是一种渐进逼近算法,通过迭代进行极大似然估计的优化算法。https://skydance./article/details/1Opencv学习笔记 - 使用opencvsharp和逻辑回归_坐望云起的博客-CSDN博客_opencvsharp使用说起逻辑回归要首先说到最优化算法。仔细想想就会发现,其实我们日常生活中遇到过很多最优化问题,比如如何在最短时间内从A点到达B点?如何投入最少工作量却获得最大的效益?如何设计发动机使得油耗最少而功率最大?可见,最优化的作用十分强大。接下来,我们介绍几个最优化算法,并利用它们训练出一个非线性函数用于分类。逻辑回归的目的是寻找一个非线性函数Sigmoid的最佳拟合参数,求解过程可以由最优化算法来完成。在最优化算法中,最常用的就是梯度上升算法,而梯度上升算法又可以简化为随机梯度上升算法。https://skydance./article/details/121897327Opencv学习笔记 - 使用opencvsharp和多层感知器_坐望云起的博客-CSDN博客人工神经网络(Artificial Neural Network,ANN)是一种非常经典的算法,具有适合并行运算、可分布存储、稳健性高、能逼近复杂的非线性关系等优点。OpenCV实现的多层感知器(MultilayerPerceptron,MLP)。多层感知器又称为多隐层前馈神经网络。多层感知器是众多神经网络模型的一种,它在文本识别等解决方案中名列前茅。如果网络足够大,则多层感知器可以表示任意的数学函数,这种特性被称为万能逼近特性(Universal Approximation Propert...https://skydance./article/details/121861870Opencv学习笔记 - 使用opencvsharp和支持向量机_坐望云起的博客-CSDN博客_opencvsharp使用以统计学习理论为基础的支持向量机被广泛应用于机器学习的各个领域,是最通用的万能分类器。20世纪90年代,针对当时的神经网络在小样本条件下的不良表现,人们试图从更本质的层次上寻求一种更好的学习机器。在这种需求的激发下,产生了统计学习理论,即研究小样本条件下机器学习规律的理论。1995年,出现了基于统计学习理论的支持向量机(Support Vector Machine,SVM)。与神经网络相比,对于有限样本的学习问题,统计学习理论具有更坚实的数学理论基础,因此SVM取得了很大的成功。https://skydance./article/details/121845536Opencv学习笔记 - 使用opencvsharp和Boosting算法处理分类问题_坐望云起的博客-CSDN博客决策树非常有用,但单独使用时它并不是表现最佳的分类器。改进的方法随机森林和Boosting算法。随机森林与Boosting算法都是在内部循环中使用决策树的,因此继承了决策树的许多优良属性,它们通常是机器学习库中最佳的“开箱即用”监督学习技术。Boosting算法又被称为OpenCV机器学习库中最好用的监督学习算法。https://skydance./article/details/121805808Opencv学习笔记 - 使用opencvsharp和随机森林进行分类和回归问题_坐望云起的博客-CSDN博客_opencv python 随机森林随机森林(Random Forest,RF)是一种简单易用的机器学习算法。即使在没有超参数调整的情况下,随机森林在大多数情况下仍可获得还算不错的结果。可用于分类任务和回归任务,是常用的机器学习算法之一。随机森林是一种监督学习算法,它构建的“森林”是决策树的集合,通常使用Bagging算法进行集成。随机森林首先使用训练出来的分类器集合对新样本进行分类,然后用多数投票或者对输出求均值的方法统计所有决策树的结果。由于森林中的每一棵决策树都具有...https://skydance./article/details/121805198Opencv学习笔记 - 使用opencvsharp和knn进行手写识别训练和预测_坐望云起的博客-CSDN博客https://skydance./article/details/121788006Opencv学习笔记 - 使用opencvsharp和决策树进行训练和预测_坐望云起的博客-CSDN博客_opencv决策树一、决策树决策树是最早的机器学习算法之一,起源于对人类某些决策过程的模仿,属于监督学习算法。决策树的优点是易于理解,有些决策树既可以做分类,也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1]。决策树有许多不同版本,典型版本是最早出现的ID3算法,以及对其改进后形成的C4.5算法,这两种算法可用于分类。对ID3算法改进的另一个分支为“分类和回归树”(Classification AndRegression Trees,CART)算法,可用于分类或回归。CART算法为随机森林和B...https://skydance./article/details/121383341

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。