在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分类器相关推荐

  1. 使用Opencv中的SVM分类器进行图像分类

    SVM的原理 SVM也叫支持向量机,最大间隔分类器.在分类.回归方面普遍出现. 我们在这里考虑使用二维空间来表示一系列数据,每个数据都有它自身的(x,y),然后用一条直线将其进行分类.这应该就是最简单 ...

  2. OpenCV中的级联分类器Cascade Classifier(面部识别)

    OpenCV中的级联分类器Cascade Classifier Goal In this tutorial you will learn how to: Use the CascadeClassifi ...

  3. opencv中traincascade训练分类器

    1 分类器的训练 训练级联分类器traincascade需要OpenCV中的两个exe文件,这两个文件分别是opencv_createsamples.exe和opencv_traincascade.e ...

  4. OpenCV中使用SVM简介

    下面这是opencv官方文档中的代码,我加了一部分注释: 1 #include "stdafx.h" 2 #include "opencv2/core/core.hpp& ...

  5. GEE:利用libsvm()创建一个支持向量机SVM分类器进行土地利用分类

    结果展示: 函数:ee.Classifier.libsvm() 用法 返回 ee.Classifier.libsvm(decisionProcedure, svmType, kernelType, s ...

  6. [数据挖掘之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 ...

  7. OpenCV中的HOG+SVM在自动驾驶车辆检测中的应用实例

    车辆检测在车辆感知模块中是非常重要的功能,本节我们的目标如下: 在标记的图像训练集上进行面向梯度的直方图(HOG)特征提取并训练分类器线性SVM分类器 应用颜色转换,并将分箱的颜色特征以及颜色的直方图 ...

  8. linux手写数字识别,OpenCV 3.0中的SVM训练 mnist 手写字体识别

    前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...

  9. opencv c++ svm分类器 初学

    c++ 初学者 + opencv初学者 写了一个简单的svm分类器,由于有很多不是很了解,所以代码注释得比较详细 svm 直接上代码吧 大家将就看 #include "pch.h" ...

最新文章

  1. RTD 比率式温度测量传感器设计思路
  2. mysql创建数据库选择_mysql创建、选择并使用数据库
  3. ValueAnimator API 介绍
  4. sublime text 2用package control安装插件时显示成功安装但实际没装上的问题
  5. Win32汇编学习[7]: 定义符号常量(=、EQU、TEXTEQU)
  6. 统计一个字符在另一个字符串中出现的次数
  7. 支付宝用大数据憋死伪基站骗子
  8. 虚拟机打不开,提示“此主机不支持虚拟化实际模式”的解决方法。
  9. java获取本地mac地址
  10. java自动生成函数注释_IDEA类和方法注释自动生成(2019-08-31 21:47写)
  11. laravel database.php,php Laravel框架学习(一) 之 建立数据库并填充测试数据
  12. 磊科nw336+linux驱动程序,磊科NW336无线网卡驱动程序
  13. EOS钱包开发注意交易消失的情况
  14. 网络编程:TCP客户端的搭建流程(附源码)
  15. Vue中数字(金额)大小写实时转换
  16. linux 蓝牙 iphone,Linux On iPhone 7 现在可运行 Wayland
  17. MOSFET原理与应用
  18. 手工彻底清除各种顽固性 Trojan Horse ***的方法
  19. Windows Phone 7 中TouchPanel的触控操作
  20. AI+安防在智慧医疗中的深度应用与前景

热门文章

  1. 常用的xshell命令之删除文件夹、删除文件、删除目录
  2. JLink V8刷固件方式 转载整合
  3. python判别分析_python中的线性判别分析
  4. 《浏览器F12开发者工具的妙用》
  5. 3周岁送福利结果出炉!
  6. 专科学历事业单位工资计算机,事业单位的人告诉你:学历跟入编之后的待遇关系有多大!很直接!...
  7. U盘量产操作工具包,包含4k对齐,ChipGenius等U盘量产工具
  8. 【6月挑战算法入门级挑战赛】组织活动
  9. 音频相关pcm,增益
  10. 1)Java web项目配置(最简单的javaweb项目)