OpenCV--SVM多分类问题

article/2025/9/7 23:03:09

物体识别中经常遇到多分类器问题,svm是比较成熟和直接的想法。一般来说使用svm作为多分类器主要有以下思路:

  1. 一对多(one-vs-all)。训练时依次将目标类别作为正样本,其余样本作为负样本,以此训练n个svm。这个在Andrew Ng的Machine leaning的课上介绍过。
    缺点:因为训练集是1:N的情况,存在较大的bias,不是特别实用。

  2. 一对一(one-vs-one)。训练时,任意两类样本之间训练一个svm,则n类别,训练出(n-1)n/2个svm。在runtime时,对一个未知样本分类,则使用投票的法方法。libsvm即使用的该种方法。
    缺点:类别多的时候,(n-1)n/2个支持向量机,计算代价大。

  3. 层次支持向量机。首先将所有类别分类为两个子类,再将子类进一步划分为两个子类,直到单独子类为止。好像一棵树耶。具体请参考:刘志刚, 李德仁, 秦前清, 等. 支持向量机在多类分类问题中的推广[J]. 2004.

  4. 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 representationint width = 512, height = 512;Mat image = Mat::zeros(height, width, CV_8UC3);// Set up training dataint 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 imageimshow("SVM Simple Example", image); // show it to the userwaitKey(0);
}

效果:
这里写图片描述

注意点:
使用RBF核或者使用autotrain,参数选择十分重要。不行你试试哟!!!


http://chatgpt.dhexx.cn/article/lUWyTdh1.shtml

相关文章

svm多分类python代码_SVM算法的理解及其Python实现多分类和二分类

原理 SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(pattern recognition)问题中有得到应用。 支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning) 方式对数据进行二元分类的广…

MATLAB实现SVM多分类(one-vs-rest),利用自带函数fitcsvm

MATLAB实现SVM多分类&#xff08;one-vs-rest&#xff09;,利用自带函数fitcsvm SVM多分类一对一&#xff08;one-vs-one&#xff09;一对多&#xff08;one-vs-rest&#xff09;fitcsvm简单介绍代码实验结果图第一次写博客&#xff0c;还请大家多多包涵&#xff0c;欢迎指教&a…

SVM多分类原理学习

https://scikit-learn.org/stable/modules/svm.html https://sklearn.apachecn.org/docs/master/5.html 中文翻译 SVC&#xff0c;NuSVC&#xff0c;LinearSVC在一个数据集上可以实现二分类&#xff0c;也能多类分类 SCV和NuSVC是相似的方法&#xff0c;但是接受的参数设置可…

SVM多类分类

从 SVM的那几张图可以看出来&#xff0c;SVM是一种典型的两类分类器&#xff0c;即它只回答属于正类还是负类的问题。而现实中要解决的问题&#xff0c;往往是多类的问题&#xff08;少部分例外&#xff0c;例如垃圾邮件过滤&#xff0c;就只需要确定“是”还是“不是”垃圾邮件…

傻瓜攻略(十九)——MATLAB实现SVM多分类

对于组合二元支持向量机模型的多类学习&#xff0c;使用纠错输出码&#xff08;ECOC&#xff0c;error-correcting output codes &#xff09;。有关详细信息&#xff0c;请参阅fitcecoc。 ECOC 可以用来将 Multiclass Learning 问题转化为 Binary Classification 问题。 以下…

【机器学习】SVM多分类问题及基于sklearn的Python代码实现

SVM多分类问题及Python代码实现 1. 什么是SVM?2. SVM的分类3. SVM决策函数类型4. SVM多分类的Python代码实现参考资料1. 什么是SVM? 对于这个点已经介绍的非常多了,不管是西瓜书还是各种博客,就是需要找到一个超平面,用这个超平面把数据划分成两个类别,最开始的SVM就是在…

SVM多分类问题

SVM本身是一个二值分类器&#xff0c;SVM算法最初是为二值分类问题设计的&#xff0c;当处理多类问题时&#xff0c;就需要构造合适的多类分类器。 1、直接法 &#xff1a;直接在目标函数上进行修改&#xff0c;将多个分类面的参数求解合并到一个最优化问题中&#xff0c;通…

《机器学习算法》SVM进行多分类及代码实现

最近做了一个工作就是对属性进行分类&#xff0c;然后用了不同的分类器&#xff0c;其中就用到了SVM&#xff0c;再次做一个总结。 1、什么是SVM&#xff1f; 对于这个点已经介绍的非常多了&#xff0c;不管是西瓜书还是各种博客&#xff0c;就是我们需要找到一个超平面&…

