使用SVM模块分类
书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
第15章 机器学习导读
15.4 OpenCV机器学习模块的使用
15.4.2 使用SVM模块分类
1、三个步骤
-
如图15-40所示,按照在OpenCV中使用机器学习模块的三步使用SVM模块即可。
图15-40 使用SVM模块的流程示意图
2、每步使用的函数。
-
Step 1:模型初始化。
在使用SVM模块时,需要先使用函数cv2.ml.SVM_create()生成用于后续训练的空分类器模型。 -
Step 2:训练分类器。
获取空分类器svm后,针对该模型使用svm.train()函数对训练数据进行训练,其语法格式为
-
其中,各参数含义如下:
● 训练数据:用于训练的数据,用来训练分类器。
● 训练数据排列形式:训练数据的排列形式有按行排列(cv2.ml.ROW_SAMPLE,每一条训练数据占一行)和按列排列(cv2.ml.COL_SAMPLE,每一条训练数据占一列)两种形式,根据数据的实际排列情况选择对应的参数即可。
● 训练数据的标签:训练数据对应的标签。
● 训练结果:训练结果的返回值。例如,用于训练的数据为data,其对应的标签为label,每一条数据按行排列,对分类器模型svm进行训练,使用的语句为
-
Step 3:使用模型。
完成对分类器的训练后,使用svm.predict()函数即可使用训练好的分类器模型对待分类的数据进行分类,其语法格式为
-
以上是SVM模块的基本使用方法。
在实际使用中,可能会根据需要对其中的参数进行调整。
OpenCV支持对多个参数的自定义,
例如,可以通过setType()函数设置类别,通过setKernel()函数设置卷积核类型,
通过setC()函数设置SVM的参数C(惩罚系数,即对误差的宽容度,默认值为0),
通过setGamma()函数设置卷积核的系数。
3、实例
-
【例15.2】使用SVM模块完成钻石分类预测
根据钻石的质量和直径将其划分为甲、乙两个等级,如图15-41左侧表格所示。现有一枚钻石的指标为(12,18),希望利用SVM模块确定其等级,如图15-41右侧图形所示。
图15-41 钻石数据
观察图15-41很容易判断出未知标签为“甲”。下面根据题目要求,编写程序使用SVM模块进行判断。
4、程序
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 10 15:22:10 2024
@author: dalong10
"""
import cv2
import numpy as np
# =====生成模拟数据及标签====
trainData = np.array([[6,3] ,[4,5],[9,8],[12,12],[15,13],[18,17]]).astype(np.float32)
tdLable = np.array([[0],[0],[0],[1],[1],[1]]).astype(np.int32)
test=np.array([[12,18]]).astype(np.float32)
# =======使用SVM算法===============
svm = cv2.ml.SVM_create()
svm.train(trainData, cv2.ml.ROW_SAMPLE, tdLable)
(p1,p2) = svm.predict(test)
# ========泉示结果============
rv = p2[0][0].astype(np.int32)
if rv==0:
print("当前钻石等级:乙级")
else:
print("当前钻石等级: 甲级")
运行结果
- 上述程序输出结果与由图15-41判断结果一致,较好地实现了预测。