opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例

这篇具有很好参考价值的文章主要介绍了opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

支持向量机(Support Vector Machine,SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大)。当数据集较小时,使用支持向量机进行分类非常有效。支持向量机是最好的现成分类器之一,这里所谓的“现成”是指分类器不加修改即可直接使用。

在对原始数据分类的过程中,可能无法使用线性方法实现分割。支持向量机在分类时,把无法线性分割的数据映射到高维空间,然后在高维空间找到分类最优的线性分类器。

Python 提供了不同的实现支持向量机的库(例如 sk-learn 库、LIBSVM 库等),OpenCV 也提供了对支持向量机的支持,对于上述库,基本都可以直接使用,无须深入了解支持向量机的原理。

理论基础

  1. 分类
    某 IT 企业在 2017 年通过笔试、面试的形式招聘了一批员工。2018 年,企业针对这批员工在过去一年的实际表现进行了测评,将他们的实际表现分别确定为 A 级(优秀)和 B 级(良好)。这批员工的笔试成绩、面试成绩和等级如图 21-1 所示,图中横坐标是笔试成绩,纵坐标
    是面试成绩,位于右上角的圆点表示测评成绩是 A 级,位于左下角的小方块表示测评成绩是 B级。

opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例,opencv 进阶,人工智能,计算机视觉,opencv,支持向量机,人工智能,计算机视觉,python
当然,公司肯定希望招聘到的员工都是 A 类(表现为 A 级)的。关键是如何根据笔试和面试成绩确定哪些员工可能是未来的 A 类员工呢?或者说,如何根据笔试和面试成绩确保招聘的员工是潜在的优秀员工?偷懒的做法是将笔试和面试的成绩标准都定得较高,但这样做可能会漏掉某些优秀的员工。

所以,要合理地确定笔试和面试的成绩标准,确保能够准确高效地招到 A 类员工。例如,在图 21-2 中,分别使用直线对笔试和面试成绩进行了 3 种不同形式的划分,将成绩位于直线左下方的员工划分为 B 类,将成绩位于右上方的员工划分为 A 类。

opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例,opencv 进阶,人工智能,计算机视觉,opencv,支持向量机,人工智能,计算机视觉,python
2. 分类器

在图 21-2 中用于划分不同类别的直线,就是分类器。在构造分类器时,非常重要的一项工作就是找到最优分类器。

那么,图 21-2 中的三个分类器,哪一个更好呢?从直观上,我们可以发现图 21-2 中右上角的分类器和右下角的分类器都偏向了某一个分类(即与其中一个分类的间距更小),而左下角的分类器实现了“均分”。而左下角的分类器,尽量让两个分类离自己一样远,这样就为每个分类都预留了等量的扩展空间,即使有新的靠近边界的点进来,也能够按照位置划分到对应的分类内。

以上述划分为例,说明如何找到支持向量机:在已有数据中,找到离分类器最近的点,确保它们离分类器尽可能地远。这里,离分类器最近的点到分类器的距离称为间隔(margin)。我们希望间隔尽可能地大,这样分类器在处理数据时,就会更准确。

例如,在图 21-3 中,左下角分类器的间隔最大。离分类器最近的那些点叫作支持向量(support vector)。正是这些支持向量,决定了分类器所在的位置。

opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例,opencv 进阶,人工智能,计算机视觉,opencv,支持向量机,人工智能,计算机视觉,python

3. 将不可分变为可分
上例的数据非常简单,我们可以使用一条直线(线性分类器)轻易地对其进行划分。而现实中的大多数问题,往往是非常复杂的,不可能像上例一样简单地完成划分。

通常情况下,支持向量机会将不那么容易分类的数据通过函数映射变为可分类的。

举个例子,假设我们不小心将豌豆和小米混在了一起。豌豆的个头很大,直径在 10 mm 左右;小米个头小,直径在 1mm 左右。如果想把它们分开,直接使用直线是不行的。此时,我们可以使用直径为 3 mm 的筛子,将豌豆和小米区分开。在某种意义上,这个筛子就是映射操作,它将豌豆和小米有效地分开了。

支持向量机在处理数据时,如果在低维空间内无法完成分类,就会自动将数据映射到高维空间,使其变为(线性)可分的。简单地讲,就是对当前数据进行函数映射操作。