android uevent机制,安卓linux uevent内核上报机制实例

uevent可以实现内核通知上层的一种机制,最常见的电池状态的变化就是kernel uevent通知的,每次百分比或者其他的变化通过power_supply_changed通知上层update; 每个device下面都有kobj,找到device就可以通过kobject_uevent_env 通知android了; 以拔出T卡为例,内核通知上层。…

Linux设备模型剖析系列之二(uevent、sysfs)

CSDN链接&#xff1a; Linux设备模型剖析系列一&#xff08;基本概念、kobject、kset、kobj_type&#xff09; Linux设备模型剖析系列之二&#xff08;uevent、sysfs&#xff09; Linux设备模型剖析系列之三&#xff08;device和device driver&#xff09; Linux设备模型剖析系…

Linux下的uevent

查找linux的uevent节点(find /sys -name uevent)&#xff0c;大概有1000多个&#xff0c;那这些节点是怎么实现的呢。 drivers/base/core.c 有如下代码&#xff0c;每创建一个device&#xff0c;都会创建一个event节点 static ssize_t uevent_show(struct device *dev, struc…

Android UEvent事件分析

1.背景概述 众所周知,在安卓系统中有状态栏,在插入外设的时候,会在顶部状态栏显示小图标。 比如,camera设备,耳机设备,U盘,以及电池等等。这些都需要在状态栏动态显示。 从上面这张图片可以看出这些设备都有自己的服务一直在跑,并且都是继承了UEventObserver.java这个…

嵌入式Linux——uevent机制:uevent原理分析

简介&#xff1a; 本文主要介绍uevent机制是什么&#xff0c;并通过代码分析使用uevent机制生成设备节点的过程。而本文将分为两部分&#xff0c;第一部分我们介绍一些预备知识和uevent的原理&#xff0c;而第二部分——通过代码介绍使用uevent机制创建设备节点。 Linux内核&am…

uevent机制:uevent原理分析

简介&#xff1a; 本文主要介绍uevent机制是什么&#xff0c;并通过代码分析使用uevent机制生成设备节点的过程。而本文将分为两部分&#xff0c;第一部分我们介绍一些预备知识和uevent的原理&#xff0c;而第二部分——通过代码介绍使用uevent机制创建设备节点。 声明&#…

900 多道 LeetCode 题解,这个 GitHub 项目值得 Star!

公众号关注 “GitHubPorn” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 大家好&#xff0c;我是小 G。 周末风和日丽&#xff0c;适合刷 LeetCode 今天给你们推荐个 GitHub 项目&#xff0c;里面收集了 900 多道 LeetCode 题解&#xff0c;并包含中英文两个版本&…

Leetcode中你的代码执行之后显示超出时间限制

Leetcode中但凡是你的代码执行之后显示超出时间限制 比如&#xff1a; 那么必定是你写的代码不够完善甚至是还存在错误&#xff01;

升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!

对于还不了解LeetCode的同学&#xff0c;那比较厉害了&#xff0c;估计离大厂还有一步距离&#xff01; LeetCode&#xff0c;让程序员进阶的在线平台&#xff0c;找工作备战名企技术面试&#xff01;(文末阅读原文到达学习平台) 本公众号之前陪伴了几期LeetCode的打卡之旅&…

LeetCode 96~100

前言 本文隶属于专栏《LeetCode 刷题汇总》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构请见LeetCode 刷题汇总 正文 幕布 幕布链接 96. 不同的二叉搜索树 题解 官方…

【下载】快速通过Python笔试?学大家一样先把LeetCode答案私藏了

如今学习python的同学越来越多了&#xff0c;也正是同学们秋招时期&#xff0c;去年分享了LeetCode答案后&#xff0c;已经有上百位同学找到小编开始实践这个平台。 LeetCode&#xff0c;让程序员进阶的在线平台&#xff0c;找工作备战名企技术面试&#xff01;(文末阅读原文到…

面试失败总结,这 577 道 LeetCode 题 Java 版答案你值得拥有

去字节、美团、BAT 等大厂面试&#xff0c;刷 LeetCode 上的数据结构算法题是必修课。许多读者说&#xff0c;刷题的时候经常会遇到困难&#xff0c;想要找一本答案题解做参考。 下面分享几个用 Java 语言实现的开源 LeetCode 题解&#xff0c;也要感谢这些优秀的开源作者们&a…