在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、正态贝叶斯

  1. // 创建贝叶斯分类器
  2. Ptr<NormalBayesClassifier> model=NormalBayesClassifier::create();
  3.  
  4. // 设置训练数据
  5. Ptr<TrainData> tData =TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  6.  
  7. //训练分类器
  8. model->train(tData);
  9. //预测数据
  10. float response = model->predict(testMat);

2、K最近邻

  1. Ptr<KNearest> knn = KNearest::create(); //创建knn分类器
  2. knn->setDefaultK(K); //设定k值
  3. knn->setIsClassifier(true);
  4. // 设置训练数据
  5. Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  6. knn->train(tData);
  7. float response = knn->predict(testMat);

3、支持向量机

  1. Ptr<SVM> svm = SVM::create(); //创建一个分类器
  2. svm->setType(SVM::C_SVC); //设置svm类型
  3. svm->setKernel(SVM::POLY); //设置核函数;
  4. svm->setDegree(0.5);
  5. svm->setGamma();
  6. svm->setCoef0();
  7. svm->setNu(0.5);
  8. svm->setP();
  9. svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, , 0.01));
  10. svm->setC(C);
  11. Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  12. svm->train(tData);
  13. float response = svm->predict(testMat);

4、决策树: decision tree

  1. Ptr<DTrees> dtree = DTrees::create(); //创建分类器
  2. dtree->setMaxDepth(); //设置最大深度
  3. dtree->setMinSampleCount();
  4. dtree->setUseSurrogates(false);
  5. dtree->setCVFolds(); //交叉验证
  6. dtree->setUse1SERule(false);
  7. dtree->setTruncatePrunedTree(false);
  8. Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  9. dtree->train(tData);
  10. float response = dtree->predict(testMat);

5、ADA Boost:adaboost

  1. Ptr<Boost> boost = Boost::create();
  2. boost->setBoostType(Boost::DISCRETE);
  3. boost->setWeakCount();
  4. boost->setWeightTrimRate(0.95);
  5. boost->setMaxDepth();
  6. boost->setUseSurrogates(false);
  7. boost->setPriors(Mat());
  8. Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  9. boost->train(tData);
  10. float response = boost->predict(testMat);

6、梯度提升决策树:gradient boosted trees

此算法在opencv3.0中被注释掉了,原因未知,因此此处提供一个老版本的算法。

  1. GBTrees::Params params( GBTrees::DEVIANCE_LOSS, // loss_function_type
  2. , // weak_count
  3. 0.1f, // shrinkage
  4. 1.0f, // subsample_portion
  5. , // max_depth
  6. false // use_surrogates )
  7. );
  8. Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  9. Ptr<GBTrees> gbtrees = StatModel::train<GBTrees>(tData, params);
  10. float response = gbtrees->predict(testMat);

7、随机森林:random forest

  1. Ptr<RTrees> rtrees = RTrees::create();
  2. rtrees->setMaxDepth();
  3. rtrees->setMinSampleCount();
  4. rtrees->setRegressionAccuracy(.f);
  5. rtrees->setUseSurrogates(false);
  6. rtrees->setMaxCategories();
  7. rtrees->setPriors(Mat());
  8. rtrees->setCalculateVarImportance(false);
  9. rtrees->setActiveVarCount();
  10. rtrees->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, , ));
  11. Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  12. rtrees->train(tData);
  13. float response = rtrees->predict(testMat);

8、人工神经网络:artificial neural networks

  1. Ptr<ANN_MLP> ann = ANN_MLP::create();
  2. ann->setLayerSizes(layer_sizes);
  3. ann->setActivationFunction(ANN_MLP::SIGMOID_SYM, , );
  4. ann->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, , FLT_EPSILON));
  5. ann->setTrainMethod(ANN_MLP::BACKPROP, 0.001);
  6. Ptr<TrainData> tData = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat);
  7. ann->train(tData);
  8. float response = ann->predict(testMat);

9、EM算法:expectation-maximization

EM算法与前面的稍微有点不同,它需要创建很多个model,将trainingDataMat分成很多个modelSamples,每个modelSamples训练出一个model

训练核心代码为:

  1. int nmodels = (int)labelsMat.size();
  2. vector<Ptr<EM> > em_models(nmodels);
  3. Mat modelSamples;
  4.  
  5. for( i = ; i < nmodels; i++ )
  6. {
  7. const int componentCount = ;
  8.  
  9. modelSamples.release();
  10. for (j = ; j < labelsMat.rows; j++)
  11. {
  12. if (labelsMat.at<int>(j,)== i)
  13. modelSamples.push_back(trainingDataMat.row(j));
  14. }
  15.  
  16. // learn models
  17. if( !modelSamples.empty() )
  18. {
  19. Ptr<EM> em = EM::create();
  20. em->setClustersNumber(componentCount);
  21. em->setCovarianceMatrixType(EM::COV_MAT_DIAGONAL);
  22. em->trainEM(modelSamples, noArray(), noArray(), noArray());
  23. em_models[i] = em;
  24. }
  25. }