如图 21-4 所示,在分类时,通过函数 f 的映射,让左图中本来不能用线性分类器分类的数据变为右图中线性可分的数据。当然,在实际操作中,也可能将数据由低维空间向高维空间转换。

opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例,opencv 进阶,人工智能,计算机视觉,opencv,支持向量机,人工智能,计算机视觉,python
大家也许会担心,数据由低维空间转换到高维空间后运算量会呈几何级增加,但实际上,支持向量机能够通过核函数有效地降低计算复杂度。

4. 概念总结

尽管上面分析的是二维数据,但实际上支持向量机可以处理任何维度的数据。在不同的维度下,支持向量机都会尽可能寻找类似于二维空间中的直线的线性分类器。

例如,在二维空间,支持向量机会寻找一条能够划分当前数据的直线;在三维空间,支持向量机会寻找一个能够划分当前数据的平面(plane);在更高维的空间,支持向量机会尝试寻找一个能够划分当前数据的超平面(hyperplane)。

一般情况下,把能够可以被一条直线(更一般的情况,即一个超平面)分割的数据称为线性可分的数据,所以超平面是线性分类器
“支持向量机”是由“支持向量”和“机器”构成的。

  • “支持向量”是离分类器最近的那些点,这些点位于最大“间隔”上。通常情况下,分类仅依靠这些点完成,而与其他点无关。

  • “机器”指的是分类器。

综上所述,支持向量机是一种基于关键点的分类算法

SVM 案例介绍

在使用支持向量机模块时,需要先使用函数 cv2.ml.SVM_create()生成用于后续训练的空分类器模型。该函数的语法格式为:

svm = cv2.ml.SVM_create( )

获取了空分类器 svm 后,针对该模型使用 svm.train()函数对训练数据进行训练,其语法格式为:

训练结果= svm.train(训练数据,训练数据排列格式,训练数据的标签)

式中参数的含义如下:

  • 训练数据:表示原始数据,用来训练分类器。例如,前面讲的招聘的例子中,员工的笔试成绩、面试成绩都是原始的训练数据,可以用来训练支持向量机。
  • 训练数据排列格式:原始数据的排列形式
    有按行排列(cv2.ml.ROW_SAMPLE,每一条训练数据占一行)和按列排列(cv2.ml.COL_SAMPLE,每一条训练数据占一列)两种形式,根据数据的实际排列情况选择对应的参数即可。
  • 训练数据的标签:原始数据的标签。
  • 训练结果:训练结果的返回值。

例如,用于训练的数据为 data,其对应的标签为 label,每一条数据按行排列,对分类器模型 svm 进行训练,所使用的语句为:

返回值 = svm.train(data,cv2.ml.ROW_SAMPLE,label)

完成对分类器的训练后,使用 svm.predict()函数即可使用训练好的分类器模型对测试数据进行分类,其语法格式为:

(返回值,返回结果) = svm.predict(测试数据)

以上是支持向量机模块的基本使用方法。在实际使用中,可能会根据需要对其中的参数进行调整。OpenCV 支持对多个参数的自定义,例如:可以通过 setType()函数设置类别,通过setKernel()函数设置核类型,通过 setC()函数设置支持向量机的参数 C(惩罚系数,即对误差的宽容度,默认值为 0)。

示例:已知老员工的笔试成绩、面试成绩及对应的等级表现,根据新入职员工的笔试成绩、面试成绩预测其可能的表现。

根据题目要求,首先构造一组随机数,并将其划分为两类,然后使用 OpenCV 自带的支持向量机模块完成训练和分类工作,最后将运算结果显示出来。具体步骤如下。

  1. 生成模拟数据
    首先,模拟生成入职一年后表现为 A 级的员工入职时的笔试和面试成绩。构造 20 组笔试和面试成绩都分布在[95, 100)区间的数据对:
a = np.random.randint(95,100, (20, 2)).astype(np.float32)

上述模拟成绩,在一年后对应的工作表现为 A 级。
接下来,模拟生成入职一年后表现为 B 级的员工入职时的笔试和面试成绩。构造 20 组笔试和面试成绩都分布在[90, 95)区间的数据对:

b = np.random.randint(90,95, (20, 2)).astype(np.float32)

