OpenCV 3.3中给出了决策树Decision Tres算法的实现,即cv::ml::DTrees类,此类的声明在include/opencv2/ml.hpp文件中,实现在modules/ml/src/tree.cpp文件中。其中:

(1)、cv::ml::DTrees类:继承自cv::ml::StateModel,而cv::ml::StateModel又继承自cv::Algorithm;

(2)、create函数:为static,new一个DTreesImpl对象用来创建一个DTrees对象;

(3)、setMaxCategories/getMaxCategories函数:设置/获取最大的类别数,默认值为10;

(4)、setMaxDepth/getMaxDepth函数:设置/获取树的最大深度,默认值为INT_MAX;

(5)、setMinSampleCount/getMinSampleCount函数:设置/获取最小训练样本数,默认值为10;

(6)、setCVFolds/getCVFolds函数:设置/获取CVFolds(thenumber of cross-validation folds)值,默认值为10,如果此值大于1,用于修剪构建的决策树;

(7)、setUseSurrogates/getUseSurrogates函数:设置/获取是否使用surrogatesplits方法,默认值为false;

(8)、setUse1SERule/getUse1SERule函数:设置/获取是否使用1-SE规则,默认值为true;

(9)、setTruncatePrunedTree/getTruncatedTree函数:设置/获取是否进行剪枝后移除操作,默认值为true;

(10)、setRegressionAccuracy/getRegressionAccuracy函数:设置/获取回归时用于终止的标准,默认值为0.01;

(11)、setPriors/getPriors函数:设置/获取先验概率数值,用于调整决策树的偏好,默认值为空的Mat;

(12)、getRoots函数:获取根节点索引;

(13)、getNodes函数:获取所有节点索引;

(14)、getSplits函数:获取所有拆分索引;

(15)、getSubsets函数:获取分类拆分的所有bitsets;

(16)、load函数:load已序列化的model文件。

关于决策树算法的简介可以参考:http://blog.csdn.net/fengbingchun/article/details/78880934

以下是从数据集MNIST中提取的40幅图像,0,1,2,3四类各20张,每类的前10幅来自于训练样本,用于训练,后10幅来自测试样本,用于测试,如下图:

关于MNIST的介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/49611549

测试代码如下:

#include "opencv.hpp"
#include <string>
#include <vector>
#include <memory>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <opencv2/ml.hpp>
#include "common.hpp"/ Decision Tree
int test_opencv_decision_tree_train()
{const std::string image_path{ "E:/GitCode/NN_Test/data/images/digit/handwriting_0_and_1/" };cv::Mat tmp = cv::imread(image_path + "0_1.jpg", 0);CHECK(tmp.data != nullptr);const int train_samples_number{ 40 };const int every_class_number{ 10 };cv::Mat train_data(train_samples_number, tmp.rows * tmp.cols, CV_32FC1);cv::Mat train_labels(train_samples_number, 1, CV_32FC1);float* p = (float*)train_labels.data;for (int i = 0; i < 4; ++i) {std::for_each(p + i * every_class_number, p + (i + 1)*every_class_number, [i](float& v){v = (float)i; });}// train datafor (int i = 0; i < 4; ++i) {static const std::vector<std::string> digit{ "0_", "1_", "2_", "3_" };static const std::string suffix{ ".jpg" };for (int j = 1; j <= every_class_number; ++j) {std::string image_name = image_path + digit[i] + std::to_string(j) + suffix;cv::Mat image = cv::imread(image_name, 0);CHECK(!image.empty() && image.isContinuous());image.convertTo(image, CV_32FC1);image = image.reshape(0, 1);tmp = train_data.rowRange(i * every_class_number + j - 1, i * every_class_number + j);image.copyTo(tmp);}}cv::Ptr<cv::ml::DTrees> dtree = cv::ml::DTrees::create();dtree->setMaxCategories(4);dtree->setMaxDepth(10);dtree->setMinSampleCount(10);dtree->setCVFolds(0);dtree->setUseSurrogates(false);dtree->setUse1SERule(false);dtree->setTruncatePrunedTree(false);dtree->setRegressionAccuracy(0);dtree->setPriors(cv::Mat());dtree->train(train_data, cv::ml::ROW_SAMPLE, train_labels);const std::string save_file{ "E:/GitCode/NN_Test/data/decision_tree_model.xml" }; // .xml, .yaml, .jsonsdtree->save(save_file);return 0;
}int test_opencv_decision_tree_predict()
{const std::string image_path{ "E:/GitCode/NN_Test/data/images/digit/handwriting_0_and_1/" };const std::string load_file{ "E:/GitCode/NN_Test/data/decision_tree_model.xml" }; // .xml, .yaml, .jsonsconst int predict_samples_number{ 40 };const int every_class_number{ 10 };cv::Mat tmp = cv::imread(image_path + "0_1.jpg", 0);CHECK(tmp.data != nullptr);// predict dattacv::Mat predict_data(predict_samples_number, tmp.rows * tmp.cols, CV_32FC1);for (int i = 0; i < 4; ++i) {static const std::vector<std::string> digit{ "0_", "1_", "2_", "3_" };static const std::string suffix{ ".jpg" };for (int j = 11; j <= every_class_number + 10; ++j) {std::string image_name = image_path + digit[i] + std::to_string(j) + suffix;cv::Mat image = cv::imread(image_name, 0);CHECK(!image.empty() && image.isContinuous());image.convertTo(image, CV_32FC1);image = image.reshape(0, 1);tmp = predict_data.rowRange(i * every_class_number + j - 10 - 1, i * every_class_number + j - 10);image.copyTo(tmp);}}cv::Mat result;cv::Ptr<cv::ml::DTrees> dtrees = cv::ml::DTrees::load(load_file);dtrees->predict(predict_data, result);CHECK(result.rows == predict_samples_number);cv::Mat predict_labels(predict_samples_number, 1, CV_32FC1);float* p = (float*)predict_labels.data;for (int i = 0; i < 4; ++i) {std::for_each(p + i * every_class_number, p + (i + 1)*every_class_number, [i](float& v){v = (float)i; });}int count{ 0 };for (int i = 0; i < predict_samples_number; ++i) {float value1 = ((float*)predict_labels.data)[i];float value2 = ((float*)result.data)[i];fprintf(stdout, "expected value: %f, actual value: %f\n", value1, value2);if (int(value1) == int(value2)) ++count;}fprintf(stdout, "accuracy: %f\n", count * 1.f / predict_samples_number);return 0;
}

