python opencv调用摄像头,python使用opencv
本文主要介绍opencv支持向量机在python中的实现,通过实例代码详细介绍,具有一定的参考价值。感兴趣的朋友可以参考一下。
00-1010 SVM,支持向量机的理论基础,用一个介绍的例子来介绍完整的程序。
目录
支持向量机,SVM)是一个二元分类模型。它的目标是找到一个标准(称为超平面)来分割样本数据。细分的原则是保证分类的最优化(类别之间的最大间隔)。
当数据集较小时,使用支持向量机进行分类是非常有效的。
支持向量机(SVM)是最好的现成分类器之一。“现成的”意味着分类器可以不经修改直接使用。
在对原始数据进行分类的过程中,可能无法使用线性方法来实现分割。分类时,支持向量机将不能线性划分的数据映射到高维空间,然后在高维空间中寻找最佳线性分类器。
Python支持向量机库: sk-learn,LIBSVM等。
OpenCV还提供了对支持向量机的支持。
支持向量机
用于划分不同类别的直线,就是分类器。
在构造分类器时,找到最优的分类器是非常重要的。
寻找支持向量机:在已有数据中,寻找最接近分类器的点,并确保它们尽可能远离分类器。
从最近点到分类器的距离称为边缘。希望区间越大越好,这样分类器在处理数据的时候会更准确。
离分类器最近的那些点叫作支持向量(support vector)。决定分类器的位置。
变不可分为可分。
支持向量机可以通过函数映射使不易分类的数据变得可分类。
SVM在处理数据时,如果不能在低维空间完成分类,会自动将数据映射到高维空间,使其(线性)可分。简单来说,就是对当前数据进行函数映射操作。
比如分类的时候,通过函数F的映射,把左图中不能用线性分类器分类的数据,变成右图中可以线性分离的数据。
与此同时,3360支持向量机能够通过核函数有效地降低计算复杂度。
实际上,支持向量机可以处理任何维度的数据。在不同的维度上,支持向量机会尽力寻找二维空间中类似于直线的线性分类器。
比如在二维空间,支持向量会找到一条可以划分当前数据的直线;在三维空间中,支持向量可以找到一个平面);可以划分当前数据;在一个更高维的空间中,支持向量机将试图找到一个可以划分当前数据的超平面。
一般来说,能被一条直线(更一般的是超平面)分割的数据称为线性可分数据,所以超平面是线性分类器。
“支持向量机”是由“支持向量”和“机器”构成的。
“支持向量”是那些最接近分类器的点,这些点处于最大“区间”。通常分类只取决于这几点,与其他点无关。“机器”指的是分类器。支持向量机是一种基于关键点的分类算法。
理论基础
使用支持向量机模块时,需要使用函数cv2.ml.SVM_create()生成空的分类器模型,用于后续训练。
语法格式:
svm=cv2.ml.SVM_create()
获得空分类器svm后,使用svm.train()函数对该模型的训练数据进行训练。
语法格式
训练结果=svm.train(训练数据,训练数据排列格式,训练数据标签)
训练数据:原始数据,用于训练分数。
类器。
例如: 用于训练的数据为data,其对应的标签为label,每一条数据按行排列,对分类器模型svm进行训练,所使用的语句为:
返回值 = svm.train(data, cv2.ml.ROW_SAMPLE, label)
完成对分类器的训练后,使用svm.predict()函数即可使用训练好的分类器模型对测试数据进行分类,其语法格式为:
(返回值,返回结果) = svm.predict(测试数据)
OpenCV支持对多个参数的自定义,例如:可以通过setType()函数设置类别,通过setKernel()函数设置核类型,通过setC()函数设置支持向量机的参数C ( 惩罚系数,即对误差的宽容度,默认值为0 )。
例子介绍
题目: 已知员工的笔试成绩、面试成绩及对应的等级表现,根据新入职员工的笔试成绩、面试成绩预测其可能的表现。
首先构造一组随机数,并将其划分为两类,然后使用OpenCV自带的支持向量机模块完成训练和分类工作,最后将运算结果显示出来。
具体步骤:
- 生成模拟数据
模拟生成入职一年后表现为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)
- 构造分组标签
为对应表现为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)
- 训练
用支持向量机模块对已知的数据和其对应的标签进行训练:
svm = cv2.ml.SVM_create()
result = svm.train(data, cv2.ml.ROW_SAMPLE, label)
- 分类
生成两个随机的数据对(笔试成绩,面试成绩)用于测试。
test = np.vstack([[98,90], [90,99]])
test = np.array(test, dtype=float32)
使用函数svm.predict()对随机成绩分类:
(p1, p2) = svm.predict(test)
- 显示分类结果
将基础数据(训练数据)、用于测试的数据(测试数据)在图像上显示出来:
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 cv2import numpy as np
import matplotlib.pyplot as plt
# 准备数据
a = np.random.randint(95,100, (20, 2)).astype(np.float32)
b = np.random.randint(90,95, (20, 2)).astype(np.float32)
data = np.vstack((a, b))
data = np.array(data, dtype=float32)
# 建立分组标签,0代表A级,1代表B级
aLabel=np.zeros((20,1))
bLabel=np.ones((20,1))
label = np.vstack((aLabel, bLabel))
label = np.array(label, dtype=int32)
# 训练
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)
#预测
test = np.vstack([[98,90], [90,99]])
test = np.array(test, dtype=float32)
(p1, p2) = svm.predict(test) # test 是 [[数据1],[数据2]] 结构的
# 结果
print(test)
print("res1",p2[0])
print("res2",p2[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()
到此这篇关于python中opencv支持向量机的实现的文章就介绍到这了,更多相关opencv 向量机内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。