在opencv3中的机器学习算法
在opencv3.0中,提供了一个ml.cpp的文件,这里面全是机器学习的算法,共提供了这么几种:
1、正态贝叶斯:normal Bayessian classifier 我已在另外一篇博文中介绍过:在opencv3中实现机器学习之:利用正态贝叶斯分类
2、K最近邻:k nearest neighbors classifier
3、支持向量机:support vectors machine 请参考我的另外一篇博客:在opencv3中实现机器学习之:利用svm(支持向量机)分类
4、决策树: decision tree
5、ADA Boost:adaboost
6、梯度提升决策树:gradient boosted trees
7、随机森林:random forest
8、人工神经网络:artificial neural networks
9、EM算法:expectation-maximization
这些算法在任何一本机器学习书本上都可以介绍过,他们大致的分类过程都很相似,主要分为三个环节:
一、收集样本数据sampleData
二、训练分类器mode
三、对测试数据testData进行预测
不同的地方就是在opencv中的参数设定,假设训练数据为trainingDataMat,且已经标注好labelsMat。待测数据为testMat.
1、正态贝叶斯
// 创建贝叶斯分类器
Ptr<NormalBayesClassifier> model=NormalBayesClassifier::create(); // 设置训练数据
Ptr<TrainData> tData =TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat); //训练分类器
model->train(tData);
//预测数据
float response = model->predict(testMat);
2、K最近邻
Ptr<KNearest> knn = KNearest::create(); //创建knn分类器
knn->setDefaultK(K); //设定k值
knn->setIsClassifier(true);
// 设置训练数据
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
knn->train(tData);
float response = knn->predict(testMat);
3、支持向量机
Ptr<SVM> svm = SVM::create(); //创建一个分类器
svm->setType(SVM::C_SVC); //设置svm类型
svm->setKernel(SVM::POLY); //设置核函数;
svm->setDegree(0.5);
svm->setGamma();
svm->setCoef0();
svm->setNu(0.5);
svm->setP();
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, , 0.01));
svm->setC(C);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
svm->train(tData);
float response = svm->predict(testMat);
4、决策树: decision tree
Ptr<DTrees> dtree = DTrees::create(); //创建分类器
dtree->setMaxDepth(); //设置最大深度
dtree->setMinSampleCount();
dtree->setUseSurrogates(false);
dtree->setCVFolds(); //交叉验证
dtree->setUse1SERule(false);
dtree->setTruncatePrunedTree(false);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
dtree->train(tData);
float response = dtree->predict(testMat);
5、ADA Boost:adaboost
Ptr<Boost> boost = Boost::create();
boost->setBoostType(Boost::DISCRETE);
boost->setWeakCount();
boost->setWeightTrimRate(0.95);
boost->setMaxDepth();
boost->setUseSurrogates(false);
boost->setPriors(Mat());
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
boost->train(tData);
float response = boost->predict(testMat);
6、梯度提升决策树:gradient boosted trees
此算法在opencv3.0中被注释掉了,原因未知,因此此处提供一个老版本的算法。
GBTrees::Params params( GBTrees::DEVIANCE_LOSS, // loss_function_type
, // weak_count
0.1f, // shrinkage
1.0f, // subsample_portion
, // max_depth
false // use_surrogates )
);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
Ptr<GBTrees> gbtrees = StatModel::train<GBTrees>(tData, params);
float response = gbtrees->predict(testMat);
7、随机森林:random forest
Ptr<RTrees> rtrees = RTrees::create();
rtrees->setMaxDepth();
rtrees->setMinSampleCount();
rtrees->setRegressionAccuracy(.f);
rtrees->setUseSurrogates(false);
rtrees->setMaxCategories();
rtrees->setPriors(Mat());
rtrees->setCalculateVarImportance(false);
rtrees->setActiveVarCount();
rtrees->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, , ));
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
rtrees->train(tData);
float response = rtrees->predict(testMat);
8、人工神经网络:artificial neural networks
Ptr<ANN_MLP> ann = ANN_MLP::create();
ann->setLayerSizes(layer_sizes);
ann->setActivationFunction(ANN_MLP::SIGMOID_SYM, , );
ann->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, , FLT_EPSILON));
ann->setTrainMethod(ANN_MLP::BACKPROP, 0.001);
Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
ann->train(tData);
float response = ann->predict(testMat);
9、EM算法:expectation-maximization
EM算法与前面的稍微有点不同,它需要创建很多个model,将trainingDataMat分成很多个modelSamples,每个modelSamples训练出一个model
训练核心代码为:
int nmodels = (int)labelsMat.size();
vector<Ptr<EM> > em_models(nmodels);
Mat modelSamples; for( i = ; i < nmodels; i++ )
{
const int componentCount = ; modelSamples.release();
for (j = ; j < labelsMat.rows; j++)
{
if (labelsMat.at<int>(j,)== i)
modelSamples.push_back(trainingDataMat.row(j));
} // learn models
if( !modelSamples.empty() )
{
Ptr<EM> em = EM::create();
em->setClustersNumber(componentCount);
em->setCovarianceMatrixType(EM::COV_MAT_DIAGONAL);
em->trainEM(modelSamples, noArray(), noArray(), noArray());
em_models[i] = em;
}
}
预测:
Mat logLikelihoods(, nmodels, CV_64FC1, Scalar(-DBL_MAX));
for( i = ; i < nmodels; i++ )
{
if( !em_models[i].empty() )
logLikelihoods.at<double>(i) = em_models[i]->predict2(testMat, noArray())[];
}
这么多的机器学习算法,在实际用途中照我的理解其实只需要掌握svm算法就可以了。
ANN算法在opencv中也叫多层感知机,因此在训练的时候,需要分多层。
EM算法需要为每一类创建一个model。
其中一些算法的具体代码练习:在opencv3中的机器学习算法练习:对OCR进行分类
在opencv3中的机器学习算法的更多相关文章
- opencv3中的机器学习算法之:EM算法
不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...
- 在opencv3中实现机器学习算法之:利用最近邻算法(knn)实现手写数字分类
手写数字digits分类,这可是深度学习算法的入门练习.而且还有专门的手写数字MINIST库.opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000*20 ...
- 在opencv3中的机器学习算法练习:对OCR进行分类
OCR (Optical Character Recognition,光学字符识别),我们这个练习就是对OCR英文字母进行识别.得到一张OCR图片后,提取出字符相关的ROI图像,并且大小归一化,整个图 ...
- scikit-learn中的机器学习算法封装——kNN
接前面 https://www.cnblogs.com/Liuyt-61/p/11738399.html 回过头来看这张图,什么是机器学习?就是将训练数据集喂给机器学习算法,在上面kNN算法中就是将特 ...
- 在opencv3中实现机器学习之:利用逻辑斯谛回归(logistic regression)分类
logistic regression,注意这个单词logistic ,并不是逻辑(logic)的意思,音译过来应该是逻辑斯谛回归,或者直接叫logistic回归,并不是什么逻辑回归.大部分人都叫成逻 ...
- 在opencv3中实现机器学习之:利用svm(支持向量机)分类
svm分类算法在opencv3中有了很大的变动,取消了CvSVMParams这个类,因此在参数设定上会有些改变. opencv中的svm分类代码,来源于libsvm. #include "s ...
- 在opencv3中实现机器学习之:利用正态贝叶斯分类
opencv3.0版本中,实现正态贝叶斯分类器(Normal Bayes Classifier)分类实例 #include "stdafx.h" #include "op ...
- Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)
朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
一.基于密度的聚类算法的概述 最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...
随机推荐
- 关于第三方IOS的checkBox框架的使用
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Tomcat服务器性能优化
在这篇文章里分以下的七个步骤,按照这些步骤走,Tomcat服务器的性能就能改善哦. 增加JVM堆(heap) 解决内存泄漏问题 线程池(thread pool)的设置 压缩 调节数据库性能 Tomca ...
- 敏捷开发中高质量 Java 代码开发实践
Java 项目开发过程中,由于开发人员的经验.代码风格各不相同,以及缺乏统一的标准和管理流程,往往导致整个项目的代码质量较差,难于维护,需要较大的测试投入 和周期等问题. 这些问题在一个项目组初建.需 ...
- android中实现view可以滑动的六种方法续篇(一)
承接上一篇,如果你没有读过前四章方法,可以点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4985053.html 下面开始讲第五中方法. 五.利用Sc ...
- 【nginx】关于fastcgi_cache
一.简介 Nginx版本从0.7.48开始,支持了类似Squid的缓存功能.这个缓存是把URL及相关组合当做Key,用Md5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目 ...
- 初识50个Linux命令
1. [命令]:cat [功能说明]: concatenate files and print on the standard output #连接文件并打印到标准输出,有标准输出的都可以用重定向定向 ...
- Windows 网络问题
一.问题描述 每次重启后电脑的ip地址或无故没掉,或不能正常连网,要重新设置ip才能上网. 二.解决方法 在DOS窗口执行 netsh winsock reset netsh int ip res ...
- URAL 1430 Crime and Punishment
Crime and Punishment Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- 修改镜像文件EI.CFG
一.EI.cfg说明 Windows 7 安装光盘中存在着 SOURCES\EI.CFG 这样一个配置文件.EI.cfg 是特定于 Windows 安装程序的配置文件,用于确定在安装过程中应该使用哪种 ...
- [转]后台页面访问权限:页面基类&内置票据认证 使用方法
本文转自:http://www.cnblogs.com/fishtreeyu/archive/2011/01/29/1947421.html 一般网站后台页面除了登录页面login.aspx未登录用户 ...