原文链接:在opencv3中的机器学习算法练习:对OCR进行分类

本文贴出的代码为自己的训练集所用,作为参考。可运行demo程序请拜访原作者。

CNN作为图像识别和检测器,在分析物体结构分布的多类识别中具有绝对的优势。通多多层卷积核Pooling实现对物体表面分布的模板学习,以卷积核的形式存储在网络中。而对于统计特征,暂时没有明确的指导规则。

opencv3中的ml类与opencv2中发生了变化,下面列举opencv3的机器学习类方法实例,以随机森林为例。

代码:

  1. //使用OpenCV随机森林训练模型//使用训练好的样本-TXT文件
  2. int RTreesTrain( int argc, char* argv[] )
  3. {
  4. if (argc < 9) {
  5. std::cout << "argc<9";
  6. return 0;
  7. }
  8.  
  9. std::string fileFeatureTrain(argv[1]);
  10. std::string fileFeatureTest(argv[2]);
  11. std::string fileTrees(argv[3]);
  12.  
  13. int lenF = atoi(argv[4]);//特征长度 32
  14. int numF = atoi(argv[5]);//使用特征个数 1000
  15. int nsample = atoi(argv[6]);//总样本数 大于numF
  16. int nTrees = atoi(argv[7]);
  17. int nClass = atoi(argv[8]);
  18.  
  19. //载入特征
  20. cv::Mat data;
  21. cv::Mat responses;
  22. const string data_filename = fileFeatureTrain;
  23. read_num_class_data( data_filename, numF, lenF, &data, &responses );
  24.  
  25. cv::Ptr<cv::ml::RTrees> StyleModelHSV;
  26. StyleModelHSV = cv::ml::RTrees::create();
  27.  
  28. StyleModelHSV->setMaxDepth(10);
  29. StyleModelHSV->setMinSampleCount(10);
  30. StyleModelHSV->setRegressionAccuracy(0);
  31. StyleModelHSV->setUseSurrogates(false);
  32. StyleModelHSV->setMaxCategories(nClass);
  33. StyleModelHSV->setPriors(cv::Mat());
  34. StyleModelHSV->setCalculateVarImportance(true);
  35. StyleModelHSV->setActiveVarCount(4);
  36. StyleModelHSV->setTermCriteria(TC(10000, 0.01f));
  37.  
  38. int nsamples_all = nsample;// data.rows;
  39. int ntrain_samples = numF;// (int)(nsamples_all*0.8);
  40. cv::Ptr<cv::ml::TrainData> tdata = prepare_train_data(data, responses, ntrain_samples);
  41. cout << "The Model is training....." << endl;
  42. StyleModelHSV->train(tdata);
  43.  
  44. StyleModelHSV->save(fileTrees);
  45. return 1;
  46. }

  1. // 读取文件数据
  2. bool read_num_class_data( const string& fileFeatureTrain, int numF,int fLen, cv::Mat* _data, cv::Mat* _responses)
  3. {
  4. using namespace cv;
  5. Mat el_ptr(1, numF, CV_32F);
  6. vector<int> responses(0);
  7. _data->release();
  8. _responses->release();
  9.  
  10. freopen(fileFeatureTrain.c_str(), "r", stdin);
  11. cout << "The feature is loading....." << endl;
  12.  
  13. int i = 0;
  14. int label = 0;
  15. for (int i = 0; i < numF; ++i) {
  16. StyleFeature aFeat;aFeat.second.resize(fLen);
  17. std::string sline;getline(cin, sline);
  18.  
  19. //以空格分开
  20. int idxBlank = sline.find_first_of(" ");
  21.  
  22. std::string sLabel = sline;//获取标签;
  23. sLabel.erase(idxBlank, sLabel.length());
  24. responses.push_back(label);//aFeat.first = label = atoi(sLabel.c_str());
  25.  
  26. std::string sFV = sline;
  27. sFV.erase(0, idxBlank + 1);//获取一行,特征
  28.  
  29. int idxFv = 0;
  30. float fV = 0.0;
  31. while (sFV.length() > 0 && idxFv < fLen) {
  32. int idxColon = sFV.find_first_of(":");
  33. std::string sv = sFV;
  34. std::strstream ssv;
  35. sv = sv.substr(idxColon + 1, sv.find_first_of(" ") - 2);
  36. ssv << sv;ssv >> fV;
  37. el_ptr.at<float>(i) = fV;//aFeat.second[idxFv] = fV;
  38.  
  39. ++idxFv;
  40. sFV.erase(0, sFV.find_first_of(" ") + 1);
  41. }
  42. _data->push_back(el_ptr);//trainData.push_back(aFeat);
  43. }
  44.  
  45. fclose(stdin); cout << "The feature load over....." << endl;
  46. Mat(responses).copyTo(*_responses);
  47.  
  48. return true;
  49. }

  1. //准备训练数据
  2. cv::Ptr<cv::ml::TrainData> prepare_train_data( const cv::Mat& data, const cv::Mat& responses, int ntrain_samples )
  3. {
  4. using namespace cv;
  5. Mat sample_idx = Mat::zeros(1, data.rows, CV_8U);
  6. Mat train_samples = sample_idx.colRange(0, ntrain_samples);
  7. train_samples.setTo(Scalar::all(1));
  8.  
  9. int nvars = data.cols;
  10. Mat var_type(nvars + 1, 1, CV_8U);
  11. var_type.setTo(Scalar::all(ml::VAR_ORDERED));
  12. var_type.at<uchar>(nvars) = ml::VAR_CATEGORICAL;
  13.  
  14. return ml::TrainData::create(data, ml::ROW_SAMPLE, responses, noArray(), sample_idx, noArray(), var_type);
  15. }