预测:

  1. Mat logLikelihoods(, nmodels, CV_64FC1, Scalar(-DBL_MAX));
  2. for( i = ; i < nmodels; i++ )
  3. {
  4. if( !em_models[i].empty() )
  5. logLikelihoods.at<double>(i) = em_models[i]->predict2(testMat, noArray())[];
  6. }

这么多的机器学习算法,在实际用途中照我的理解其实只需要掌握svm算法就可以了。

ANN算法在opencv中也叫多层感知机,因此在训练的时候,需要分多层。

EM算法需要为每一类创建一个model。

其中一些算法的具体代码练习:在opencv3中的机器学习算法练习:对OCR进行分类

在opencv3中的机器学习算法的更多相关文章

  1. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

  2. 在opencv3中实现机器学习算法之:利用最近邻算法(knn)实现手写数字分类

    手写数字digits分类,这可是深度学习算法的入门练习.而且还有专门的手写数字MINIST库.opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000*20 ...

  3. 在opencv3中的机器学习算法练习:对OCR进行分类

    OCR (Optical Character Recognition,光学字符识别),我们这个练习就是对OCR英文字母进行识别.得到一张OCR图片后,提取出字符相关的ROI图像,并且大小归一化,整个图 ...

  4. scikit-learn中的机器学习算法封装——kNN

    接前面 https://www.cnblogs.com/Liuyt-61/p/11738399.html 回过头来看这张图,什么是机器学习?就是将训练数据集喂给机器学习算法,在上面kNN算法中就是将特 ...

  5. 在opencv3中实现机器学习之:利用逻辑斯谛回归(logistic regression)分类

    logistic regression,注意这个单词logistic ,并不是逻辑(logic)的意思,音译过来应该是逻辑斯谛回归,或者直接叫logistic回归,并不是什么逻辑回归.大部分人都叫成逻 ...

  6. 在opencv3中实现机器学习之:利用svm(支持向量机)分类

    svm分类算法在opencv3中有了很大的变动,取消了CvSVMParams这个类,因此在参数设定上会有些改变. opencv中的svm分类代码,来源于libsvm. #include "s ...

  7. 在opencv3中实现机器学习之:利用正态贝叶斯分类

    opencv3.0版本中,实现正态贝叶斯分类器(Normal Bayes Classifier)分类实例 #include "stdafx.h" #include "op ...

  8. Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...

  9. 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

    一.基于密度的聚类算法的概述     最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...

随机推荐

  1. 解决log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader)警告信息的问题

    spring项目经常在启动tomcat时报如下警告信息: log4j:WARN No appenders could be found for logger (org.springframework. ...

  2. Ubuntu 环境 运行Asp.net mvc +EntityFramework+ Mysql

    关键词:ubuntu,mono,.Net framework 4.5,asp.net mvc 4,Entityframework 6,Mysql Mono安装 参考文章: Install Mono o ...

  3. 深入剖析js命名空间函数namespace

    在看阿里员工写的开源数据库连接池的druid的源代码时,发现了其中在jquery的原代码中又定义了一个命名空间的函数:$.namespace(),其代码如下: 网址为:https://github.c ...

  4. jQuery最佳实践(不断更新中...)

    1. 处理cdn失效 <script type="text/javascript" src="http://xxx.com/jquery.min.js " ...

  5. MyCat 学习笔记 第八篇.数据分片 之 求摸运算分片

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在M ...

  6. 第一篇 UEditor入门部署和体验

    UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. UEditor富文本编辑器,轻量, ...

  7. Linux学习之三——操作档案与目录

    一. 目录文档操作指令 1. pwd 显示目前所在目录 如果加上-P 的选项,则取得正确的目录名称,而不是以链接文件的路径来显示. 例如CentOS下,刚刚好/var/mail是/var/spool/ ...

  8. Ubuntu进阶学习,指令迅速查询,Bug迅速查询(Ctrl+F)

    There is some notes while I am learning Ubuntu Operate System! (Ask Ubuntu) 1-- Hard link : ln comma ...

  9. makefile中的伪目标

    伪目标就是总是被执行的目标,相对于目标来说,伪目标不会去考虑它的依赖的时间戳与自己时间戳的新旧关系,从而决定是否执行规则.伪目标格式: .PHONY:clean clean: -rm *.o 在mak ...

  10. dev/shm time in linux

    统计文件夹大小: du -hx --max=1 : du -sk :du -hsc 重新组织行分隔符进行显示: echo "abc,dd,bach,dong,jing,shang,china ...