上述模拟成绩,在一年后对应的工作表现为 B 级。
最后,将两组数据合并,并使用 numpy.array 对其进行类型转换:

data = np.vstack((a,b))
data = np.array(data,dtype='float32')
  1. 构造分组标签
    首先,为对应表现为 A 级的分布在[95, 100)区间的数据,构造标签“0”:
aLabel=np.zeros((20,1))

接下来,为对应表现为 B 级的分布在[90, 95)区间的数据,构造标签“1”:

bLabel=np.ones((20,1))

最后,将上述标签合并,并使用 numpy.array 对其进行类型转换:

label = np.vstack((aLabel, bLabel))
label = np.array(label,dtype='int32')
  1. 训练
    用支持向量机模块对已知的数据和其对应的标签进行训练:
svm = cv2.ml.SVM_create()
result = svm.train(data,cv2.ml.ROW_SAMPLE,label)
  1. 分类
    生成两个随机的数据对(笔试成绩,面试成绩)用于测试。可以用随机数,也可以直接指定两个数字。
    这里,我们想观察一下笔试和面试成绩差别较大的数据如何分类。用如下语句生成成绩:
test = np.vstack([[98,90],[90,99]])
test = np.array(test,dtype='float32')

然后,使用函数 svm.predict()对随机成绩分类:

(p1,p2) = svm.predict(test)
  1. 显示分类结果
    将基础数据(训练数据)、用于测试的数据(测试数据)在图像上显示出来:
plt.scatter(a[:,0], a[:,1], 80, 'g', 'o')
plt.scatter(b[:,0], b[:,1], 80, 'b', 's')
plt.scatter(test[:,0], test[:,1], 80, 'r', '*')
plt.show()

将测试数据及预测分类结果显示出来:

print(test)
print(p2)

整体代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 第 1 步 准备数据
# 表现为 A 级的员工的笔试、面试成绩
a = np.random.randint(95,100, (20, 2)).astype(np.float32)
# 表现为 B 级的员工的笔试、面试成绩
b = np.random.randint(90,95, (20, 2)).astype(np.float32)
# 合并数据
data = np.vstack((a,b))
data = np.array(data,dtype='float32')
# 第 2 步 建立分组标签,0 代表 A 级,1 代表 B 级
#aLabel 对应着 a 的标签,为类型 0-等级 A
aLabel=np.zeros((20,1))
#bLabel 对应着 b 的标签,为类型 1-等级 B
bLabel=np.ones((20,1))
# 合并标签
label = np.vstack((aLabel, bLabel))
label = np.array(label,dtype='int32')
# 第 3 步 训练
# 用 ml 机器学习模块 SVM_create() 创建 svm
svm = cv2.ml.SVM_create()
# 属性设置,直接采用默认值即可
#svm.setType(cv2.ml.SVM_C_SVC) # svm type
#svm.setKernel(cv2.ml.SVM_LINEAR) # line
#svm.setC(0.01)
# 训练
result = svm.train(data,cv2.ml.ROW_SAMPLE,label)
# 第 4 步 预测
# 生成两个随机的笔试成绩和面试成绩数据对
test = np.vstack([[98,90],[90,99]])
test = np.array(test,dtype='float32')
# 预测
(p1,p2) = svm.predict(test)
# 第 5 步 观察结果
# 可视化
plt.scatter(a[:,0], a[:,1], 80, 'g', 'o')
plt.scatter(b[:,0], b[:,1], 80, 'b', 's')
plt.scatter(test[:,0], test[:,1], 80, 'r', '*')
plt.show()
# 打印原始测试数据 test,预测结果
print(test)
print(p2)

同时,程序会在控制台输出如下运行结果:

[[98. 90.]
[90. 99.]]
[[1.]
[1.]]

运行结果表明:

  • 笔试成绩为 98 分,面试成绩为 90 分,对应的分类为 1,即该员工一年后的测评可能为B 级(表现良好)。

  • 笔试成绩为 90 分,面试成绩为 99 分,对应的分类为 1,即该员工一年后的测评可能为B 级(表现良好)。

因为我们采用随机方式生成数据,所以每次运行时所生成的数据会有所不同,运行结果也就会有所差异。文章来源地址https://www.toymoban.com/news/detail-654688.html