样本结构:

  1. 0 1:211946 2:0 3:0 4:0 5:105 6:5693 7:34 8:0 9:0 10:0 11:25 12:12697 13:226916 14:1826 15:497 16:282 17:105 18:15 19:104 20:18 21:0 22:737 23:46979 24:17889 25:7121 26:6970 27:9441 28:12679 29:20890 30:37498 31:43568 32:27465
  2. 0 1:23544 2:210 3:11663 4:158 5:310 6:166 7:591 8:6131 9:193297 10:1985 11:1136 12:809 13:149069 14:33036 15:20045 16:11525 17:6552 18:2928 19:2590 20:1844 21:1305 22:11106 23:81817 24:29063 25:6654 26:5015 27:4916 28:8862 29:34762 30:44044 31:17409 32:7458
  3. 0 1:254596 2:0 3:65361 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:10 12:14033 13:333347 14:330 15:75 16:80 17:25 18:0 19:42 20:0 21:0 22:101 23:31990 24:66583 25:49191 26:59149 27:35800 28:25089 29:21463 30:18022 31:18409 32:8304
  4. 0 1:11697 2:2431 3:228 4:9 5:0 6:1 7:150 8:28 9:8413 10:9673 11:6345 12:6025 13:7695 14:8080 15:5689 16:6175 17:5146 18:4358 19:3246 20:2170 21:1478 22:963 23:2192 24:6866 25:7082 26:4273 27:3100 28:2733 29:2833 30:3265 31:3835 32:8821