执行结果如下:由于训练样本数量少,所以识别率只有72.5%,为了提高识别率,可以增加训练样本数。

GitHub: https://github.com/fengbingchun/NN_Test

OpenCV3.3中决策树(Decision Tree)接口简介及使用相关推荐

  1. 决策树(Decision Tree)简介

    决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法.决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树型的分类模型. ...

  2. 决策树 Decision Tree 简介

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!  决策树 ...

  3. Machine Learning | (7) Scikit-learn的分类器算法-决策树(Decision Tree)

    Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...

  4. 算法杂货铺——分类算法之决策树(Decision tree)

    算法杂货铺--分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 88978 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别 ...

  5. 数据分类:决策树Decision Tree

    背景 决策树(decision tree)是一种基本的分类和回归(后面补充一个回归的例子?)方法,它呈现的是一种树形结构,可以认为是if-then规则的集合.其其主要优点是模型具有很好的可读性,且分类 ...

  6. 决策树Decision Tree+ID3+C4.5算法实战

    决策树Decision Tree 决策树的三种算法: 举个栗子: 熵entropy的概念: 信息熵越大,不确定性越大.信息熵越小,不确定性越小. 其实就是排列组合之中的概率,概率相乘得到其中一个组合, ...

  7. 机器学习算法实践:决策树 (Decision Tree)(转载)

    前言 最近打算系统学习下机器学习的基础算法,避免眼高手低,决定把常用的机器学习基础算法都实现一遍以便加深印象.本文为这系列博客的第一篇,关于决策树(Decision Tree)的算法实现,文中我将对决 ...

  8. 第六章.决策树(Decision Tree)—CART算法

    第六章.决策树(Decision Tree) 6.2 CART算法 CART决策树的生成就是递归地构建二叉决策树的过程.CART用基尼(Gini)系数最小化准则来进行特征选择,生成二叉树. 1.Gin ...

  9. 分类Classification:决策树Decision Tree

    目录 分类的定义 决策树Decision Tree 混乱衡量指标Gini index 决策树的特点 分类的定义 分类:建立一个学习函数(分类模型)将每个属性集合(x1,x2,...xn)对应到一组已定 ...

最新文章

  1. Java中创建线程需要使用的类_如何通过使用Java中的匿名类创建线程?
  2. webpack如何将css文件分离的,【Webpack小书】Webpack中如何将CSS样式抽取到独立文件中? - Tim的资源站...
  3. JPA使用指南 javax.persistence的注解配置
  4. 在 Win7 下运行 TC 2.0 / TC3.0 / BC 3.1 / QB 4.5 等 DOS 开发工具
  5. 科普 | 5G基站功耗,到底有多可怕?
  6. font-size用VW来写的方法
  7. 熟悉Qt开发环境--Hello Qt
  8. Json-server 创建模拟API服务器
  9. 前端Vue3中级视频(240分钟)评分95分
  10. Eclipse 提示 The given project is not a virtual component project
  11. 运算符——Python
  12. 181008有道扇贝每日一句
  13. 随机画五十个圆python_随拼音,随部首,随笔画,随组词,随解释,随笔顺,随词语,随康熙字典解释,随说文解字解释 - 查字典|CHAZIDIAN...
  14. Iocomp Crack和ProEssentials Crack
  15. 矩阵论(四)——矩阵的广义逆
  16. php百度编辑器demo,百度编辑器 Laravel Ueditor | 码农软件 - 码农网
  17. 开关电源模块 遥控开/关电路
  18. 【AVD】【转载翻译】NVDEC_VideoDecoder_API_ProgGuide
  19. 计算机评游戏图形低,5常见的PC游戏图形选项说明 | MOS86
  20. MFC生成错误msado15.tlh(3991):fatal error C1003: 错误计数超过100;正在停止编译

热门文章

  1. Overleaf-LaTex表格制作
  2. raymarching算法
  3. IDEA设置单击左侧项目文件,自动在右侧编辑器打开
  4. 【杠精】问卷星防切屏解除方法-解除问卷星平台模拟考试防作弊切屏和最大化全屏的方法
  5. ATS线上报告个别日志过大无法写入问题的解决方法
  6. HLS中m3u8格式规范解读
  7. Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)
  8. static关键字和内存使用
  9. jQuery与其它库冲突的解决方法(转)
  10. 关系管理系统:js代码生成select的出生日期