Python图像处理(15):SVM分类器

原创 2015年07月06日 21:38:59

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息


opencv中支持SVM分类器,本文尝试在python中调用它。


和前面的贝叶斯分类器一样,SVM也遵循先训练再使用的方式,我们直接在贝叶斯分类器的测试代码上做简单修改,完成两类数据点的分类。


首先也是先创建训练用的数据,需要注意的是这里的train_label必须是整数类型,而不是float


# 训练的点数
train_pts = 30

# 创建测试的数据点,2类
# 以(-1.5, -1.5)为中心
rand1 = np.ones((train_pts,2)) * (-2) + np.random.rand(train_pts, 2)
print('rand1:')
print(rand1)

# 以(1.5, 1.5)为中心
rand2 = np.ones((train_pts,2)) + np.random.rand(train_pts, 2)
print('rand2:')
print(rand2)

# 合并随机点,得到训练数据
train_data = np.vstack((rand1, rand2))
train_data = np.array(train_data, dtype='float32')
train_label = np.vstack( (np.zeros((train_pts,1), dtype='int32'), np.ones((train_pts,1), dtype='int32')))

# 显示训练数据
plt.figure(1)
plt.plot(rand1[:,0], rand1[:,1], 'o')
plt.plot(rand2[:,0], rand2[:,1], 'o')
plt.plot(rand2[:,0], rand2[:,1], 'o')

类似这样的数据:



在得到训练数据后,接着创建一个SVM分类器并配置训练参数:


# 创建分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)  # SVM类型
svm.setKernel(cv2.ml.SVM_LINEAR) # 使用线性核
svm.setC(1.0)

接着我们对此分类器进行训练:

# 训练
ret = svm.train(train_data, cv2.ml.ROW_SAMPLE, train_label)


在训练完成后就可以使用测试数据进行预测了:

# 测试数据,20个点[-2,2]
pt = np.array(np.random.rand(20,2) * 4 - 2, dtype='float32')
(ret, res) = svm.predict(pt)
print("res = ")
print(res)

predict通过res返回得到一个20x1的数组,每一行对应一个输入点,计算得到的值就是分类的序号,在这里是01,我们取0.5为阈值进行分类并显示结果:

# 按label进行分类显示
plt.figure(2)
res = np.hstack((res, res))

# 第一类
type_data = pt[res < 0.5]
type_data = np.reshape(type_data, (type_data.shape[0] / 2, 2))
plt.plot(type_data[:,0], type_data[:,1], 'o')

# 第二类
type_data = pt[res >= 0.5]
type_data = np.reshape(type_data, (type_data.shape[0] / 2, 2))
plt.plot(type_data[:,0], type_data[:,1], 'o')

plt.show()

看看最后的结果:




最后,通过svm. getSupportVectors获取支持向量。

# 支持向量
vec = svm.getSupportVectors()
print(vec)














版权声明:本文为博主原创文章,未经博主允许不得转载。

Opencv Python版学习笔记(八)字符识别-分类器(SVM,KNearest,RTrees,Boost,MLP)

Opencv提供了几种分类器,例程里通过字符识别来进行说明的 1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。 函数原型:训练原型 ...
  • gjy095
  • gjy095
  • 2013年07月07日 21:42
  • 5981

学习SVM(一) SVM模型训练与分类的OpenCV实现

学习SVM(一) SVM模型训练与分类的OpenCV实现 学习SVM(二) 如何理解支持向量机的最大分类间隔 学习SVM(三)理解SVM中的对偶问题 学习SVM(四) 理解SVM中的支持向量(S...

Opencv Python版学习笔记(八)字符识别-分类器(SVM,KNearest,RTrees,Boost,MLP)

OpenCV提供了几种分类器,例程里通过字符识别来进行说明的 1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。 函数原型:训练原...

OpenCV学习笔记(二十六)——小试SVM算法ml

总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西。OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图像处理的初级阶段,我也得加油,深入研究它的算法库。就从...

python实现用SIFT+K-MEANS+SVM图片分类

用python实现图片分类过程: 1. 按图片类别抽取训练集中所有图片的SIFT特征; 2. 将每一类图片的SIFT特征聚类为K类,构成该类的visual vocabulary(其size为K); ...

OpenCv学习笔记---OpenCv中支持向量机模块SVM------源代码分析

/**************************************************************************************** ...

opencv3.0-支持向量机(svm)使用介绍

这篇文章翻译opencv官网关于opencv3.0 svm的使用介绍

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Python图像处理(14):神经网络分类器

在opencv中支持神经网络分类器,本文尝试在python中调用它。 和前面的贝叶斯分类器一样,神经网络也遵循先训练再使用的方式,我们直接在贝叶斯分类器的测试代码上做简单修改,完成两类数据点的分类。...

python学习(18)--图片分类

图片分类学习动机.在这一节中我们会引入图片分类为题。这也是从一个合适的集合中分配给图片一个标记的任务。这是计算机视觉的核心问题之一。鉴于它的简单性,有一大批实用应用。更多的是,我们可以在以后的章节中看...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python图像处理(15):SVM分类器
举报原因:
原因补充:

(最多只允许输入30个字)