OpenCV中使用SVM分类器
在opencv中支持SVM分类器,过程就是:先训练再预测(python实现)
# svm 对于数据的要求: 所有的数据都要有label # [155,48] -- 0 女生 [152,53] ---1 男生 # 监督学习 0 负样本 1 正样本
步骤一:获取训练样本
#1.获取训练样本,2类
row = 30
data1 = np.ones((row,2))+np.random.rand(row,2) #[1,2) 1.5为中心
data2 = np.ones((row,2))*(-2)+np.random.rand(row,2) #[-2,-1) -1.5为中心plt.figure(1)
plt.plot(data1[:,0],data1[:,1],'o')
plt.plot(data2[:,0],data2[:,1],'o')#data = np.vstack(data1, data2) #报错
data = np.vstack((data1,data2)) #将两种训练样本合并,这里无法转float32格式,所以才有下一行代码
data = np.array(data,dtype='float32') #将训练样本转换成要求的float32格式才可以
步骤二:获取训练标签
#2.获取标签
label_data1 = np.zeros((row,1),dtype='int32') #将训练标签转换成要求的int32格式才可以
label_data2 = np.ones((row,1),dtype='int32')
label = np.vstack((label_data1,label_data2)) #行堆积,另起一行,得到一个60x2的数组
label = np.array(label,dtype='int32') #这句话可有可无,因为label_data1和label_data2已声明int32类型
步骤三:创建分类器
#3.创建分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setC(cv2.ml.SVM_C_SVC)
步骤四:进行训练
#4.进行训练
res = svm.train(data,cv2.ml.ROW_SAMPLE,label)
print("训练成功与否res的值",res) #输出:True
步骤五:进行预测
#5.进行预测
pre = np.random.rand(20,2)*4-2 #测试样本:20个点[-2,2)
pre = np.array(pre,dtype='float32') #将测试样本转换成要求的float32格式才可以
(par1,res) = svm.predict(pre) #返回值两个参数
print("预测后结果res的值\n",res) #得到一个20x1的数组
输出:
预测后结果res的值
[[1.]
[0.]
[0.]
[1.]
[1.]
[1.]
[1.]
[1.]
[0.]
[1.]
[0.]
[1.]
[0.]
[1.]
[1.]
[0.]
[0.]
[1.]
[1.]
[1.]]
步骤六:结果绘图
predict通过res返回得到一个20x1的数组。每一行相应一个输入点,计算得到的值就是分类的序号,在这里是0和1我们取0.5为阈值进行分类并显示结果。
因为测试样本是20个[-2,2)范围的点,即20*2的数组为了方便比较,先将结果预测后结果res进行列堆积,由20*1转换成20*2的数组同型数组就可以进行比较输出。
#6.结果绘图
res = np.hstack((res,res)) #列堆积,另起一列,得到一个20x2的数组
pre0 = pre[res<0.5] #后续详细解释
pre1 = pre[res>=0.5]
print("pre0\n",pre0)
print("pre1\n",pre1)
print("pre0.shape:",pre0.shape) #此时两者均为一列
print("pre1.shape:",pre1.shape)
pre0 = np.reshape(pre0,(int(pre0.shape[0]/2),2)) #为了显示绘图,将一列变二列
pre1 = np.reshape(pre1,(int(pre1.shape[0]/2),2))
plt.figure(2)
plt.plot(pre0[:,0],pre0[:,1],'o') #画图plt.plot(x坐标,y坐标,'线型')
plt.plot(pre1[:, 0], pre1[:, 1], 'o')
plt.show()
输出:
pre0.shape: (24,)
pre1.shape: (16,)
pre0
[-0.33559075 1.3618486 1.7029347 0.04593408 0.3551418 1.3985409
0.75370246 -0.13495038 0.18302129 0.46836114 0.42994153 0.3347996
-0.05576663 1.3062311 1.9422737 1.8106563 0.5062942 0.6137762
1.9550579 -0.65718 0.8673214 1.4073303 1.3502296 0.88142025]
pre1
[-0.3959848 -0.9314422 0.12321403 -0.8255872 -1.9429276 -0.49432907
-1.5003582 -0.20095745 -1.786253 1.0939165 -0.68006885 -0.40214399
-1.3144214 -1.7472401 -0.6790464 -0.4059371 ]
完整代码
def svm_point():"""以下出现的np.array(pre,dtype='float32')作用:指定数组或者矩阵内部数据的数据类型"""row = 30#1.获取样本,2类data1 = np.ones((row,2))+np.random.rand(row,2) #[1,2) 1.5为中心data2 = np.ones((row,2))*(-2)+np.random.rand(row,2) #[-2,-1) -1.5为中心plt.figure(1)plt.plot(data1[:,0],data1[:,1],'o')plt.plot(data2[:,0],data2[:,1],'o')# data = np.vstack(data1, data2) #报错data = np.vstack((data1,data2)) #将两种训练样本合并,这里无法转float32格式,所以才有下一行代码data = np.array(data,dtype='float32') #将训练样本转换成要求的float32格式才可以#2.获取标签label_data1 = np.zeros((row,1),dtype='int32') #将训练标签转换成要求的int32格式才可以label_data2 = np.ones((row,1),dtype='int32')label = np.vstack((label_data1,label_data2)) #行堆积,另起一行,得到一个60x2的数组label = np.array(label,dtype='int32') #这句话可有可无,因为label_data1和label_data2已声明int32类型#3.创建分类器svm = cv2.ml.SVM_create()svm.setType(cv2.ml.SVM_C_SVC)svm.setKernel(cv2.ml.SVM_LINEAR)svm.setC(cv2.ml.SVM_C_SVC)#4.训练样本res = svm.train(data,cv2.ml.ROW_SAMPLE,label)print("训练成功与否res的值",res) #输出:True#5.进行预测pre = np.random.rand(20,2)*4-2 #测试样本:20个点[-2,2)pre = np.array(pre,dtype='float32') #将测试样本转换成要求的float32格式才可以(par1,res) = svm.predict(pre) #返回值两个参数print("预测后结果res的值\n",res) #得到一个20x1的数组"""predict通过res返回得到一个20x1的数组。每一行相应一个输入点,计算得到的值就是分类的序号,在这里是0和1我们取0.5为阈值进行分类并显示结果""""""因为测试样本是20个[-2,2)范围的点,即20*2的数组为了方便比较,先将结果预测后结果res进行列堆积,由20*1转换成20*2的数组同型数组就可以进行比较输出"""#6.结果绘图res = np.hstack((res,res)) #列堆积,另起一列,得到一个20x2的数组pre0 = pre[res<0.5] #后续详细解释pre1 = pre[res>=0.5]print("pre0.shape:",pre0.shape) #此时两者均为一列print("pre1.shape:",pre1.shape)pre0 = np.reshape(pre0,(int(pre0.shape[0]/2),2)) #为了显示绘图,将一列变二列pre1 = np.reshape(pre1,(int(pre1.shape[0]/2),2))plt.figure(2)plt.plot(pre0[:,0],pre0[:,1],'o') #画图plt.plot(x坐标,y坐标,'线型')plt.plot(pre1[:, 0], pre1[:, 1], 'o')plt.show()
# usePlot()
# reshape()
svm_point()
补充:解释pre0 = pre[res<0.5]
前提:要由两个维度一样的才可以进行比赋值
def true_false():a = np.array([[1],[2],[3],[4],[5]])b = np.array([[1],[1],[1],[0],[0]])res1 = a[b==1]print(res1)res2 = a[b<0.5]print(res2)true_false()
输出:
[1 2 3]
[4 5]
OpenCV中使用SVM分类器相关推荐
- 使用Opencv中的SVM分类器进行图像分类
SVM的原理 SVM也叫支持向量机,最大间隔分类器.在分类.回归方面普遍出现. 我们在这里考虑使用二维空间来表示一系列数据,每个数据都有它自身的(x,y),然后用一条直线将其进行分类.这应该就是最简单 ...
- OpenCV中的级联分类器Cascade Classifier(面部识别)
OpenCV中的级联分类器Cascade Classifier Goal In this tutorial you will learn how to: Use the CascadeClassifi ...
- opencv中traincascade训练分类器
1 分类器的训练 训练级联分类器traincascade需要OpenCV中的两个exe文件,这两个文件分别是opencv_createsamples.exe和opencv_traincascade.e ...
- OpenCV中使用SVM简介
下面这是opencv官方文档中的代码,我加了一部分注释: 1 #include "stdafx.h" 2 #include "opencv2/core/core.hpp& ...
- GEE:利用libsvm()创建一个支持向量机SVM分类器进行土地利用分类
结果展示: 函数:ee.Classifier.libsvm() 用法 返回 ee.Classifier.libsvm(decisionProcedure, svmType, kernelType, s ...
- [数据挖掘之scikit-learn] sklean.svm 分类器实例详解
文章目录 概述 1. sklearn.svm分类器 1.1 sklearn.svm.SVC 1.2 sklearn.svm.NuSVC 1.3 sklearn.svm.LinearSVC 1.4 SV ...
- OpenCV中的HOG+SVM在自动驾驶车辆检测中的应用实例
车辆检测在车辆感知模块中是非常重要的功能,本节我们的目标如下: 在标记的图像训练集上进行面向梯度的直方图(HOG)特征提取并训练分类器线性SVM分类器 应用颜色转换,并将分箱的颜色特征以及颜色的直方图 ...
- linux手写数字识别,OpenCV 3.0中的SVM训练 mnist 手写字体识别
前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...
- opencv c++ svm分类器 初学
c++ 初学者 + opencv初学者 写了一个简单的svm分类器,由于有很多不是很了解,所以代码注释得比较详细 svm 直接上代码吧 大家将就看 #include "pch.h" ...
最新文章
- RTD 比率式温度测量传感器设计思路
- mysql创建数据库选择_mysql创建、选择并使用数据库
- ValueAnimator API 介绍
- sublime text 2用package control安装插件时显示成功安装但实际没装上的问题
- Win32汇编学习[7]: 定义符号常量(=、EQU、TEXTEQU)
- 统计一个字符在另一个字符串中出现的次数
- 支付宝用大数据憋死伪基站骗子
- 虚拟机打不开,提示“此主机不支持虚拟化实际模式”的解决方法。
- java获取本地mac地址
- java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)
- laravel database.php,php Laravel框架学习(一) 之 建立数据库并填充测试数据
- 磊科nw336+linux驱动程序,磊科NW336无线网卡驱动程序
- EOS钱包开发注意交易消失的情况
- 网络编程:TCP客户端的搭建流程(附源码)
- Vue中数字(金额)大小写实时转换
- linux 蓝牙 iphone,Linux On iPhone 7 现在可运行 Wayland
- MOSFET原理与应用
- 手工彻底清除各种顽固性 Trojan Horse ***的方法
- Windows Phone 7 中TouchPanel的触控操作
- AI+安防在智慧医疗中的深度应用与前景