OpenCV--SVM多分类问题
<div class="markdown_views"><p>物体识别中经常遇到多分类器问题,svm是比较成熟和直接的想法。一般来说使用svm作为多分类器主要有以下思路:</p>
一对多(one-vs-all)。训练时依次将目标类别作为正样本,其余样本作为负样本,以此训练n个svm。这个在Andrew Ng的Machine leaning的课上介绍过。
缺点:因为训练集是1:N的情况,存在较大的bias,不是特别实用。一对一(one-vs-one)。训练时,任意两类样本之间训练一个svm,则n类别,训练出(n-1)n/2个svm。在runtime时,对一个未知样本分类,则使用投票的法方法。libsvm即使用的该种方法。
缺点:类别多的时候,(n-1)n/2个支持向量机,计算代价大。层次支持向量机。首先将所有类别分类为两个子类,再将子类进一步划分为两个子类,直到单独子类为止。好像一棵树耶。具体请参考:刘志刚, 李德仁, 秦前清, 等. 支持向量机在多类分类问题中的推广[J]. 2004.
DAG-SVMS。由Platt提出的决策导向的循环图DDAG导出的,是针对“一对一”SVMS存在误分、拒分现象提出的。请参考论文
简单示例
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp> #include "opencv2/imgcodecs.hpp" #include <opencv2/highgui.hpp> #include <opencv2/ml.hpp> using namespace cv; using namespace cv::ml; Vec3b getRandomColor(){ RNG rng(clock()); return Vec3b(rng.next() % 255, rng.next() % 255, rng.next() % 255); } int main( int, char **) { // Data for visual representation int width = 512, height = 512; Mat image = Mat::zeros(height, width, CV_8UC3); // Set up training data int labels[ 4] = { 1, 2, 3, 4}; float trainingData[ 4][ 2] = { { 100, 10}, { 10, 500}, { 500, 10}, { 500, 500} }; Mat trainingDataMat( 4, 2, CV_32FC1, trainingData); Mat labelsMat( 4, 1, CV_32SC1, labels); // Train the SVM //! [init] Ptr<SVM> svm = SVM::create(); svm->setType(SVM::C_SVC); svm->setKernel(SVM::POLY); svm->setDegree( 1.0); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); //! [init] //! [train] // svm->train(trainingDataMat, ROW_SAMPLE, labelsMat); // Ptr<TrainData> auto_train_data = TrainData::create(trainingDataMat, ROW_SAMPLE, labelsMat); // svm->trainAuto(auto_train_data); svm->train(trainingDataMat, ROW_SAMPLE, labelsMat); //! [train] // Show the decision regions given by the SVM //! [show] Vec3b green( 0, 255, 0), blue ( 255, 0, 0), red( 0, 0, 255),yellow( 0, 255, 255); for ( int i = 0; i < image.rows; ++i){ for ( int j = 0; j < image.cols; ++j){ Mat sampleMat = (Mat_< float>( 1, 2) << j,i); float response = svm->predict(sampleMat); double ratio = 0.5; if (response == 1) image.at<Vec3b>(i,j) = green *ratio; else if (response == 2) image.at<Vec3b>(i,j) = blue *ratio; else if(response == 3){ image.at<Vec3b>(i,j) = red *ratio; } else if(response == 4){ image.at<Vec3b>(i,j) = yellow *ratio; } } } int thickness = - 1; int lineType = 8; circle( image, Point( 100, 10), 5, Scalar( 0, 255, 0), thickness, lineType ); circle( image, Point( 10, 500), 5, Scalar( 255, 0, 0), thickness, lineType ); circle( image, Point( 500, 10), 5, Scalar( 0, 0, 255), thickness, lineType ); circle( image, Point( 500, 500), 5, Scalar( 0, 255, 255), thickness, lineType ); thickness = 2; lineType = 8; Mat sv = svm->getSupportVectors(); std::cout << sv << std::endl; for ( int i = 0; i < sv.rows; ++i){ const float* v = sv.ptr< float>(i); circle( image, Point( ( int) v[ 0], ( int) v[ 1]), 6, CV_RGB( 128, 128, 128), 2); } imwrite( "result.png", image); // save the image imshow( "SVM Simple Example", image); // show it to the user waitKey( 0); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
效果:
注意点:
使用RBF核或者使用autotrain,参数选择十分重要。不行你试试哟!!!
OpenCV--SVM多分类问题相关推荐
- OpenCV+SVM简单应用-------路面箭头分类
OpenCV+SVM简单应用-------路面箭头分类 博客分类: openCV C++ 机器学习 openCV,图像处理 问题内容:路面箭头检测与识别(该部分主要介绍基于SVM的分类,也就是识别,检 ...
- 详细的基于opencv svm hog的描述讲解
(转自http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义: locally normalised histogram ...
- SVM+二分类+多分类
SVM+二分类+多分类 SVM本身是一个二值分类器,SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器. 目前,构造SVM多类分类器的方法主要有两类,直接法.间接法. ...
- MAT之SVM:SVM之分类预测根据已有大量数据集案例,输入已有病例的特征向量实现乳腺癌诊断高准确率预测
MAT之SVM:SVM之分类预测根据已有大量数据集案例,输入已有病例的特征向量实现乳腺癌诊断高准确率预测 目录 输出结果 代码设计 输出结果 代码设计 load BreastTissue_data.m ...
- OpenCV SVM支持向量机和KNearest数字识别的实例(附完整代码)
OpenCV SVM支持向量机和KNearest数字识别的实例 OpenCV SVM支持向量机和KNearest数字识别的实例 OpenCV SVM支持向量机和KNearest数字识别的实例 #inc ...
- OpenCV转换PyTorch分类模型并使用OpenCV C ++启动
OpenCV转换PyTorch分类模型并使用OpenCV C ++启动 转换PyTorch分类模型并使用OpenCV C ++启动 目标 简介 要求 实践 模型转换管道 推理管道 转换PyTorch分 ...
- OpenCV转换PyTorch分类模型并使用OpenCV Python启动
OpenCV转换PyTorch分类模型并使用OpenCV Python启动 转换PyTorch分类模型并使用OpenCV Python启动 目标 介绍 要求 实践 模型转换管道 模型评估 评估模式 测 ...
- 机器学习:SVM多分类,SVM回归(SVR)
文章目录 分类和回归的关系: 多分类问题处理的普适的方法: 一对多(One VS Rest): 一对一(One vs One): 有向无环图方法(Directed Acyclic Graph Meth ...
- [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 机器学习(二十一)——Optimizer, 单分类SVM多分类SVM, 时间序列分析
http://antkillerfarm.github.io/ Optimizer 在<机器学习(一)>中,我们已经指出梯度下降是解决凸优化问题的一般方法.而如何更有效率的梯度下降,就是本 ...
最新文章
- FTP 命令的使用详解
- 如何利用 nbconvert将 IPYNB文档转换 Markdown文档?
- 思科服务器型号m1414,Cisco UCS M 系列模块化服务器
- vs2012下 error4996
- FormatJS – 让你的 Web 应用程序国际化
- 【转载】KMP算法详解
- 【操作系统】信号量的用法
- 数据库中单个表数据备份
- C#获取实体类属性名和值 | 遍历类对象
- Oracle中Lpad函数和Rpad函数的用法
- yolov3 使用darknet的python接口使用
- php xss漏洞扫描工具,XSS漏洞扫描器工具:XSpear
- 常见水果日文名称整理:
- 推荐电影电视剧下载最好去处
- S3C2440 蜂鸣器 汇编语言,S3C2440 点亮led灯详解(基于MDK) | 勤奋的小青蛙
- 麦子学院IT资源,web前端,UI设计,Java全套,IOS,android,产品经理,pyhton,网络安全,运维
- SSH密码暴力破解及防御实战
- 数据结构复习题(线性表)
- 使用BBED恢复DELETE的数据
- JS中substr和substring