到了这里,关于opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv进阶08-K 均值聚类cv2.kmeans()介绍及示例

    K均值聚类是一种常用的无监督学习算法,用于将一组数据点分成不同的簇(clusters),以便数据点在同一簇内更相似,而不同簇之间差异较大。K均值聚类的目标是通过最小化数据点与所属簇中心之间的距离来形成簇。 当我们要预测的是一个离散值时,做的工作就是“分类”

    2024年02月12日
    浏览(48)
  • opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale()

    人脸识别是指程序对输入的人脸图像进行判断,并识别出其对应的人的过程。人脸识别程 序像我们人类一样,“看到”一张人脸后就能够分辨出这个人是家人、朋友还是明星。 当然,要实现人脸识别,首先要判断当前图像内是否出现了人脸,也即人脸检测。只有检 测到图像

    2024年02月09日
    浏览(49)
  • opencv进阶09-视频处理cv2.VideoCapture示例(打开本机电脑摄像头)

    视频信号(以下简称为视频)是非常重要的视觉信息来源,它是视觉处理过程中经常要处理的一类信号。实际上,视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示

    2024年02月12日
    浏览(49)
  • opencv 进阶13-Fisherfaces 人脸识别-函数cv2.face.FisherFaceRecognizer_create()

    PCA 方法是 EigenFaces 方法的核心,它找到了最大化数据总方差特征的线性组合。不可否认,EigenFaces 是一种非常有效的方法,但是它的缺点在于在操作过程中会损失许多特征信息。 因此,在一些情况下,如果损失的信息正好是用于分类的关键信息,必然会导致无法完成分类。

    2024年02月11日
    浏览(46)
  • opencv 进阶15-检测DoG特征并提取SIFT描述符cv2.SIFT_create()

    前面我们已经了解了Harris函数来进行角点检测,因为角点的特性,这些角点在图像旋转的时候也可以被检测到。但是,如果我们放大或缩小图像时,就可能会丢失图像的某些部分,甚至有可能增加角点的质量。这种损失的现象需要一种与图像比例无关的角点检测方法来解决。

    2024年02月11日
    浏览(46)
  • 【opencv】示例-peopledetect.cpp HOG(方向梯度直方图)描述子和SVM(支持向量机)进行行人检测...

    本段代码是一个使用OpenCV库的 HOG(Histogram of Oriented Gradients,方向梯度直方图)描述子和SVM(Support Vector Machines,支持向量机)进行行人检测的程序 。程序定义了Detector类来执行行人检测,可以在两种模式(默认模式和戴姆勒模式)之间切换。通过命令行参数,用户可以选择是

    2024年04月14日
    浏览(52)
  • 支持向量机SVM原理

    目录 支持向量机SVM原理 SVM原理 从线性分类器说起 SVM的目标是最大化分类间隔 转化为对偶问题求解                     【数之道】支持向量机SVM是什么,八分钟直觉理解其本质_哔哩哔哩_bilibili      SVM是由Vapnik等人于1995年提出的,在之后的20多年里它都是最具影响力的机

    2024年02月11日
    浏览(40)
  • MATLAB 支持向量机(SVM)

    简单来讲就是如何将两个数据用点、直线、平面分开。。。。。 二维空间中,要分开两个线性可分的点集合,我们需要找到一条分类直线即可, 通俗来讲,在这个二维平面中,可以把两类点的分开的直线有很多条,那么这些直线中,哪一条才是最好的呢?也就是如何选择出

    2024年02月03日
    浏览(36)
  • 机器学习——支持向量机SVM

    支持向量机(SVM)是一种二类分类模型,其基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大,间隔最大使它有别于感知机,支持向量机也可通过核技巧使它成为非线性分类器。支持向量机的学习策略是间隔最大化,可将其转化为一个求解凸二次

    2024年01月17日
    浏览(52)
  • 机器学习-支持向量机SVM

    在本练习中,我们将使用支持向量机(SVM)来构建垃圾邮件分类器。 我们将从一些简单的2D数据集开始使用SVM来查看它们的工作原理。 然后,我们将对一组原始电子邮件进行一些预处理工作,并使用SVM在处理的电子邮件上构建分类器,以确定它们是否为垃圾邮件。 我们要做

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包