OpenCV:使用OpenCV3随机森林进行统计特征多类分析的更多相关文章

  1. 基于opencv的RandomForest随机森林

    2.OpenCV函数使用 OpenCV提供了随机森林的相关类和函数.具体使用方法如下: (1)首先利用CvRTParams定义自己的参数,其格式如下 CvRTParams::CvRTParams(in ...

  2. OpenCV:使用 随机森林与GBDT

    随机森林顾名思义,是用随机的方式建立一个森林.简单来说,随机森林就是由多棵CART(Classification And Regression Tree)构成的.对于每棵树,它们使用的训练集是从总的训 ...

  3. RandomForestClassifier(随机森林检测每个特征的重要性及每个样例属于哪个类的概率)

    #In the next recipe, we'll look at how to tune the random forest classifier. #Let's start by importi ...

  4. 随机森林算法原理及OpenCV应用

    随机森林算法是机器学习.计算机视觉等领域内应用较为广泛的一个算法.它不仅可以用来做分类(包括二分类和多分类),也可用来做回归预测,也可以作为一种数据降维的手段. 在随机森林中,将生成很多的决策树,并不 ...

  5. 用随机森林分类器和GBDT进行特征筛选

    一.决策树(类型.节点特征选择的算法原理.优缺点.随机森林算法产生的背景) 1.分类树和回归树 由目标变量是离散的还是连续的来决定的:目标变量是离散的,选择分类树:反之(目标变量是连续的,但自变量可以 ...

  6. ObjectT5:在线随机森林-Multi-Forest-A chameleon in track in

    原文::Multi-Forest:A chameleon in tracking,CVPR2014  下的蛋...原文 使用随机森林的优势,在于可以使用GPU把每棵树分到一个流处理器里运行,容易并行化 ...

  7. RandomForest随机森林总结

    1.随机森林原理介绍 随机森林,指的是利用多棵树对样本进行训练并预测的一种分类器.该分类器最早由Leo Breiman和Adele Cutler提出,并被注册成了商标.简单来说,随机森林就是由多棵CA ...

  8. CART决策树和随机森林

    CART 分裂规则 将现有节点的数据分裂成两个子集,计算每个子集的gini index 子集的Gini index: \(gini_{child}=\sum_{i=1}^K p_{ti} \sum_{ ...

  9. Python中随机森林的实现与解释

    使用像Scikit-Learn这样的库,现在很容易在Python中实现数百种机器学习算法.这很容易,我们通常不需要任何关于模型如何工作的潜在知识来使用它.虽然不需要了解所有细节,但了解机器学习模型是如 ...

随机推荐

  1. C. Hexadecimal's Numbers

    C. Hexadecimal's Numbers time limit per test 1 second memory limit per test 64 megabytes input stand ...

  2. 17、Java并发性和多线程-避免死锁

    以下内容转自http://ifeve.com/deadlock-prevention/: 在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按 ...

  3. MyBatis3-以接口方式编程

    以下内容引用自http://www.yihaomen.com/article/java/304.htm,不过内容有修改: 继前一篇文章http://www.cnblogs.com/EasonJim/p ...

  4. ORACLE EM的删除与创建

    手动删除ORACLE 10G EM 使用emca可以手动配置em! 配置em的过程中有一个环节要特别主要: 不论使用dbca还是使用emca -deconfig dbcontrol db -repos ...

  5. Manthan, Codefest 16 F

    寻找树上最大权值和的两条不相交的路径. 树形DP题.挺难的,对于我…… 定义三个变量ma[MAXN], t[MAXN], sum[MAXN] 其中,ma[i]代表i子树中,最长的路径和 t[i]代表i ...

  6. ubuntu Shell

    Ubuntu下的ShellUbuntu的图形界面也是运行在Shell下的:虚拟终端机开启:Ctrl+Alt+F1~ F6 可以开启6个命令行的ShellCtrl+Alt+F7  开启图形终端机命令su ...

  7. GRANT 授权

    sys(管理员)身份登录.创建usernamezsta_new create user zsta_new   identified by password   default tablespace Z ...

  8. LeetCode 541. Reverse String II (反转字符串 II)

    Given a string and an integer k, you need to reverse the first k characters for every 2k characters ...

  9. 分布式软件体系结构风格(C/S,B/S)

    分布式软件体系结构风格 1.  三层C/S结构 2.  三层B/S结构 了解很多其它软件体系结构 三层C/S结构(3-Tier C/S Architecture) §第1层:用户界面GUI-表示层-- ...

  10. 深圳MPD大会 讲师演讲稿 2014-10

     深圳MPD大会 讲师演讲稿 2014-10  互联网下的蛋-姜志辉.pdf: http://www.t00y.com/file/76704370 俞炜-互联网研发整形术 终于版.pdf: htt ...